ヤルキデナイズド

Unclassified Articles on Software and IT

Mac で Raspberry Pi 用の Arch Linux を準備してみた

はじめに

本稿では Mac を使って Raspberry Pi 用に Arch Linux をセットアップする手順を説明する。今回構築する Linux システムでは、ルートファイルシステムを外付けハードディスクに移し、ブートファイルシステムを収めた SD カードを読み取り専用で扱うことを目指す。 Arch Linux の初期設定についてはカバーしない。また本稿は備忘録であるため内容の正確さは保証しない。内容についての指摘は歓迎する。

用意した環境

  • Arch Linux ARM (archlinux-hf-2013-07-22.img)
  • MacBook Pro 15-inch, mid 2010
  • Raspberry Pi ModelB 512MB
  • 適当な SD カード(8GB)
  • 適当な USB 接続の外付けハードディスク(120GB)
  • 5V700mA 以上で MicroUSB 出力できる電源(100円ショップにあるスマホ用充電ケーブルで十分)
  • 接続に必要なもの
    • USB キーボード
    • HDMI ケーブルとテレビ
    • 上記2つ、または LAN ケーブル

SD カードをフォーマットする

SD カードを Mac の SD カードスロットに挿入する。/アプリケーション/ユーティリティ/ディスクユーティリティを起動し、左の欄から「xxGB APPLE SD Card Reader Media」を選択する。右のタブの「消去」を選び、フォーマット:「MS-DOS (FAT)」、名前:「UNTITLED」になっていることを確認し、「消去…」ボタンを押す。

f:id:uasi:20130915142101p:plain

SD カードをアンマウントする

ターミナルを起動し、マウントされている SD カードを df コマンドで確認する:

$ df
Filesystem                        512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2                       659597488 588953464  70132024    90% 73683181  8766503   89%   /
(中略)
/dev/disk3s1                        15681728      4288  15677440     1%        0        0  100%   /Volumes/UNTITLED

/Volumes/UNTITLED としてマウントされている SD カード(の第1パーティション)は、 /dev/disk3s1 というデバイスであることが分かる。この値は環境によって異なるかもしれないので、その場合は以降の記述を適宜読み替えてほしい。

diskutil コマンドでこの SD カードをアンマウントする:

$ diskutil unmount /dev/disk3s1
Volume UNTITLED on disk3s1 unmounted

SD カードに OS のディスクイメージを書き込む

Raspberry Pi 向けの ArchLinux ARM のページの Installation タブを開き、 OS のディスクイメージをダウンロードする。ダウンロード ZIP ファイルを展開すると archlinux-hf-2013-07-22.img が作られる。このディスクイメージを dd コマンドで SD カードに書き込む:

$ sudo dd bs=1m if=/path/to/archlinux-hf-2013-07-22.img of=/dev/rdisk3
1870+0 records in
1870+0 records out
1960837120 bytes transferred in 201.702728 secs (9721421 bytes/sec)

of=/dev/rdisk3 は先ほど確認したデバイス名に合わせて読み替える(デバイス名が /dev/disk4s1 なら of=/dev/rdisk4 という具合)。

補足: Mac の BSD dd では bs オプションの数字の接尾辞を小文字にしなければならない。一方 GNU dd の bs オプションは接尾辞が大文字である。

書き込みが終わるとふたたび SD カードがマウントされるので、ファインダーを操作して SD カードを取り出す。

Raspberry Pi を起動する

Raspberry Pi に SD カードを挿入し、外付けハードディスクを基板から遠いほうの USB ポートに接続する(ポートの位置は重要ではないが、以降の説明に現れるハードディスクのデバイス名が変わってくるかもしれない)。外付けハードディスクが外部給電タイプではない場合、 Raspberry Pi との間にセルフパワード USB ハブを挟むこと。そうしなければ Raspberry Pi の電源が不安定になり、起動しなかったり突然落ちたりする。

空いている USB ポートにキーボードを接続し、 HDMI ポートにはテレビを繋ぐ。それらの代わりに、 LAN ケーブルで Raspberry Pi とルータを接続し、起動後に SSH でログインすることもできる。 この手順は詳しく解説しない。

電源ケーブルを除く各ケーブルの接続が終わったら、外付けハードディスクの電源を入れ数秒待つ。電源を安定させる意図でこのようにしたが、こうする必要はないかもしれない。

最後に Raspberry Pi の電源ケーブルを接続する。基板の PWR ランプが点灯し、テレビ画面に起動ログが出力されれば起動成功である。

外付けハードディスクをフォーマットする

ユーザ名「root」、パスワード「root」で Raspberry Pi にログインする。外付けハードディスクに対応するデバイス名を lsblk コマンドで調べる:

[root@alarmpi ~]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 111.8G  0 disk 
`-sda1        8:1    0 111.8G  0 part 
mmcblk0     179:0    0   7.5G  0 disk 
|-mmcblk0p1 179:1    0    90M  0 part /boot
|-mmcblk0p2 179:2    0     1K  0 part 
`-mmcblk0p5 179:5    0   1.7G  0 part /

ディスクのデバイス名は /dev/sda、その第1パーティションは /dev/sda1 であることが分かる。ルートファイルシステムにあたる SD カードのパーティションが /dev/mmcblk0p5 であることもメモしておく。

fdisk コマンドでディスクをフォーマットする。すべてのパーティションを削除し、プライマリパーティションを1つ作成する:

[root@alarmpi ~]# fdisk /dev/sda
Command (m for help): d # パーティション削除:すべて削除するまで繰り返す
Command (m for help): n # パーティション作成:質問はすべてデフォルト値でよい
Command (m for help): w # 情報をディスクに書き込んで終了

ルートファイルシステムを外付けハードディスクに移す

SD カードの書き換え回数には上限があるため、なるべく書き込みを減らしたいものである。そこで、ルートファイルシステムを丸ごと外付けハードディスクに移してしまうことにする。

まずルートファイルシステムを SD カードから外付けハードディスクにコピーする:

[root@alarmpi ~]# dd bs=1M if=/dev/mmcblk0p5 of=/dev/sda1

if オプションの値は先ほどメモした SD カードのパーティションにすること。

コピーされたルートパーティションのファイルシステムext4、サイズは2GBになっている。サイズが小さいままではもったいないなので、パーティションをハードディスク全体に拡張する。パーティションのリサイズには resize2fs コマンドを使う:

[root@alarmpi ~]# resize2fs /dev/sda1

特にオプションを与えなければパーティションを最大まで拡張してくれる。

補足:各デバイスのファイルシステムlsblk -f で一覧できる。

外付けハードディスク内のルートファイルシステムで起動する

起動時に外付けハードディスク内のルートファイルシステムを参照するように、起動パラメータを書き換える:

[root@alarmpi ~]# vi /boot/cmdline.txt
ipv6.disable=1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p5 rootfstype=ext4 elevator=noop rootwait

/boot/cmdline.txt 内の root=/dev/mmcblk0p5root=/dev/sda1 に修正し、保存する。

reboot コマンドで再起動し、 lsblk コマンドでデバイスを確認する。 sda1 のマウントポイントが / になっていればよい。

[root@alarmpi ~]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 111.8G  0 disk 
`-sda1        8:1    0 111.8G  0 part / # ←こうなっていれば成功
mmcblk0     179:0    0   7.5G  0 disk 
|-mmcblk0p1 179:1    0    90M  0 part /boot
|-mmcblk0p2 179:2    0     1K  0 part 
`-mmcblk0p5 179:5    0   1.7G  0 part

パラメータを間違えるなどして Raspberry Pi が起動しなくなった場合、 SD カードを Mac に挿入してファインダーで開き cmdline.txt を編集するとよい。

終わりに

これで目指したとおりの環境が構築できた。この構成ならば基本的には SD カードにデータが書き込まれることはないため、書き込みプロテクトスイッチをオンにしてもよいかもしれない。

参考にしたページ

unionfs-fuse か aufs でルートファイルシステムをオーバーレイすることも考えたが面倒そうだったのでやめた。そのときの調査記録も残しておく: