lvm の動作や、障害回復、ボリュームの増設のコマンドをテストしたい
lvm や fdisk の練習のために、HDDを何本も用意するのが面倒ですよね。
dd で作った巨大ファイルを使う
dd で1GiB くらいのファイルを作ってLVMで遊んだり、ソフトウェアRAID組んだりして復旧ノウハウを培いましょう。
まずはdd で1GiBのファイルを作る
mkdir lvm_test; cd lvm_test touch 1GiB-file{1,2,3}.img for i in * ; do dd if=/dev/zero of=$i bs=1MiB count=1000; done
dd 結果
dd した結果はこんな感じ。
takuya@atom:~/lvm_test$ ls -hl 合計 3GB -rw-r--r-- 1 takuya takuya 1G 1月 26 04:37 1GiB-file1.img -rw-r--r-- 1 takuya takuya 1G 1月 26 04:37 1GiB-file2.img -rw-r--r-- 1 takuya takuya 1G 1月 26 04:37 1GiB-file3.img
dd したイメージ・ファイルにfdisk を実行する
3ファイルにそれぞれfdisk を実行していく
fdisk 1GiB-file1 fdisk 1GiB-file2 fdisk 1GiB-file3
パーティションを作って(n) 、ディスクのタイプをlvmに変更する(t →8e)
実行サンプル
takuya@atom:~/lvm_test$ fdisk 1GiB-file1 デバイスは正常な DOS パーティションテーブルも、Sun, SGI や OSF ディスクラベルも 含んでいません 新たに DOS ディスクラベルをディスク識別子 0xd3e59ef8 で作成します。 あなたが書き込みを決定するまで、変更はメモリ内だけに残します。 その後はもちろん以前の内容は修復不可能になります。 警告: パーティションテーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって 正常になります コマンド (m でヘルプ): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p パーティション番号 (1-4, 初期値 1): 初期値 1 を使います 最初 セクタ (2048-204799, 初期値 2048): 初期値 2048 を使います Last セクタ, +セクタ数 or +size{K,M,G} (2048-204799, 初期値 204799): 初期値 204799 を使います コマンド (m でヘルプ): t 選択したパーティション 1 16進数コード (L コマンドでコードリスト表示): 8e パーティションのシステムタイプを 1 から 8e (Linux LVM) に変更しました コマンド (m でヘルプ): w パーティションテーブルは変更されました! ディスクを同期しています。
ディスクイメージをloopデバイスに設定する
作ったディスクイメージをloopデバイスに割り当てる。
sudo losetup /dev/loop1 ./1GiB-file1.img sudo losetup /dev/loop2 ./1GiB-file2.img sudo losetup /dev/loop3 ./1GiB-file3.img
ここは、面倒なので for使ってもイイ。
for i in {1,2,3} ; do sudo losetup /dev/loop$i ./1GiB-file$i.img ; done;
loopに割り当てない方法もあったとは思う。だけど覚えやすさと実際に本番の物理ハードディスクでに/dev/を扱うことを考えてloopでいいと判断しました。
dd イメージをlvm の仮想物理ボリュームに割り当てる
pvcreate を使って、作ったddイメージのloop デバイスをpv に割り当てる
sudo pvcreate /dev/loop{1,2,3}
実際の実行結果
takuya@atom:~/lvm_test$ sudo pvcreate /dev/loop{1,2,3} Physical volume "/dev/loop1" successfully created Physical volume "/dev/loop2" successfully created Physical volume "/dev/loop3" successfully created
できたPVをボリューム・グループに割り当てる
lvm ではボリュームグループ単位で管理するので、ddイメージ用に新しくボリュームグループを作ってそこにloopデバイスを割り当てる。その後、ボリュームグループを拡張する形式でloopデバイスを順次割り当てる
#新規作成 sudo vgcreate vol01 /dev/loop1 #追加 sudo vgextend vol01 /dev/loop2 sudo vgextend vol01 /dev/loop3
実際の実行結果は以下のとおり
takuya@atom:~/lvm_test$ sudo vgcreate vol01 /dev/loop1 Volume group "vol01" successfully created takuya@atom:~/lvm_test$ sudo vgextend vol01 /dev/loop2 Volume group "vol01" successfully extended takuya@atom:~/lvm_test$ sudo vgextend vol01 /dev/loop3 Volume group "vol01" successfully extended
LG(論理ボリューム)として使えるようにする。
Logical volume group (論理ボリューム)として定義します。
sudo lvcreate -L 3G -n logical_vol01 vol01
実際の実行結果は以下の感じになった。
takuya@atom:~/lvm_test$ sudo lvcreate -L 288M -n logical_vol01 vol01 Logical volume "logical_vol01" created takuya@atom:~/lvm_test$ sudo lvscan ACTIVE '/dev/vol01/logical_vol01' [288.00 MiB] inherit
作ったロジカル・ボリュームをフォーマットして利用可能にする
ここまで出来ると、論理ボリュームは通常HDD/SSDとなんら変わりなく扱うことが出来る。
フォーマットも普段通りで済む。
sudo mkfs.ext4 /dev/vol01/logical_vol01
この時のデバイスファイルは sudo lvscan で確認が可能。
実際に実行した結果は次のようになった。
takuya@atom:~/lvm_test$ sudo mkfs.ext4 /dev/vol01/logical_vol01 mke2fs 1.42 (29-Nov-2011) Discarding device blocks: done Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 73728 inodes, 294912 blocks 14745 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67633152 36 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729, 204801, 221185 Allocating group tables: done Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done
LVM仮想ディスク(論理ボリューム)を使うためにマウントして書き込んでみる
sudo mount /dev/vol01/logical_vol01 /mnt
実際に書き込んでみた
takuya@atom:~/lvm_test$ sudo mount /dev/vol01/logical_vol01 /mnt takuya@atom:~/lvm_test$ takuya@atom:/mnt$ mount /dev/sda3 on / type ext4 (rw,errors=remount-ro) (中略 /dev/mapper/vol01-logical_vol01 on /mnt type ext4 (rw) takuya@atom:/mnt$ cd /mnt takuya@atom:/mnt$ ls -lt 合計 12 drwx------ 2 root root 12288 1月 26 05:08 lost+found takuya@atom:/mnt$ sudo dd if=/dev/zero of=test bs=1MiB count=100 100+0 レコード入力 100+0 レコード出力 104857600 バイト (105 MB) コピーされました、 0.145189 秒、 722 MB/秒
ちゃんとファイルが書けました。
後片付け
実験した後は後片付けも必要です。後かたづけもlvm練習の内だと思います。
cd ~ sudo umount /mnt sudo vgremove vol01 sudo losetup -d /dev/loop{1,2,3}
実際にマウント lvm のディスクイメージLG/VG/PG をやってみた結果
takuya@atom:~/lvm_test$ sudo pvscan PV /dev/loop1 VG vol01 lvm2 [96.00 MiB / 96.00 MiB free] PV /dev/loop2 VG vol01 lvm2 [96.00 MiB / 96.00 MiB free] PV /dev/loop3 VG vol01 lvm2 [96.00 MiB / 96.00 MiB free] Total: 9 [2.69 TiB] / in use: 9 [2.69 TiB] / in no VG: 0 [0 ] takuya@atom:~/lvm_test$ sudo vgremove vol01 Volume group "vol01" successfully removed takuya@atom:~/lvm_test$ sudo pvscan PV /dev/loop1 lvm2 [100.00 MiB] #← VG が除去されたのが分かるでしょう。 PV /dev/loop2 lvm2 [100.00 MiB] #← PV /dev/loop3 lvm2 [100.00 MiB] #← takuya@atom:~/lvm_test$ sudo pvremove /dev/loop{1,2,3} Labels on physical volume "/dev/loop1" successfully wiped Labels on physical volume "/dev/loop2" successfully wiped Labels on physical volume "/dev/loop3" successfully wiped takuya@atom:~/lvm_test$ sudo pvscan PV /dev/sdb2 VG Volume00 lvm2 [465.66 GiB / 0 free] (中略 Total: 6 [2.69 TiB] / in use: 6 [2.69 TiB] / in no VG: 0 [0 ] #/dev/loopXのデバイスがPVから消えました takuya@atom:~/lvm_test$ sudo losetup -d /dev/loop{1,2,3} #仕上げ。/dev/loopのマウントを解除する。 takuya@atom:~/lvm_test$
書いたきっかけ
仮想マシンのインストールの練習やサーバー構築の実験に物理ディスクや物理ハードを買わないと出来ないエンジニアさん、VPSを借りちゃう人。
彼女らを見てて非常に残念だと思った。大企業からの転職移籍組の人がLinuxシステム構築は得意分野ですと言ってたので見てたら、コマンド使えんお。。Linuxシステムの環境構築すらまともに出来なく物理ハードがその辺に山積みになって邪魔だったのでイライラしてた。lvmやkvmくらいしっとけ。いや知らなくてもいいから直ぐに実験する方法を学んでいて欲しい。。ハードウェアはコストがかかるんですよ。場所とか時間とか。納品されるまでにソフト環境ででできる事や練習や、いま必要なのはパパっとディスクイメージをやりとりすることなんだよ。ってことで
関連エントリ
指定サイズのダミーファイルを容量指定して作る(win/linux/mac) - それマグで!
LVMを使ってファイルシステムをリサイズする - それマグで!
ディスクの仮想化みたいなLVMを使ってディスク管理してみる - それマグで!
追加資料
bashの{} ブレース展開について。
bash にはブレース展開があって、{1,2,3}のように書くと、変数に展開されて複数回ループしたことと同義になる。
takuya@atom:~/lvm_test$ echo hogehoge{1,2,3} hogehoge1 hogehoge2 hogehoge3
また、連番も利用可能です。
takuya@atom:~/lvm_test$ echo hogehoge{1..9} hogehoge1 hogehoge2 hogehoge3 hogehoge4 hogehoge5 hogehoge6 hogehoge7 hogehoge8 hogehoge9
bash展開については以下の資料が参考になる。
bashのブレース展開を使ってカンマ区切りリストを作る - 双六工場日誌
bashで指定回数ループして綺麗なファイル名を作る - それマグで!