目次

29 TGT で thin provision

下記はティスクで作成している解説
32_CentOSでiSCSI環境構築

TGTでシンプロビジョニングを利用する場合、TGTのバックエンドはディスクではなく、ファイルである必要があります。

Not all filesystems support FALLOC_FL_PUNCH_HOLE; if a filesystem
     doesn't support the operation, an error is returned.  The operation
     is supported on at least the following filesystems:

     *  XFS (since Linux 2.6.38)

     *  ext4 (since Linux 3.0)

     *  Btrfs (since Linux 3.7)

     *  tmpfs(5) (since Linux 3.5)

     *  gfs2(5) (since Linux 4.16)

参考URL

1. Sparseファイル作成

これで500G のSparseファイル作成

# dd if=/dev/zero of=/mnt/disk.tgt bs=1 count=0 seek=500G

見た目上500Gだが、実使用量は0になります。

# du -h --apparent-size /mnt/disk.tgt 
500G    /mnt/disk.tgt
# du -h /mnt/disk.tgt 
0       /mnt/disk.tgt

2.SpaseディスクをLUNとして追加

# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 --backing-store /mnt/disk.tgt

3.シンプロビジョニングを有効にする

# tgtadm --lld iscsi --mode logicalunit --op update --tid 1 --lun 1 --params thin_provisioning=1 

4.設定ファイルの場合

「params thin_provisioning=1」で指定する。

/etc/tgt/targets.conf

default-driver iscsi

<target iqn.2014-03.storage-server:disk1>
        backing-store /mnt/disk.tgt
        write-cache on
        params thin_provisioning=1
</target>

5. シンプロビジョニングの確認

「Thin-provisioning: Yes」となっていればOK

# tgt-admin -s
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 536871 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: Yes
            Backing store type: rdwr
            Backing store path: /mnt/disk.tgt
            Backing store flags:

クライアントから接続確認

31 iscsidで接続

今回はsdcで接続している状況で説明

# ll /dev/disk/by-path/| grep sdc
lrwxrwxrwx. 1 root root  9 Mar 24 00:40 ip-192.168.10.16:3260-iscsi-iqn.2014-03.storage-server:disk1-lun-1 -> ../../sdc

discard_granularityを確認

thin provisionが有効になっていると、「/sys/block/{BLOCK}/queue/discard_granularity」が0以外になっている

# cat /sys/block/sdc/queue/discard_granularity 
512

下記でUNMAPが有効になっている事が分かる。

# sg_vpd -p 0xb2 /dev/sdc 
Logical block provisioning VPD page (SBC):
  Unmap command supported (LBPU): 1
  Write same (16) with unmap bit supported (LBWS): 1
  Write same (10) with unmap bit supported (LBWS10): 1
  Logical block provisioning read zeros (LBPRZ): 1
  Anchored LBAs supported (ANC_SUP): 0
  Threshold exponent: 0
  Descriptor present (DP): 0
  Provisioning type: 2

クライアント側と、サーバ側で交互に確認

-o discard でマウントしおくと、下記を自動で行ってくれる
LVMの場合は、issue_discards=1 にしておくとOK

クライアントで確認

1.マウントするとちゃんと500Gのディスクとしてマウントしている

# mkfs.xfs /dev/sdc
# mount /dev/sdc /mnt/
# df -h | grep mnt
/dev/sdc                 500G   33M  500G   1% /mnt

3.1Gフィアルを10個作成

当然容量は増える

# for i in `seq -w 0 10`; do dd if=/dev/zero of=/mnt/$i bs=1M count=1024 ; done
# df -h | grep mnt
/dev/sdc                 500G   12G  489G   3% /mnt

5.ファイルを削除

ファイル削除で容量は減る

# rm -rvf /mnt/*
# df -h | grep mnt
/dev/sdc                 500G   33M  500G   1% /mnt

7.fstrim

# fstrim /mnt

サーバ側で確認

2.mkfsで少し容量増えるけど、ほとんど利用されてない状態

# du -h /mnt/disk.tgt 
251M    /mnt/disk.tgt

4.サーバ側でも増えている

# du -h /mnt/disk.tgt 
12G     /mnt/disk.tgt

6.サーバ側は減っていない

# du -h /mnt/disk.tgt 
12G    /mnt/disk.tgt

8.クライアントでfstrim後はサーバ側でも減っている

# du -h /mnt/disk.tgt 
251M    /mnt/disk.tgt