それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

lvm/fdiskの実験を仮想ファイルで行う。物理HDDは使わない。

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  126 04:37 1GiB-file1.img
-rw-r--r-- 1 takuya takuya 1G  126 04:37 1GiB-file2.img
-rw-r--r-- 1 takuya takuya 1G  126 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  126 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$

LVMミラーリング/RAID

定番のRAIDミラーリングが使えるLVMのおかけでハードウェアの理解が必要。
でも試す価値ありだと思う。無いより物理HDDを用意しなくていいのが嬉しい

RAIDやLVMミラーリングの動作検証や復旧(ミラーリング)練習をスルには持ってこいだと思います。

書いたきっかけ

仮想マシンのインストールの練習やサーバー構築の実験に物理ディスクや物理ハードを買わないと出来ないエンジニアさん、VPSを借りちゃう人。

彼女らを見てて非常に残念だと思った。大企業からの転職移籍組の人がLinuxシステム構築は得意分野ですと言ってたので見てたら、コマンド使えんお。。Linuxシステムの環境構築すらまともに出来なく物理ハードがその辺に山積みになって邪魔だったのでイライラしてた。lvmやkvmくらいしっとけ。いや知らなくてもいいから直ぐに実験する方法を学んでいて欲しい。。ハードウェアはコストがかかるんですよ。場所とか時間とか。納品されるまでにソフト環境ででできる事や練習や、いま必要なのはパパっとディスクイメージをやりとりすることなんだよ。ってことで

追加資料

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