Raspberry Pi 3でUbuntu MateをUSBブートさせる

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

Similar Posts:

“Raspberry Pi 3でUbuntu MateをUSBブートさせる” への1件の返信

  1. 今公開されているUbuntu Mate 18.04.2 では、書き込んでcmdline.txt と /etc/fstab を編集するだけでUSBブートができますよ。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください