3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi 4 Model B で USB ブート(3) LVM 編

Last updated at Posted at 2020-10-23

Raspberry Pi 4 Model B で USB ブート(2) パーティション作成編」では USB マスストレージに基本パーティションを作成し、ext4 でフォーマットをして Raspberry Pi OS をそのままコピーした。
ところで、よくある x86 用の Linux ディストリビューションではインストール時に LVM を選択できる。Raspberry Pi 4 でも LVM を利用することは可能だ。
root パーティションで LVM を使うこともできる。ただし起動には initramfs を使う必要がある。

なお、前回までは(特に明記はしていなかったけれど)USB マスストレージへのインストールを PC で行っていたが、この方法だと initramfs を作成できないため、今回は microSD にインストールした Raspberry Pi OS から作業する。
これに伴い対象となるデバイスが /dev/sdb から dev/sda になるので注意。

LVM 作成

パーティションを作成するところは前回と同じ。

$ sudo gdisk -l /dev/sda
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
:
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          526335   256.0 MiB   0700
   2          526336      5860533134   2.7 TiB     8300

2 つめのパーティションに LVM を作成する。
名前は pi-vg とするが、他の名前にしてもいい。

# LVM 物理ボリュームを作成
$ sudo pvcreate /dev/sda2

# ボリュームグループ pi-vg を作成
$ sudo vgcreate pi-vg /dev/sda2

# 論理ボリュームを作成
# 今回使用した USB マスストレージの容量は 3TB。
# swap に 8GB 割り当てることを想定し、/ の容量は総容量から逆算している
$ sudo lvcreate --size 2786G --name root pi-vg
$ sudo lvcreate -l 100%FREE --name swap pi-vg

# 現時点のHDDの状態を確認
$ lsblk /dev/sda
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  2.7T  0 disk 
├─sda1            8:1    0  256M  0 part 
└─sda2            8:2    0  2.7T  0 part 
  ├─pi--vg-root 254:0    0  2.7T  0 lvm  
  └─pi--vg-swap 254:1    0  8.3G  0 lvm  

使用した USB マスストレージは HDD であり、データーの書き込みによるデバイスの劣化を心配する必要はないため、swap パーティションを作成した。
swap のサイズを決めるにあたっては以下の情報を参考にし、メモリとほぼ同じ容量を確保した。

作成した boot, root, swap をフォーマットする。

$ sudo mkfs -t vfat /dev/sda1
$ sudo mkfs -t ext4 /dev/pi-vg/root
$ sudo mkswap       /dev/pi-vg/swap

システムファイルのコピー

  • microSD にインストールイメージをコピーしておく
  • 起動した Raspberry Pi OS 上でインストールイメージをダウンロードする

などをすれば前回までと同じ方法でコピーができるが、ここではこの手間を省き、起動に使用した microSD からコピーをすることにする。

$ mkdir /tmp/root
$ sudo mount /dev/pi-vg/root /tmp/root/

# 実ファイルシステムではない devtmpfs, sysfs, proc, tmpfs, boot と
# ext4 フォーマット時に作成される lost+found 以外のディレクトリをコピー
$ cd /
$ sudo cp -a bin etc home lib media mnt opt root sbin srv tmp usr var /tmp/root/
$ cd /tmp/root/
$ sudo mkdir dev sys proc run boot tmp

# 後述の initramfs を作成するために、boot パーティションは /tmp/root 以下にマウントする
$ sudo mount /dev/sda1 /tmp/root/boot/
$ sudo cp -a /boot/* /tmp/root/boot/

起動設定の変更

cmdline.txtfstab を更新する。
パーティション情報だけでなく、initramfs に関するオプションも指定する。

# root= に /dev/pi-vg/root を指定
# initramfs を使用するために initrd=0x01f00000 を追加する
# 起動に失敗する場合は quiet を削除すると、起動中のメッセージが画面に表示されるので原因を特定しやすくなる
# デバッグには break オプションも有用。詳しくは initramfs-tools(7) を参照
$ cat /tmp/root/boot/cmdline.txt
console=serial0,115200 console=tty1 root=/dev/pi-vg/root initrd=0x01f00000 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

# 前回までと同じく、boot パーティションの PARTUUID を blkid コマンドで調べ指定
# SSD の場合はデバイスの劣化を防ぐために、/dev/pi-vg/root の defaults には "defaults,noatime" を指定する
$ cat /tmp/root/etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=09468d30-111e-4028-8f37-16f65e497c25  /boot           vfat    defaults          0       2
/dev/pi-vg/root  /               ext4    defaults  0       1
/dev/pi-vg/swap  none            swap    sw  0       0

initramfs

boot パーティションに initrd.gz を作成し、起動時にこれを使うようにする。

# /tmp/root 以下でコマンドを実行できるよう、各種ディレクトリを /tmp/root 以下にマウント
$ sudo mount --bind /sys  /tmp/root/sys
$ sudo mount --bind /proc /tmp/root/proc
$ sudo mount --bind /dev  /tmp/root/dev

# /tmp/root/boot に initrd.gz を作成
$ sudo chroot /tmp/root/ apt install lvm2
$ sudo chroot /tmp/root/ mkinitramfs -o /boot/initrd.gz

# boot/config.txt に "initramfs initrd.img followkernel" を追加
$ cat /tmp/root/boot/config.txt
:
initramfs initrd.gz 0x01f00000

冒頭で、PC で作業をすると initramfs を作成できない旨を書いたが、それはここでの apt install lvm2 がうまく行かないため。
lvm2 パッケージのインストール後に initramfs を作成する処理が走るが、このときに正しいカーネルのバージョンが取得できないのが原因と思われる(詳細は追っていないので要確認)。

## 後始末
$ sudo umount /tmp/root/sys /tmp/root/proc /tmp/root/dev
$ sudo umount /tmp/root/boot
$ sudo umount /tmp/root

これでインストールは完了。
Raspberry Pi OS をシャットダウンし、microSD を抜き取ってから電源を入れれば USB マスストレージから起動できる。

おまけ

手順が多くなってきたので、インストーラーを作ってみた。


3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?