LFCS — Linux Foundation認定システム管理者
LVM から autofs まで — ストレージを手で作る
目標
ループデバイス2つの上にLVMを構築し、ext4をUUIDでfstabに登録し、オンラインで拡張し、スワップファイルを有効にし、同じVMの中でNFSサーバーとautofsクライアントを構成したあと、iostat・vmstatで指標を残します。すべて本当にマウントされます。
なぜ重要なのか
LFCSのStorageドメイン(20%)は、Podでは1行もできませんでした。pvcreateもmountも、capabilityがなくて塞がれます。このラボはUbuntu 24.04のVMで、rootで動作します。その代わり、空きディスクはありません。スクラッチディスクは、プラットフォームがすでにext4でフォーマットして取り付けているので、ファイルをブロックデバイスのように見せるループデバイス(losetup)から始めます。実務でディスクなしにLVMやRAIDを試すときに使う、まさにその方法です。
3つが、このラボの骨格です。1つ目、LVMはPV → VG → LVの3つの層で、拡張は2つの層で別々に起こります(lvextendのあとにresize2fs)。2つ目、fstabには、デバイス名ではなくUUIDを書きます。デバイスの順序は、起動のたびに変わることがあります。3つ目、設定ファイルを変更することと、デーモンがそれを知ることは別です(exportfs -ra、systemctl restart autofs)。
セッションは60分で始まり、最大180分まで延長でき、VMはセッションが終わると消えます。
ステップ
/var/lib/lfcs/disk1.imgと/var/lib/lfcs/disk2.imgを、それぞれ1GiBのサイズで作成し(スパースファイルでかまいません)、どちらもループデバイスとして取り付けてください。取り付けたあと、losetup -aの出力を/root/lfcs/storage/loop.txtに保存してください。- 2つのループデバイスをLVMの物理ボリューム(PV)として初期化し、2つを合わせてボリュームグループ
vg_lfcsを作成してください。 vg_lfcsから600MiBの論理ボリュームlv_dataを作成し、ext4でフォーマットしてください。lv_dataを/srv/dataにマウントし、再起動後も取り付けられるように、/etc/fstabにUUID= で始まる行(タイプext4、オプションdefaults、dump 0、pass 2)を追加してください。findmnt --verifyで、fstabにエラーがない必要があります。lv_dataを300MiB追加で拡張し(合計900MiB以上)、マウントを外さないまま、ext4ファイルシステムも一緒に大きくしてください。dfで見た/srv/dataのサイズが大きくなっている必要があります。/var/swap/lfcs.swapを256MiBのスワップファイルとして作成して、有効にしてください。権限は600である必要があり、/etc/fstabに、再起動後も有効になるように行(タイプswap)を追加してください。/srv/shareをNFSでエクスポートします。ただし、127.0.0.1にだけ許可してください(オプションrw,sync,no_subtree_check)。/srv/share/hello.txtに任意の内容を書き、その共有を/mnt/shareにNFSでマウントして、同じファイルが見えるようにしてください。- 同じ共有を、autofsがアクセスした瞬間に取り付けるようにしてください。マスターマップ
/etc/auto.master.d/lfcs.autofsで/nfsをマップ/etc/auto.lfcsに接続し、そのマップに、キーshareが127.0.0.1:/srv/shareをnfs4で指すように書いてください。autofsを再起動したあと、ls /nfs/shareがhello.txtを表示する必要があります。(サーバーが自分自身の場合、autofsはNFSの代わりにbindで取り付けます。findmnt /nfs/shareのSOURCEが[/srv/share]と表示されても、正常です。) iostat -dxk 1 3の出力を/root/lfcs/storage/iostat.txtに、vmstat 1 3の出力を/root/lfcs/storage/vmstat.txtに保存してください。そして、/root/lfcs/storage/summary.txtを4行で作成してください:VG=vg_lfcs、PVS=<vg_lfcs 의 PV 개수>、LV_MB=<lv_data 의 크기(MiB, 정수)>、SWAP=<켜져 있는 스왑 파일 경로>(プレースホルダーは順に、vg_lfcsのPVの数、整数で表したlv_dataのMiB単位のサイズ、有効になっているスワップファイルのパスです)。
参考
- ループデバイス:
truncate -s 1G 파일→losetup -f --show 파일。どのデバイスに取り付いたかはlosetup -j 파일で確認できます(プレースホルダーはファイルです)。 - LVM:
pvcreate、vgcreate vg_lfcs 장치1 장치2、lvcreate -L 600M -n lv_data vg_lfcs、lvextend -L +300M -r(プレースホルダーは1つ目と2つ目のデバイスです)。 - UUID:
blkid -o value -s UUID /dev/vg_lfcs/lv_data。fstabを変更したあとは、systemctl daemon-reloadとmount -a。 - NFS:
/etc/exports→exportfs -ra→exportfs -v。autofs: マップファイル →systemctl restart autofs。 - よくある間違い1:
lvextendだけを行ってresize2fsを抜かし、dfがそのままの場合です。 - よくある間違い2:
/etc/exportsで、クライアントと開き括弧の間に空白を入れて、全世界に公開されてしまう場合です。 - よくある間違い3: fstabに
/dev/loopNを書く場合です。番号は起動のたびに変わることがあります。
ループデバイスを2つ作る
/var/lib/lfcs/disk1.imgと/var/lib/lfcs/disk2.imgを、それぞれ1GiBのサイズで作成し(スパースファイルでかまいません)、どちらもループデバイスとして取り付けてください。取り付けたあと、losetup -aの出力を/root/lfcs/storage/loop.txtに保存してください。
truncate -sでスパースファイルを作れます。ループ番号はsnapがすでにいくつか使っているので、固定せず、空いているものを受け取ってください(losetup -f --show)。
PV 2つでVGを作る
2つのループデバイスをLVMの物理ボリューム(PV)として初期化し、2つを合わせてボリュームグループvg_lfcsを作成してください。
pvcreateはデバイスごとに、vgcreateはVG名の後ろにデバイスを並べます。どのループデバイスかは、losetup -j <ファイル>で見つけ直せます。
LVを切り出してext4でフォーマット
vg_lfcsから600MiBの論理ボリュームlv_dataを作成し、ext4でフォーマットしてください。
lvcreateの-Lでサイズ、-nで名前を指定します。デバイスパスは、/dev//または/dev/mapper/-の2通りで見えます。
マウントしてfstabにUUIDで書く
lv_dataを/srv/dataにマウントし、再起動後も取り付けられるように、/etc/fstabにUUID= で始まる行(タイプext4、オプションdefaults、dump 0、pass 2)を追加してください。findmnt --verifyで、fstabにエラーがない必要があります。
UUIDはblkidで確認します。デバイスパス(/dev/loopN)は起動のたびに変わることがあるので、fstabに書いてはいけません。書いたあと、systemctl daemon-reloadとmount -aで、fstabの行自体が動作するかを確認してください。
オンラインでLVとファイルシステムを拡張
lv_dataを300MiB追加で拡張し(合計900MiB以上)、マウントを外さないまま、ext4ファイルシステムも一緒に大きくしてください。dfで見た/srv/dataのサイズが大きくなっている必要があります。
lvextend -L +300MでLVを拡張しても、ファイルシステムは知りません。resize2fsを別に実行するか、lvextendに-rを付けないと、dfが変わりません。
スワップファイルを作って有効にする
/var/swap/lfcs.swapを256MiBのスワップファイルとして作成して、有効にしてください。権限は600である必要があり、/etc/fstabに、再起動後も有効になるように行(タイプswap)を追加してください。
fallocateまたはddでファイルを作り、chmod 600 → mkswap → swaponの順序です。swapon --showで有効になったかを見ます。fstabの行は6つのフィールドで、マウントポイントの位置はnone、タイプはswapです(例: /var/swap/sample.swap none swap sw 0 0)。
ローカルNFSサーバーでエクスポートしてマウント
/srv/shareをNFSでエクスポートします。ただし、127.0.0.1にだけ許可してください(オプションrw,sync,no_subtree_check)。/srv/share/hello.txtに任意の内容を書き、その共有を/mnt/shareにNFSでマウントして、同じファイルが見えるようにしてください。
/etc/exportsの1行 → exportfs -ra → mount -t nfs4 127.0.0.1:/srv/share /mnt/shareの順序です。exportfs -vで実際にエクスポートされたかを確認してください。ファイルを変更しただけでは、サーバーは知りません。
autofsでアクセスしたときに取り付ける
同じ共有を、autofsがアクセスした瞬間に取り付けるようにしてください。マスターマップ/etc/auto.master.d/lfcs.autofsで/nfsをマップ/etc/auto.lfcsに接続し、そのマップに、キーshareが127.0.0.1:/srv/shareをnfs4で指すように書いてください。autofsを再起動したあと、ls /nfs/shareがhello.txtを表示する必要があります。(サーバーが自分自身の場合、autofsはNFSの代わりにbindで取り付けます。findmnt /nfs/shareのSOURCEが[/srv/share]と表示されても、正常です。)
マスターマップの行は「マウントポイント マップファイル」、マップの行は「キー -fstype=nfs4 サーバー:/パス」です。マップを変更したあと、systemctl restart autofsを忘れると、/nfsはただの空のディレクトリです。
iostat・vmstatで性能指標を残す
iostat -dxk 1 3の出力を/root/lfcs/storage/iostat.txtに、vmstat 1 3の出力を/root/lfcs/storage/vmstat.txtに保存してください。そして、/root/lfcs/storage/summary.txtを4行で作成してください: VG=vg_lfcs、PVS=<vg_lfcs 의 PV 개수>、LV_MB=<lv_data 의 크기(MiB, 정수)>、SWAP=<켜져 있는 스왑 파일 경로>(プレースホルダーは順に、vg_lfcsのPVの数、整数で表したlv_dataのMiB単位のサイズ、有効になっているスワップファイルのパスです)。
iostatはsysstatパッケージにあります。最初のサンプルは起動後の累積値なので、3回取得します。値は手で書かずに、vgs・lvs --units m --nosuffix・swapon --showから取り出してください。