Featured image of post /home/<user>を新しいパーティションに移行する(btrfsサブボリュームから専用パーティションへ)

/home/<user>を新しいパーティションに移行する(btrfsサブボリュームから専用パーティションへ)

ASUS ROG Zephyrus G14 に CachyOS を導入した記録の続きです。これまで /home/<user> はルートと同じディスク(/dev/nvme0n1p11)上のbtrfsサブボリューム @home に置かれていました。空き容量が逼迫してきたため、新しく確保した専用パーティション /dev/nvme0n1p6(btrfs、ラベルhome_<user>)にホームディレクトリを丸ごと引っ越すことにしました。

  • OS: CachyOS(Arch系)
  • ファイルシステム: btrfs(ルート側は@/@home等のサブボリューム構成、移行先は単一パーティション)

作業手順

旧ホームをアンマウントし、退避

sudo umount /mnt/newhome   # 新パーティションに事前にコピー済みのデータを一旦アンマウント
sudo mv /home/<user> /home/<user>.old
sudo mkdir /home/<user>

いきなり削除せず.oldにリネームして退避しておくことで、問題が起きてもすぐ元に戻せるようにしました。

新パーティションをマウント

sudo mount /home/<user>
df -h /home/<user>
ls /home/<user> | head -20

/etc/fstabには事前に以下の行を追加済み。

UUID=d010059f-41a8-4029-b1fe-bb9a514634a8  /home/<user>  btrfs  defaults,compress=zstd:1  0  2

ポイントは、/home自体は従来通り@homeサブボリュームにマウントしたまま、その内側の/home/<user>だけを別パーティションで上書きマウントする構成にしたことです。/home配下の他ユーザーディレクトリ構成には手を加えずに済みます。

systemctl daemon-reloadとマウント確認

fstabを変更すると、mountコマンド実行時に以下の警告が出る。

mount: (注意) fstab が変更されましたが、 systemd はまだ古いバージョンを
       使っています。'systemctl daemon-reload' でリロードしてください。

言われた通りリロードします。

sudo systemctl daemon-reload

その後、隠しファイル(.ssh.config.claudeなど)も含めて中身が揃っているかls -laで確認しました。

再起動して恒久性を確認

一時的なmountコマンドではなく、fstab経由で起動時に正しくマウントされるかを再起動して確かめました。

sudo reboot

ハマった点: df -h /homeだけを見て「切り替わっていない」と誤認しかけた

再起動後、df -h / /homeを実行すると、/homeが旧パーティション(/dev/nvme0n1p11@homeサブボリューム)のままに見えて、一瞬「fstabの設定が起動時に反映されていないのでは」と焦りました。

/dev/nvme0n1p11   525G  421G  104G   81% /
/dev/nvme0n1p11   525G  421G  104G   81% /home

しかし今回の構成は「/home@homeサブボリュームのまま、その内側の/home/<user>だけ別パーティション」というネストしたマウントだったため、親ディレクトリのdf結果だけでは子マウントの状態は分かりませんdf -h /home/<user>findmnt /home/<user>で確認すると、狙い通り新パーティションにマウントされていました。

$ df -h /home/<user>
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/nvme0n1p6   954G  404G  549G   43% /home/<user>

$ findmnt /home/<user>
TARGET        SOURCE         FSTYPE OPTIONS
/home/<user> /dev/nvme0n1p6 btrfs  rw,relatime,compress=zstd:1,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/

lsblk -fでも同様に、nvme0n1p6/home/<user>に、nvme0n1p11/home(と//var/log等の他サブボリューム)にそれぞれマウントされていることが確認できました。

容量回収は後回し

旧データは/home/<user>.oldとしてルート側のディスク(/dev/nvme0n1p11)にまだ残っているため、df -h /の空き容量(104G)はこの時点では変化しません。これは想定通りで、btrfsサブボリューム内のファイルを削除しない限り容量は解放されません。

数日間、デスクトップ・ログイン・主要アプリを普段通り使ってみて問題がないことを確認してから、/home/<user>.oldを削除して容量を回収する予定です。

  • btrfsで//homeが同じディスクのサブボリューム構成になっている場合でも、/home配下の特定ユーザーディレクトリだけを別パーティションに切り出してネストマウントできます。
  • fstab変更後はsystemctl daemon-reloadを忘れずに。ただし本当に確認すべきは再起動後の恒久的な挙動です。
  • 親ディレクトリ(/home)のdf結果は、その内側にネストしたマウントポイント(/home/<user>)の状態を反映しません。個別にdffindmntで確認する必要があります。
  • 削除は最後の最後まで待つのがおすすめです。リネームで退避 → 動作確認 → 数日様子見 → 削除、の順で進めることで、切り戻しの余地を残せます。
Hugo で構築されています。
テーマ StackJimmy によって設計されています。