忍者ブログ
PCメモ
PC関係のメモ、気付いたこと。 simhとChromium OSをいじって遊んでいます。 Chromium OSのカスタムビルドを配布しています。(http://chromiumosde.gozaru.jp) twitter: @zui22904336 PGP fingerprint: 45FC 0E47 A68A FA06 02FE 2BEF B72C C6E6 F9FF 1C19
Admin / Write
8/10(木)〜8/20(日)の間はChromium OS カスタムビルドに関する活動をおやすみいたします。期間中にお問い合わせをいただいても対応はできません。
2014/03/24 (Mon) 09:44
<'15/09/08追記>

VAIO Type Pで動作するChromium OSのカスタムビルドを公開しました。興味がおありでしたらお試しいただければと思います。



前々回の記事
でも書きましたが、Chromium OSのカーネルにはPATAドライバが入っていません。そのため、そのままではVAIO Type Pの内蔵HDDを認識してくれず、HDDへのインストールができません。

そこで、今回はChromium OSのカーネル設定を変更して再ビルドし、VAIO Type P(VGN-P61S)の内蔵HDDが正しく認識できるようにしてみます。うまくいけばVAIO Type Pでも内蔵HDDからブートできるようになります。

今回は内蔵HDDに対応するだけです。他にも何か必要かもしれませんが、まだ問題が見えていないのでとりあえず無視。何かあれば対応しようと思います。

なお、うちのVAIOはSSD換装していないので、SSDでうまくいくかは分かりません。また、今回のVAIO Type Pは旧型です。新型は手元にないのでよく分かりません。そもそもこんな問題は起きないかもしれません。

今回の内容は一応簡単な動作確認はしていますが、素人が試した内容なのでいろいろ嘘があるかもしれません。
今回の記事では以下の各ページを参考にしています。中身は英語ですが、英語はよくわかっていませんので間違えて理解している可能性が高いです。正確に理解したい方は以下の各ページをご覧になることをお勧めします。


ビルド環境の起動


今回は、前回の記事で書いたChromium OSのビルド環境がすでにあり、Chromium OSを最低1回はビルドしていることを前提として進めて行きます。今回は前回の環境を再度起動するところから始めます。

ビルド環境をVirtualBoxなどの仮想環境で作成している方は、現時点で一度スナップショットをとっておくことをお勧めします。

まずビルド用のUbuntu 12.04 LTSを起動して、ビルド用ユーザでChromium OSのSDKを起動します。以下のコマンドを実行します。

chromium@Ubuntu12:~$ cd ~/chromiumos/
chromium@Ubuntu12:~/chromiumos$ ./chromite/bin/cros_sdk
[sudo] password for chromium: 
(cr) ((395f6d3...)) chromium@Ubuntu12 ~/trunk/src/scripts $ export BOARD=x86-generic
 

一度実行しているので、今回はすぐにchroot環境に移行します。移行したら上記のようにBOARDの設定を行います。ターゲットはVAIO Type Pなのでx86-genericです。

カーネルソースの場所を探す


今回の目的はカーネルの設定を変更してPATAドライバを有効にしてカーネルを再ビルドし、ChromiumOSに組み込みなおすことです。
そのため、まずカーネルソースがどこにあるかを探します。

前回の記事でx86-genericはビルドの設定をまとめたオーバレイの名前だと書きましたが、このオーバレイは複数のパッケージから構成されています。以下のコマンドを実行することで、x86-genericに含まれるパッケージの一覧を表示することができます。

(cr) ((395f6d3...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cros_workon --board=${BOARD} list --all
(略)
sys-kernel/chromeos-kernel
sys-kernel/chromeos-kernel-3_10
sys-kernel/chromeos-kernel-3_14
sys-kernel/chromeos-kernel-next
(略)
 

カーネルパッケージが4つも出てきます。この辺りの事情はよくわからないのですが、この記事を書いた時点では、x86-genericに関しては正解は "chromeos-kernel-3_10" になります。
(参考:[PSA] x86 generic overlays now use chromeos-kernel-3_10
これを間違えると、後でビルドしたカーネルをChromium OSに組み込む際にFile Collisionというエラーが起きます。
なお、ほかのアーキテクチャでは違うカーネルパッケージを使っている可能性がありますが、それについては現時点では把握していません。

パッケージ名を把握したら、そのソースがどこにあるかは以下のコマンドで調べることができます。

(cr) ((395f6d3...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cros_workon --board=${BOARD} info --all | grep chromeos-kernel-3_10
/mnt/host/source/src/scripts/cros_workon: eval: 行 137: 予期しないトークン `(' 周辺に構文エラーがあります
/mnt/host/source/src/scripts/cros_workon: eval: 行 137: `CROS_WORKON_INCREMENTAL_BUILD=1 CROS_WORKON_USE_VCSID=1 CROS_WORKON_LOCALNAME=( CROS_WORKON_PROJECT=("${CROS_WORKON_LOCALNAME[@]/#/chromiumos/platform/}") CROS_WORKON_DESTDIR=("${CROS_WORKON_LOCALNAME[@]/#/${S}/}")'
sys-kernel/chromeos-kernel-3_10 chromiumos/third_party/kernel-next src/third_party/kernel-next
sys-kernel/chromeos-kernel-3_10 chromiumos/third_party/kernel-next src/third_party/kernel/3.10
sys-kernel/chromeos-kernel-3_10 chromiumos/third_party/kernel-next src/third_party/kernel/3.14
 

なんかエラーが出ていますが気にしません。結果が3行出ていますが、2行目があたりです。3つのカラムに分かれて出てきていますが、ソースの場所は最後のカラム src/third_party/kernel/3.10 です。これは~/trunkからの相対パスになります。

パッケージの編集開始


Chromium OSのSDKでは、パッケージに対して修正を加える前に、以下のコマンドを使ってパッケージの編集開始操作を行う必要があるようです。

(cr) ((395f6d3...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cros_workon --board=${BOARD} start chromeos-kernel-3_10
INFO    : Started working on 'sys-kernel/chromeos-kernel-3_10' for 'x86-generic'
 

ソースコードの同期


編集に取り掛かる前にソースの同期を行っておきます。
以下のコマンドを、もう一つ端末を起動してchrootの外、~/chromiumosの下で実行します。

chromium@Ubuntu12:~$ cd chromiumos/
chromium@Ubuntu12:~/chromiumos$ repo sync
remote: Finding sources: 100% (3/3)
(略)
Your sources have been sync'd successfully.
 

これでソースの編集準備ができました。以降はまたchrootした環境に戻って作業します。

ブランチの作成


Chromium OSのSDKはソースコードの管理にgitを使っていますので、編集に先立ってブランチを作成します。ただし直接gitのコマンドを使わず、repoコマンドを使用します。ブランチを作成する場合は、先ほど調べたソースコードのディレクトリに移動してから以下のコマンドを実行します。

(cr) ((395f6d3...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cd ../third_party/kernel/3.10/
(cr) ((0df1ac4...)) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10 $ repo start mykernel-3_10 .  ←最後にピリオドがあるので注意
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10 $ 
 

repo start の次のmykernel-3_10はブランチの名前ですので任意の名前を指定できます。ブランチを作成するとシェルプロンプトにその名前が表示されます。

カーネル設定ファイルの書き換え


ブランチを作ったので、いよいよカーネルの設定を変更します。
カーネルの設定ファイルはカーネルソースディレクトリの下のchromeos/configの下にあります。

Chromium OSのSDKではカーネル設定に関して"splitconfig"という仕組みを取り入れていて、アーキテクチャに共通の設定をchromeos/config/base.configに書き、それ以外のアーキテクチャごとに異なる設定をarmel, i386, x86_64の各サブディレクトリに分けておいてあり、これをビルド時に統合して各アーキテクチャに適したコンフィギュレーションを行うようになっているようです。
今回はVAIO Type PをターゲットにPATA関連の設定を行いますので、base.configおよびi386サブディレクトリに対してgrep PATA を実行してPATA関係のパラメータがあるファイルを探します。

(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10 $ cd chromeos/config/
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config $ ls
armel  base.config  i386  x86_64
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config $ grep PATA base.config
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config $ cd i386
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config/i386 $ ls
chromeos-pinetrail-i386.flavour.config  chromiumos-i386.flavour.config  common.config
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config/i386 $ grep PATA *
common.config:# CONFIG_PATA_ACPI is not set
common.config:# CONFIG_PATA_ALI is not set
common.config:# CONFIG_PATA_AMD is not set
common.config:# CONFIG_PATA_ARTOP is not set
(略)
common.config:# CONFIG_PATA_SCH is not set
(略)
 

これでchromeos/config/i386/common.configが編集対象と判明したので、このファイルを編集します。今回は以下の2つのパラメータをyに書き換えます。

(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config/i386 $ vi common.config

(略)
CONFIG_PATA_ACPI=y
(略)
CONFIG_PATA_SCH=y
(略)
 

ここで、パラメータはmではなく必ずyを指定します。mを指定するとUSBメモリからHDDにChromium OSをインストールするところまではいきますが、インストールしたOSからブートできなくなります。
今VAIOで使っているlubuntu 13.10ではこれらにmを指定しているので同じにしてみたのですが、うまくいかずにはまって結構悩みました。

Chromium OSでは、ブート時に以下のようなシーケンスを取るようです。

1.MBRに書かれたブートローダが起動し、パーティション12にあるカーネルを起動
2.パーティション12にあるカーネルがパーティション3または5にある本番カーネルを起動

パーティション3または5がルートパーティションで、verified bootの仕組みを実現するため、同じ内容が2つ用意されているようです。一方パーティション12にはブート用のカーネルが置いてあります。vmlinux自体はルートパーティションと同じものですが、パーティション12にはカーネルモジュールがインストールされません。そのため、PATAドライバをモジュールにしてしまうとパーティション12のカーネルはルートパーティションを見つけられずにブートに失敗するのではないかと考えています。
そのため必ずyを指定してPATAドライバをカーネルに直接リンクする必要があります。

先ほども書いたようにChromium OSでは"splitconfig"という仕組みを取り入れているので、単にファイルを書き換えるだけではだめなようで、専用のスクリプトを実行して編集内容を全体に反映する必要があります。
途中で何回か質問をされますが、すべてデフォルトでEnterのみ押します。

(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10/chromeos/config/i386 $ cd ../../..
(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10 $ ./chromeos/scripts/kernelconfig oldconfig
(略)
#
# configuration written to .config
#
Running splitconfig for armel
 

このスクリプトではi386だけでなくx86_64およびarmelの設定も必要に応じて同時に更新するようです。編集されたファイルを確認してみるとこんな感じになります。

(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10 $ git status
# On branch mykernel-3_10
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   chromeos/config/i386/common.config
#	modified:   chromeos/config/x86_64/common.config
#
no changes added to commit (use "git add" and/or "git commit -a")
 

i386だけでなくx86_64の設定も書き換わっているようです。

カーネルの再ビルドとChromium OSへの取り込み


これでカーネルの再ビルドの準備ができましたので、カーネルを再ビルドし、以前に実行したChromium OSのビルド結果に新しいカーネルを取り込みます。
カーネルの再ビルドと更新したカーネルのOSへの取り込みは、以下のコマンドで一気に実行できます。

(cr) (mykernel-3_10) chromium@Ubuntu12 ~/trunk/src/third_party/kernel/3.10 $ cd ../../../scripts/
(cr) ((c97f454...)) chromium@Ubuntu12 ~/trunk/src/scripts $ FEATURES="noclean" cros_workon_make --board=${BOARD} chromeos-kernel-3_10 --install
・・・しばらく待つ
>>> Auto-cleaning packages...

>>> Using system located in ROOT tree /build/x86-generic/

>>> No outdated packages were found on your system.
(cr) ((c97f454...)) chromium@Ubuntu12 ~/trunk/src/scripts $ 
 

FEATURES="noclean"を指定すると、変更したところが局所的ならその部分だけをビルドしますのでうまくいけば早くビルドが終わります。今回のケースは残念ながら全部ビルドになったようで時間がそれなりにかかりました。
ちなみに、最初のカーネルパッケージの選択を間違えると、ここで再ビルドも終わった後にエラーになって失敗します。ここまで来てエラーだと結構ショックがでかいですので気を付ける必要があります。

ビルドと取り込みが終わったら、変更内容がきちんと反映されているか確認します。
Chromium OSのビルド結果はchroot環境の/buildの下にあります。カーネルコンフィギュレーションファイルが/build/x86-generic/bootの下にあるので見てみます。

(cr) ((c97f454...)) chromium@Ubuntu12 ~/trunk/src/scripts $ cd /build/x86-generic/boot/
(cr) chromium@Ubuntu12 /build/x86-generic/boot $ grep PATA config-3.10.18 
# PATA SFF controllers with BMDMA
# CONFIG_PATA_ALI is not set
# CONFIG_PATA_AMD is not set
# CONFIG_PATA_ARTOP is not set
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_ATP867X is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CS5520 is not set
# CONFIG_PATA_CS5530 is not set
# CONFIG_PATA_CS5535 is not set
# CONFIG_PATA_CS5536 is not set
# CONFIG_PATA_CYPRESS is not set
# CONFIG_PATA_EFAR is not set
# CONFIG_PATA_HPT366 is not set
# CONFIG_PATA_HPT37X is not set
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_JMICRON is not set
# CONFIG_PATA_MARVELL is not set
# CONFIG_PATA_NETCELL is not set
# CONFIG_PATA_NINJA32 is not set
# CONFIG_PATA_NS87415 is not set
# CONFIG_PATA_OLDPIIX is not set
# CONFIG_PATA_OPTIDMA is not set
# CONFIG_PATA_PDC2027X is not set
# CONFIG_PATA_PDC_OLD is not set
# CONFIG_PATA_RADISYS is not set
# CONFIG_PATA_RDC is not set
# CONFIG_PATA_SC1200 is not set
CONFIG_PATA_SCH=y
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_SIL680 is not set
# CONFIG_PATA_SIS is not set
# CONFIG_PATA_TOSHIBA is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_VIA is not set
# CONFIG_PATA_WINBOND is not set
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_MPIIX is not set
# CONFIG_PATA_NS87410 is not set
# CONFIG_PATA_OPTI is not set
# CONFIG_PATA_PLATFORM is not set
# CONFIG_PATA_RZ1000 is not set
CONFIG_PATA_ACPI=y
# CONFIG_PATA_LEGACY is not set


うまく反映されているようです。

<4/19追記>

現在のChromium OSのソースコードではこの修正だけではVAIO Type Pでブートしませんこちらの記事も参照してください。

イメージの再作成


これでカーネルの置換が終わりました。前回の記事でいうとbuild_packageが終わったのと同じ状況です。後は前回と同様にChromium OSのディスクイメージを再作成してUSBメモリに書きだします。

(cr) ((c97f454...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ./build_image --board=${BOARD} --noenable_rootfs_verification dev
ひたすら待つ
INFO    : Elapsed time (build_image): 19m49s
To copy the image to a USB key, use:
  ./image_to_usb.sh --from=../build/images/x86-generic/R35-5682.0.2014_03_24_2142-a1
To convert it to a VMWare image, use:
  ./image_to_vm.sh --from=../build/images/x86-generic/R35-5682.0.2014_03_24_2142-a1 --board=x86-generic

(cr) ((c97f454...)) chromium@Ubuntu12 ~/trunk/src/scripts $ ./image_to_usb.sh --board=${BOARD}
No target device specified, autodetecting...
Found /dev/sdb: Sony Storage Media, 3.7 GiB
No image name specified, autodetecting...
Found default image chromiumos_image.bin
Copying image /mnt/host/source/src/build/images/x86-generic/R35-5682.0.2014_03_24_2142-a1/chromiumos_image.bin to device /dev/sdb...
WARNING : this will erase all data on /dev/sdb: Sony Storage Media, 3.7 GiB
Are you sure (y/N)? y
2.41GiB 0:10:39 [3.86MiB/s] [================================>] 100%            
617+1 レコード入力
617+1 レコード出力
INFO    : Elapsed time (image_to_usb.sh): 10m45s
Done.
 


作成したUSBメモリでVAIO Type Pをブートしてみます。

以前の記事で、USBメモリからブートする際にESCを押してコマンドを入力しないと起動しないと書きましたが、PATAドライバを組み込んだ後のUSBメモリであれば、ESCを押さなくても起動するようになっているはずです。ブート時に内蔵HDDが認識されることにより、内蔵HDDが/dev/sda、USBメモリが/dev/sdbと、Chromium OSの想定通りにデバイスファイル名が割り当てられるようになるためです。

あとは、GoogleアカウントでログインしてCtrl+Alt+Tを押してコンソールを起動し、

crosh> install

とすればHDDへのインストールが始まります。HDDの中身は全部消されますので、必要ならあらかじめバックアップを取っておきます。インストール中にWARNING one of the GPT header/entries is invalidという警告が出ますが、インストール自体はうまくいくようです。気になる方はGPartedなどでUSBメモリのGPTパーティションを修復をすればでなくなります。

インストールが終わったら再起動してHDDからうまくChromium OSがブートすれば成功です。
 
とりあえず今回はここまで。




[関連記事]

[悲報] Chrome R44でffmpegsumoが消えた
Dev serverによるChromium OSのアップデート
Chromium OSにパッケージを追加する
最近のChromium OS R35がVAIO Type Pで動かない件への対策
安定版ソースを使ってChromium OSをビルドする
勝手ビルド版Chromium OSとGoogleドライブの連携
Chromium OSをKVMで動かす
勝手ビルド版Chromium OSをVirtualBoxで動くようにする
Chromium OSのビルド環境を作る
Hexxeh版Chromium OSをVAIO Type Pにインストールしようとして挫折した話
VAIO Type PでChromium OSをUSBメモリからブートするときのメモ




ランキングに参加してみました。クリックしていただければ嬉しいです。

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

パソコン ブログランキングへ

拍手[1回]

PR


Comment
Name
Title
Mail
URL
Comment
Pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
ありがとうございます!すごいテクニックですね〜。
ryu 2014/03/25(Tue)00:44:08 編集
昨日から本日にかけ本当にお世話になりました。
参考(と言うよりはそのまま実行するつもりでですが、、、。)にさせていただきます!
自分はvgn-p70hでssd化してますのでテストケースとしてちょうど良いかと思います。
本当にありがとうございます!
無題
ryu 2014/03/27(Thu)03:01:30 編集
こんばんは。escキーなしで起動一歩手前までいきましたが(一度chromeosの起動画面は出ます。)、カーネルでループして先にすすみません。
ビルド失敗でしょうか?
か、pataの有効化を増やさなければならいのでしょうか?
USBメモリ用イメージを公開しました。
zui 2014/03/27(Thu)22:59:15 編集
ryu様

この記事で作成したUSBメモリ用イメージを公開してみました。本文にリンク先を追記しています。
ただ、記事の通りにやられたのであればこれを使ってもうまくいかない可能性が高いと思います。

固まったように見えてもChromium OS自体は起動している可能性が高いです。現象が発生したらCtrl+Alt+F2を押してターミナルが表示されるか確認してみてください。

ターミナルが表示されたらユーザchronos, パスワードpasswordでログインできるので
/var/log/messageおよび/var/log/Xorg.0.logの内容を確認し、エラーがないか見てみることをお勧めします。

いい機会ですので自分なりにビルドしたChromium OSが動かなかったときのチェックポイントを記事にまとめてみようと思いますが、投稿までは数日かかると思います。
やはりこちらのビルドの失敗だったようです。
ryu 2014/03/28(Fri)02:00:13 編集
お世話になります。
イメージダウンロードさせて頂き、早速試してみました。
結論は成功です。こちらのコメントもvaio p にインストールしたchrome osから記入しております。
ありがとうございました。
こちらのイメージはwindows上でusbにイメージを書き込み作成しましたが大丈夫でした。
やはりこちらのビルドの仕方に問題があったようです、、、。いい勉強させていただきました。
じつは私の他にもvaio pで困ってる人がいるのですが、このページ紹介してもよろしいでしょうか?
無題
zui 2014/03/28(Fri)06:47:10 編集
動いたようでよかったです。

すでにネット向けに公開している内容ですし、ご紹介いただくのは構いません。
ビルドしても起動しない件について
zui 2014/04/19(Sat)21:08:47 編集
以前コメントで起動しないというお話がありましたが、以下の記事で書いた内容が原因かもしれません。
http://pcmemo.take-uma.net/chromium%20os/r35_boot_failed

参考にしていただければと思います。
  HOME   24  23  22  21  20  19  18  17  15  14  13 
プロフィール
HN:
zui
性別:
非公開
PR
忍者カウンター
忍者ブログ [PR]