Introduction

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

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

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

用意するもの

  • USBメモリ

以上。

ファームウェア更新

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

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

1
2
3
4
5
6
7
8
9
10
11
12
# まずはパッケージリストを更新
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

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

1
2
$ vcgencmd otp_dump | grep 17:
17:3020000a

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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 でデバイスが使用中になってしまった模様。
なので、再起動します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ 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 が作成されます。
続いて、フォーマット

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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 で複製ができる模様。

1
$ sudo apt-get install -y rsync

次に、フォーマットした領域をマウントします。
Linuxは直接デバイスにアクセスするのに mount が必要なので面倒。
いや、Windowsも背後でExplorerに表示するために、ドライブという形でマウントはしているんですけど… 下記は、**/mnt/target** 、**/mnt/target/boot** を作成し、そこにそれぞれ /dev/sda2/dev/sda2 をマウントします。
その後、rsyncでコピーを開始します。

1
2
3
4
5
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を調べます。
これにより、デバイスファイル名が変わっても安心。

1
2
3
4
5
6
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に渡されるコマンド引数を記述したテキストとのこと。

1
2
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 に読み込まれるコマンドになります。

1
2
3
4
5
6
$ 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は環境依存ですので適宜書き換えてください。

1
2
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カードを抜く必要があるので、電源を落とします。

1
2
3
4
cd ~
sudo umount /mnt/target/boot
sudo umount /mnt/target
sudo shutdown -h now

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

起動しない(゚д゚)

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