それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Raspberry Pi のルートファイルシステム LVMにしてを ext4 on LVM にする

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ので、随分前にインストールしたまま放置してたものです。

手順

だいたいの手順は次のとおりです。

  • ディスクレイアウトの確認。
  • ラベルの確認。
  • バックアップ
  • クローンの作成
  • パーティションの初期化
  • パーティションレイアウトの作成
  • LVMを作る
  • ブートを作り直す

ディスクの確認

ディスクのレイアウトを確認します。

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]

rpi on lvm の参考資料

*1:kvm など仮想マシン環境のサポート面