皆さんディスクのパーテショニングって、どうやってるんでしょうね?
ちょっと不思議に思ったので私が長年使っているやり方を書いてみます。
もしかしたらありふれたやり方かも知れませんが。
先ず OS の固定領域とでもいう部分は大体インストーラーやディストリビューションのデフォルトで切り方が決まってしまうと思うのだけれど、それ以外の可変領域の扱いですね。
私の場合、
- ファイルシステムのサイズを動的に柔軟に拡大したい
- RAID1 で冗長化しておきたい
- 物理ボリューム(HDD) を動的に交換可能にしておきたい
という希望があるので、長年使っている手法があります。
元々は IBM AIX の LVM でやり始めた手法ですが。
ユースケース的には、こんな感じ。
割と適当なサイズでファイルシステムを作成しておいて、使っているうちにサイズが不足するので動的に拡張する。
そのうちに今度は物理ボリューム自体の容量が不足するので、HDDを追加して解決する。
ということで、 HDD から OS インストーラーのデフォルトに従って作成したパーティション以外の残りは全て PV にしてしまい、そこから動的に LV を切り出して使う、ということをやっています。
で、その LV を2本使って、 md (software raid) で RAID1 にして、
その md 上のファイルシステム(今なら btrfs)を作成して使っています。
HDD -> PV -> VG -> LV -> md -> btrfs
となります。
具体的には、Silverblue を使っているので、こんな感じ。
/dev/sda
Number Start (sector) End (sector) Size Code Name
1 2048 411647 200.0 MiB EF00 EFI System Partition
2 411648 4605951 2.0 GiB 8300 /boot
3 4605952 138823679 64.0 GiB FD00 swap00
4 138823680 306595839 80.0 GiB FD00 sysroot
5 306595840 369510399 30.0 GiB FD00 var
6 369510400 3011921919 1.2 TiB 8E00 VG0
7 3011921920 5738219519 1.3 TiB 8E00 VG0
8 5738219520 8464517119 1.3 TiB 8E00 VG0
9 8464517120 11190814719 1.3 TiB 8E00 VG0
/dev/sdb
Number Start (sector) End (sector) Size Code Name
1 2048 411647 200.0 MiB EF00 BKUPEFI
2 411648 4605951 2.0 GiB 8300 BKUPboot
3 4605952 138823679 64.0 GiB FD00 swap00
4 138823680 306595839 80.0 GiB FD00 sysroot
5 306595840 369510399 30.0 GiB FD00 var
6 369510400 3011921919 1.2 TiB 8E00 VG1
7 3011921920 5738219519 1.3 TiB 8E00 VG1
8 5738219520 8464517119 1.3 TiB 8E00 VG1
9 8464517120 11190814719 1.3 TiB 8E00 VG1
sysroot, var は md (software raid)の機能で、RAID1 になっています。
sd[ab][6-9] は PV で、それぞれ VG0 と VG1 構成用です。
実際は仮予約でスタートして、必要に応じて VG の容量が不足した段階で、
vgextend を使って増量時に追加します。
そうすれば急に普通の他の用途でパーティションが必要になった時も、
未使用のPVが残っていれば、そこから切り出すことができます。
lvscan がこんな感じ。
ACTIVE '/dev/VG0/LV0_HOME' [500.00 GiB] inherit
ACTIVE '/dev/VG0/LV0_Photos' [10.00 GiB] inherit
ACTIVE '/dev/VG0/LV0_var_spool_squid' [6.00 GiB] inherit
ACTIVE '/dev/VG0/LV0_var_usrlocal' [10.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_HOME' [500.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_Photos' [10.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_var_spool_squid' [6.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_var_usrlocal' [10.00 GiB] inherit
例えば Photos という LV から md を作成するのは、
/sbin/mdadm -C Photos -N Photos --homehost=<hostname> -l 1 -n 2 -f /dev/VG0/LV0_Photos /dev/VG1/LV1_Photos
で、これを
/sbin/mkfs.btrfs -f -L Photos Photos
として、
mount -LPhotos /mnt/Photos
みたいに使う。
容量が不足したら、 lvextend で LV[01]_Photos を動的に拡張し、
/sbin/mdadm -G /dev/md/Photos -z max;
/usr/sbin/btrfs filesystem resize max /mnt/Photos;
とすれば、ファイルシステム自体を動的に拡張できる。
未使用の PV を使い尽くして容量が不足したら、
追加の HDD に別 VG2 を同様に作成し、
VG0, VG1 から被らないように幾つかのLVを移して VG0, VG1 に空きを作る。
その後、 例えば Photos を拡大する。
- 例えば、こんな感じにVG2 にLVを作成する。
ACTIVE '/dev/VG0/LV0_HOME' [500.00 GiB] inherit
ACTIVE '/dev/VG0/LV0_Photos' [10.00 GiB] inherit
ACTIVE '/dev/VG0/LV0_var_spool_squid' [6.00 GiB] inherit
ACTIVE '/dev/VG0/LV0_var_usrlocal' [10.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_HOME' [500.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_Photos' [10.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_var_spool_squid' [6.00 GiB] inherit
ACTIVE '/dev/VG1/LV1_var_usrlocal' [10.00 GiB] inherit
ACTIVE '/dev/VG2/LV2_HOME' [500.00 GiB] inherit
ACTIVE '/dev/VG2/LV2_var_usrlocal' [10.00 GiB] inherit
- その後、 HOME の LV を入れ換える。
/sbin/mdadm /dev/md/HOME -a /dev/VG2/LV2_HOME
/sbin/mdadm /dev/md/HOME -f /dev/VG0/LV0_HOME
/sbin/mdadm /dev/md/HOME -r /dev/VG0/LV0_HOME
/sbin/mdadm /dev/md/var_usrlocal -a /dev/VG2/LV2_var_usrlocal
/sbin/mdadm /dev/md/var_usrlocal -f /dev/VG1/LV1_var_usrlocal
/sbin/mdadm /dev/md/var_usrlocal -r /dev/VG1/LV1_var_usrlocal
- これで VG0, VG1 に空きができる。
/sbin/lvremove /dev/VG0/LV0_HOME
/sbin/lvremove /dev/VG1/LV1_var_usrlocal
で、空いた容量の分だけ Photos を拡大できる。
老朽化で HDD を取り除きたい時も、より大容量のHDDを追加した後、
上記の手順で問題の HDD から LV を全て移動してしまえば除去可能になりますね。
長年これでやってきてしまったのですが、
こちらを参照すると、 md のレイヤを除いて lvm2 でミラーにできるようですね。
んー。このやり方だと、複数 HDD を同一の VG に放り込んで、そこからミラーの LV を切り出す感じになるのかな?
複数 HDD に跨る巨大 VG は作りたくないので、やはり md を介してミラーにする、今迄のやり方の方が私の好みになりますね。
2021-06-13(Sun) 追記
10年来この方法でやってきたけれど、流石にもう標準 LVM2 で、
vgcreate VGx0 /dev/sda1 /dev/sdb1
lvcreate -n LVspc -L 100G -m1 VGx0
で良いような気がしてきた。
HDD 換装の時は、 lvconvert の --replace オプションかな?