rootのXFSファイルシステムを縮小する方法

※当ブログではアフィリエイト広告を利用しています

Red Hat Enterprise Linux (CentOS)7からは、標準のファイルシステムとしてXFSが採用されています。

https://ja.wikipedia.org/wiki/XFS

rootへのボリュームを適当に割り振った結果、/home の容量が足りない事態になってしまいました。

「LVMだし適当に縮小すればいいっしょ」って思っていた結果、、、

XFSはファイルシステムの容量を縮小することはできないことが判明しました。

で、何とか方法はないものかと調べた結果、縮小することができたのでメモ。

前提(必要なもの)

とりあえず以下のものを用意しましょう。でないと多分無理です。

  • 外部ディスク(NFS、VMDK、その他なんでも)
  • RHEL(もしくはCentOS)のインストールディスク

XFS縮小手順

先ほども書いた通り、XFSの縮小はできないので、

  1. root論理ボリュームのバックアップを取得
  2. rootの論理ボリュームを削除
  3. rootの論理ボリュームを再作成
  4. root論理ボリュームのバックアップを戻す

という手順で疑似的に縮小を行います。

失敗した時のために事前にスナップショットをとっておきましょう。(そもそも・・・という話はある)

NFSマウント

今回は外部ディスクとしてNFSを使用します。その他の場合は適宜読み替えてください。

バックアップ用のNFSディスクをマウント。(アドレスやパスは適宜読み替えてください)

mkdir /nfs
mount -o nolock 192.168.101.57:/backup /nfs

シングルユーザーモードへの移行

バックアップ時のファイル変更を抑えるため、シングルユーザーモードへ移行します。

init 1

IPアドレスを付与します。

ip addr add 192.168.101.56/24 dev eth0

xfsdumpを使ってバックアップ

xfsdumpを使ってバックアップをNFSへ取得。IPアドレスを付与した時点でNFS接続されるはずですが、できていない場合は再度マウントしてください。

xfsdump -l 0 - /dev/centos_k8smaster/root > /nfs/root.dump

論理ボリュームの再作成

RHEL(CentOS)のインストールディスクを使い、レスキューモードで起動します。今回はrootのボリュームを操作するため、通常のOS起動時には操作することができません。

起動時には「3. Skip to Shell」を選び、ディスクを一切使用しないようにします。

先ほどと同様にIPアドレスを付与したあと、論理ボリュームを再作成します。サイズは縮小後のサイズを指定します。

lvremove /dev/centos_k8smaster/root
lvcreate -L 30G -n root centos_k8smaster
mkfs.xfs /dev/centos_k8smaster/root
mount /dev/centos_k8smaster/root

xfsrestoreを使ってリストア

バックアップを取得したディスクをマウントし、ファイルシステムをリストアします。

mkdir /nfs
mount -o nolock 192.168.101.57:/backup /nfs
mkdir /mnt/root
mount /dev/centos_k8smaster/root /mnt/root
xfsrestore -f /nfs/root.dump /mnt/root

完了したら、再起動すればOKのはず。

まとめ

そもそも、スナップショットとっておけばこんなことしなくて良かった。

どんな些細な操作をする場合でもスナップショットはお守りとしてとっておきましょう。

参考にした記事:

https://qiita.com/toshikiw/items/d4ddaaff8e1d2904c9cf

https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/W3b01d47f6143_4fff_8f84_2c2b102a626a/page/RHEL7%20for%20IBM%20Power%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%83%BB%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E6%96%B9%E6%B3%95(xfsdump%E3%81%A8xfsrestore)