Ubuntu Weekly Recipe

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

今月の頭にRaspberry Pi 2の発売が開始しました。この新モデルの大きな特徴の1つが、ARMv7世代のCortex-A7を搭載していることです。つまりこれまでのRaspberry Piと異なり、Ubuntuが動くということでもあります。そこで今回はRaspberry Pi 2にXubuntu 14.04をインストールしてみます。

Raspberry Pi 2について

Raspberry Pi 2の発売開始から2週間ほど経過し、周囲でも入手された方が増えてきたようです。Ubuntu Weekly Topicsでも既にお伝えしているように、お値段ほぼ据え置きで、CPUがCortex-A7の900MHz(クアッドコア⁠⁠、メインメモリーが1Gバイトと大幅なスペックアップを成し遂げたおかげで、Linuxのサーバーはおろかデスクトップ環境ですら、そこそこ動く性能になってきました。

従来のRaspberry PiはARMv6世代であるARM11ファミリーのCPUを搭載していました。しかしながらUbuntuの公式リポジトリで提供しているバイナリパッケージはARMv7世代以降をターゲットにしているため旧Raspberry Piでは動かすことができませんでした[1]⁠。それに対して今回採用されたSoCのCPUはCortex-A7というARMv7の命令セットであり、Ubuntuのバイナリパッケージがそのまま動くというわけなのです。

実際既にRaspberry Piの公式サイトでは、Snappy Ubuntu Coreのイメージが公開されています。このSnappyは、昨年12月に公開されたUbuntuの新しい配布形態の1つで、コンテナ型の仮想化やIoTのような組み込み機器向けの利用を想定して作られています。ファイルシステムのレイアウトやパッケージ管理システムは通常のUbuntuと異なるものの、その中身についてはUbuntuとは変わりません[2]⁠。つまり既に、Ubuntuが動くイメージが公開されているということです。Snappyについての詳しいことは、Software Designの2015年3月号にも掲載していますので、そちらも参照してください。

Snappyイメージが公開されているとはいうものの、Snappyそのものは開発中のアルファ版とでも言うべきものであり、日常の利用にはまだ向いていません。そもそも、従来のAPTコマンドも使えませんので、どうせ使うならSnappyではなく「普通のUbuntu」を使いたいと思うのが人情でしょう。

そこで今回は、Raspberry Pi 2に普通のUbuntuをインストールする手順を紹介します[3]⁠。

Ubuntuを動かすために必要なもの

最初にUbuntuを動かすために必要になりそうなものをリストアップしていきましょう。必ずしもすべて用意する必要はありません。用途に合わせて、用意してください。

Raspberry Pi 2本体
これがなくては始まりません。ただしなくても「Raspberry Pi 2用のイメージを作る」ことは可能です。
片方がMicro-BオスのUSBケーブル
給電用です。Micro-Bオス側をRaspberry Pi 2側に接続します。もう片方は、5V2AのACアダプターなどに接続しましょう。
8GバイトのmicroSDHCカード
Ubuntuをインストールします。サーバー用途なら4Gバイトでもかまいませんが、デスクトップ環境を動かすとなると最低でも8Gバイトはないと心許ないです。またデスクトップ環境を動かすならClass 10にしておいたほうが良いでしょう。
LANケーブル
Raspberry Pi 2で使用します。ネットワークにつながずにスタンドアローンで起動するなら不要です。
HDMIケーブル
Raspberry Pi 2をディスプレイに接続するために使います。Raspberry Pi 2側はタイプAの(一般的なサイズの)コネクタを使用しています。サーバー用途であれば不要ですが、最初のうちはカーネルの起動ログを確認するを確認するために、用意しておいたほうが便利です。
HDMIディスプレイ
上記HDMIケーブルをつなぐために使います。
USBキーボード・マウス
直接、デスクトップ環境を利用したい場合は必要です。サーバー用途やリモートデスクトップにするなら不要です。
LinuxがインストールされたPC
イメージを作成するために使います。zipファイルとtar.gzファイルが展開できてchrootできてカーネルがLinuxならUbuntuでなくてもかまいません。
microSDHCカードリーダー
PCで作成したイメージをmicroSDHCカードに書き込むために必要です。
USBシリアルケーブル
シリアルコンソールを取得したい場合は必要になります。FTDI製のチップが載っているものがよく使われているようです。基本的に不要です。

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]⁠。

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]⁠。

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

ブートパーティションにはカーネルやブートローダーなどを配置します。今回は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」に変更しています。

ルートファイルシステムの作成

次にルートファイルシステムを作成します。前述したとおり、「Snappyではないほうの」Ubuntu Coreを使用します。これはUbuntuの最小構成をアーカイブしたもので、Ubuntuのルートファイルシステムとして起動、ハードウェアの検知、⁠DHCPも含む)ネットワークへの接続、パッケージ管理まではできるようになっています[6]⁠。今回はUbuntu 14.04.1を利用します。他のリリースを使いたい場合や、将来的に14.04.2以降がリリースされたら、URLを適宜読み替えてください。

$ wget http://cdimage.ubuntu.com/ubuntu-core/releases/14.04.1/release/ubuntu-core-14.04.1-core-armhf.tar.gz
$ sudo tar xvf ubuntu-core-14.04.1-core-armhf.tar.gz -C /media/ubuntu/root/

さらにRaspberry Pi 2用のカーネルモジュールもルートファイルシステムに展開しましょう。こちらもカーネルイメージと同じく、Snappyのそれをそのまま流用します。⁠ブートパーティションの作成」で使用したpi-snappy.imgを使って、今度は第2パーティションをマウントします。

$ sudo mount -o loop,offset=71303168,sizelimit=1073741824 pi-snappy.img /mnt
$ sudo cp -a /mnt/lib/modules /media/ubuntu/root/lib/
$ sudo umount /mnt

このファイルシステムは最小構成なので、一般ユーザーも存在しない状態です。そこで一般ユーザー「ubuntu」を作成し、sudoグループに追加、さらにネットワーク設定を行い、aptのuniverseとmultiverseを有効にしておきます。

$ sudo apt install qemu-user-static
$ cd /media/ubuntu/root
$ sudo cp /usr/bin/qemu-arm-static usr/bin
$ sudo mount -t proc proc proc
$ sudo mount --rbind /dev dev
$ sudo mount --rbind /sys sys
$ sudo mount -o bind /etc/resolv.conf etc/resolv.conf
$ sudo chroot . /bin/bash

# adduser ubuntu
# addgroup ubuntu sudo
# echo "raspi2" > /etc/hostname
# echo "127.0.1.1       raspi2" > /etc/hosts
# echo "auto eth0" > /etc/network/interfaces.d/eth0
# echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0
# sed -i "s/^# \(.*trusty.*verse.*\)/\1/g" /etc/apt/sources.list
# apt install openssh-server avahi-daemon
# exit

$ sudo umount etc/resolv.conf
$ sudo umount -l sys
$ sudo umount -l dev
$ sudo umount proc
$ sudo rm usr/bin/qemu-arm-static

途中でopenssh-serverとavahi-daemonをインストールしているのは、起動後にSSH経由で操作したいことと、Raspberry Pi 2のIPアドレスをDHCPで割り当てたときに「raspi2.local」でアクセスできるようにするためです。どちらも必須ではありませんので、各自の都合に合わせて変更してください。

ここまででルートファイルシステムの基本設定は完了です。Xubuntuのインストールなどの残りの作業についてはデバイスを起動後に実行することにします。

ちなみにこの状態で、アーカイブに固めておけば、複数のRaspberry Pi 2に展開するときに設定済みイメージとして流用できます。

Raspberry Pi 2で起動する

microSDHCを用意できたので、これをアンマウントしたうえでRaspberry Pi 2に装着し、LANケーブルなどを接続して、電源を投入してみましょう。HDMIも接続していれば、ディスプレイにカラフルな四角が描画されたあと、木苺が4つ登場し、カーネルの起動ログが流れていくはずです。

最終的にログインプロンプトが表示されたら、Ubuntuの起動はうまくいったということになります。

電源投入直後、赤LEDは点灯するものの、緑LEDが点滅しない場合はmicroSDHCカードを認識できていない可能性があります。特にいろんなケーブルを挿している状態だと、うまく認識できないことがありましたので、適宜ケーブルを挿抜したり、電源を再度投入することも試してみてください。

木苺が表示されるものの、カーネルのログが表示されない場合は、⁠ブートパーティションの作成」で行ったconsoleオプションの設定を間違っている可能性が高いです。

他のRaspberry Pi 2で使用したUbuntuインストール済みのmicroSDHCカードを流用する場合、udevの設定によりネットワークインターフェースの名前が変わってしまいます。⁠ルートファイルシステムの作成」ではeth0で決め打ちで設定しているので、必要であればあらかじめ/etc/udev/rules.d/70-persistent-net.rulesを削除しておくか、どのデバイスでも同じインターフェース名になるよう設定しておくと良いでしょう。

その他、起動しない際のトラブルシューティングはeLinux.orgのWikiにまとまっていますので、状況にマッチする項目を探してみると良いでしょう。

ベースシステムのインストール

Raspberry Pi 2が無事起動したら、Xubuntuをインストールする前に、Ubuntuのベースシステムをインストールしておきます。USBキーボードとHDMIディスプレイを接続している環境であれば、そこからログインしてください。

openssh-serverとavahi-daemonをインストールしている状況であれば、ネットワーク越しにログインして作業できます。

$ avahi-resolve -n raspi2.local
raspi2.local    192.168.0.5    Raspberry Pi 2IPアドレスが表示される
$ ssh ubuntu@raspi2.local

ホスト名やアカウント、パスワードは「ルートファイルシステムの作成」で指定したものを使用します。

まずはシステムを最新状態に更新したあと、Ubuntuの標準的なパッケージをインストールします。Ubuntu Coreは必要最低限のものしかインストールしないため、このままだといろいろと不便です。そこでUbuntuのどのフレーバーにもインストールされているパッケージ一式をインストールします。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ubuntu-standard

これによりBusyBoxの機能強化版やfileやed、iptables、cron、wget、nanoといった基本的なコマンドに加えて、apparmorやufw、update-manager-coreなどUbuntu定番の機能、bash-completion、command-not-found、manpagesといった補助機能などが導入されます。

ちなみに日時は起動時にntpdateコマンドによって補正されます。ネットワークに接続していない場合は、1970年のままなので適宜変更してください。RTCはないため、起動の度に補正が必要になります。

Ubuntuサーバーのインストール

デスクトップ環境は不要でUbuntuサーバー環境にしたい場合は、上記に加えてserver taskをインストールすると良いでしょう。

$ sudo apt install server^

タイムゾーンやロケール設定を日本にしたい場合は、次のコマンドも実行しておきます。

$ echo "Asia/Tokyo" | sudo tee /etc/timezone
$ sudo dpkg-reconfigure -f noninteractive tzdata
$ sudo locale-gen ja_JP.UTF-8
$ sudo dpkg-reconfigure -f noninteractive locales

あとは普通のUbuntuサーバーですのでこれまでと同様に自由に設定してください。

Xubuntuのインストール

Xubuntuをインストールする場合は、xubuntu-desktopをインストールします。

$ sudo apt install xubuntu-desktop language-pack-ja
$ sudo reboot

Unity環境にしたい場合はubuntu-desktop、Lubuntuならlubuntu-desktopといった具合に変更します。ただしRaspberry Pi 2のGPUに対応したX Window Systemのドライバは存在しないため、Unityは利用できません。

Xubuntuをインストールしたら一度再起動します。あとは普通の起動画面とともに、ログイン画面が表示されるはずです。この際、HDMIの表示がおかしいようであれば、eLinux.orgのトラブルシューティングを参考に、ブートパーティションのconfig.txtを書き換えてみてください。

Xubuntuの設定そのものは第324回「懐かしのネットブックにXubuntu 14.04 LTSをインストールする」が参考になるでしょう。Raspberry Pi 2固有の問題として、Ubuntu Japanese TeamのPPAはARMバイナリを生成できないため利用できません。Xubntuにfcitxとmozcをインストールするなら、次のように手作業でインストールしてください。

$ sudo apt install fcitx fcitx-mozc fcitx-libs-qt5 fcitx-frontend-qt5 mozc-utils-gui

インストーラーを経由していないため、日本語のキーボードまわりの設定ができていないかもしれません。その場合は/etc/defaults/keyboardを書き換えたり、setxkbmapを実行してください。メニューから「Fcitxの設定」を開き「入力メソッド」で日本語キーボードが登録されているかどうかも確認しておいたほうが良いでしょう。14.04における日本語入力そのものは第319回も参考になります。

ヘッドフォンジャックから音を鳴らしたい場合は、モジュールのロードが必要です。

$ sudo modprobe snd_bcm2835

これでサウンド再生されるようであれば、/etc/modulesあたりにモジュール名を追加しておくと良いでしょう。

そこそこの速度で動くXubuntu

使用感は個人によってかなりばらつきがあるものの、⁠デスクトップ環境が思ったよりもちゃんと動く」と感じました。一番もたつくのがアプリ起動時のようなディスクの読み書きが発生するタイミングのようで、ディスクアクセスが発生しない操作の場合はそこまでストレスを感じません。実際、LibreOfficeやFirefoxも起動さえしてしまえれば、それなりに使えます。

図1 FirefoxだのLibreOfficeだのを複数起動してももたつかない広大なメモリ
図1 FirefoxだのLibreOfficeだのを複数起動してももたつかない広大なメモリ

ちなみにFirefox/Chromiumが動くとは言えCPUはARMであり、純正のFlash Playerはありませんので艦これは動きません。

おすすめ記事

記事・ニュース一覧