33645f4ad2
original Intel code (BSD-licensed) in othersrc, by myself. This provides an iSCSI target implementation in userland, as well as a test harness which also runs in userland. The iSCSI target has been tested with version 1.06 of the Microsoft initiator, as well as with its own test harness.
189 lines
7.5 KiB
Plaintext
189 lines
7.5 KiB
Plaintext
|
|
---------------------------------------
|
|
Intel iSCSI v20 Reference Implementation
|
|
---------------------------------------
|
|
|
|
This is a software implementation of iSCSI v20. Included in this distribution
|
|
are both host and target mode drivers with built in conformance and performance
|
|
tests, and sockets tests that can be used to simulate TCP traffic identical to
|
|
that generated between a real iSCSI host and target.
|
|
|
|
See PERFORMANCE for information regarding the expected performance of this
|
|
distribution.
|
|
|
|
This code has been successfully compiled and tested on Redhat 8.0
|
|
(kernel version 2.4.18-14) and Redhat 9.0 (kernel version 2.4.20)
|
|
with UP and SMP configurations.
|
|
|
|
-------------------
|
|
Starting the System
|
|
-------------------
|
|
|
|
1a) Modify the array in initiator.c to contain your target ip addresses and port
|
|
numbers. If you specify a TargetName there will be no discovery process. For
|
|
example, targets 0 and 2 below will first be discovered. Target 1 will not.
|
|
ISCSI_PORT is the default port defined in iscsi.h and currently set to 3260.
|
|
|
|
static INITIATOR_TARGET_T g_target[CONFIG_INITIATOR_NUM_TARGETS] = {
|
|
{"192.168.10.10", ISCSI_PORT, "", NULL, 0},
|
|
{"192.168.10.11", ISCSI_PORT, "iqn.com.intel.abc123", NULL, 0},
|
|
{"192.168.10.12", ISCSI_PORT, "", NULL, 0}};
|
|
|
|
The initiator currently only connects to one of the discovered targets. If
|
|
multiple TargetNames and TargetAddresses are returned, all but 1 are ignored.
|
|
|
|
1b) Alternately for the kernel mode driver you may specify ip addresses
|
|
in a file in the local directory called "./intel_iscsi_targets". This
|
|
file will also be looked for in the /etc directory or you may specify
|
|
the file name as a module parameter to the insmod command using the
|
|
"gfilename" argument, (insmod intel_iscsi.o gfilename="./targets").
|
|
The format for the contents of of the file is:
|
|
ip=192.168.10.10
|
|
ip=192.168.10.11 name=iqn.com.intel.abc123 port=3260
|
|
ip=192.168.10.12
|
|
The name and port fields are optional. If name is not specified, there
|
|
will be a discovery process. If port is not specified, the default port
|
|
of 3260 will be used.
|
|
|
|
1c) For the user mode intiator, if the first entry of the g_target array has ip
|
|
address "151.0.1.1", the initiator will prompt the user to enter the number
|
|
of targets and their ip addresses.
|
|
|
|
2) Modify the following constant in initiator.h accordingly:
|
|
|
|
#define CONFIG_INITIATOR_NUM_TARGETS 3
|
|
|
|
3) Run "make" to build each of:
|
|
|
|
intel_iscsi.o - kernel mode iSCSI initiator
|
|
kramdisk.o - kernel mode iSCSI target ramdisk
|
|
ufsdisk - user mode iSCSI target (disk stored as file in /tmp)
|
|
ufsdisk_mmap - same as ufsdisk, but uses mmap
|
|
uramdisk - user mode iSCSI ramdisk
|
|
utest - user mode iSCSI test suite
|
|
ktest - invokes same tests as utest, but from within device driver
|
|
usocktest - user mode sockets test that simulates iSCSI traffic
|
|
|
|
4) Start a user level target (uramdisk, ufsdisk, ufsdisk_mmap) on each target
|
|
machine:
|
|
|
|
Usage: -t <name> iSCSI TargetName (dflt "iqn.com.intel.abc123")
|
|
-p <port> Port Number (dflt 3260)
|
|
-b <block len> Block Length (dflt 512)
|
|
-n <num blocks> Number of Blocks (dflt 204800)
|
|
|
|
|
|
Or start the kernel level target (kramdisk.o):
|
|
|
|
Usage: insmod kramdisk.o port=<port>
|
|
block_len=<block length>
|
|
num_blocks=<number of blocks>
|
|
|
|
|
|
With ufsdisk and ufsdisk_mmap you can directly access a device in /dev by
|
|
creating a symbolic link in /tmp to point to the appropriate device. For
|
|
example:
|
|
|
|
"ln -s /dev/sdd /tmp/iqn.com.intel.abc123_3260_iscsi_disk_lun_0"
|
|
|
|
And kramdisk.o only operates in ramdisk mode.
|
|
|
|
5) Run utest. If you did not successfully connect to each target machine you
|
|
specified in initiator.c, then there was a problem. Make sure initiator.h
|
|
and initiator.c were correctly edited and all your targets had been started.
|
|
|
|
6) As root, run "insmod ./intel_iscsi.o." You should see output similar to the
|
|
following when either viewing /var/log/messages or running dmesg:
|
|
|
|
*********************************************
|
|
* PARAMETERS NEGOTIATED *
|
|
* *
|
|
* InitiatorName: Intel *
|
|
* InitiatorAlias: Intel *
|
|
* SessionType: normal *
|
|
* TargetName: iqn.com.intel.abc12 *
|
|
*********************************************
|
|
*********************************************
|
|
* LOGIN SUCCESSFUL *
|
|
* *
|
|
* CID: 0 *
|
|
* ISID: 0 *
|
|
* TSID: 1 *
|
|
* CmdSN: 0 *
|
|
* MaxCmdSN: 0 *
|
|
* ExpStatSN: 0 *
|
|
*********************************************
|
|
Vendor: Intel Model: Intel Labs iSCSI Rev: 2
|
|
Type: Direct-Access ANSI SCSI revision: 02
|
|
Detected scsi disk sdb at scsi2, channel 0, id 0, lun 0
|
|
SCSI device sdb: 204800 512-byte hdwr sectors (105 MB)
|
|
sdb: unknown partition table
|
|
|
|
You can now use the device as you would any other SCSI device. You can also
|
|
view driver statistics by viewing the file in /proc/scsi/iscsi. Writing to
|
|
the file (e.g. echo reset > /proc/scsi/iscsi/1) will reset all counters.
|
|
|
|
------------------
|
|
Testing the System
|
|
------------------
|
|
|
|
Once your targets and host have been started, you can test the installation
|
|
using either a single target, or by creating a RAID volume over multiple
|
|
targets.
|
|
|
|
To test a single target you can either directly read and write the device by
|
|
opening, for example, /dev/sdd. Or you can create a filesystem on the device:
|
|
|
|
fdisk /dev/sdd
|
|
mkfs /dev/sdd1
|
|
mount -t ext2 /dev/sdd1 /mnt/iscsi_fs
|
|
|
|
To test a multiple target installation, you can create a RAID volume,
|
|
virtualizing multiple targets as one SCSI device. The Linux RAID modules
|
|
will either need to be installed or compiled into the kernel. The file
|
|
/etc/raidtab must be created to reflect your targets. For example,
|
|
|
|
raiddev /dev/md0
|
|
raid-level 0
|
|
nr-raid-disks 5
|
|
persistent-superblock 0
|
|
chunk-size 64
|
|
|
|
device /dev/sdd
|
|
raid-disk 0
|
|
device /dev/sde
|
|
raid-disk 1
|
|
device /dev/sdf
|
|
raid-disk 2
|
|
device /dev/sdg
|
|
raid-disk 3
|
|
device /dev/sdh
|
|
raid-disk 4
|
|
|
|
|
|
After initialized the raid device with "mkraid /dev/md0," you can use /dev/md0
|
|
as though it were a normal SCSI device. For example,
|
|
|
|
mkfs /dev/md0
|
|
mount -t ext2 /dev/md0 /mnt/iscsi_fs
|
|
|
|
--------------------
|
|
When Things Go Wrong
|
|
--------------------
|
|
|
|
Check the kernel error messages /var/log/messages or run the dmesg command to
|
|
see any errors reported from the host driver. The targets will report target
|
|
errors to standard output.
|
|
|
|
If you need more fine grained debugging, modify the Makefile to turn on the
|
|
compilation flag CONFIG_ISCSI_DEBUG. Then run "make clean," and then "make."
|
|
You can select which type of debugging statements get printed by modifying
|
|
util.h
|
|
|
|
-------------------------------------
|
|
Interoperability with Cisco Initiator
|
|
-------------------------------------
|
|
|
|
The target is tested to be interoperable with Cisco Initiator release
|
|
3.4.1.1
|