RHELの公式サイトでは
LVMで設定した「XFSまたはGFS2ファイルシステム」の論理ボリュームを縮小することはできないと記載されています。
縮小する方法がないといっているわけではなく、縮小する方法はあります。
あくまでも、XFS/GFS2ファイルシステムは、ファイルの移動やコピーなどをせずに、今設定されているファイルシステムにとどまったまま(ファイルを保持したまま)縮小することはできないという意味で「縮小方法がない」と言っているわけではないので注意してください。
■RedHat説明している縮小できないケース
■以下の5ステップを踏んで縮小できるケース
- 縮小したい容量の仮想デバイスを仮想サーバに新規追加
- 追加した仮想デバイスを新規にLVM設定して仮想サーバにマウント
- 新規にマウントしたところにデータを移行
- 既存の(移行元)仮想ディスクを削除
- 追加した仮想ディスクのコントローラーのポートを削除した仮想ディスクのポートに変更
※追加した仮想ディスクのデバイスを/dev/sdcから/dev/sdbに変更
LVMで論理ボリューム縮小方法を解説(XFSのデータ編)
xfsファイルシステムの縮小は、縮小したい容量の仮想ディスクを追加し、そこにデータをコピーして行います。
実質、データを移行して縮小を実現します。
その方法を5ステップで「VirtualBoxで稼働する仮想サーバ」を題材に詳しく解説します
ステップ1.縮小したい容量の仮想デバイスを仮想サーバに新規追加
今回は、LVM設定をしてデータ領域として利用している仮想デバイス(/dev/sdb)を2Gから1G(-1G)に縮小します。
1-1.【作業前】縮小したい仮想デバイスの情報を確認
下記情報を縮小前に対象の仮想デバイスで確認します。
確認項目 | 値 |
仮想デバイスのvdiファイル名 | rhel84efi_clone2-disk1.vdi |
ハードディスク | SATAポート1 |
サイズ | 2G |
仮想デバイス | /dev/sdb |
LVM設定 | /dev/mapper/vg--sdb-lv--sdb |
ファイルシステム | xfs |
マウントポイント | /lv-data |
1-2.【作業後】縮小したい容量で新規に追加した仮想デバイスの情報を確認
下記の新規追加した仮想デバイスの情報を確認します。
確認項目 | 値 |
仮想デバイスのvdiファイル名 | rhel84efi_clone2-disk3.vdi |
ハードディスク | SATAポート2 |
サイズ | 1G |
仮想デバイス | /dev/sdc |
ーーー情報確認で使用したコマンドーーー
df -h
more /etc/fstab
blkid
lsblk
ステップ2.追加した仮想デバイスをLVM設定して仮想サーバにマウント
縮小したい容量(1G)で追加した仮想デバイスをLVM設定してディスクをマウントします。
VG名とLV名にはデバイス名(sdc)をつけない名前を使用してください。
詳しくは下記の「既存のLVM設定のディスクを削除した時~」と「縮小したい容量でLVM設定する時~」を参照ください。
今回は、縮小方法を分かりやすく解説するためにVG名とLV名にデバイス名(sdc)を使用しています。
※追加した仮想デバイスは、/lv-data-newとしてマウントします。
※VG名、LV名を付ける時は、既存(元)のLVM設定した名前と重複して使用することはできません。
lsblk
fdisk -l /dev/sdc
pvcreate /dev/sdc
vgcreate vg-sdc /dev/sdc
lvcreate -n lv-sdc -l 100%FREE vg-sdc
lvdisplay
mkfs.xfs /dev/vg-sdc/lv-sdc
mkdir /lv-data-new
mount /dev/vg-sdc/lv-sdc /lv-data-new/
df -h
ステップ3.新規にマウントしたところにデータを移行
xfsファイルシステムのデータ移行に「xfsdump」と「xfsrestore」コマンドを使用します。
df -h
ls -al /lv-data
->既存(元)のLVM構成のマウントポイント
ls -al /lv-data-new/
->縮小したい容量でLVM設定したマウントポイント
xfsdump -l 0 - /dev/mapper/vg--sdb-lv--sdb |xfsrestore - /lv-data-new/
->今回ポイントとなるデータ移行するためのコマンド
※「/lv-data」から「/lv-data-new」へデータを移行する
※豆知識
ext4などで利用するdumpとrestoreコマンドと比較
#dump -0uf - /dev/mapper/vg--sdb-lv--sdb |(cd /lv-data-new;restore -rf -)
ls -al /lv-data-new/
->縮小したい容量でLVM設定したマウントポイントにデータ移行されているか確認
■xfsdump
「/dev/mapper/vg--sdb-lv--sdb」の箇所を「/lv-data」とすることも可能です。
※「/lv-data/」と設定するとエラーになります。
※アンマウントして実行するとエラーになります。
オプション | 説明 |
-l | ダンプレベルを「0」から「9」まで指定できます。 「-l」(ハイホンエル)のオプションを指定しない場合は、デフォルトの「0」を指定したことになります。 よって、今回の利用では「0」のフルバックアップを使用しますので、このオプションを付けなくても問題ありません。 今回の利用ケースでは他のダンプレベルは使用しません。 |
- | バックアップの保存先を標準出力にするためのオプションとなります。 今回は「|」(パイプ)で次のxfsrestoreにつなげるために利用しています。 |
ーー補足ーー
「/dev/mapper/vg--sdb-lv--sdb」のようにデバイス指定することで
下記のマウントポイント構成の場合に対象を明示的に指定できます。
デバイス | マウントポイント |
/dev/mapper/vg--sdy-lv--sdy | /lv-data/test1 |
/dev/mapper/vg--sdz-lv--sdz | /lv-data/test1/log |
※「/dev/mapper/vg--sdy-lv--sdy」と指定することで「/lv-data/test1/log」以外の「/lv-data/test1」配下のデータが移行されます。
xfsdumpで「/lv-data/test1」とすると「/lv-data/test1/log」のデータもダンプ対象となってしまいます。
■xfsrestore
「/lv-data-new/」また「/lv-data-new」どちらも指定することが可能です。
※「/dev/mapper/vg--sdc-lv--sdc」と設定するとエラーになります。
※アンマウントして実行するとエラーになります。
オプション | 説明 |
- | リストア対象となるバックアップファイルを標準入力からにするためのオプションとなります。 今回は「|」(パイプ)で受け取ったxfsdumpからの標準出力を標準入力として受けってリストア対象としてxfsrestoreするために利用しています。 |
ステップ4.既存の(移行元)仮想ディスクを削除
縮小したい容量のLVM設定した仮想デバイスのデータ移行が完了したので、元のLVM設定した仮想デバイスを削除します。
※削除する仮想デバイスだけで構成されたLVM設定の場合は、LVM設定を削除せずに仮想デバイス削除が可能です。
■注意事項
「/etc/fstab」にマウント設定をしていた場合は、削除する仮想デバイスの設定は削除してください。
4-1.削除する仮想ディスクの「/etc/fstab」設定を修正してサーバ停止
more /etc/fstab
vi /etc/fstab
more /etc/fstab
shutdown -h now
4-2.仮想ディスク削除
既存の仮想デバイスをサーバ停止後、サーバ構成から削除します。
■仮想ディスク削除前
※2GのLVM設定の仮想ディスクを削除
■仮想ディスク削除後
※1Gの縮小したい容量で設定した仮想ディスクだけになっています
ステップ5.追加した仮想ディスクのコントローラーのポートを削除した仮想ディスクのポートに変更
既存の仮想デバイスを削除したことによりハードディスク(デバイス)のポートの番号が歯抜けになったので解消します。
5.1仮想ディスクポートを「2」から「1」へ変更
■「ステップ1~ステップ3」までのポート番号の状態
ポート0:OS
ポート1:既存LVM設定の仮想デバイス※削除予定
ポート2:縮小したい容量でLVM設定した仮想デバイス
↓
■「ステップ4実行後」のポート番号の状態
ポート0:OS
ポート2:縮小したい容量でLVM設定した仮想デバイス
↓
■「ステップ5実行後」のポート番号の状態
ポート0:OS
ポート1:縮小したい容量でLVM設定した仮想デバイス
5-2.サーバを起動し縮小した容量で仮想ディスクをマウント
縮小したい容量で追加したLVM設定の仮想ディスクの仮想デバイスが「/dev/sdc」から「/dev/sdb」に変更されていることを確認します。
次に、「/etc/fstab」を修正して「/lv-data」で縮小したい容量でLVM設定した仮想ディスクがマウントできるように設定します。
pvdisplay
->「/dev/sdc」から「/dev/sdb」になっていることを確認する
vgdisplay
lvdisplay
df -h
more /etc/fstab
vi /etc/fstab
->縮小したい容量でLVM設定したもので「/lv-data」をマウントする
more /etc/fstab
mount -a
->「/etc/fstab」を修正した設定でディスクをマウントする
df -h
shutdown -r now
->既存のLVM設定と同様に縮小したい容量でLVM設定した仮想ディスクも「/lv-data」をサーバ起動時からマウントした状態で利用する為にサーバを再起動しておきます。
まとめ
- LVM設定のxfsファイルシステムの縮小は新しく縮小したい容量の仮想デバイスを追加しデータを移行して縮小させる。
- xfsファイルシステムのデータを移行するときにxfsdumpとxfsrestoreコマンドで行いますが、余計なdumpファイルの容量確保をしなくていいように、「|」(パイプ)を使った実行をする。
- 既存のLVM設定のディスクを削除した時に仮想デバイスの歯抜けに注意する。
※ステップ5で実施したポートの入替えは、必ずしも実施する必要はないが管理がややこしくなるので実施することをおススメします。
以下がその理由です。
■ステップ5を実施しなかった場合
ーー作業前ーー
ポート NO | ファイル名 | 仮想デバイス名 | (VG名)・(LV名) |
0 | 仮想ディスクA(diskA.vdi) | /dev/sda | - |
1 | 仮想ディスクB(diskB.vdi) | /dev/sdb | (vg-sdb)・(lv-sdb) |
2 | 仮想ディスクC(diskC.vdi) | /dev/sdc | (vg-sdc)・(lv-sdc) |
↓
ーー作業後ーー
ポート NO | ファイル名 | 仮想デバイス名 | (VG名)・(LV名) |
0 | 仮想ディスクA(diskA.vdi) | /dev/sda | - |
2 | 仮想ディスクC(diskC.vdi) | /dev/sdb | (vg-sdc)・(lv-sdc) |
となり、「ポート1」が歯抜けになり仮想デバイスは
「ポート2」であるにもかかわらずサーバ上で認識される
仮想デバイスは「/dev/sdc」ではなく「/dev/sdb」で
認識されます。
■ステップ5を実施した場合
ーー作業後ーー
ポート NO | ファイル名 | 仮想デバイス名 | (VG名)・(LV名) |
0 | 仮想ディスクA(diskA.vdi) | /dev/sda | - |
1 | 仮想ディスクC(diskC.vdi) | /dev/sdb | (vg-sdc)・(lv-sdc) |
となり、管理しやすくしています。
※VG名とLV名にデバイス名を付けない
- 縮小したい容量でLVM設定する時、VG名とLV名は、上記のようなことが発生するのでデバイス名(sdX)を含む名前を付けないように設定する。
- ディスクのマウントは「/etc/fstab」で設定されています。
削除した仮想デバイスの設定がされていたら削除してください。
※削除された仮想デバイスが「/etc/fstab」に登録された状態で、サーバ停止・起動をするとメンテナンス状態での起動であったり、起動に時間がかかったりするので注意してください。 - 縮小(移行)後に、縮小したい容量でLVM設定した仮想デバイスは、削除した仮想デバイスがマウントしていたマウントポイント(/lv-data)に「/etc/fstab」を設定変更する。
- 縮小(移行)作業が完了した時点では、サーバ起動時にディスクはマウントされていない状態になっています。
縮小したマウントポイントがサーバ起動時にマウントされた状態でサーバを提供するために、必ず、作業終了前にサーバを再起動してから利用する。
※起動時にディスクがマウントされていない状態でサーバを利用しているとサーバサービスが起動時にそのディスクを利用していた場合、サーバサービスが動作しない場合があります。
コメント