TenForward

技術ブログ。はてなダイアリーから移転しました

Linux 3.2 の Thin Provisioning (1)

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) で試しています.

  1. LVM2 の cvs 先端を取得.インストール.今なら前述の通り 2.02.89 のソースを取得して make します.(この後も改良が続きそうですから ChangeLog で確認してリポジトリから取得した方が良いかもしれませんね)
    ./configure --with-thin=internal (もしくは shared)
    としなければいけません.
  2. 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
  3. 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
  4. PV作成
    # pvcreate /dev/vdb1 /dev/vdb2
  5. VG作成
    # vgcreate TestVG -s 64K /dev/vdb1 /dev/vdb2
  6. 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
  7. 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.
  8. 仕方ないので良く知らないのですが btrfs を.
    root@plamo64:~# mkfs.btrfs /dev/TestVG/ThinLV
    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
    はい,ちゃんと 1TB の領域が見えてますよ.:-)

(Linux 3.2 の Thin Provisioning (2) - TenForwardの日記へ続く)