iSCSI is a way to share storage over a network. Unlike NFS, which works at the file system level, iSCSI works at the block device level.
In iSCSI terminology, the system that shares the storage is known as the target. The storage can be a physical disk, or an area representing multiple disks or a portion of a physical disk. For example, if the disk(s) are formatted with ZFS, a zvol can be created to use as the iSCSI storage.
The clients which access the iSCSI
      storage are called initiators.  To
      initiators, the storage available through
      iSCSI appears as a raw, unformatted disk
      known as a LUN.  Device nodes for the disk
      appear in /dev/ and the device must be
      separately formatted and mounted.
FreeBSD provides a native, kernel-based iSCSI target and initiator. This section describes how to configure a FreeBSD system as a target or an initiator.
To configure an iSCSI target, create
	the /etc/ctl.conf configuration file, add
	a line to /etc/rc.conf to make sure the
	ctld(8) daemon is automatically started at boot, and then
	start the daemon.
The following is an example of a simple
	/etc/ctl.conf configuration file.  Refer
	to ctl.conf(5) for a more complete description of this
	file's available options.
portal-group pg0 {
	discovery-auth-group no-authentication
	listen 0.0.0.0
	listen [::]
}
target iqn.2012-06.com.example:target0 {
	auth-group no-authentication
	portal-group pg0
	lun 0 {
		path /data/target0-0
		size 4G
	}
}The first entry defines the pg0 portal
	group.  Portal groups define which network addresses the
	ctld(8) daemon will listen on.  The
	discovery-auth-group no-authentication
	entry indicates that any initiator is allowed to perform
	iSCSI target discovery without
	authentication.  Lines three and four configure ctld(8)
	to listen on all IPv4
	(listen 0.0.0.0) and
	IPv6 (listen [::])
	addresses on the default port of 3260.
It is not necessary to define a portal group as there is a
	built-in portal group called default.  In
	this case, the difference between default
	and pg0 is that with
	default, target discovery is always denied,
	while with pg0, it is always
	allowed.
The second entry defines a single target.  Target has two
	possible meanings: a machine serving iSCSI
	or a named group of LUNs.  This example
	uses the latter meaning, where
	iqn.2012-06.com.example:target0 is the
	target name.  This target name is suitable for testing
	purposes.  For actual use, change
	com.example to the real domain name,
	reversed.  The 2012-06 represents the year
	and month of acquiring control of that domain name, and
	target0 can be any value.  Any number of
	targets can be defined in this configuration file.
The auth-group no-authentication line
	allows all initiators to connect to the specified target and
	portal-group pg0 makes the target reachable
	through the pg0 portal group.
The next section defines the LUN.  To
	the initiator, each LUN will be visible as
	a separate disk device.  Multiple LUNs can
	be defined for each target.  Each LUN is
	identified by a number, where LUN 0 is
	mandatory.  The path /data/target0-0 line
	defines the full path to a file or zvol backing the
	LUN.  That path must exist before starting
	ctld(8).  The second line is optional and specifies the
	size of the LUN.
Next, to make sure the ctld(8) daemon is started at
	boot, add this line to
	/etc/rc.conf:
ctld_enable="YES"
To start ctld(8) now, run this command:
#service ctld start
As the ctld(8) daemon is started, it reads
	/etc/ctl.conf.  If this file is edited
	after the daemon starts, use this command so that the changes
	take effect immediately:
#service ctld reload
The previous example is inherently insecure as it uses no authentication, granting anyone full access to all targets. To require a username and password to access targets, modify the configuration as follows:
auth-group ag0 {
	chap username1 secretsecret
	chap username2 anothersecret
}
portal-group pg0 {
	discovery-auth-group no-authentication
	listen 0.0.0.0
	listen [::]
}
target iqn.2012-06.com.example:target0 {
	auth-group ag0
	portal-group pg0
	lun 0 {
		path /data/target0-0
		size 4G
	}
}The auth-group section defines
	  username and password pairs.  An initiator trying to connect
	  to iqn.2012-06.com.example:target0 must
	  first specify a defined username and secret.  However,
	  target discovery is still permitted without authentication.
	  To require target discovery authentication, set
	  discovery-auth-group to a defined
	  auth-group name instead of
	  no-authentication.
It is common to define a single exported target for every initiator. As a shorthand for the syntax above, the username and password can be specified directly in the target entry:
target iqn.2012-06.com.example:target0 {
	portal-group pg0
	chap username1 secretsecret
	lun 0 {
		path /data/target0-0
		size 4G
	}
}The iSCSI initiator described in this section is supported starting with FreeBSD 10.0-RELEASE. To use the iSCSI initiator available in older versions, refer to iscontrol(8).
The iSCSI initiator requires that the
	iscsid(8) daemon is running.  This daemon does not use a
	configuration file.  To start it automatically at boot, add
	this line to /etc/rc.conf:
iscsid_enable="YES"
To start iscsid(8) now, run this command:
#service iscsid start
Connecting to a target can be done with or without an
	/etc/iscsi.conf configuration file.  This
	section demonstrates both types of connections.
To connect an initiator to a single target, specify the IP address of the portal and the name of the target:
#iscsictl -A -p10.10.10.10-tiqn.2012-06.com.example:target0
To verify if the connection succeeded, run
	  iscsictl without any arguments.  The
	  output should look similar to this:
Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Connected: da0
In this example, the iSCSI session
	  was successfully established, with
	  /dev/da0 representing the attached
	  LUN.  If the
	  iqn.2012-06.com.example:target0 target
	  exports more than one LUN, multiple
	  device nodes will be shown in that section of the
	  output:
Connected: da0 da1 da2.
Any errors will be reported in the output, as well as the system logs. For example, this message usually means that the iscsid(8) daemon is not running:
Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Waiting for iscsid(8)
The following message suggests a networking problem, such as a wrong IP address or port:
Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.11 Connection refused
This message means that the specified target name is wrong:
Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Not found
This message means that the target requires authentication:
Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Authentication failed
To specify a CHAP username and secret, use this syntax:
#iscsictl -A -p10.10.10.10-tiqn.2012-06.com.example:target0-uuser-ssecretsecret
To connect using a configuration file, create
	  /etc/iscsi.conf with contents like
	  this:
t0 {
	TargetAddress   = 10.10.10.10
	TargetName      = iqn.2012-06.com.example:target0
	AuthMethod      = CHAP
	chapIName       = user
	chapSecret      = secretsecret
}The t0 specifies a nickname for the
	  configuration file section.  It will be used by the
	  initiator to specify which configuration to use.  The other
	  lines specify the parameters to use during connection.  The
	  TargetAddress and
	  TargetName are mandatory, whereas the
	  other options are optional.  In this example, the
	  CHAP username and secret are
	  shown.
To connect to the defined target, specify the nickname:
#iscsictl -Ant0
Alternately, to connect to all targets defined in the configuration file, use:
#iscsictl -Aa
To make the initiator automatically connect to all
	  targets in /etc/iscsi.conf, add the
	  following to /etc/rc.conf:
iscsictl_enable="YES" iscsictl_flags="-Aa"
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
    documentation may be
    sent to <freebsd-questions@FreeBSD.org>.
    Send questions about this document to <freebsd-doc@FreeBSD.org>.