mattintosh note

どこかのエンジニアモドキの備忘録

2024-06-05: 現在ホビー関連の記事を 新しいブログ に移行しています(一部の国、ISP からは閲覧できません)

Raspberry PiでUUID指定でルートパーティションをマウントする

昨日、Raspberry Pi のルートパーティションを USB メモリに移した話を書いたのですが、やっぱり root=/dev/sda1 と指定するのは納得がいかないので root=UUID= で起動できるようにしてみました。

mattintosh.hatenablog.com

まずはちょっとおさらい。

現在の blkid の出力はこんな感じです。(ここでの UUID は uuidgen で書き換えたダミーです)

# sudo blkid
/dev/mmcblk0p1: SEC_TYPE="msdos" UUID="0000-0000" TYPE="vfat" PARTUUID="00000000-00"
/dev/mmcblk0: PTUUID="00000000" PTTYPE="dos"
/dev/sda1: UUID="d505fd00-8573-4681-b34c-a03ffaa40c75" TYPE="ext4" PARTUUID="e7ccba30-0efc-4bee-9c1c-f12f442b5f9e"

/dev/sda1 行に記載されている UUID="d505fd00-8573-4681-b34c-a03ffaa40c75"/boot/cmdline.txtroot= に記載すれば起動できる…らしいのですが、Raspberry Pi 1 Model B+ ではそれだけでは起動できませんでした。

これとは別件(ディスプレイを回転させる方法)で config.txt のマニュアルを読んでいたところ、config.txt 内で initramfs を指定できるとのこと。

www.raspberrypi.org

initramfs を指定する方法は2つあり、まず1つ目は ramfsfile=ramfsaddr を指定する方法。

ramfsfile=<filename>
ramfsaddr=<address>

もう1つは initramfs だけで指定する方法があるようです。この場合のみ特殊で、= は使用しません。

initramfs <filename> <address>

今回は後者の initramfs を使用しました。

まずは initrd を作成します。Arch Linux ARM の場合、mkinitcpiomkinitcpio パッケージに含まれています。

mkinitcpio -z gzip -g /boot/initrd.gz

config.txtinitramfs 行を追加します。<address>0x00800000 なんかを指定するようなのですが、試してみたところうまく割り当てができなかったので followkernel を使うことにしました。

echo initramfs initrd.gz followkernel >>/boot/config.txt

/boot/cmdline.txt を書き換えます。root=UUID= は上の blkid で調べたもの。

root=UUID=d505fd00-8573-4681-b34c-a03ffaa40c75 rw rootwait console=ttyAMA0,115200 console=tty1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 elevator=noop

なお、ルートパーティションを USB メモリに移したときもそうですが、/etc/fstab にルートパーティションの記載はしていません(記載してなくても起動できるようで…)。後々ちゃんと書きますが。

# 
# /etc/fstab: static file system information
#
# <file system> <dir>   <type>  <options>       <dump>  <pass>
/dev/mmcblk0p1  /boot   vfat    defaults        0       0
/swapfile       none    swap    swap            0       0

これで再起動すれば UUID でルートパーティションを探してくれます。

initrd.gz が読み込めていない場合は dmesg にエラーが出力されます。あと、パット見ですが、ルートパーティションの読み込みに関する部分が少し変わっていました。今までは ext2ext3 とテストが行われていたのですが、initramfs にしてから一発で ext4 と認識してます。

:
[    6.767761] scsi 0:0:0:0: Direct-Access     SanDisk  Ultra USB 3.0    1.00 PQ: 0 ANSI: 6
[    6.785853] sd 0:0:0:0: [sda] 30375936 512-byte logical blocks: (15.5 GB/14.4 GiB)
[    6.807828] sd 0:0:0:0: [sda] Write Protect is off
[    6.816467] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
[    6.825209] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    6.877905]  sda: sda1
[    6.890652] sd 0:0:0:0: [sda] Attached SCSI removable disk
[    7.587282] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
:

cmdline.txt の記述に間違いがあって起動できなくても microSD の差し替えなしで修正できるのは有り難い…。


さてあとは JACK 環境の構築か…。