ZFS and iSCSI Integration: Two Great Powers Collide
Posted on December 11, 2006
OpenSolaris Build 54 is now in the wild. As of Build 53 we have an amazing powerful new feature that will ultimately become a staple of the data center: ZFS and iSCSI Integration. Its now drop dead simple to start dishing out iSCSI Targets to your network, in a way that only ZFS can provide.
If you didn’t already know, ZFS brings the functions of a filesystem and a volume manager together into perfect harmony. Now, when people hear this they probly think about the underlying zpool on which filesystems are built, but it goes further. You can create zvols, a traditional allocated block device similar to a Veritas Volume Manager Volume or LVM Logical Volume, that coexists happily with your other ZFS file systems. Because iSCSI Target LUN’s are shared network accessible block storage devices they are built on top of these zvols. The advantage of these zvols is that they come with all that ZFS has to offer filesystems including snapshots, replication, compression, etc, but adds in something special for block storage: sparse volumes, commonly refered to as “thin provisioning”. Learn more about thin provisioning with ZFS in my blog entry entitled: ZFS and Thin Provisioning.
Prior to B53 you could share a zvol via iSCSI using iscsitadm, the administrative interface to the Solaris iSCSI Target. But thats all like tedious and involves a lot of typing, therefore we can now simplify the proccess. Simply create a zvol and enable iSCSI like so:
[thumper3:/] root# zfs create -s -V 150tb splash/uber_iscsitarget [thumper3:/] root# zfs set shareiscsi=on splash/uber_iscsitarget
Presto! With these two commands I’ve created a thinly provisioned 150TB volume and then turned “shareiscsi” on. We’re done!
Don’t believe me? Just check:
[thumper3:/] root# svcs -a | grep -i iscsi
disabled 9:04:43 svc:/network/iscsi_initiator:default
online 22:21:01 svc:/system/iscsitgt:default
[thumper3:/] root# iscsitadm list target -v
Target: splash/uber_iscsitarget
iSCSI Name: iqn.1986-03.com.sun:02:df204646-7956-e0a9-bfc1-c47759d0d93b
Alias: splash/uber_iscsitarget
Connections: 0
ACL list:
TPGT list:
LUN information:
LUN: 0
GUID: 0x0
VID: SUN
PID: SOLARIS
Type: disk
Size: 150T
Backing store: /dev/zvol/rdsk/splash/uber_iscsitarget
Status: online
[thumper3:/] root# zfs get all splash/uber_iscsitarget
NAME PROPERTY VALUE SOURCE
splash/uber_iscsitarget type volume -
splash/uber_iscsitarget creation Mon Dec 11 8:22 2006 -
splash/uber_iscsitarget used 54.8K -
splash/uber_iscsitarget available 15.9T -
splash/uber_iscsitarget referenced 54.8K -
splash/uber_iscsitarget compressratio 1.00x -
splash/uber_iscsitarget reservation none default
splash/uber_iscsitarget volsize 150T -
splash/uber_iscsitarget volblocksize 8K -
splash/uber_iscsitarget shareiscsi on local
splash/uber_iscsitarget checksum on default
splash/uber_iscsitarget compression off default
splash/uber_iscsitarget readonly off default
iSCSI really is that easy!
At this point we can go ahead and mount it on another system. In this case I’ll use a OpenSolaris B43 admin server:
[atlantis:/] root# iscsiadm list discovery
Discovery:
Static: disabled
Send Targets: disabled
iSNS: disabled
[atlantis:/] root# iscsiadm modify discovery --sendtargets enable
[atlantis:/] root# iscsiadm add discovery-address 10.10.10.10
[atlantis:/] root# svcadm enable network/iscsi_initiator
[atlantis:/] root# iscsiadm list target
Target: iqn.1986-03.com.sun:02:df204646-7956-e0a9-bfc1-c47759d0d93b
Alias: splash/uber_iscsitarget
TPGT: 1
ISID: 4000002a0000
Connections: 1
[atlantis:/] root# format
Searching for disks...done
c4t010000144F20FD1A00002A00457D16C8d0: configured with capacity of 153600.00GB
AVAILABLE DISK SELECTIONS:
...
4. c4t010000144F20FD1A00002A00457D16C8d0
/scsi_vhci/disk@g010000144f20fd1a00002a00457d16c8
Specify disk (enter its number): ^D
See? Once the target is accessible from an initiator on your network simply use the disk like you world any local drive.
…but wait. We can make this even simpler by using ZFS property inheritance! By creating what I call a ZFS stub, we can turn on “shareiscsi” and then let volume created under that stub be automatically shared because they’ll inherit the “shareiscsi=on” properly. Lets go back to the begining and try this on a clean system:
[thumper3:/] root# zfs create splash/iscsi_luns
[thumper3:/] root# zfs set shareiscsi=on splash/iscsi_luns
[thumper3:/] root# iscsitadm list target
[thumper3:/] root#
[thumper3:/] root# zfs create -s -V 25g splash/iscsi_luns/vol001
[thumper3:/] root# zfs create -s -V 25g splash/iscsi_luns/vol002
[thumper3:/] root# zfs create -s -V 25g splash/iscsi_luns/vol003
[thumper3:/] root# zfs create -s -V 25g splash/iscsi_luns/vol004
[thumper3:/] root# iscsitadm list target
Target: splash/iscsi_luns/vol001
iSCSI Name: iqn.1986-03.com.sun:02:736c2517-91e6-cf6c-d566-d48fb182e9f7
Connections: 0
Target: splash/iscsi_luns/vol002
iSCSI Name: iqn.1986-03.com.sun:02:78692333-1fb4-ee45-b547-ea49922ee538
Connections: 0
Target: splash/iscsi_luns/vol003
iSCSI Name: iqn.1986-03.com.sun:02:792505e0-a3fc-4ccf-f86d-b79f7baee006
Connections: 0
Target: splash/iscsi_luns/vol004
iSCSI Name: iqn.1986-03.com.sun:02:994ce0c3-d1fd-c0c9-ad8e-c4eeef462899
Connections: 0
Now you can create iSCSI Targets by simply creating a volume. Simply brilliant.