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を追記する。それから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/*

「Raspberry Pi 3でUbuntu MateをUSBブートさせる」への1件のフィードバック

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

    返信

コメントする

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