下記はティスクで作成している解説
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)
これで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
# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 --backing-store /mnt/disk.tgt
# tgtadm --lld iscsi --mode logicalunit --op update --tid 1 --lun 1 --params thin_provisioning=1
「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>
「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
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
# mkfs.xfs /dev/sdc # mount /dev/sdc /mnt/ # df -h | grep mnt /dev/sdc 500G 33M 500G 1% /mnt
当然容量は増える
# 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
ファイル削除で容量は減る
# rm -rvf /mnt/* # df -h | grep mnt /dev/sdc 500G 33M 500G 1% /mnt
# fstrim /mnt
# du -h /mnt/disk.tgt 251M /mnt/disk.tgt
# du -h /mnt/disk.tgt 12G /mnt/disk.tgt
# du -h /mnt/disk.tgt 12G /mnt/disk.tgt
# du -h /mnt/disk.tgt 251M /mnt/disk.tgt