
Raspberry Pi 3 Model B
OS: Raspbian Stretch lite April 2018
OS: Ubuntu MATE 16.04.2
RaspbianであればUSBメモリに焼き付けるだけで素直にUSBブートしてくれるのであるが、Ubuntu MateをUSBブートさせるとなれば様々細工を施しておかねばならぬようである。まずはRaspberry Pi 3に搭載されているOne Time Programmable(OTP) メモリに対してUSBブートを許すビットをセットせねばならない。これは一旦セットしてしまうともはや元に戻すこと能わないから勢い慎重にならざるを得ない。セット前のOTPメモリの様子はこうである。
$ vcgencmd otp_dump | grep 17:
17:1020000a
/boot/config.txtの御仕舞いにprogram_usb_boot_mode=1を追記する。
$ echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
program_usb_boot_mode=1
そうしたら再起動する。
$ sudo reboot
再起動後にあらためてOTPメモリの様子を窺い17番目の箇所が「3020000a」となっていたら宜しいようである。
$ vcgencmd otp_dump | grep 17:
17:3020000a
次はRaspbianとUbuntu Mateのイメージを準備する。圧縮された姿のままであるとこのあとに控える開始セクタの取り調べにちょっと困るので併せて解凍も済ませておく。
$ wget -c http://director.downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2018-04-19/2018-04-18-raspbian-stretch-lite.zip
$ unzip 2018-04-18-raspbian-stretch.zip
$ wget -c https://ubuntu-mate.org/raspberry-pi/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz
$ xz -dkv ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz
そうしたらまずはRaspbianを構成するそれぞれのパーティションがどのセクタから開始しているかを詳らかにする。これらが明らかになったらマウント用のディレクトリをこしらえてパーティション毎にループバックマウントする。
$ parted 2018-04-18-raspbian-stretch.img
(snip)
(parted) unit B
(parted) print
Model: (file)
Disk /home/guro/local/tmp/2018-04-18-raspbian-stretch.img: 4953473024B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 4194304B 49384447B 45190144B primary fat32 lba
2 50331648B 4953473023B 4903141376B primary ext4
(parted) quit
$ sudo mkdir -p /mnt/raspbian/bootfs /mnt/raspbian/rootfs
$ sudo mount -t vfat -o loop,offset=4194304 2018-04-18-raspbian-stretch.img /mnt/raspbian/bootfs
$ sudo mount -t ext4 -o loop,offset=50331648 2018-04-18-raspbian-stretch.img /mnt/raspbian/rootfs
Ubuntu Mateのイメージファイルについても同じ要領でループバックマウントする。
$ parted ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img
(snip)
(parted) unit B
(parted) print
(snip)
Number Start End Size Type File system Flags
1 1048576B 67108863B 66060288B primary fat16 lba
2 67108864B 4999610367B 4932501504B primary ext4
$ sudo mkdir -p /mnt/mate/bootfs /mnt/mate/rootfs
$ sudo mount -t vfat -o loop,offset=1048576 ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img /mnt/mate/bootfs
$ sudo mount -t ext4 -o loop,offset=67108864 ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img /mnt/mate/rootfs
そうしたらUSBブートに必要となるファイルをRaspbian側からUbuntu Mateの方へ複製する。
$ sudo cp -av /mnt/raspbian/rootfs/lib/modules/4.14.34* /mnt/mate/rootfs/lib/modules/
$ sudo cp -av /mnt/raspbian/rootfs/lib/firmware/brcm/brcmfmac43455-sdio.* /mnt/mate/rootfs/lib/firmware/brcm/
$ cd /mnt/raspbian/bootfs/
$ sudo cp -av bootcode.bin fixup.dat start.elf bcm2710-rpi-3-b-plus.dtb kernel.img kernel7.img bcm2710-rpi-* /mnt/mate/bootfs/
それからUbuntu Mateのcmdline.txtとfstabも書き換える。
$ sudo vi /mnt/mate/bootfs/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles init=/usr/lib/raspi-config/init_resize.sh
$ sudo vi /mnt/mate/rootfs/etc/fstab
proc /proc proc defaults 0 0
/dev/sda2 / ext4 defaults,noatime 0 1
/dev/sda1 /boot/ vfat defaults 0 2
これで下準備は終いであるからRaspbianとUbuntu MateのイメージをアンマウントしておいてUSBメモリにUbuntu MateのイメージをEtcherなどで焼き付けてやればRaspberry Pi 3でUSBブートできたのでよかった。
$ sudo umount /mnt/raspbian/* /mnt/mate/*

参考:
HOW TO BOOT FROM A USB MASS STORAGE DEVICE ON A RASPBERRY PI 3
RPI vcgencmd usage
Ubuntu-Mate fails to boot on Raspberry-Pi 3 via USB