みつのーと

頑張ってます・・・

LVM で home の容量を減らして root の容量を増やす

例えば、

という感じの構成のときに、「home の容量をけずって、その分を root にもってきたい」といったケース。の作業ログ的なもの。

なお Archwiki に全部載ってるので、このまま先を読むより ArchWiki を読むほうが正確なうえにタメになる。

LVM - ArchWiki

基本

LVM で管理するのはボリュームサイズであって、ファイルサイズはまた別なので注意が必要。 うっかりファイルサイズを変更しないままボリュームサイズを縮小したりすると苦しむことになる*1

  • 論理ボリュームを拡大する場合
    1. 論理ボリュームを拡大する
    2. 新しく作られた容量を使うようにファイルシステムを拡張する
  • 論理ボリュームを縮小する場合
    1. ファイルシステムのサイズを縮小する
      • このとき、ボリュームの縮小サイズより多めにファイルシステムのサイズを縮小しておく
      • 縮小サイズが同じだと、ボリュームを縮小したときに、うっかりファイルシステムのケツを切り落としてしまうことがあるらしい
    2. 論理ボリュームを縮小する
    3. 論理ボリュームに残っている空き容量を使い切るように、ファイルシステムを拡大する

これを頭に入れておく。

実践

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 にしてみたら思ったより簡単だし便利で最高だった。

*1:ぼくは一度homeをぶっこわして????ってなった

*2:正しく縮小されてないときはがんばるしかない、諦めも重要

*3:だいたい 28GiB くらい

*4:その場しのぎで雑に apt autoremove --purge しまくってたらナニか大切なものまでパージしてしまった