明日、TV JACK 1000のライブだけど雨降るとヤだな

今は晴れているんだけどな。
_ Debian Sid上でChromium OSをビルドしてみた
昨日の夜中、突発的にDebian Sid上でChromium OS(オープンソース版Chrome OS)をビルドしたくなったので作業の記録を残しておきます。
ビルドプラットフォームとしてubuntu(Hardy 8.04以上、Karmic 9.10推奨)となっていますが、ビルドでubuntuに依存したの部分はなかったので、ひっかかることはないと思います。 ビルドの手順は Getting and Building a Chromium-Based OS (The Chromium Projects)に書いてある通りに進めました。
ビルド準備
作業ディレクトリ作る
$ mkdir chromiumos
$ cd chromiumos
パッケージのインストール
ビルドに必要なパッケージをインストールします。gitとQEMUは必須なのでインストールします。
$ sudo aptitude install git-core qemu
他にChromiumをビルドするためのパッケージもいれておきます。
$ sudo aptitude install subversion pkg-config python perl g++ g++-multilib bison flex gperf libnss3-dev libgtk2.0-dev libnspr4-0d libasound2-dev libnspr4-dev msttcorefonts libgconf2-dev libcairo2-dev libdbus-1-dev
depot_toolsのインストール
gitリポジトリからChromium OSを持ってくるために必要なgclientスクリプトが、depot_toolsというスクリプト集に収められているのでダウンロードします。
Subversionでチェックアウト
$ svn co http://src.chromium.org/svn/trunk/tools/depot_tools
gclientにパスを通す
$ export PATH=`pwd`/depot_tools:"$PATH"
ChromiumOSのソースをダウンロードする
ソースコードをダウンロードするにはtarボールをダウンロードする方法とgitリポジトリからダウンロードの二つの方法がありますが、ここではgitからダウンロードしました。
$ gclient config http://src.chromium.org/git/chromiumos.git
$ gclient sync
リポジトリから持ってくるのはとても時間がかかるので、とりあえず放置して別の事をしてるといいでしょう。
ChromiumOSのビルド
ビルド環境のセットアップに書いてある、シンボリックリンクを貼るのはオプションなので飛ばしました。 Chromium Browserのソースリポジトリがあってビルドする場合は、Build Instructionを参考にシンボリックリンクを貼ります。
ローカルリポジトリの作成
$ cd chromiumos.git/src/scripts/
$ ./make_local_repo.sh
make_local_repo.shを実行すると、debootstrapでubuntuのパッケージを取ってきたりしているみたいです。 これも時間がかかります。
ビルド環境の作成
書いてある通りにmake_chroot.shを実行します。
$ ./make_chroot.sh
Processing triggers for initramfs-tools ...
Processing triggers for python-support ...
All set up. To enter the chroot, run:
(作業ディレクトリ)/chromiumos.git/src/scripts/enter_chroot.sh
CAUTION: Do *NOT* rm -rf the chroot directory; if there are stale bind
mounts you may end up deleting your source tree too. To unmount and
delete the chroot cleanly, use:
./make_chroot.sh --delete
chroot環境に入るにはenter_chroot.shを実行。 chroot環境を消すときは rm -rf は使わず、削除スクリプト ./make_chroot.sh --delete を使わないといけないとのこと。
Chromium(ブラウザ)の準備
ここでChromium Browserのビルドとなるけど、ビルドされたものを利用してもいいそうなので、そうすることにします。
ダウンロードしたzipファイルを _(作業用ディレクトリ)/chromiumos/src/build/x86/localassets/ に chrome-chromeos.zip という名前で置きます。
$ cd ~/(作業ディレクトリ)
$ mkdir -p chromiumos.git/src/build/x86/local_assets/
$ cd chromiumos.git/src/build/x86/local_assets/
$ wget http://build.chromium.org/buildbot/archives/chromium-chromiumos-r32516.zip
$ mv chromium-chromiumos-r32516.zip chrome-chromeos.zip
ビルド環境にchrootで入る
$ cd (作業ディレクトリ)/chromiumos.git/src/scripts/
$ ./enter_chroot.sh
ローカルユーザーアカウントを有効にする
ChromeOSのログインアカウントは、Googleのアカウントですが、開発するにはローカルでログインできた方が都合がいいのでローカルユーザーを追加しました。 名前はchromiumosとしてみました。
(chroot):~/trunk/src/scripts$ ( cd ../platform/pam_google && ./enable_localaccount.sh chromiumos )
Enabling local account. Remove chromeos_pam_localaccount.h to disable.
(chroot):~/trunk/src/scripts$
共有ユーザーパスワードを設定する
ローカルユーザーのパスワードを設定します。パスワードもchromiumosにしました。
(chroot):~/trunk/src/scripts$ ./set_shared_user_password.sh
Enter password for shared user account: chromiumos
Shared user password set in /home/hoge/trunk/src/scripts/shared_user_passwd.txt
パッケージとイメージのビルド
パッケージとイメージのビルドですが、 _Build the packages (note you can use buildall.sh to run all these steps together) と書いてあるので、 _buildall.sh を見るとパッケージのビルドとテスト、イメージのビルドとテストを連続して実行してくれるそうなので、こちらを使うことにします。
(chroot):~/trunk/src/scripts$ ./build_all.sh
ビルド途中で寝てしまったので、どれだけ時間がかかるのか計っていませんが、かなり時間がかかると思います。
イメージの確認
ビルドできたらイメージの確認をしろということなのでします。
~/trunk/src/build/images/999.999.33109.163647-a1 にイメージがあるので
(chroot):~/trunk/src/scripts$ cd ~/trunk/src/build/images/999.999.33109.163647-a1
(chroot):~/trunk/src/build/images/999.999.33109.163647-a1$ ls -lah
total 793M
drwxr-xr-x 3 jun eng 224 Nov 27 16:41 .
drwxr-xr-x 3 jun eng 88 Nov 27 16:36 ..
-rw-r--r-- 1 jun eng 512 Nov 27 16:41 mbr.image
-rw-r--r-- 1 root root 42K Nov 27 16:40 package_list_installed.txt
-rw-r--r-- 1 root root 42K Nov 27 16:41 package_list_pruned.txt
drwxr-xr-x 2 jun eng 48 Nov 27 16:36 rootfs
-rw-r--r-- 1 jun eng 950M Nov 27 16:36 rootfs.image
システムだけだと950MBなんですね。
イメージをマウントして、できたイメージの中にchrootで入ります。
(chroot):~/trunk/src/build/images/999.999.33109.163647-a1$ sudo mount -o loop rootfs.image rootfs
(chroot):~/trunk/src/build/images/999.999.33109.163647-a1$ sudo chroot rootfs
インストールされているパッケージを見ました。
$ dpkg -l
ii chromeos-acpi 0.1 chromeos acpi scripts
ii chromeos-assets 0.3 Chrome OS platform assets
ii chromeos-chrome 0.1 chromeos chrome
ii chromeos-connman 0.3 connman
ii chromeos-cryptohome 0.1 Helper scripts which smooth the integration of
ii chromeos-init 0.3 Chrome OS init scripts
ii chromeos-installer 0.1 Chrome OS installer
ii chromeos-libcros 0.1 Chrome OS plug-in library for Chrome
ii chromeos-login 0.4 Chrome OS login manager
ii chromeos-monitor-recon 0.1 Small module that will reconfigure an external monitor to th
ii chromeos-pam-google 0.10 Linux-PAM module to authenticate against Google
ii chromeos-ply-image 0.1 Chrome OS boot splash image loader.
ii chromeos-screenlocker 1.0-1 Screen locker configuration for Chrome OS. Includes custom
ii chromeos-wm 0.4 Chrome OS window manager
ii chromeos-wpasupplicant 0.1 wpasupplicant
Chrome関係のパッケージですね。initとかloginとかpamとか面白いそうなものがあったり、Window Managerがオリジナルのものだったり興味深いですね。
ii anthy 9100h-0ubuntu1 input method for Japanese - backend, dictionary and utility
ii ibus 1.2.0.20090927-1~ppa1 New input method framework using dbus
ii ibus-anthy 1.2.0.20090813-2 anthy engine for IBus
ii ibus-chewing 1.2.0.20090818-2 chewing input engine for IBus
ii ibus-gtk 1.2.0.20090927-1~ppa1 New input method framework using dbus
ii ifupdown 0.6.8ubuntu19 high level tools to configure network interfaces
ii im-switch 1.16ubuntu1 Input method switch framework
あれ? iBusとanthyが入ってる? Chrome OSは日本語に対応していないというけれど、Language Packが入ってないので、入れれば問題解決するんじゃない? と、いじりがいありそうと思ったところで無事できているようなのでexitで抜けます。
$ exit
(chroot):~/trunk/src/scripts$ sudo umount rootfs
イメージのチェックが終わったので、スクリプトディレクトリに戻ります。
(chroot):~/trunk/src/scripts$ cd ~/trunk/src/scripts
USBメモリにイメージを書き込む
できあがったイメージをUSBメモリに書き込みます。といいたいのですが、今回は手元にSDカードがあったのでSDカードに書き込みました。
今までビルドのためにchroot環境で作業をしていましたが、注意書きに Do this outside the chroot environment. と書いてあるのでchroot環境から抜けます。
(chroot):~/trunk/src/scripts$ exit
$ pwd
(作業ディレクトリ)/chromiumos.git/src/scripts
元の環境に戻ったらfdiskでSDカードのデバイスを調べます。
$ sudo /sbin/fdisk -l
で見るとSDカードが/dev/sdbにあることがわかったので
$ sudo ./image_to_usb.sh --from=../build/images/999.999.33109.163647-a1/ --to=/dev/sdb
という感じで書き込みました.
VMwareイメージを作る
SDカードの書き込みにはroot権限が必要なのでsudoをつけましたが、VMwareイメージ作成は必要ないだろうと思ってsudoなしで実行すると
$ ./image_to_vmware.sh --from=../build/images/999.999.33109.163647-a1/ --to=../build/images/999.999.33109.163647-a1/ide.vmdk
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.00010848 s, 9.2 kB/s
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.0001476 s, 6.8 kB/s
./image_to_vmware.sh: line 43: mkfs.ext3: コマンドが見つかりません
あら? mkfs.ext3は/sbin/mkfs.ext3なので通常、ユーザーはパスが通ってないですね。 ということで _image_tovmware.sh の該当個所をフルパスに書き換えて sudo をつけてもう一度。
*** image_to_vmware.sh.orig 2009-11-27 23:22:10.000000000 +0900
--- image_to_vmware.sh 2009-11-28 07:25:39.000000000 +0900
***************
*** 40,46 ****
seek=$(( $PART_SIZE - 1 ))
dd if=/dev/zero of="${FLAGS_from}/state.image" bs=1 count=1 \
seek=$(( $PART_SIZE - 1 ))
! mkfs.ext3 -F -L C-STATE "${FLAGS_from}/state.image"
# Copy MBR and rootfs to output image
qemu-img convert -f raw \
--- 40,46 ----
seek=$(( $PART_SIZE - 1 ))
dd if=/dev/zero of="${FLAGS_from}/state.image" bs=1 count=1 \
seek=$(( $PART_SIZE - 1 ))
! /sbin/mkfs.ext3 -F -L C-STATE "${FLAGS_from}/state.image"
# Copy MBR and rootfs to output image
qemu-img convert -f raw \
$ sudo ./image_to_vmware.sh --from=../build/images/999.999.33109.163647-a1/ --to=../build/images/999.999.33109.163647-a1/ide.vmdk
無事終了。VMwareイメージはrawイメージ作成後qemu-imgを使ってVMware形式に変換しているだけなので、ちょっと変えればVirtualbox用やKVM用イメージも作れそうです。
eeePC 900Aで起動してみる
コールドブートで20秒ほどで起動しました。 以前Bit Torrentを使ってダウンロードしたイメージを使って試していたので感動はないけれど、こんなものでしょうか。 ベースがubuntu 9.10なので余裕で無線LANも認識。
インストールしてみる
eeePC 900AはテストマシンなのでSSDにインストールしてみました。
ログイン後 Ctrl+Alt+T でターミナルを開き、 /usr/sbin/chromeos-install を実行するとインストールできます。
$ /usr/sbin/chromeos-install
Using source USB device with label: C-ROOT
This will install from '/dev/sdb' to '/dev/sda'. If you are sure this is
what you want then feel free to enter the root password to proceed.
[sudo] password for chronos: (ビルド時に設定したパスワードを入れる)
(ddで書き込んだりブートローダーを書き込んだり処理するので待つ)
Installation to '/dev/sda' complete.
Please shutdown, remove the USB device, cross your fingers, and reboot.
書き込みが終わったら再起動します。 ちなみにChromiumOSのシャットダウンは電源ボタンです。家電感覚ですね。 (といっても最近のOSは電源ボタンを押すとシャットダウン処理が走るようになってるので、普通といえば普通なんですが)
eeePCのSSDから起動する
初回起動時はBIOSから起動するので、SDカードからの起動と変わらない起動時間でしたが、2回目からBIOSとブートローダーを飛ばして起動するので7〜8秒で起動します。これは感動しますね。
BIOSとブートローダーを飛ばして再起動というと、kexec使ってる? カーネルの設定/boot/config-2.6.31.4-chromeos-intel-menlowを見ると
CONFIG_KEXEC=y
となってるので、おそらくそうだと思います。
ブートローダーはgrubでもliloでもなくext2/3用SyslinuxのEXTLINUXを使ってます。 雰囲気的にはLiveシステムっぽいです。
iBusとAnthyについて追記
@nogajun blogのIBusの件ですが、ctrl-alt-tでターミナルを開いて、ibus-daemon& を起動し、ibus-setupコマンドを起動しAnthyをAddしてやれば、Chrome内でctrl+spaceで日本語入力できるようになると思われます。ご参考まで
twitterで教えてもらったので試してみました。
- Ctrl+Alt+Tでターミナルに入る。
- ibus-daemon & でibus-daemonをバックグラウンドで起動。
- ibus-setup を起動して[Input Method]タブからAnthyを追加する。
とりあえずは、これで日本語入力することができますね。
佐藤さん、ありがとうございました。
_ リモートで差分バックアップにはrdiff-backupがよさげ
サーバーのバックアップを世代毎の差分バックアップを取りたくて、NFSでマウントしてpdumpfsを使うややこしい事をしてたけど、rdiff-backupならリモートで世代毎の差分バックアップが取れるそうな。 ググってみると、日本語の解説が結構ひっかかるということは、かなりポピュラーだった?
うわー、全然知らなかったよ。テストして使えそうなら変えよう。
_ 12月 12日 19日 オープンフォース Debian勉強会 徳島で、のがじゅんさんが話をするそうですよ
12月 12日 19日に、のがじゅんさんが「Debianと関西Debian勉強会」と「Debian Live」について、話をするそうですよ。 ということなので徳島周辺の人は遊びに来てください。関西の人も明石から高速バスですぐなので来てください。
日にち間違えてました。正しくは12月19日(土)です。