ストレージ実務 — RAID・スナップショット・iSCSI・fio
スナップショットで戻し、XFS は拡張し、ext4 は縮小する
目標
変更の直前にLVMスナップショットを取り、間違った変更をマージで元に戻し、XFSはオンラインで拡張し、ext4はデータを守りながらオフラインで縮小し、シンプールでオーバープロビジョニングを作ってみます。
なぜ重要なのか
変更作業は、「失敗したら元に戻す」を前提に承認されます。スナップショットは、その前提を数秒で作ってくれますが、サイズを間違えると、作業中に静かに無効になり、元に戻す手順(アンマウント → マージ → 再マウント)を知らないと、明け方に右往左往します。ファイルシステムの選択も同じです。XFSは拡張はできても縮小できないものとして設計するので、縮小する可能性があるボリュームに何を選んだかが、あとの選択肢を決めます。
このラボは、Ubuntu 24.04のVM上で、rootとして動きます。空のディスクがないので、3GiBのスパースファイルをループデバイスとして取り付け、ディスクの代わりに使います。セッションは60分で始まり、最大180分まで延長でき、VMはセッションが終わると消えます。
ステップ
/var/lib/sto/lvm.imgを3GiBで作成してループデバイスとして取り付け、PVとして初期化して、ボリュームグループvg_stoを作成してください。- 600MiBのLV
lv_appをXFSでフォーマットして、/srv/appにマウントしてください。/srv/app/app.confにversion=1、/srv/app/orders.csvに3行以上のCSVを書き、sha256sum /srv/app/orders.csvの出力を/root/sto/snap/orders.sha256に保存してください。 - スナップショット
lv_app_snapを200MiBで作成し、lvs -o lv_name,origin,lv_attr,lv_size vg_stoの出力を/root/sto/snap/snap.txtに保存してください。 - 間違った変更として、
app.confをversion=2にし、orders.csvを削除し、/srv/app/junk.binに60MiBを書き込んでください。そのあと、lvs -o lv_name,origin,data_percent vg_stoの出力を/root/sto/snap/usage.txtに保存してください。 - スナップショットをマージして元に戻してください。
lv_app_snapはなくなり、/srv/appが再びマウントされていて、version=1・orders.csvのチェックサムが一致・junk.binなし、である必要があります。 lv_appを900MiBに拡張し、XFSもマウントしたまま拡張してください。- 500MiBのLV
lv_logsをext4で/srv/logsにマウントし、/srv/logs/keep.logに5MiBを書いたあと、sha256sum /srv/logs/keep.logの出力を/root/sto/snap/keep.sha256に保存してください。 lv_logsを300MiBに縮小してください。ファイルシステムも一緒に縮小され、再びマウントされていて、keep.logがチェックサムと同じである必要があります。- 400MiBのシンプール
poolの上に、仮想サイズ1GiBのシンボリュームlv_thinを作成し、lvs -o lv_name,lv_size,pool_lv,data_percent vg_stoの出力を/root/sto/snap/thin.txtに保存してください。
参考
- スナップショット:
lvcreate -s -L 200M -n lv_app_snap vg_sto/lv_app、元に戻す:lvconvert --merge。 - 拡張:
lvextend -r -L 900M vg_sto/lv_app。縮小:e2fsck -f→resize2fs <작게>→lvreduce→resize2fs(プレースホルダーは小さいサイズです)。 - シン:
lvcreate --type thin-pool、lvcreate -V 1G -T vg_sto/pool -n lv_thin。 - よくある間違い1: マウントしたまま
lvconvert --mergeを実行して、「なぜ元に戻らないのか」となる場合です。マージが、次のアクティブ化まで延期されたのです。 - よくある間違い2:
lvreduceを先に行い、resize2fsをあとにする場合です。ファイルシステムの末尾が切り捨てられます。
ループデバイスの上にVGを立ち上げる
/var/lib/sto/lvm.imgを3GiBのスパースファイルとして作成してループデバイスとして取り付け、PVとして初期化したあと、その1つでボリュームグループvg_stoを作成してください。
truncate → losetup -f --show → pvcreate → vgcreateの順です。ループの番号は、losetup -j <ファイル>で取得し直します。
XFSボリュームと守るデータ
vg_stoに600MiBのLVlv_appを作成してXFSでフォーマットし、/srv/appにマウントしてください。/srv/app/app.confに1行version=1を、/srv/app/orders.csvに3行以上の任意のCSVを書き、sha256sum /srv/app/orders.csvの出力を/root/sto/snap/orders.sha256に保存してください。
lvcreate -L 600M -n lv_app vg_sto、mkfs.xfs、mountの順です。チェックサムのファイルに絶対パスが入っている必要があり、そうすればあとでsha256sum -cで検査できます。
変更直前のスナップショット
lv_appのスナップショットlv_app_snapを200MiBで作成してください。そして、lvs -o lv_name,origin,lv_attr,lv_size vg_stoの出力を/root/sto/snap/snap.txtに保存してください。
lvcreate -s -L <サイズ> -n <名前> vg_sto/lv_appです。スナップショットのlv_attrはsで始まり、Origin列に元の名前が見えます。
間違った変更とスナップショットの使用率
間違った変更を模してください。/srv/app/app.confをversion=2に変え、/srv/app/orders.csvを消し、/srv/app/junk.binに60MiBを書いてください。そのあと、lvs -o lv_name,origin,data_percent vg_stoの出力を/root/sto/snap/usage.txtに保存してください。
dd if=/dev/urandom of=... bs=1M count=60で書けます。書いたあとにsyncをしないと、スナップショットの使用率(Data%)に反映されません。スナップショットより多く書くと、スナップショットが無効になるので、サイズを守ってください。
マージで元に戻す
スナップショットを元にマージして、間違った変更の前に戻してください。終わったら、lv_app_snapはなくなり、/srv/appが再びマウントされていて、app.confはversion=1、orders.csvはチェックサムと同じで、junk.binはない必要があります。
lvconvert --mergeは、元がマウントされていると、次のアクティブ化まで延期されます。先にアンマウントしてからマージし、再びマウントしてください。
XFSをマウントしたまま拡張する
lv_appを900MiBに拡張し、アンマウントせずにXFSも一緒に拡張してください。dfで見た/srv/appが大きくなっている必要があります。
lvextend -rは、LVを拡張したあと、ファイルシステムに合ったツール(XFSならxfs_growfs)を呼んでくれます。xfs_growfsは、マウントされた状態でのみ動作します。
縮小できるボリュームを作る
vg_stoに500MiBのLVlv_logsを作成してext4でフォーマットし、/srv/logsにマウントしてください。/srv/logs/keep.logに5MiBのランダムなデータを書き、sha256sum /srv/logs/keep.logの出力を/root/sto/snap/keep.sha256に保存してください。
ステップ2と同じ流れで、ファイルシステムだけがext4です。次のステップで、このボリュームを縮小します。
ext4をデータを守りながら縮小する
lv_logsを300MiBに縮小してください。ファイルシステムも一緒に縮小する必要があり、終わったら/srv/logsに再びマウントされていて、keep.logがチェックサムと同じである必要があります。
ext4は、アンマウントした状態でのみ縮小できます。順序が重要です。ファイルシステムを目標より小さく先に縮小し(先にe2fsck -fが必要です)、次にLVを縮小し、最後にファイルシステムをLVのサイズに合わせ直してください。
シンプールとオーバープロビジョニング
vg_stoに400MiBのシンプールpoolを作成し、そのプールの上に、仮想サイズ1GiBのシンボリュームlv_thinを作成してください。lvs -o lv_name,lv_size,pool_lv,data_percent vg_stoの出力を/root/sto/snap/thin.txtに保存してください。
lvcreate --type thin-pool -Lでプールを、lvcreate -V <仮想サイズ> -T vg_sto/pool -n <名前>でシンボリュームを作ります。プールより大きなボリュームを作るとオーバープロビジョニングの警告が出ますが、それがこのステップで見たいことです。