A certain engineer "COMPLEX"

Raspberry Pi 3をUSBからブートする (失敗)

Introduction


前回、SDカードを使ってマウス、キーボード、ディスプレイなしでRaspberry Pi 3のセットアップを完了。
でも、SDカードって信用できないのね。
USBメモリのがまだましって感じ。
USBメモリのが扱いやすいしね。

あんな小さい筐体に32GBや64GBとか狂気の沙汰やで。

今回は下記を参考にしてセットアップしました。
有益な情報ありがとうございます。

「Raspberry PiをUSB(HDD)で起動させる」というやり方は既にあります。しかし、これは単にデータ(OS)の部分をHDDに移しただけであり、依然としてブートローダとなるSDカ...

用意するもの


  • USBメモリ

以上。

ファームウェア更新


新しいファームでないとUSBブートはできない模様。

下記のブログによれば、安易に後述のコマンドで更新するのは非推奨の模様。

Raspberry Pi の最新ファームウェアは、Raspbian から rpi-update コマンドでアッ…


# まずはパッケージリストを更新
sudo apt-get update
# ファームウェアの最新版を取得
sudo apt-get install -y rpi-update
# 更新を実行
sudo rpi-update

# USBブートを有効
echo "program_usb_boot_mode=1" | sudo tee -a /boot/config.txt

# 再起動
sudo shutdown -r now

再起動後、下記の結果になることを確認。


$ vcgencmd otp_dump | grep 17:
17:3020000a

USBにパーティションを作成


USBを差し込みます。
当然、この後フォーマットするからデータが消えます。
差し込んだ後、下記のコマンドで、Deviceに差し込んだUSBが表示されていることを確認。


# sudo fdisk -l

Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 92159 83968 41M c W95 FAT32 (LBA)
/dev/mmcblk0p2 92160 62333951 62241792 29.7G 83 Linux

Disk /dev/sda: 28.9 GiB, 30995906560 bytes, 60538880 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x545445f1

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 8064 60538879 60530816 28.9G c W95 FAT32 (LBA)

/dev/sdaにデバイスがあることが確認できたので、下記のコマンドでパーティションを作成します。
しかし、sudo fdisk -lでデバイスが使用中になってしまった模様。
なので、再起動します。


$ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable msdos
Warning: Partition(s) on /dev/sda are being used.
Ignore/Cancel? Ignore
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to
continue?
Yes/No? Yes
Error: Partition(s) 1 on /dev/sda have been written, but we have been unable to inform the kernel of the change,
probably because it/they are in use. As a result, the old partition(s) will remain in use. You should reboot now
before making further changes.
Ignore/Cancel? Ignore

再起動後、再度コマンドを実施。


$ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to
continue?
Yes/No? Yes
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: TDK LoR TF10 (scsi)
Disk /dev/sda: 31.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 99.6MB 98.6MB primary fat32 lba
2 99.6MB 31.0GB 30.9GB primary ext4 lba

(parted) quit
Information: You may need to update /etc/fstab.

上記によって、/dev/sda1/dev/sda2が作成されます。
続いて、フォーマット


$ sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2mkfs.fat 3.0.27 (2014-11-12)
$ sudo mkfs.ext4 /dev/sda2
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 7543040 4k blocks and 1888656 inodes
Filesystem UUID: 4b3bdbe7-f63e-46a4-ad88-7e2a00bd40a1
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

SDカードの複製


SDカードに全データが入っている状態なので、USBにコピーします。
rsyncで複製ができる模様。


$ sudo apt-get install -y rsync

次に、フォーマットした領域をマウントします。
Linuxは直接デバイスにアクセスするのにmountが必要なので面倒。
いや、Windowsも背後でExplorerに表示するために、ドライブという形でマウントはしているんですけど...

下記は、/mnt/target/mnt/target/bootを作成し、そこにそれぞれ/dev/sda2/dev/sda2をマウントします。
その後、rsyncでコピーを開始します。


sudo mkdir -p /mnt/target
sudo mount /dev/sda2 /mnt/target/
sudo mkdir /mnt/target/boot
sudo mount /dev/sda1 /mnt/target/boot/
sudo rsync -ax --progress / /boot /mnt/target

ブート情報の編集


参考ページの手順だと上手くいきませんでしたので、頑張って調べました。

まず、デバイスを一意に識別するPARTUUIDを調べます。
これにより、デバイスファイル名が変わっても安心。


sudo blkid
/dev/mmcblk0p1: LABEL="boot" UUID="95E0-9AC4" TYPE="vfat" PARTUUID="85d563bf-01"
/dev/mmcblk0p2: UUID="b105f9a8-f450-4976-8ac8-69053f57bab4" TYPE="ext4" PARTUUID="85d563bf-02"
/dev/sda1: LABEL="BOOT" UUID="87CD-DAAB" TYPE="vfat" PARTUUID="a40eeb1f-01"
/dev/mmcblk0: PTUUID="85d563bf" PTTYPE="dos"
/dev/sda2: UUID="4b3bdbe7-f63e-46a4-ad88-7e2a00bd40a1" TYPE="ext4" PARTUUID="a40eeb1f-02"

次に/mnt/target/boot/cmdline.txtを確認します。
cmdline.txtは、起動時にLinux Kernelに渡されるコマンド引数を記述したテキストとのこと。


cat /mnt/target/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=85d563bf-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

root=PARTUUID=85d563bf-02になっているのを修正する必要があります。
そこで先ほどのblkidで調べたPARTUUIDを調べます。
USBメモリのext4になっているPARTUUIDはa40eeb1f-02になります。

続いて、/mnt/target/etc/fstabを確認します。

fstabfile system tableの略らしい。
起動時にmountに読み込まれるコマンドになります。


$ cat /mnt/target/etc/fstab
proc /proc proc defaults 0 0
PARTUUID=85d563bf-01 /boot vfat defaults 0 2
PARTUUID=85d563bf-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that

PARTUUID=85d563bfはSDカードを指しています。
これをa40eeb1fに置換すれば、全部変換できそうです。

以上より、下記のコマンドでファイルを書き換えます。
当然、上述のPARTUUIDは環境依存ですので適宜書き換えてください。


sudo sed -i.bak "s,85d563bf,a40eeb1f," /mnt/target/boot/cmdline.txt
sudo sed -i.bak "s,85d563bf,a40eeb1f," /mnt/target/etc/fstab

ちなみに、sedはテキストとかの文字列を編集したりするコマンド。
String Editorの略だと思っていたら、Stream Editorの略らしい。
-i.bakで拡張子bakで編集前のファイルのバックアップを取ってからi(in place)を実行します。

再起動


アンマウントして再起動します。
再起動と言っても、一度SDカードを抜く必要があるので、電源を落とします。


cd ~
sudo umount /mnt/target/boot
sudo umount /mnt/target
sudo shutdown -h now

電源が落ちたら、SDカードを抜いて、電源プラグを差し直します。
するとまた勝手に起動します。

起動しない(゚д゚)

なんでやねん。
最新版はダメなのか、USBメモリがダメなのか、原因は不明。
とりあえず今回はここまで。

2 thoughts on “Raspberry Pi 3をUSBからブートする (失敗)

  1. 通りすがり

    > Linuxは直接デバイスにアクセスするのにmountが必要なので面倒。

    直接デバイスにアクセスするなら、マウントする必要ないけど。
    デバイスファイルを直接叩けば良い。

    1. Takuya Takeuchi Post author

      デバイス上にディレクトリ掘ったりするのにも、mountが不要なんですか?
      初めて聞きました、目から鱗です。
      mkdir /dev/sda1/test
      とかすればいいんですか?

コメントを残す

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

%d人のブロガーが「いいね」をつけました。