最近の Raspbian を USB 接続のドライブで起動する

新しめの Raspbian を DL してきたら Berryboot から起動するようになってて、一筋縄では USB 接続のドライブから起動するようにできそうもなかったのでメモ
(そもそも RPi3 だと SD カードレスで起動できるらしいんだけど上手く行かなかったのと、いま USB のドライブから起動したいのは RPi2 なのであくまで SD カード自体は使う方式で)。


とりあえず USB 接続のストレージがあるとして適当な Linux 機でフォーマットする手順(適当)。sdx ってなってるところは適切にフォーマット対象のデバイスを選ぶこと(まるごと消すから)
まずまっさらな GPT 形式にしてパーティション切っていく
$ sudo sgdisk -Z /dev/sdx
$ sudo gdisk /dev/sdx
(o で GPT パーティションテーブルを作って n でパーティション切って w で書き込んで終わり)
$ sudo mkfs -t ext4 /dev/sdx1
あとで Raspbian の中身をコピーしてくるのでマウントしておく
$ mkdir -p ~/mnt/dst
$ sudo mount /dev/sdx1 ~/mnt/dst


公式のイメージファイルが 2017-03-02-raspbian-jessie.img だとして、中身をさぐる
$ parted ~/2017-03-02-raspbian-jessie.img unit B print
二つにわかれてる両方に用事があるので両方マウントしておく


$ mkdir -p ~/mnt/boot
$ mkdir -p ~/mnt/berryboot
$ sudo mount -o offset=1048576,sizelimit=133169152 ~/2017-03-02-raspbian-jessie.img ~/mnt/boot
$ sudo mount -o offset=134217728,sizelimit=7610564608 ~/2017-03-02-raspbian-jessie.img ~/mnt/berryboot
ext4 の berryboot の中に Raspbian のイメージが入ってる。つまり bag in bag!!
こいつをマウントする


$ mkdir -p ~/mnt/raspbian
$ sudo mount ~/mnt/berryboot/images/Debian_Jessie_Raspbian_2016.11.img192 ~/mnt/raspbian


中身をコピー(ここのコピー元の最後の / は重要で、忘れたら sudo mv ~/mnt/dst/raspbian/* ~/mnt/dst みたいにして移動する必要があるw)
$ sudo rsync -av ~/mnt/raspbian/ ~/mnt/dst


いったんこれで外付けする USB ストレージは完成。
$ sudo umount ~/mnt/dst
$ sudo umount ~/mnt/raspbian
$ sudo umount ~/mnt/berryboot


~/mnt/boot から RPi の起動につかう SD カードへ中身をコピー(この SD カードはあまり容量を大きくとると RPi の一番最初のブート処理部分が bootcode.bin を見つけられずに失敗するかもしれないので控えめなサイズにしておく。公式イメージそのままだと 127MB くらいになってる)
$ cp ~/mnt/boot/* /mnt/sdcard
$ sudo umount ~/mnt/boot


で、SD カード内のファイルをいじっていきます。まずは config.txt から


# Berryboot settings, do not change
initramfs berryboot.img


って書いてある部分を消すかコメントアウトします
チェンジするなって書いてあるけど全力ででチェンジで!!


# Berryboot settings, do not change
# initramfs berryboot.img


つぎに cmdline.txt を書き換えます。
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait
これでいったん /dev/sda1 から起動するはずなので、SD カードと USB ストレージをつけて RPi を起動します(/dev/sda1 って決め打ってる状態なので他のストレージを繋がないように)


ここで RPi が起動すれば8割完了ですが、まだ /dev/sda1 って決め打ってるのが気持ち悪いので UUID 指定にします。
カーネル単体だと UUID 指定を理解してくれないようなので initramfs を作って指定します。


もし initramfs-tools がなければ入れておきます(標準のイメージなら入ってるはず)
$ sudo apt-get install initramfs-tools


さくっと作れるかと思ったらモジュールの入ったディレクトリがないとか怒られるので、適当に空ディレクトリ作ったら警告はでるけどできました。
$ sudo mkinitramfs -o /boot/initrd.img
$ sudo mkdir -p /lib/modules/4.4.47v7-aufs
$ sudo mkinitramfs -o /boot/initrd.img


また config.txt をいじります。
initramfs initrd.img


$ sudo blkid して USB ストレージの uuid を調べておきます。
それを cmdline.txt で指定します


dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=UUID=00000000-0000-0000-0000-000000000000 rootfstype=ext4 elevator=deadline rootwait


これで再起動してちゃんと起動したら完了です。
もう他の USB ストレージをつないでも大丈夫。
つか自分用備忘録なので分かりづらくてさーせん。