Raspberry Pi4 はLVMに入れられるのか。
LVMにしておけば、マイクロSDカードが巨大サイズでも困りません。OpenMediaVaultのようなNASサーバーを構築する際もLVMが扱えると便利です。LXC/LXDのような仮想マシンを扱うときもLVMが扱えると管理が楽です。ルートファイルシステムをバックアップとるにしてもスナップショットが扱えるのでLVMが便利です。
準備したもの
- Raspberry Pi4 8GB(コロナ前に買って放置してたやつ)
- MicroSDカード128GB ( USB アダプタ経由)
- MicroSDカード 32GB ( 本体emmcblock )
- raspi ubuntu
Pi4 8GB は5台買って殆ど使わずに放置してました。ええ勿体ないです。転売すれば儲かってたレベル。
今回は、ubuntu on raspberry pi を用いています。3年前の事情でUbntuです。aarch64環境化では、ubuntu 64bit が便利だった*1ので、随分前にインストールしたまま放置してたものです。
手順
だいたいの手順は次のとおりです。
ディスクの確認
ディスクのレイアウトを確認します。
root@raspi-ubuntu:~# lsblk -f sda ├─sda1 vfat FAT32 system-boot FE3E 23.5M 91% /boot/firmware └─sda2 ext4 1.0 writable ce2ab978 3.3G 71% / sdb ├─sdb1 vfat FAT32 system-boot FE3E └─sdb2 ext4 1.0 writable 87f67789
バックアップ
最初にバックアップを取っておきます。
sudo tar cpvf - --one-file-system / | ssh takuya@192.168.12.15 'pigz | cat -> raspi-ubuntu.lan.tgz' sudo tar cpvf - --one-file-system /boot/firmware | ssh takuya@192.168.12.15 'pigz | cat -> raspi-ubuntu.boot.firmware.tgz'
--one-file-system
については過去記事に書きました。
gdisk を用いてパーティション開放と作成
sudo gdisk /dev/sdb
出来上がったディスクレイアウト
sudo sgdisk -p /dev/sdb Number Start (sector) End (sector) Size Code Name 1 2048 1050623 512.0 MiB 0700 Microsoft basic data 2 1050624 250069646 118.7 GiB 8E00 Linux LVM
LVMを構成する。
sudo pvcreate /dev/sdb2 sudo vgcreate vg.main /dev/sdb2 sudo lvcreate -n root -L 10G vg.main sudo mkfs.ext4 /dev/mapper/vg.main-root
ファイルシステムを作る。
ext4 を選択。btrfs でも良かったけどまた今度。
sudo mkfs.vfat /dev/sdb1 sudo mkfs.ext4 /dev/mapper/vg.main-root
ファイルをコピーする
既存のディスクから同期する(raspi-ubuntuの場合)
sudo mount /dev/sdb1 /mnt2 rsync -av --progress --one-file-system /boot/firmware /mnt2
raspi-ubuntuの場合/boot/firmware,raspbian は /boot
同期する(rootファイルシステム同期)
sudo mount /dev/mapper/vg.main-root /mnt rsync -av --progress --one-file-system / /mnt
--one-file-system
が超便利。マウントポイント(dev/mnt)は無視してくれた。
swap が大きいときは邪魔なので退けておいてもいい。
sudo swapoff /swap.img
マウント解除する。
sudo umount /mnt2 sudo umount /mnt
initamfs を再構成
chroot で中に入ってinitramfs をリビルドが必要。その準備をしていく。
ここでは、次のことを行う。
- lvm2 をインストール initramfsをインストール
- fstab を変更
- cmdline.txtを変更
dev と proc と sys をマウントしていく。
sudo mkdir -p /mnt/chroot/ sudo mount /dev/mapper/vg.main-root /mnt/chroot/ sudo mount /dev/sdb1 /mnt/chroot/boot/firmware/ sudo mount -t proc none /mnt/chroot/proc/ sudo mount -t sysfs none /mnt/chroot/sys/ sudo mount -o bind /dev /mnt/chroot/dev/ sudo mount -o bind /dev/pts /mnt/chroot/dev/pts/
chroot する
sudo -E LANG=C chroot /mnt/chroot/
ツールをインストールする。
root@chroot :# apt install initramfs-tools lvm2
/etc/fstab を編集する。
root@chroot :# vim /etc/fstab
cmdline.txt カーネルオプションを書き換える。
cmdline.txt にinitrdを記入するのがコツらしい。
initrd=0x01f00000
fstabでの指定にはラベルを付けておくと便利。
root@chroot :# tune2fs -L writable /dev/mapper/vg.main-root
ラベルを使ってcmdline.txtはこんな感じに
(略)console=(略) initrd=0x01f00000 root=LABEL=writable (略)
0x00f00000って何?
config.txt でもいいらしい。でもたぶんいまのRaspberryPi4にはいらないやつかもしれない。
参考資料1と、参考資料2によると、initramfsをメモリにロードした状態を示すんだとか。
This answer helped me to use a UUID for my root file system on a USB drive. I was wondering however what exactly the number (address) in initramfs initrd 0x00f00000 means.
The address 0x00f00000 is the address where the initramfs image is loaded into memory.
USBメモリを入れ替えて実験
全部終わったら、シャットダウンして、USBメモリとSDカード入れ替えて実験。
確認
レインボー画面が表示されて、ブートが始まったらほぼ成功。
再起動の例
sudo lsblk /dev/sda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 119.2G 0 disk ├─sda1 8:1 0 512M 0 part /boot/firmware └─sda2 8:2 0 118.7G 0 part ├─vg.main-root 253:1 0 50G 0 lvm / └─vg.main-swap 253:2 0 2G 0 lvm [SWAP]