2009年11月22日日曜日

GoogleのChromeOS、ビルド挫折の記録

まだ上手くいってないものの、ビルドに必要な情報を日本語でメモした内容。 Ubuntuは入れてないので、Debian lennyで挑戦中。
OSの構築
http://sites.google.com/a/chromium.org/dev/chromium-os/building-chromium-os/build-instructions

……の適当な和訳になります。
勝手に番号をつけてしまっていますが、大体以下のような手順。
青字で、個人的なメモが付け加えられてます。
前のページ同様、情報は更新され、ビルドの方法も変化していく可能性があります。

私の現状:ログイン後マウス、キーボードの反応がない
または、マウスカーソルが動いてもクリックに何の反応もなかったり



1 前準備
1.1 シンボリックリンクの作成
1.2 構築環境の準備(レポジトリ?)
1.3 chrootで入る構築環境を作る

2 構築
2.1a chromiumを作る(おまけ)
2.1b chromiumをダウンロードする
2.1a,bはどちらか一方のみ必要。aで自分でビルドするか、bでバイナリをダウンロードする。
2.2開発のための準備 (ログイン用アカウントということで、作成を推奨したい)
テストのためのセキュリティの低いアカウント
(共同で使えるアカウント、パスワードの作成)
一人で独自の開発をしない人は必要なし?
2.3 パッケージのビルド
2.4 イメージ作成
2.5 USB メモリにインストール
ブート可能なイメージであり、HDDにインストールしたい場合もこの中から行う。
2.6 ハードディスクにインストール
USBでブートした状態からインストールする様子です。HDDがまっさらになる可能性あり。
2.7 VMware用イメージの作成
2.8 chroot環境を消す方法

+おまけ:HDD上のイメージにchrootした状態からHDDへのインストールに挑戦して挫折


2.2までの準備がうまくいけば、あとの実質的なビルドは自動で進行するはず
2.5でUSBに入れるまでが必要な手順で、以降はおまけみたいなもの。
現状、開発者はHDDに入れることはあまり考えていない様子?

1.1このシンボリックリンクがあるという前提で進んでいくので、とても重要な準備です。
$ln -s /usr/local/chromiumos/chromiumos.git ~/chromiumos
$ln -s /usr/local/chromium/trunk ~/chromium


これは/home/username以下にchromeOS,chromiumのシンボリックリンクを作るための命令です。

/usr/local/chromiumos/chromiumos.gitは、gitで入れた場所であり、他の場所にファイルがあるならそこからということになるでしょう。


なくてもいいですが、これで2種類のsrcディレクトリに直接アクセスできるようになるため、大変便利です。
……とあるものの、ここを間違えたり省略したりすると上手くいきませんでした。
~/chromeos, ~/chromiumの真下にそれぞれのsrc/ディレクトリが見えるよう、ちゃんと確認しましょう。

1.2
必要なスクリプトはすべて~/chromiumos/src/scriptsに入っています
以下の操作は、このディレクトリに入っていることを前提に進めます。
$cd ~/chromiumos/src/scripts
~/chromiumos/repo:にレポジトリを作ります。(必要なファイルのリストアップなど?)
$./make_local_repo.sh

#ここで一度詰まりましたが、上のシンボリックリンクの張り方が間違えていた点、一度失敗したら
$sudo rm -rf ~/chromiumos/repo
で一度repoディレクトリを削除しないといけない点などが問題でした。
debootstrapで30分ほどかけて、必要なファイルを集めます。repo以下に850MBほど使用。
repreproが必要?とかで詰まった。
続chromiumはDebianではビルドできない? - kinneko@転職先募集中の日記http://hatenatunnel.appspot.com/kinneko/20091120/p8
私のほうでは、リンクをちゃんとユーザーのホームディレクトリ直下に張りなおして、一度repo/ディレクトリを削除したらうまくいった・・・と思う。
必要なパッケージはこれの前に作ったページどおり。1,2パッケージ以外はちゃんと入ったし、上のldの問題も出なかった。特に特殊なものはインストールしてない状態です。
けど、最終的に作成されたイメージ+私の環境ではマウスが動かせてないんですけどね・・・

これでうまくいかなければ、debootstrapでkarmic環境を作ります。
karmic.listというファイルに以下3行の内容を書き込む
deb http://build.chromium.org/buildbot/packages chromeos_dev main restricted
deb-src http://build.chromium.org/buildbot/packages chromeos_dev main restricted
EOF

この内容をapt-getに登録
$sudo mv karmic.list /etc/apt/sources.list.d/karmic.list
$sudo apt-get update
$sudo apt-get install -y --force-yes debootstrap
$rm /etc/apt/sources.list.d/karmic.list
$sudo apt-get update
新しいdebootstrapを入手し、その後、下の2行でaptのリストを元通りに戻している様子です。

で、もう一度
$./make_local_repo.sh
を実行すれば大丈夫なはず。
それでも駄目なら、
$sudo ln -s /usr/share/debootstrap/scripts/gutsy /usr/share/debootstrap/scripts/karmic
と入力してから./make_local_repo.sh

1.3 スクリプトを利用し、chroot環境を作成する。chromiumos/以下にchroot/ というディレクトリが作成されます。
$./make_chroot.sh

必要なパッケージをダウンロードする場合、etc/apt/sources.listを参照しています。
もし新しい方法に挑戦する場合など(他のプロセッサを利用してビルドする)、ひょっとしたらもっと新しいパッケージが必要になるかもしれません。
そのときは、以下のようにしてapt-getが参照するミラーサイトを指定してください。

$./make_chroot.sh --mirror=http://build.chromium.org/buildbot/packages --suite=chromeos_dev

ここの手順でも、失敗したらそのたびにchroot/ごと削除しないといけません。
正常にchroot環境が構築できた後、 chroot環境を安全に削除するに、
$./make_chroot.sh --delete
というコマンドがあることが判明します。
これは、今後chroot環境で作業を行った際、システム、デバイス関連のディレクトリをマウントしてあった場合など、それらのファイルまで強制的に削除しようとしてしまうことを防ぐ目的がある様子です。
chroot環境の構築に失敗した場合も、こちらを利用してもいいかもしれません。

2.1a chromiumのビルド
$./build_chrome.sh --chrome_dir ~/chromium
--chrome_dirにはchromiumのソースがあるディレクトリを指定。
上の例(オフィシャルな説明)では、/usr/local以下にあるものをシンボリックリンクでユーザーのホームディレクトリ(/home/user/)の真下にリンクさせているため、このようになります。
必要なファイルが足りないとかでビルド中にエラー
2.1bでバイナリを入手することに

あとで必要になるかも知れない情報……
ソースの入手、内容の確認方法
Get the Code (The Chromium Projects)
http://dev.chromium.org/developers/how-tos/get-the-code

chromium単体でのビルド方法のページ
LinuxBuildInstructions - chromium - Build instructions for Linux - Project Hosting on Google Code
http://code.google.com/p/chromium/wiki/LinuxBuildInstructions


2.1b chromiumのバイナリデータの入手
Download the binaryからzipファイルを入手し、それを~/chromeos/src/build/x86/local_assets以下に置く。バイナリデータのファイル名はchrome-chromeos.zip
私の場合、ダウンロードしたファイルはDesktopにあるので、
$mkdir -p ~/chromeos/src/build/x86/local_assets
$cp /home/username/Desktop/chromium-chromiumos-r32516.zip /chromeos/src/build/x86/local_assets/chrome-chromeos.zip
のようにする。


ここから、 chromeOSのビルド環境へ
$./enter_chroot.sh
(/home/username/chromeos/src/scripts/#にて、./enter_chroot.sh)
chroot環境に入れば、(chroot)$src/scriptみたいに表示されているはず

2.2 開発のための準備 (ログイン用アカウント作成)
インストールそのものには不要な(はずな)ので、とばしました
…が、どうやらここでアカウントを作成しといたほうがいいらしい。
そうしないと、ネットワークにつないだ状態でgoogleのアカウント、パスワードを入れないといけない。
$cd ../platform/pam_google && ./enable_localaccount.sh USERNAME
$cd ../../scripts && ./set_shared_user_password.sh

Enabling local account. Remove chromeos_pam_localaccount.h to disable.
というメッセージが出ますが、一度設定したローカルアカウントを取り消すために消すファイルはpam_localaccount.hのようです。
このファイルは、src/platform/pam_google/に置いてある状態でビルドする必要があるのでしょうか。一度このディレクトリに移動し、このディレクトリでファイルを作成したあと、もう一度src/scriptのディレクトリに戻ります。

2.3 Chrome OSパッケージのビルド
$./build_platform_packages.sh
$./build_kernel.sh


一度に進めるなら、
$./build_platform_packages.sh && ./build_kernel.sh
でいいんですが、エラーが出ると、2つのコマンドのうちどこで詰まったのか分からない。
エラーを見るためには、
./build_platform_packages.sh >logp1.txt 2>logp2.txt &&
./build_kernel.sh >logk1.txt 2>logk2.txt &
で、*1.txtにビルドの手順が、*2.txtにエラーメッセージが出力される。
CUIで作成するときには20行くらいしか保持されないので、有用。
上の方法で作成すると、ビルドの進行状況が確認できなくなるが、tail -f logp1.txtと入力すればlogp1.txtに書き込まれていく内容を随時追っていける。
tail -fを終わりにするときはctrl+c



パッケージのビルドはうまく行かなかったことがありました。
http://codf196.jail.google.com/archive/chrome-official/4.0.250.2/chrome-linux.zip
が必要だけどホスト名の間違いかサービス不在かでダウンロードできないとかで止まっていたのですが、足りていなかったファイルというのはchromium(ブラウザ)の実行形式ファイルで、このアーカイブのファイル名か置き場所が間違っていた様子です。ファイル名を変更するか、上に記した置き場所にちゃんと置いてあるかどうかを確認してみてください。

カーネルのビルドは問題なくうまくいきました。
ただし、この時点でchromeosディレクトリの容量が4Gほどになっていて、ディスク容量が一度たりなくなってしまいました。

エラーで中断されてやりなおしの場合、途中からではなく最初から全部やり直している?無駄に時間がかかってます。


2.4 USBメモリ用イメージ作成
$./build_image.sh
デフォルトでは、イメージは ~/chromiumos/src/build/imagesに作成されているはず

USBメモリ用イメージとして作成される場合、どの程度の容量が必要とされるか気になっていたところですが、
(chroot)user@pc1:~/trunk/src/scripts$ ls -hl ../build/images/999.999.32809.114410-a1/
total 710M
-rw-r--r-- 1 user eng 512 Nov 24 12:02 mbr.image
-rw-r--r-- 1 root root 40K Nov 24 12:01 package_list_installed.txt
-rw-r--r-- 1 root root 40K Nov 24 12:02 package_list_pruned.txt
drwxr-xr-x 2 user eng 4.0K Nov 24 11:44 rootfs
-rw-r--r-- 1 user eng 950M Nov 24 11:44 rootfs.image

ということで、950MB必要ということで、1GB以上のUSBメモリが必要になるようです。
……と思ったら、なぜかこのrootfs.imageの2倍+mbr.image分を確保するよう、インストールのスクリプトが書かれています。
それであっても2GBで足りそうですが、なぜか上手くいきませんでした。ちょっとだけ足りていない様子。
書き込みに必要とする容量は1992294912(byte)で、2GBのUSBメモリは2032140288(byte) availableとあったのに、足りてないと表示され、インストールが中断されます。
4GB以上のUSBメモリで動作する様子。他の人のページに書いてあったことによると、16GBのUSBメモリとかでも大丈夫らしいので、4GB以上の容量ならどれも問題ないのでしょう。

civic site » Chrome OSのビルドとインストールについて

http://civic.xrea.jp/2009/11/20/chrome-os/


2.5 USBメモリへのインストール
ブート可能なUSBメモリを作成します。3GB以上の容量が必要になり、…実際には3GBのUSBメモリは見かけないので、4GB以上のものということになるでしょう。
そこからHDDへのインストールも可能です。(場合によっては、このイメージの中に入ってしまえば、そこから直接HDDにイメージを作成できるのかもしれませんが……)
~/chromiumos/src/build/images/SUBDIR #SUBDIRはbuild_image.shによって作成され、ここに新しいイメージが入っています。

$cd ~/chromiumos/src/build/images/SUBDIR
$sudo mount -o loop rootfs.image rootfs
$sudo chroot rootfs

これでイメージに入っているはず
どの程度の容量を使っているかを確認してみるには、

$df
$dpkg -l


イメージの中から出るには

$exit
$sudo umount rootfs

このようにして、exitでchroot環境から脱出できる。

例:
$cd ../build/images/999.999.32809.114410-a1/
$sudo mount -o loop rootfs.image rootfs
$sudo chroot rootfs


もしくは、
$sudo mount -o loop .
./build/images/999.999.32809.114410-a1/rootfs.image ../build/images/999.999.32809.114410-a1/rootfs
$sudo chroot rootfs

dpkg -l は大量に出てくるのでいまいち意義がわかりませんが、dfのほうは、

(chroot)user@pc1:~/trunk/src/build/images/999.999.32809.114410-a1$ sudo chroot rootfs
root@pc1:/# df
df: cannot read table of mounted file systems: No such file or directory
root@pc1:/# exit
exit
(chroot)user@pc1:~/trunk/src/build/images/999.999.32809.114410-a1$ df -h
Filesystem Size Used Available Use% Mounted on
sysfs 9.2G 5.3G 3.5G 60% /sys
/dev/loop1 936M 589M 299M 67% /home/user/trunk/src/build/images/999.999.32809.114410-a1/rootfs

と、なりました。

USBへのコピーはchroot環境から出てから。
(USBメモリが見えていないなら、きっとあなたはchroot環境の中にいるのでしょう。)
$./image_to_usb.sh --from=~/chromiumos/src/build/images/SUBDIR --to=/dev/USBKEYDEV

--toはUSBメモリのあるディレクトリ。
数字なしのsda,sdbで指定しないといけない?
基本的にfromは最も新しいイメージを、toは/dev/sdbを指定してそこにインストールするようになっている。だから、それでいいなら、この2つのオプションは省略できます。

linuxのカーネルが2.6.27あたりから?/dev/hdaなどではなくhddもUSBメモリもsdaであらわされるようになりました。これ、scsiの表示なのかな?シリアルATAならsで始まっててもおかしくないんだけど。
それ以前のカーネルだと、usbメモリはsdaだったりすることもあると思います。
使用するChromiunOSのイメージのほうも、古いイメージを使うときにはそちらを指定する必要があるんですが、そうでない場合、イメージの場所は基本的に省略していいのだと思います。

USBのメモリには、1Gほどの空き容量、1Gほどのスワップ領域を確保した上で1Gのイメージを書き込んでいる様子?3Gほど使い、1Gほど容量は余ってはいました。そこに新たなパーティションを作成し、その領域を普通のUSBメモリとして使用することも可能。


$./image_to_usb.sh --to=/dev/USBMEMORY
あたりでしょうか。


2.6 HDDへの(インストール)
この項目には、あなたのHDDにダメージを与える可能性があります。
(詳しい意図はわかりませんが、HDDをnuke=暖める……ダメージを与える?可能性が示唆されています。)
どうやら、HDD1つにまるまるインストールしてしまう形になるようです。
USBメモリからブートしてから
、ログイン後、Ctrl+Alt+Tでターミナルを起動し、以下のコマンドを入力
$/usr/sbin/chromeos-install /dev/hddname

これでインストール開始。インストールに十分な容量(1GBほど?)があるコンピュータに入れましょう。

デフォルトのインストール先は/dev/sda。
つまり、ハードディスクをまっさらにしてそこに入れなおすことになります。
インストール先を指定する場合も、特定のパーティションを指定することは難しいかもしれません。

USBメモリから起動し、キーボードからID、パスワードを入力してログインするところまでは行けたんですが、Ctrl+Alt+Tでターミナルが起動しなかった。USBマウスも動かない。なにもできないので強制終了させました(ログインまではできたんですが)


ちなみに、ログイン時にgoogleアカウントでログインする際、メールアドレスが必要になることもあります。 (gmail以外のメールアドレスをメインのメールアドレスに設定している場合)
その際、@を入力する必要がありますが、日本語用キーボードでは@の位置が少しおかしい。
私はshift+2で出力できました。 キー配置が日本語用(109)に対応していないためか、ちょっと混乱する


それと、rootfs.imageの容量は1G以下なのですが、イメージ書き込みの前にrootfs.imageの2倍の容量を確保し、cat rootfs.image >>$FLAGS_outみたいな方法で書き込んでいる様子。
なぜ2倍必要なのかわかりませんが、この2倍の容量を確保する分を減らしてみたりすると確かに上手くいかない。
書き込みは終了したのですが、ブートできなかった。
そして、スクリプトをいじって小さな容量のディスクに入れようとするとUSBメモリがうまく使えなくなる可能性はあります。ちゃんと直りましたが。スクリプト内部をいじらなければ問題ないです。
開発作業を効率化するためのアカウント、ユーザーの作成時にローカルユーザーのアカウントを作成しておかないと、googleにログインするためのアカウントが必要で、さらにネットにつながってないといけないらしい。作成しておくべきでした。
http://d.hatena.ne.jp/r_kurain/20091121/1258768687
また、私のノートPCはUSBから起動できないっぽいので、この状態だとちょっと上手くいきません。そこもなんとかしたいです。

2.7 vmware用イメージ作成
$./image_to_vmware.sh --from=~/chromiumos/src/build/images/SUBDIR \ --to=~/chromiumos/src/build/images/SUBDIR/ide.vmdk

from,to共に省略可能。
$./image_to_vmware.sh で、/home/username/src/build/images/999.999.32809.114410-a1/以下にide.vmdkができると。

2.8 chroot環境の削除
$./make_chroot.sh --delete
でいいようです。
レポジトリとかも消えるのでしょうか?消えないなら、chromeos/自体を消すほうがいいかもしれません。
その際、sudoを使って色々作ってあるので、ルートアカウントを使って削除しないといけないものが出てきます。多分。


さらに、ちょっとだけ……
イメージファイルにログインした状態からhddの空きパーティションへのインストールにも挑戦してみました。
build/image/subdir/rootfs/をホームディレクトリにするので、そこ以下に必要なハードウェアデータを入れていけばインストールできるんじゃないかと。

$cd /home/username/src/build/images/999.999.32809.114410-a1/
$sudo mount -o loop rootfs.image rootfs
$sudo mount --bind /sys ./rootfs/sys
$sudo mount --bind /dev ./rootfs/dev
$sudo mount proc -t proc ./rootfs/proc
$sudo chroot rootfs
root@pc1:/# /usr/sbin/chromeos-install /dev/hda7 true
Note: You must be the 'chronos' user to run this script.
Usage: /usr/sbin/chromeos-install [destination_device] [skip_source_removable_check]
…というわけで、このコマンドの実行用にはchronosというアカウントが用意されています。

他のアカウントからこのコマンドが実行できないのかどうかは未検証。chronosかどうかをチェックしてるところをごまかせばいいのかもしれないけど、sudoを使うので、他のアカウントから使用する際は/etc/sudoersを修正する必要あり。
新しく作ったローカルユーザーからでは利用できないのか?……そもそも、googleのアカウントでログインした場合はこのchronosとしてログインしたことになっているのか?このへんはよくわかりません。

ちなみに、金属の
クロムは、クロノスとはあまり関係なさそうに見えます。

しかしchronosで作業するにしても、イメージファイル内から su chronosした後sudo 使用時にパスワードを聞かれるのですが、そのパスワードがわかりませんでした。
chpasswdを受け付けてくれず、しかしこのスクリプトはchronosでなくては動かない様子なので、このアカウントを一度削除し、もう一度作成する際にパスワードを自力で設定しました。
そして削除時にsudoの利用可能アカウントからも除外されてしまうので、/etc/sudoersを編集。
#delluser chronos
#adduser chronos
#vi /etc/sudoers
その後、/usr/sbin/chromeos-install を編集してexit 1 をいくつかコメントアウト。危ないかもだけど。
最後のtrue は、skip_source_removable_checkへの返事なのですが、チェックの必要がない、チェックをしたくないという場合、trueと書く。$2(2つ目の引数)を読むため、これを指定するためには1つ目の引数としてインストール先も指定する必要がある。
HDD1つを使うわけにはいかなかったので、/dev/hda7を指定してみました。
/sys/block/hda/hda7/にある情報を見に行かず、/sys/block/hda7/を参照しようとしてスクリプトが停止することが何度かありました。
そのあたりのexit 1をコメントアウトして強行突破してみたのですが、結局、目的のパーティションをさらにいくつもに切り分けようとしてfdiskのエラーがでて停止。
現状、PC一台をchromeOS用PCに出来る状態じゃないとインストールは無理そう。
USBメモリから起動した状態で、マウスやらキーボードからの入力を受け付けるようになれば、今はそれでいいです。他のOSと共存できるようになるまではHDDに入れない方向でいくことになるでしょう。

……ディスクいっぱいに入れてしまうのなら、image_to_usb.shでハードディスクを指定してしまえば書き込めるかもしれません……いや、MBRとかあるから駄目ですか。


現段階での希望
・USBメモリ1GBのものに書き込めるようにしてほしい
・HDDにはCDR1枚から書き込みたい
・できればリブートなしで、イメージファイルとかから他のパーティションに書き込んでしまいたい
・HDD1つでマルチブートしたい。
・秋山瑞人のEGFが読みたい。ミナミノも読みたい。

こんなとこです。
もう、このページの更新はしないでしょう。次に書くことがあるとしたら、また新しいページになると思われます。

0 件のコメント: