CloudStack 4.18のプライマリ/セカンダリストレージのパーティションを変更

CloudStack

この記事で設定したpool01は1つのパーティションをNFSで共有していて、プライマリストレージとセカンダリストレージを1つのパーティションで設定していました。

この影響で、CloudStack側から見た時に

  • プライマリ: 11T
  • セカンダリ: 11T

で、合計22T使える様に見えてしまっていました。
これを解消するためにパーティションを分割して、

  • プライマリ: 9T
  • セカンダリ: 2T

に設定しました。

一歩間違うとデータを損失する作業なので、バックアップは確実にとっておいた方がいいです。

現状確認

まずは現状確認。pool01のマウントポイントとデバイスを確認します。

$ df -h
Filesystem                 Size  Used Avail Use% Mounted on
tmpfs                      4.7G  1.9M  4.7G   1% /run
/dev/mapper/vg0-lv--0      251G   25G  214G  11% /
tmpfs                       24G     0   24G   0% /dev/shm
tmpfs                      5.0M     0  5.0M   0% /run/lock
tmpfs                       24G     0   24G   0% /run/qemu
/dev/mapper/vg0-lv--1      615G  203G  382G  35% /mnt/pool00
/dev/sda2                  2.0G  251M  1.6G  14% /boot
/dev/mapper/vg01-lv01--00   11T  4.0T  6.5T  38% /mnt/pool01

tmpfs                      4.7G  4.0K  4.7G   1% /run/user/1000

/mnt/pool01 にマウントしているデバイスは /dev/mapper/vg01-lv01–00 だということがわかります。
このパーティションはLVMの論理ボリュームなのでもう少し詳細を確認。
デバイス名に含まれているとおり論理グループの名前は vg01 なので、下記コマンドで詳細情報を確認します。

$ sudo lvdisplay vg01
  --- Logical volume ---
  LV Path                /dev/vg01/lv01-00
  LV Name                lv01-00
  VG Name                vg01
  LV UUID                5VZ1pI-uYo5-zwqb-u9mF-XWNk-HTQk-5rUpJN
  LV Write Access        read/write
  LV Creation host, time whale, 2023-05-02 09:43:55 +0900
  LV Status              available
  # open                 1
  LV Size                <10.92 TiB
  Current LE             2337229
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     4096
  Block device           253:2

今回はプライマリストレージの使用容量が圧倒的に大きかったので、lv01-00をプライマリストレージ用のパーティションとして使用します。この領域の容量を縮小して空き領域を作成し、空き領域に新しい論理ボリュームを作成してプライマリストレージ用のパーティションを作成します。

準備

論理ボリュームとファイルシステムのサイズ変更はマウントされていない必要がありますが、CloudStackが動作している環境ではアンマウントできません。
一旦CloudStack上で動いているインスタンス(仮想環境)と各種CloudStackのサービスを停止する必要があります。

インスタンスはWebの管理画面からすべてシャットダウンし、停止していることを確認してから各種サービスを停止しました。

$ sudo systemctl stop cloudstack-agent
$ sudo systemctl stop cloudstack-usage
$ sudo systemctl stop cloudstack-management
$ sudo systemctl stop qemu-kvm.service
$ sudo systemctl stop nfs*

この状態でもumount失敗したので、一度シングルユーザモードにランレベルを変更しました。

$ sudo init 1

ランレベルを変更後、下のコマンドで無事アンマウントできました。

$ sudo umount /mnt/pool01

論理ボリュームを縮小して空き領域を確保

まずは現状確認で調べた論理ボリュームの情報から「LV PATH」を使って論理ボリュームサイズを縮小します。
このコマンドはfsck.ext4が失敗するような状態だとうまくいかないので、事前にfsckを試してみて正常終了することを確認しておくと安心かもしれません。

$ sudo lvreduce --resizefs -L -2T /dev/vg01/lv01-00

このコマンドでlv01-00上にあるファイルシステム(ext4)と論理ボリュームサイズを2TiB分縮小します。
–resizefs オプションをつけることで論理ボリュームサイズ変更の前に自動的にファイルシステムを縮小してくれるようです。オプションをつけ忘れるとファイルシステムが破損する可能性があるので注意が必要です。
結構危険な操作なので慎重に操作する必要ありですね。RedHatのこのページを参考にしました。

6.2. 論理ボリュームとファイルシステムの縮小

領域サイズが大きいからか、lvreduceの処理は15分くらい?かかりました。
lvdisplayで変更後の容量を見てみると、10.92TiBから8.92TiB (-2TiB)に変更できていました。

$ sudo lvdisplay vg01
  --- Logical volume ---
  LV Path                /dev/vg01/lv01-00
  LV Name                lv01-00
  VG Name                vg01
  LV UUID                5VZ1pI-uYo5-zwqb-u9mF-XWNk-HTQk-5rUpJN
  LV Write Access        read/write
  LV Creation host, time whale, 2023-05-02 09:43:55 +0900
  LV Status              available
  # open                 1
  LV Size                <8.92 TiB
  Current LE             2337229
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     4096
  Block device           253:2

ext4のサイズも変更されているはずなので、このままマウントできますがマウントする前にfstabの設定を変えておきます。

$ sudo vi /etc/fstab

/mnt/pool01 にマウントしている所を、

/dev/disk/by-uuid/58d3105b-7d24-4ff6-b99e-f4c4b0698d92 /mnt/pool01 ext4 defaults 0 1

/mnt/pool01/primary にマウントするように変更します。

/dev/disk/by-uuid/58d3105b-7d24-4ff6-b99e-f4c4b0698d92 /mnt/pool01/primary ext4 defaults 0 1

保存したらマウントポイントを作成してマウントします。

$ sudo mkdir -p /mnt/pool01/primary /mnt/pool01/secondary
$ sudo mount /mnt/pool01/primary

うまくいったらこんな感じになるはずです。

$ df -h
Filesystem                          Size  Used Avail Use% Mounted on
tmpfs                               4.7G  2.5M  4.7G   1% /run
/dev/mapper/vg0-lv--0               251G   25G  214G  11% /
tmpfs                                24G     0   24G   0% /dev/shm
tmpfs                               5.0M     0  5.0M   0% /run/lock
tmpfs                                24G     0   24G   0% /run/qemu
/dev/sda2                           2.0G  251M  1.6G  14% /boot
/dev/mapper/vg0-lv--1               615G  203G  382G  35% /mnt/pool00

/dev/mapper/vg01-lv01--00           9.0T  3.9T  4.6T  46% /mnt/pool01/primary

セカンダリストレージ用の領域用の論理ボリュームを追加

次はセカンダリストレージ用の論理ボリュームとファイルシステムを作成します。
論理ボリュームの名前はlv01-01とします。

$ sudo lvcreate --name lv01-01 --size 2T vg01

これで論理ボリュームは作成完了です。
ファイルシステムを作成するために必要なので、論理ボリュームのLV PATHを確認しておきます。

$ sudo lvdisplay vg01
  --- Logical volume ---
  LV Path                /dev/vg01/lv01-01
  LV Name                lv01-01
  VG Name                vg01
  LV UUID                o8MUt1-Es25-Vccb-VN1i-5QMU-dnQL-8rNSYu
  LV Write Access        read/write
  LV Creation host, time whale, 2024-02-12 01:23:33 +0900
  LV Status              available
  # open                 1
  LV Size                2.00 TiB
  Current LE             524288
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     4096
  Block device           253:3

lvcreateはファイルシステムを同時に作成しないので、ext4のファイルシステムを作成します。(予約領域は0としました)

$ sudo mkfs.ext4 -m 0 /dev/vg01/lv01-01

コマンド実行後に表示されるUUIDでfstabに登録します。

$ sudo vi /etc/fstab
/dev/disk/by-uuid/50e45a62-d2c4-4ec1-a508-0e6c5c6ce72d /mnt/pool01/secondary ext4 defaults 0 1

fstab編集後、マウントしてパーミッションも調整します。

セカンダリは少し特殊なパーミッションで drwxrwxrwt です。

$ sudo mount /mnt/pool01/secondary
$ sudo chmod 777 /mnt/pool01/secondary
$ sudo chmod o+t /mnt/pool01/secondary

データを移動

プライマリ / セカンダリストレージの各データを適切な場所に移動します。

$ sudo mv /mnt/pool01/primary/secondary/* /mnt/pool01/secondary
$ sudo mv /mnt/pool01/primary/primary/* /mnt/pool01/primary
$ sudo rmdir /mnt/pool01/primary/primary/
$ sudo rmdir /mnt/pool01/primary/secondary/

不要なディレクトリも削除しておきます。
適切にデータが移動されているか、各ディレクトリの内容と df -h で容量も確認しておくといいです。

$ df -h
Filesystem                          Size  Used Avail Use% Mounted on
tmpfs                               4.7G  2.5M  4.7G   1% /run
/dev/mapper/vg0-lv--0               251G   25G  214G  11% /
tmpfs                                24G     0   24G   0% /dev/shm
tmpfs                               5.0M     0  5.0M   0% /run/lock
tmpfs                                24G     0   24G   0% /run/qemu
/dev/sda2                           2.0G  251M  1.6G  14% /boot
/dev/mapper/vg0-lv--1               615G  203G  382G  35% /mnt/pool00
/dev/mapper/vg01-lv01--01           2.0T   34G  2.0T   2% /mnt/pool01/secondary
/dev/mapper/vg01-lv01--00           9.0T  3.9T  4.6T  46% /mnt/pool01/primary

NFSサーバーの設定変更

最後に、NFSとして公開するディレクトリの設定を変更するためにexportsファイルを編集します。

/etc/exportsの /mnt/pool01 の行をに下記変更します。

/mnt/pool01/primary *(rw,async,no_root_squash,no_subtree_check)
/mnt/pool01/secondary *(rw,async,no_root_squash,no_subtree_check)

保存後できたらNFS設定読み込みなおします。

これで一通り設定変更終了!

システム再起動

今回はランレベルを1に変更しているので、念のためOSを再起動しました。

$ sudo reboot

再起動後、ブラウザから接続確認。

プライマリストレージのStatusがUPになっていて、

システムVMのsecondarystoragevmが正しく起動できてればOK

無事にストレージサイズが正しく見えるようになりました!

(隣のPrimary storageが2倍に見えているのはとりあえず気にしないようにしよう…)


今の環境、システムの終了にすごい時間(20分くらい)かかるんだよね。
多分Qemuの終了に時間がかかっているようなんだけど、こんなもんなのかな…

あと、CloudStack 4.19.0.0がリリースされているようです。近いうちにうちの環境もアップデートしたい。

https://cloudstack.apache.org/downloads/