Linux パーティショニング

皆さんディスクのパーテショニングって、どうやってるんでしょうね？

ちょっと不思議に思ったので私が長年使っているやり方を書いてみます。
もしかしたらありふれたやり方かも知れませんが。

先ず 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 を拡大する。

1. 例えば、こんな感じに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
```

2. その後、 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
```

3. これで VG0, VG1 に空きができる。

```
/sbin/lvremove /dev/VG0/LV0_HOME
/sbin/lvremove /dev/VG1/LV1_var_usrlocal
```

で、空いた容量の分だけ Photos を拡大できる。

老朽化で HDD を取り除きたい時も、より大容量のHDDを追加した後、
上記の手順で問題の HDD から LV を全て移動してしまえば除去可能になりますね。

長年これでやってきてしまったのですが、

https://qiita.com/KouCo/items/7be2a1a478358fb29ac3

こちらを参照すると、 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 オプションかな？