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を追記する。それからOSを再起動すると、USBブートのための設定が反映される。
$ 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 (parted) quit $ 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/*
今公開されているUbuntu Mate 18.04.2 では、書き込んでcmdline.txt と /etc/fstab を編集するだけでUSBブートができますよ。