Linux 3.2 で入った Thin Provisioning を試してみました.Device Mapper 経由で使います.
kernel 付属文書には dmsetup を使った例が載っていますが,そこにも実際は LVM2 とかのツールを使うことになるよ,みたいなことは書かれていますので,見てみたところ,LVM2 でも既に実装されているようでしたので,そちらで試しています.と思っていたら,2012/01/30 付けで LVM2 2.02.89 がリリースされていますね.
以下は kernel 3.2 に更新した Plamo64-1.0 (on kvm) で試しています.
- LVM2 の cvs 先端を取得.インストール.今なら前述の通り 2.02.89 のソースを取得して make します.(この後も改良が続きそうですから ChangeLog で確認してリポジトリから取得した方が良いかもしれませんね)
./configure --with-thin=internal (もしくは shared)
としなければいけません. - Thin Provisioning ドライバのロード
root@plamo64:/home/karma# modprobe -v dm-thin-pool
insmod /lib/modules/3.2.0-plamo64/kernel/drivers/md/dm-bufio.ko
insmod /lib/modules/3.2.0-plamo64/kernel/drivers/md/persistent-data/dm-persistent-data.ko
insmod /lib/modules/3.2.0-plamo64/kernel/drivers/md/dm-thin-pool.ko - fdisk で LVM パーティション 2 つ作成.LVM2 を使うと,今のところ PV が二つないとダメなようなので,とりあえずパーティションを二つ作成します (この辺りは良く判ってません ^^;)
root@plamo64:~# fdisk -l /dev/vdb
: (snip)
Device Boot Start End Blocks Id System
/dev/vdb1 2048 8390655 4194304 8e Linux LVM
/dev/vdb2 8390656 16777215 4193280 8e Linux LVM - PV作成
# pvcreate /dev/vdb1 /dev/vdb2
- VG作成
# vgcreate TestVG -s 64K /dev/vdb1 /dev/vdb2
- PVを作成するところでシンプロビジョニングの Volume を作成します.ここでは実際は 100MB の領域を確保し,そこを 1TB に見せています.
# lvcreate -L100M -T TestVG/pool -V 1T -n ThinLV
root@plamo64:~# lvs
LV VG Attr LSize Pool Origin Snap% Move Log Copy% Convert
ThinLV TestVG Vwi-aotz 1.00t pool
pool TestVG twi-a-tz 100.00m
root@plamo64:~# lvdisplay
--- Logical volume ---
LV Name /dev/TestVG/pool
VG Name TestVG
LV UUID uSAvKZ-lNed-Yd9f-K72E-MgTu-23D8-JCIKUS
LV Write Access read/write
LV Thin transaction ID 1
LV Thin metadata /dev/TestVG/pool_tmeta
LV Thin data pool /dev/TestVG/pool_tdata
LV Zero new blocks yes
LV Status available
# open 0
LV Size 100.00 MiB
Current LE 1600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:3
--- Logical volume ---
LV Name /dev/TestVG/ThinLV
VG Name TestVG
LV UUID bvZhRn-v8Ah-RwcX-ahot-IXfx-hdUm-YjeBcK
LV Write Access read/write
LV Thin pool /dev/TestVG/pool
LV Status available
# open 1
LV Size 1.00 TiB
Current LE 16777216
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:4 - ext4 で Filesystem 作成をためしてみましたが...
# mke2fs -t ext4 -E lazy_itable_init /dev/TestVG/ThinLV
ここでだんまり.こんなログが出ます.
mke2fs 1.41.12 (17-May-2010)
: (snip)
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:device-mapper: thin: 253:2: no free space available.
- 調べると似たような症状が報告されています.Bug 769917 – deadlock in block core when thin-pool runs out of space
- 仕方ないので良く知らないのですが btrfs を.
root@plamo64:~# mkfs.btrfs /dev/TestVG/ThinLV
はい,ちゃんと 1TB の領域が見えてますよ.:-)
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label (null) on /dev/TestVG/ThinLV
nodesize 4096 leafsize 4096 sectorsize 4096 size 1.00TB
Btrfs Btrfs v0.19
root@plamo64:~# mount -t btrfs /dev/TestVG/ThinLV /mnt
root@plamo64:~# df -h
Filesystem Size Used Avail Use% Mounted on
: (snip)
/dev/mapper/TestVG-ThinLV 1.0T 56K 1022G 1% /mnt