Crouton で、VirtualBox を動かすための前提条件
- VirtualBox を使用するには、vboxdrv.ko など 専用カーネルモジュールのコンパイルが必要。
- その為には、Chromebook の Linuxカーネルバージョン(chrootなので、Crouton(Ubuntu)側でも同じバージョン)に合致するカーネルヘッダなどが無ければならない。
- Chromebook の Linuxカーネルアップデートのたびに、これらの作業が必要。
つまり、これらをやってでも 上の環境で VirtualBox を動かしたい人のみ、自己責任で 以下を実行してください。
Ubuntu で カーネルヘッダ・イメージを コンパイル・インストールする
引用元:
https://github.com/dnschneid/crouton/wiki/Build-kernel-headers-and-install-Virtualbox-(x86)
コンパイルの為の 事前準備。
(ubuntu)$ sudo apt-get install git-core make kernel-package bc
(ubuntu)$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
(ubuntu)$ sudo apt-get update
(ubuntu)$ sudo apt-get install g++-4.9
(ubuntu)$ sudo rm /usr/bin/gcc
(ubuntu)$ sudo ln -s /usr/bin/gcc-4.9 /usr/bin/gcc
(ubuntu)$ uname -r
3.18.0-17554-g9194949d4df2
(ubuntu)$ cd ~
(ubuntu)$ git clone https://chromium.googlesource.com/chromiumos/third_party/kernel -b chromeos-3.18
ブラウザで 上のURLを開き、合致するバージョンを確認・指定し、カーネルソースを ホームディレクトリにコピーする。
(ubuntu)$ cd kernel
(ubuntu)$ ./chromeos/scripts/prepareconfig chromeos-intel-pineview
(ubuntu)$ make oldconfig
(ubuntu)$ make kernelrelease
〜
3.18.0-18111-g67722d7
ここで、表示されるバージョンが、現在のカーネルバージョンと合わないはず。
(ubuntu)$ uname -r
3.18.0-17554-g9194949d4df2
(ubuntu)$ git reset --hard origin/chromeos-3.18
(ubuntu)$ git checkout HEAD~17554-g9194949d4df2
チルダ以降に、現在のカーネルバージョンのリビジョンを つなげて入れる。
(ubuntu)$ ./chromeos/scripts/prepareconfig chromeos-intel-pineview
(ubuntu)$ make oldconfig
(ubuntu)$ make kernelrelease
〜
3.18.0-17554-g9194949
一応、リビジョンの 前半部分は一致するが、完全に同じになっていない。
カーネルヘッダをインストールするには、完全に同じリビジョンでなければならない。
(ubuntu)$ vi scripts/setlocalversion
「 -dirty」(半角スペース+ハイフン+アルファベット)で検索し、リビジョン後半の、切れている、上で言えば「d4df2」に置き換える。2箇所ある。
(ubuntu)$ vi chromeos/config/base.config
ここで、「CONFIG_ERROR_ON_WARNING」を探し、「n」に変える。
(ubuntu)$ ./chromeos/scripts/prepareconfig chromeos-intel-pineview
(ubuntu)$ make oldconfig
(ubuntu)$ make-kpkg --rootcmd fakeroot kernel_image kernel_headers
〜
drivers/gpu/drm/udl/udl_connector.c:17:27: fatal error: udl_connector.h: そのようなファイルやディレクトリはありません
〜
コンパイル途中で、ヘッダファイルが見つからないエラーになる。
(ubuntu)$ vi drivers/gpu/drm/udl/udl_connector.c
drivers/gpu/drm/udl/udl_connector.c
の中の include文「udl_connector.h」を、<> から "" に変える。
再度、コンパイル。
(ubuntu)$ make-kpkg --rootcmd fakeroot kernel_image kernel_headers
〜
/etc/kernel/postinst.d/apt-auto-removal: 84: /etc/kernel/postinst.d/apt-auto-removal: cannot create
/etc/apt/apt.conf.d//01autoremove-kernels.dpkg-new: Permission denied
run-parts: /etc/kernel/postinst.d/apt-auto-removal exited with return code 2
make[3]: *** [install] エラー 1
make[2]: *** [install] エラー 2
make[2]: ディレクトリ ``/home/kuri/kernel' から出ます
make[1]: *** [debian/stamp/install/linux-image-3.18.0-17554-g9194949d4df2] エラー
make[1]: ディレクトリ ``/home/kuri/kernel' から出ます
make: *** [kernel_image] エラー 2
コンパイルの後半で、ROOT権限がなくて エラーになる為、sudo で再実行する。
(ubuntu)$ sudo make-kpkg --rootcmd fakeroot kernel_image kernel_headers
(ubuntu)$ cd ~
(ubuntu)$ sudo vi /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# umount bindmounts /lib/modules from enter-chroot
for m in `cat /proc/mounts | /usr/bin/cut -d ' ' -f2 | grep /lib/modules| grep -v "^/$" `; do
umount "$m"
done
# try to load vboxdrv modules
if [ `find /lib/modules/"\`uname -r\`" -name vboxdrv.ko` ]; then
# check if module_locking is disabled
if ! grep -q "module_locking=0" /proc/cmdline; then
exit 2
fi
modprobe vboxdrv
modprobe vboxpci
modprobe vboxnetadp
modprobe vboxnetflt
fi
exit 0
(ubuntu)$ sudo chmod +x /etc/rc.local
Ubuntuを再起動する。
/lib/modules がアンマウントされ、書き込み可能状態になるので、コンパイルしたパッケージをインストールする。
(ubuntu)$ sudo dpkg -i linux-headers-3.18.0-17554-g9194949d4df2_3.18.0-17554-g9194949d4df2-10.00.Custom_amd64.deb
(ubuntu)$ sudo dpkg -i linux-image-3.18.0-17554-g9194949d4df2_3.18.0-17554-g9194949d4df2-10.00.Custom_amd64.deb
VirtualBox ダウンロードサイトから、最新版をダウンロードし、インストールする
Ubuntu のバージョンに合致するファイルを、ダウンロード・インストールする。
https://www.virtualbox.org/wiki/Linux_Downloads
(ubuntu)$ sudo apt-get -f install
(ubuntu)$ sudo apt-get install libopus0
(ubuntu)$ sudo dpkg -i ダウンロード/virtualbox-5.2_5.2.16-123759~Ubuntu~trusty_amd64.deb
Chromebookで、VT-x 有効化し 再起動する
VT-x の有効化(カーネルオプションの変更)は、失敗すると システム起動しなくなり、リカバリメディアからリカバリすることになる危険性が あります。
有効化する前に データのバックアップと、本番運用する前の 動作検証を 十分に行ってください。
また、標準で付属している Chromebook リカバリ ユーティリティ を使って、リカバリメディアを作ってください。
これが無いと、起動できなくなったら ASUS のサイトから 機種名などを指定してダウンロードすることになり、かなり面倒です。
有効化した場合、通常起動や 強制電源断後の再投入などで、ブートが出来ない可能性が高い ようです。
私の環境では、reboot コマンドで リブートすれば大丈夫そう。
その為、インストールした Crouton を SDカードなどに移動して、そこから起動できるようにしておくことをお勧めします。(方法は 後述)
こうしておけば、Chromebookの内部ストレージをリカバリしても Crouton の領域は 別デバイスにそのまま残るので、Crouton まで再インストール・環境再構築する必要が無くなります。
情報として、スリープからの復帰時にクラッシュするという話もあるらしいので、必要に応じて、フタを閉じても スリープしないように設定したり、
Keep Awake - Chrome ウェブストア
みたいな機能拡張で スリープしないようにする必要があるかもしれません。
ただ、私の環境では、確かに スリープからの復帰時、
Chromebook側からは SDカードが アンマウントされているのですが、Ubuntu側は クラッシュしないので、
機種や 使用環境・使用方法に 依存する問題かもしれません。
ご自分の環境で問題ないか ご確認のうえ、必要に応じて対応してください。
VT-x 有効化するには、Chromebookで、以下から enable-vmx.sh をダウンロードし、crosh の shellコマンド内でROOTで実行し、マシンを再起動する。
https://gist.github.com/DennisLfromGA/cd3455530cec2a5a1ef4
私の場合、ゲストとして 32ビットOS しか、うまく動かなかった。
VT-x が うまく有効になっていないのかも知れない。
Crouton(Ubuntu)領域を、SDカード等 別デバイスに移動させ、そちらから起動できるようにする方法
1,SDカードを ext4 などでフォーマットする。
df コマンドなどで、デバイスファイルを確認の上、ファイルシステム作成します。
$ sudo umount /dev/mmcblk1p1
$ sudo mkfs -t ext4 -L UNITY /dev/mmcblk1p1
2,SDカードを挿し直すと /media/removable/UNITY
にマウントされるはずなので、
/mnt/stateful_partition/crouton/chroots
を、SDカードに移動する。
$ sudo mv /mnt/stateful_partition/crouton/chroots /media/removable/UNITY/
3,/usr/local/bin も、SDカードに移動する。
$ sudo mv /usr/local/bin /media/removable/UNITY/
4,/mnt/stateful_partition/crouton と /usr/local に、SDカードの chrootsディレクトリへの シンボリックリンクを張り直す。
$ cd /mnt/stateful_partition/crouton/
$ sudo ln -s /media/removable/UNITY/chroots .
$ cd /usr/local/
$ sudo ln -sf /media/removable/UNITY/chroots .
5,/usr/local/bin に、SDカードから ディレクトリごと、コピーする。
$ cd /usr/local/
$ sudo cp -Rdp /media/removable/UNITY/bin .
あとは 通常通り、sudo startunity
などとすれば、Ubuntu が SD からブートできます。
Chromebook を リストアして、Crouton も元通りにしたい場合には、4以降をやり直すだけで 問題ありません。
再セットアップ用スクリプトは 以下の通り。
#!/bin/sh
sudo mkdir -p /mnt/stateful_partition/crouton/
cd /mnt/stateful_partition/crouton/
sudo ln -sf /media/removable/UNITY/chroots .
cd /usr/local/
sudo ln -sf /media/removable/UNITY/chroots .
sudo cp -Rdp /media/removable/UNITY/bin .
exit 0