LVM で home の容量を減らして root の容量を増やす
例えば、
- root パーティションに 28GiB
- home に残りの容量全部
という感じの構成のときに、「home の容量をけずって、その分を root にもってきたい」といったケース。の作業ログ的なもの。
なお Archwiki に全部載ってるので、このまま先を読むより ArchWiki を読むほうが正確なうえにタメになる。
基本
LVM で管理するのはボリュームサイズであって、ファイルサイズはまた別なので注意が必要。 うっかりファイルサイズを変更しないままボリュームサイズを縮小したりすると苦しむことになる*1。
- 論理ボリュームを拡大する場合
- 論理ボリュームを拡大する
- 新しく作られた容量を使うようにファイルシステムを拡張する
- 論理ボリュームを縮小する場合
これを頭に入れておく。
実践
home や root のパーティションをいじる場合は recovery mode でログインしておく。
状態を確認
最初の状態を確認する。 サイズを縮小するパーティションにサイズを削る分の余裕があることを確認しておく。
root@pc:~# df -Th Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 32G 0 32G 0% /dev tmpfs tmpfs 6.3G 9.4M 6.3G 1% /run /dev/mapper/pc--vg-root ext4 28G 3.3G 23G 13% / tmpfs tmpfs 32G 0 32G 0% /dev/shm tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/nvme0n1p1 ext2 236M 58M 166M 26% /boot /dev/mapper/pc--vg-home ext4 826G 77M 784G 1% /home root@pc:~# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home pc-vg -wi-ao---- <839.44g root pc-vg -wi-ao---- <27.94g swap_1 pc-vg -wi-ao---- 63.89g
今回は、この状態から home を 100G けずって root を 100G 増やしていく。
home パーティションを縮小する
まずは unmount でhome をアンマウントする。
一応 e2fsck でファイルシステムが正常かどうかチェックすると安心。もし異常になったときは…がんばるしかない、がんばれ。
root@pc:~# umount /dev/mapper/pc--vg-home # e2fsck でファイルシステムをチェック(一応) root@pc:~# e2fsck -f /dev/mapper/pc--vg-home e2fsck 1.44.5 (15-Dec-2018) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mapper/pc--vg-home: 15/55017472 files (0.0% non-contiguous), 3735649/220053504 blocks
次に、 resize2fs
でファイルシステムを縮小していく。
このとき、予定している論理ボリュームの縮小量よりも、少し多めに縮小しておくこと。
例では、もともと 826G あったところから 100G 減らしたいので、826G - 100G = 726G よりも小さな値を指定する。 今回はめんどうだから 700G を指定してる。
root@pc:~# resize2fs /dev/mapper/pc--vg-home 700G resize2fs 1.44.5 (15-Dec-2018) Resizing the filesystem on /dev/mapper/pc--vg-home to 183500800 (4k) blocks. The filesystem on /dev/mapper/pc--vg-home is now 183500800 (4k) blocks long.
ファイルシステムを縮小できたら、lvreduce
を使って論理ボリュームを縮小していく。
-L
オプションで "-100G" のように "-" をつけると相対的にサイズを指定できるので便利。
root@pc:~# lvreduce -L -100G /dev/mapper/pc--vg-home WARNING: Reducing active logical volume to <739.44 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce pc-vg/home? [y/n]: y Size of logical volume pc-vg/home changed from <839.44 GiB (214896 extents) to <739.44 GiB (189296 extents). Logical volume pc-vg/home successfully resized.
最後に、論理ボリュームに残っている空き容量をすべて使うようにファイルシステムを拡張する。
resize2fs
でサイズを指定しなければ、全部使うように上手くやってくれる。
root@pc:~# resize2fs /dev/mapper/pc--vg-home resize2fs 1.44.5 (15-Dec-2018) Resizing the filesystem on /dev/mapper/pc--vg-home to 193839104 (4k) blocks. The filesystem on /dev/mapper/pc--vg-home is now 193839104 (4k) blocks long.
最後に再マウントしてサイズが変更されているか確認する。
マウント前に e2fsck
でファイルシステムが正しく縮小されているか確認すると安心*2。
# ファイルシステムの状態をチェックしておく(一応) root@pc:~# e2fsck -f /dev/mapper/pc--vg-home e2fsck 1.44.5 (15-Dec-2018) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mapper/pc--vg-home: 15/48463872 files (0.0% non-contiguous), 3323013/193839104 blocks # 再マウントする root@pc:~# mount -a [ 4101.989495] EXT4-fs (dm-2): mounted filesystem with ordered data mode. Opts: (null) # 縮小されていることを確認 root@pc:~# df -Th Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 32G 0 32G 0% /dev tmpfs tmpfs 6.3G 9.4M 6.3G 1% /run /dev/mapper/pc--vg-root ext4 28G 3.3G 23G 13% / tmpfs tmpfs 32G 0 32G 0% /dev/shm tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/nvme0n1p1 ext2 236M 58M 166M 26% /boot /dev/mapper/pc--vg-home ext4 727G 72M 690G 1% /home root@pc:~# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home pc-vg -wi-ao---- <739.44g root pc-vg -wi-ao---- <27.94g swap_1 pc-vg -wi-ao---- 63.89g
root パーティションを拡張する
home の容量を無事削減できたので、その分 root の容量を増やしていく。
拡張するときは、先に論理ボリュームを拡張する。
拡張には lvextend
を使用する。
root@pc:~# lvextend -L +100G /dev/mapper/pc--vg-root Size of logical volume pc-vg/root changed from <27.94 GiB (7152 extents) to <127.94 GiB (32752 extents). Logical volume pc-vg/root successfully resized. # ちなみに、空き容量を全部使うように指示したい場合は、 lvextend を以下のようにする # root@pc:~# lvextend -l +100%Free /dev/mapper/pc--vg-root
論理ボリュームを拡張したら、拡張した容量を使うようファイルシステムも拡張していく。
root@pc:~# resize2fs /dev/mapper/pc--vg-root resize2fs 1.44.5 (15-Dec-2018) Filesystem at /dev/mapper/pc--vg-root is mounted on /; on-line resizing required old_desc_blocks = 4, new_desc_blocks = 16 [ 421.184784] EXT4-fs (dm-0): resizing filesystem from 7323648 to 33538048 blocks [ 421.235220] EXT4-fs (dm-0): resized filesystem to 33538048 The filesystem on /dev/mapper/pc--vg-root is now 33538048 (4k) blocks long.
最後に、ちゃんと拡張されていることを確認しておく。
root@pc:~# df -Th Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 32G 0 32G 0% /dev tmpfs tmpfs 6.3G 9.4M 6.3G 1% /run /dev/mapper/pc--vg-root ext4 128G 3.4G 118G 3% / tmpfs tmpfs 32G 0 32G 0% /dev/shm tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/nvme0n1p1 ext2 236M 58M 166M 26% /boot /dev/mapper/pc--vg-home ext4 727G 72M 690G 1% /home root@pc:~# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home pc-vg -wi-ao---- <739.44g root pc-vg -wi-ao---- <127.94g swap_1 pc-vg -wi-ao---- 63.89g
おしまい!
補足: lvextend
したときになんかエラーがでる
root@pc:~# lvextend -L +100G /dev/mapper/pc--vg-root lvm cannot archive volume group metadata for pc-vg/root to read-only filesystem
謎。 何の参考にもならないけれど、ぼくの場合はマシンを再起動したらなおった、多分だけど再起動を信じる心が大事。
debian のセットアップ時に、インストーラ任せにパーティションを切ると、 root パーティションは必要最低限なサイズしか割り当てられなかったりする*3。
デスクトップ用途で使ってると結構カツカツになるし、とくに Docker image はデフォルトでは /home 以下には保存されないから、docker を使って開発してると気付いたらカツカツになってた…ってなりがちな気がする。 で、ぼくはパンクさせたうえにやらかした*4から、同じ面倒に遭遇しないよう、SSD のサイズを倍にして root パーティションも大きめに取るようにした。
「柔軟に変更出来たほうがいいなー」と思って LVM にしてみたら思ったより簡単だし便利で最高だった。