Ubuntu Weekly Recipe

第362回 Raspberry Pi 2でXubuntu 14.04を動かす

この記事を読むのに必要な時間:およそ 7 分

Ubuntuの起動ディスクを作成する

必要なハードウェアが揃ったところで,Ubuntuの起動ディスクを作成しましょう。最近のARMデバイスにおいて,一般的にUbuntuを起動する際に必要になるのは次のコンポーネントです。

  • ブートローダー
  • カーネルイメージ
  • カーネルモジュールの組み込まれたInitramfs
  • Device Tree Blob
  • Ubuntuのルートファイルシステム

Raspberry Pi 2はBootROMからSDカードの先頭パーティションにあるstart.elf(GPUファームウェア)とbootcode.bin(ブートローダー)を読み込んで起動します。このstart.elfとbootcode.binについてはコンパイル済みのバイナリが公開されているため,これをそのまま利用します。

Raspberry Pi 2のカーネルはソースコードがGitHub上に公開されています。Ubuntuでこのカーネルを使うためには,Ubuntu特有のパッチやコンフィグを適用した状態でコンパイルする必要があります。今回はSnappyのコンパイル済みイメージをそのまま使いますが,興味のある方は第333回「カーネルパッケージをビルドしよう」などを参照してください。InitramfsについてもSnappyのそれをそのまま流用します。

Device Treeはハードウェアの構成情報を記述したファイルで,Device Tree Blob(dtbファイル)はそれをDevice Tree Compilerでコンパイルしたファイルです。こちらもブートローダーと一緒に配布されているファイルをそのまま使います。

ルートファイルシステムは「Snappyではないほうの」Ubuntu Coreを使用します。

microSDHCカードのフォーマット

まずはmicroSDHCカードをフォーマットし,パーティションを作成します。Raspberry Pi 2を起動するためには,先頭パーティションはFATで,なおかつここにbootcode.binなどが配置されている必要があります。そこで,先頭パーティションを/boot用の64MバイトのFAT領域に,残りをルートファイルシステム用のext4領域にしてしまいましょう注4)⁠

注4)
64MバイトにしているのはSnappyのイメージに合わせているというだけで,カーネルその他がインストールできる容量であれば変更しても問題ありません。

PCにmicroSDHCカードを接続します。dmesgなどでmicroSDHCカードのデバイスファイル名を確認してください。ここでは「/dev/sdb」であると仮定します。間違えるとPCの環境自体が壊れる可能性もありますので,くれぐれもデバイスファイル名の間違いには注意してください

$ export RASPI_SD=/dev/sdb
$ sudo parted -s ${RASPI_SD} mklabel msdos
$ sudo parted -s ${RASPI_SD} unit B mkpart primary fat32 4194304 71303167
$ sudo parted -s ${RASPI_SD} unit B mkpart primary ext4 71303168 100%
$ sudo parted -s ${RASPI_SD} set 1 boot on
$ sudo mkfs.fat  ${RASPI_SD}1
$ sudo mkfs.ext4 -L root ${RASPI_SD}2

Ubuntuであれば,mkfsが終わると自動的にマウントされると思います。されなければ,Launcherにあらわれたアイコンをクリックするとマウントされます。fatとext4それぞれのマウント先が「/media/ubuntu/boot」「/media/ubuntu/root」であると仮定して話を進めていきます注5)⁠

注5)
この状態でディスクを取り外すときは,正しくアンマウントしてください。Unityの場合は,Launcherにデバイスアイコンが表示されるはずですので,それを右クリックして「親ドライブを取り出す」を選択し,アイコンが消えて通知が表示されるまで待てば問題ありません。

ブートパーティションの作成

ブートパーティションにはカーネルやブートローダーなどを配置します。今回はSnappyイメージのブートパーティションを流用することにしましょう。Snappyのイメージをダウンロードして,microSDHCカードのブートパーティション(/media/ubuntu/boot)に展開します。

$ wget -O pi-snappy.zip http://downloads.raspberrypi.org/ubuntu_latest
$ unzip pi-snappy.zip

展開されたpi-snappy.imgは生のディスクイメージですので,partedでパーティションテーブルの内容を確認できます。

$ parted pi-snappy.img unit B print
警告: 管理者権限がありません。パーミッションに注意してください。
モデル:  (file)
ディスク /home/shibata/temp/raspi/pi-snappy.img: 3000000000B
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始         終了         サイズ       タイプ   ファイルシステム  フラグ
 1    4194304B     71303167B    67108864B    primary  fat32             boot, lba
 2    71303168B    1145044991B  1073741824B  primary  ext4
 3    1145044992B  2218786815B  1073741824B  primary  ext4
 4    2218786816B  2998927359B  780140544B   primary  ext4

ここでは先頭パーティションだけ必要なので,それを/mntにマウントして取り出しておきましょう。offsetとsizelimitの値は上記の先頭パーティションの「開始」「終了」を指定します。

$ sudo mount -o loop,offset=4194304,sizelimit=67108864 pi-snappy.img /mnt
$ sudo cp -r /mnt/* /media/ubuntu/boot
$ sudo umount /mnt

カーネルの起動オプションはcmdline.txtファイルで指定しています。初期値は次のとおりです。途中に改行を入れていますが,本来は1行です。

dwc_otg.lpm_enable=0 console=ttyAMA0,115200
  root=/dev/disk/by-label/system-a
  init=/lib/systemd/systemd ro panic=-1 fixrtc elevator=deadline rootwait

これを次のように変更します。こちらも一行で記述してください。

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 boot=local
  root=/dev/mmcblk0p2 rootfstype=ext4 rw panic=-1 fixrtc elevator=deadline rootwait

まず「console=tty1」を追加しています。これはカーネルの起動ログをシリアル(ttyAMA0)だけでなく,HDMIにも出力するためです。主にデバッグ目的なので指定しなくてもかまいません。

次に「boot=local」を指定しています。SnappyのInitramfsは,既定の起動モードが「ubuntu-core-rootfs」になっています。これはSnappyのパーティションレイアウトに従って読み込み専用ディスクや書き込み可能領域をマウントするモードですので,普通のUbuntuのパーティション構成では使用できません。そこで通常のパーティションレイアウトでマウントするためにbootオプションで起動モードを変更しています。

「root=/dev/mmcblk0p2」ではルートファイルシステムのデバイスとパーティション(microSDHCの第2パーティション)を指定しています。⁠by-label」の指定でもかまいません。

「init=/lib/systemd/systemd」を削除して,Upstartによる起動に変更しています。Snappyはsystemdのみサポートしているのでこの記述が必要ですが,Ubuntu 14.04はまだsystemdに移行できていないのでこの設定があると起動しません。ちなみに現在開発中のvividからは,systemdでも起動できるようになります。

最後にルートファイルシステムは書き込み可能なので「ro」「rw」に変更しています。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

  • 間違いについて

    コマンドの中の「apt」は全て「apt-get」ではないのでは

    Commented : #1  トンボ (2016/01/23, 15:42)

コメントの記入