ASUS Chromebook C200MAでUbuntuを起動する

ASUS Chromebook C200MAを格安Linuxノートとして使う目的で約2万円で購入し、試行錯誤の結果やっとまともに使えるようになったのでその記録。

ChromebookはChromeOSというWWWブラウザChromeを利用することに特化したOSが搭載されている。
ChromeOSのカーネルLinuxなので色々なことができる。
Linuxディストリを使うという目的であれば2つの方法がある。

Linuxディストリをchroot環境で実行する

これについては、croutonという完成度の高いツールが公開されているので、それを利用するのが良い。chroot環境でありながら、GUI環境まで提供されている。

Linuxディストリを生で起動する

chrubuntuというのがあるようなのだが、私の理解が正しければLegacy boot(普通のPCでのBIOSによる起動)ができる古い機種でしか利用できない。
C200MAでもLegacy bootを有効化する方法は存在するのだが、危険な作業をする必要がある。
http://www.matws.org/c300/
http://kazuhito-m.github.io/tech/2015/10/04/choromebook-c300ma-ubuntu-boot/

それは避けたいと色々調べた結果、これらを参考に起動することができた。
https://wiki.debian.org/InstallingDebianOn/Asus/C201
https://bbs.archlinux.org/viewtopic.php?id=185789
https://github.com/hanklords/chromebook-busybox

概要

普通のPCでOSを起動するのはHDDのMBRを読み込むLegacy bootか、EFIバイナリが格納されたパーティションを読みこんで起動するEFI方式が一般的だ。
Chromebookはそのどちらでもない、corebootというものを利用しているそうである。
これは署名済みカーネルバイナリを焼きこんだカーネルパーティションを読み込んで起動するという方式のようだ。
そのため、UbuntuのようなLinuxディストリをインストールするにはこのような機構を理解していないといけない。

試行錯誤の結果、下記の方法によってUbuntuを起動させることに成功した。
・最小構成debian環境を作成する
Grubのかわりに、この環境からkexecにより他OSを起動する。
UbuntuインストーラUSBを作成・修正・起動する
UbuntuインストーラUSBを一般的な手順で作成したあと、kexecで起動するためのスクリプトを作成し、debianから起動する
Ubuntuをインストールし、Ubuntuを起動するためのスクリプトを作成する


本作業では
Chromebook上のcrouton環境(以下crouton環境と呼ぶ)
x86_64のUbuntu PC環境(以下PC環境と呼ぶ)
Ubuntuインストール先のSDカード
を必要とする。

手順

途中、面倒になったので書きかけです。リンク先など参考にしてみてください。

Chromebook上のcrouton環境

Googleで検索して以下等を参考に準備してください
http://qiita.com/yasuki/items/f6a8a350087517b0069b

SDカードのパーティション作成

PC環境で行うことをおすすめする。rootで行う。

DEV=/dev/mmcblk1

# GPTとしてフォーマット
parted --script ${DEV} mklabel gpt
# ChromeOS用のGPTにする
cgpt create ${DEV}

# カーネルパーティションサイズは16MB固定のよう?
KERNEL_SIZE=32768
P1_SIZE="${KERNEL_SIZE}"
# Debian環境パーティションセクタサイズ 1GB相当
P2_SIZE=2097152
# Ubuntu環境パーティションセクタサイズ 適当に
P3_SIZE=39772093

P1_BEGIN=34
P2_BEGIN=`expr ${P1_BEGIN} + ${P1_SIZE}`
P3_BEGIN=`expr ${P2_BEGIN} + ${P2_SIZE}`

# Debian環境カーネルパーティション
cgpt add -t kernel -l debian_kernel -b ${P1_BEGIN} -s ${P1_SIZE} ${DEV}
# Debian環境パーティション作成
cgpt add -t data -l debian_root -b ${P2_BEGIN} -s ${P2_SIZE} ${DEV}
# Ubuntu環境パーティション作成
cgpt add -t data -l ubuntu_root -b ${P3_BEGIN} -s ${P3_SIZE} ${DEV}

blockdev --rereadpt ${DEV}

https://wiki.debian.org/InstallingDebianOn/Asus/C201

最小構成debian環境

まずはカーネルをビルドする。
https://github.com/hanklords/chromebook-busybox#kernel
この記事では、バージョンが4.0-rc7を使っているが、私は3.?をビルドした。
とくに問題は起こっていない。

ビルドしたバイナリをvbutil_kernelで署名し、カーネルパーティションに書き込む。

ルートイメージを/dev/mmcblk1p2に作成する。

Ubuntuインストーラ環境

Ubuntu14.04.3のStartup Disk CreatorインストーラUSBを作成する。

./syslinux/txt.cfg

kexec -l /mnt/casper/vmlinuz.efi --command-line "noprompt cdrom-detect/try-usb=true file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.lz --" --initrd=/mnt/casper/initrd.lz

Ubuntu環境

インストール後、そのままでは起動しないので
kexec -l $(readlink -f ${MNT}/vmlinuz) --command-line "BOOT_IMAGE=/$(basename $(readlink ${MNT}/vmlinuz) ) root=UUID=659bf19e-e80a-4243-bcab-8ecfc3d84c84 ro elevator=cfq" --initrd $(readlink -f ${MNT}/initrd.img) -d

kexec -l $(readlink -f ${MNT}/vmlinuz.old) --command-line "BOOT_IMAGE=/$(basename $(readlink ${MNT}/vmlinuz.old) ) root=UUID=659bf19e-e80a-4243-bcab-8ecfc3d84c84 ro elevator=cfq" --initrd $(readlink -f ${MNT}/initrd.img.old) -d

驚くべきことに、スピーカーの認識以外はちゃんと機能している。
機種によって相性良し悪しがあるそうなので、たまたま相性が良かったのだろうと思う。

スピーカーの認識

スピーカーの認識についても試行錯誤の結果やっと認識させることができた。
http://www.matws.org/c300/
このサイトによるとカーネルは4. 以上を使う必要があるので、最新版カーネルをインストールする
apt-get update
apt-get install linux-generic-lts-wily
ChromeOS上の/lib/firmware/intel/fw_sst_0f28*をUbuntu環境の同じ場所にコピーする。
その後、fw_sst_0f28.bin-48kHz_i2s_masterをfw_sst_0f28.binへのシンボリックリンクとして作成する。
ln -s fw_sst_0f28.bin fw_sst_0f28.bin-48kHz_i2s_master
再起動後、alsamixerを起動し
・Left Speaker Mixer Left DAC
・Right Speaker Mixer Right DAC
のミュートを解除することで、音声が出力されるようになる。
https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture#Unmute_with_alsamixer
https://wiki.ubuntu.com/Audio/Alsamixer



https://wiki.debian.org/InstallingDebianOn/Asus/C201
https://bbs.archlinux.org/viewtopic.php?id=185789