CentOS7でhomeパーティションの容量を削減してrootに割り当てる

前回の記事でさくらVPSにCentOS7をインストールしましたが、その時のパーティション配分についてちょっと困ったことになりました。

再掲になりますが、dfコマンドで確認すると、ディスクの使用状況がこのようになっていました。

# df -hT
ファイルシス                            タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_vps--host--name-root xfs         50G   15G   36G   30% /
devtmpfs                                devtmpfs   2.0G     0  2.0G    0% /dev
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /dev/shm
tmpfs                                   tmpfs      2.0G  8.4M  2.0G    1% /run
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/vda1                               xfs        497M  142M  355M   29% /boot
/dev/mapper/centos_vps--host--name-home xfs         46G   49M   46G    1% /home
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1111

※「vps–host–name」の部分は契約したVPSのホストドメイン名になります。

ストレージ全体は100GBしかなく、またyumでインストールしていくと使用領域は概ねrootになるので、このままだとほぼ実質50GBしか使えないことになります。これは痛い。
homeの方を削減して、rootの領域を増やしたいと思いますが、ちょっと一筋縄ではいかなそうです。
本当はインストール時に割当を決められるようなのですが、さくらVPSのインストールマニュアルにはその部分は無かったので、そのまま進めたらこうなってしまっていたということです。

参考記事

CentOS 7(XFS)のパーティションを縮小する手順 – Qiita

CentOS7 minimalインストール後、自動作成の/homeを削除して/(ルート)に統合 – Qiita

CentOS7の/homeのディスク領域を縮小してルートのディスク領域を拡張したお話 – Qiita

このあたりの記事を参考にさせていただきました。
簡単にまとめると、CentOS7のファイルシステム(XFS)だと、パーティションの拡張は簡単だけど縮小は出来ず、もしやるとしたら一旦対象のパーティションの中身をバックアップし、アンマウント・削除を行った後、同じパーティションを小さいサイズで作り直し、復元、という手順になるようです。

また、homeパーティションだとユーザーごとにインストールしたプログラム等が動いていたり、参照されていたりすることもあるので、そういったプロセスを全部終了させないと、パーティションが削除出来ません。
作業前にプロセスを確認して、homeを利用しているものは全部落としておきます。

1.事前準備

普通に作ったアカウントだと、homeにユーザーのホームディレクトリができているはずです。
そうなると、そのアカウントでログインしているとhomeを参照してしまうので、今回の作業用にhome以外のディレクトリをホームディレクトリを持つアカウントを作る必要があります。

1-1.ホームディレクトリがworkの作業用ユーザーを作る

まず、suでrootになった後、/workディレクトリを作成します。

mkdir /work

次に、作業用ユーザーを作成し、パスワードを設定します。
useraddは、-dオプションでホームディレクトリを指定します。
作業用ユーザーもsu出来る必要があるので、wheelグループを追加します。

useradd -d /work/resize -m -G wheel -p resize resize
passwd resize

1-2.homeのダンプのためxfsdumpをインストールする

suのまま、homeのダンプが出来るxfsdumpをyumからインストールします。

yum install xfsdump

※既にインストール済みなら飛ばします。

1-3.fuserコマンドが使えるようにする

psmiscパッケージをインストールすると、fuserコマンドが使えるようになります。
CentOS7を手順通りにインストールすると最小構成になるようで、最初からインストールされていないので、追加する必要があります。

yum install psmisc

※既にインストール済みなら飛ばします。

これは、後々にhomeパーティションを利用しているプロセスを見つけるために必要になります。

2.homeのバックアップ

homeパーティションの中身をバックアップするため、作業ユーザーでログインしなおし、先程インストールしたxsfdumpを実行します。

cd /work
sudo xfsdump -J -L home -M drive -f home.dump /home

ダンプファイルは/workディレクトリ直下に作成するので、一度cdしています。
色々とログが出ますが、「xfsdump: Dump Status: SUCCESS」が出たら正常終了です。
これで、 /work/home.dump にダンプファイルが出来ました。

3.homeのアンマウントと削除

バックアップが済んだので、いよいよhomeをアンマウントします。
unmountコマンドでアンマウントするのですが、パスは先程のduコマンドで出てきた「/dev/mapper/centos_vps–host–name-home」になります。したがって、コマンドはこうなります。

umount /dev/mapper/centos_vps--host--name-home 

※「vps–host–name」部分は契約環境によって異なります。

これを実行後、再度duコマンドを実行すると、/homeの行が無くなっていることが確認できます。

# df -Th
ファイルシス                            タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_vps--host--name-root xfs         50G   15G   36G   30% /
devtmpfs                                devtmpfs   2.0G     0  2.0G    0% /dev
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /dev/shm
tmpfs                                   tmpfs      2.0G  8.4M  2.0G    1% /run
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/vda1                               xfs        497M  142M  355M   29% /boot
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1111
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1112

※その他、先程作った作業用ユーザーの分のtmpfsが増えています。

アンマウントが出来たので、次は論理ボリュームの削除です。
Red Hatのマニュアルにはこうあります。
4.4.12. 論理ボリュームの削除

「lvchange -an」で非アクティブにし、「lvremove」で削除します。

sudo lvchange -an /dev/centos_vps-host-name/home
sudo lvremove /dev/centos_vps-host-name/home

※「vps-host-name」部分は契約環境によって異なります。

Logical volume “home” successfully removed
と表示されれば成功です。

アンマウント・削除がうまくいかない時

この工程で、umountのタイミングなどで「device is busy」等のエラーが出て進まなくなることがあります。
これが出るときは、対象のディレクトリを使用中のプロセスが存在していますので、fuserコマンドでそのプロセスを見つけて終了させます。

fuser -va /dev/centos_vps-host-name/home

プロセスIDを1個ずつkillしてもよいですが、-kmオプションで一気に落とすこともできるようです。

参考:いつか役立つfuserコマンド | OpenGroove

4.homeの再作成・マウント

論理ボリュームの削除ができたら、今度はhomeを再作成します。
この時に新しいhomeの容量を指定します。今回は、念のため5Gとしていますが、実際のところ運用上は1Gとかでも良かったように思います。

lvcreate コマンドで、容量とボリューム名・ボリュームグループを指定して、論理ボリュームを作成します。
参考:4.4. 論理ボリュームの管理

sudo lvcreate -L 5G -n home centos_vps-host-name

「vps-host-name」の部分は例によって契約環境によって異なりますが、上記のコマンドは「vps-host-nameというボリュームグループに、homeというボリューム名の論理ボリュームを5G分作る」という意味になります。
論理ボリュームが出来たら、次のそこにファイルシステムを作ります。

sudo mkfs.xfs /dev/centos_vps-host-name/home

最後に、新しく出来たhomeをマウントします。

sudo mount /dev/centos_vps-host-name/home

ちゃんとdfコマンドで出てくるか確認します。

df -Th                                                
ファイルシス                            タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_vps--host--name-root xfs         50G   15G   36G   30% / 
devtmpfs                                devtmpfs   2.0G     0  2.0G    0% /dev  
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /dev/shm
tmpfs                                   tmpfs      2.0G   25M  2.0G    2% /run  
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/vda1                               xfs        497M  142M  355M   29% /boot 
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1111
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1112
/dev/mapper/centos_vps--host--name-home xfs        5.0G   33M  5.0G    1% /home

増えていました。サイズも5Gになっています。
あとはダンプファイルをリストアするだけです。

4.homeのリストア

xfsrestore コマンドで、ダンプファイルをリストアします。
先程ダンプファイルは/work直下に作成したので、一旦cdしています。

cd /work
sudo xfsrestore -J -L home -f home.dump /home

また色々とログが出てきますが、最後にSUCCESSが出たら正常終了です。
xfsrestore: Restore Status: SUCCESS

これで、homeを縮小させることが出来ました。
しかし、このままだとrootが50GBのままで、何も使われていない領域が41Gほど残っていることになります。
余った領域を、rootに割り当てましょう。

5.rootを拡張する

rootの使用領域を増やすには、論理ボリュームを拡張し、ファイルシステムも拡張する必要があります。
まず論理ボリュームの残りの部分を全部rootに割り当てます。

sudo lvextend -l +100%FREE /dev/centos_vps-host-name/root

Logical volume root successfully resized.
と出れば成功です。
次にファイルシステムを拡張します。

xfs_growfs /dev/mapper/centos_vps--host--name-root

これで論理ボリュームの割り当てによって増えた部分も使えるようになりました。
dfコマンドを確認します。

df -Th                                             
ファイルシス                            タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_vps--host--name-root xfs         91G   15G   77G   17% / 
devtmpfs                                devtmpfs   2.0G     0  2.0G    0% /dev  
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /dev/shm
tmpfs                                   tmpfs      2.0G   25M  2.0G    2% /run  
tmpfs                                   tmpfs      2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/vda1                               xfs        497M  142M  355M   29% /boot 
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1111
tmpfs                                   tmpfs      396M     0  396M    0% /run/user/1112
/dev/mapper/centos_vps--host--name-home xfs        5.0G   49M  5.0G    1% /home

無事にrootの領域が+41Gされて合計で91Gになっています。
これで、homeを縮小してrootを増やす作業が完了しました。

非常に面倒な手順になるので、出来ればOSインストール時点でちゃんとパーティションのボリュームを指定してインストールした方がいいですね。

コメント

  1. 仲村 太 より:

    ありがとうございます。
    この記事を読んで本当に助かりました。
    OSは違いますが、同じ事象で悩んでいました。

    今後とも参考にさせて頂きます。

  2. duck より:

    ありがとうございます!!!!!
    助かりました!!!!!!!!!

  3. 大澤 克巳 より:

    まずは、本当に感謝しております。
    お客様のサーバーを要件通りにセッティングを行い出荷したのですが、、
    この記事と全く同じ要求がお客様から出されて1週間方法を調査しておりました。
    英語の記事なども含めて検索しておりましたが、どれも期待通りの動作をしませんでした。
    本日貴殿のブログが目に留まりまして、無事LVM内の論理ボリュームの縮小と拡張が出来る方法がわかりました。本当に助かりました。ありがとうございます。

タイトルとURLをコピーしました