Fibre Channel

The Linux SCSI Target Wiki

(Redirected from QLogic)
Jump to: navigation, search
Linux-IO Target
Logo
RTS OS 2.0 120207a.png
Fibre Channel fabric module(s)
Original author(s) Nicholas Bellinger
Andrew Vasquez
Madhu Iyengar
Developer(s) Datera, Inc.
Initial release July 21, 2012 (2012-07-21)
Stable release 4.1.0 / June 20, 2012;
21 months ago
 (2012-06-20)
Preview release 4.2.0-rc5 / June 28, 2012;
21 months ago
 (2012-06-28)
Development status Production
Written in C
Operating system Linux
Type Fabric module
License GNU General Public License
Website datera.io
See Target for a complete overview over all fabric modules.
QLogic Fibre Channel running at line rate in target mode with PCIe device passthrough and MSI-X polled interrupts across Linux/SCSI qla2xxx LLD request and response rings.
TCM v4.0 qla2xxx using PCIe device passthrough for target mode MSI-X interrupts, and QEMU Megasas HBA emulation into Windows7 64-bit guest.

Fibre Channel (FC) provides drivers for various FC Host Bus Adapters (HBAs). Fibre Channel is a gigabit-speed network technology primarily used for storage networking.

Contents

Overview

Fibre Channel is standardized in the T11 Technical Committee of the Inter National Committee for Information Technology Standards (INCITS), an American National Standards Institute (ANSI) - accredited standards committee.

Fibre Channel has been the standard connection type for storage area networks (SAN) in enterprise storage. Despite its name, Fibre Channel signaling can run on both twisted pair copper wire and fiber-optic cables.

The Fibre Channel Protocol (FCP) is a transport protocol which predominantly transports SCSI commands over Fibre Channel networks.

Hardware support

The following QLogic Fiber Channel HBAs are supported in 4/8-gigabit mode:

The QLogic Fibre Channel fabric module (qla2xxx.ko, Linux kernel driver database) for the Linux SCSI Target was released with Linux kernel 3.5 on July 21, 2012 (2012-07-21).[1]

With Linux 3.9, the following 16-gigabit QLogic Fibre Channel HBA is supported, which makes LIO™ the first open source target to support 16GFC:

With Linux 3.9, the following QLogic CNAs are also supported:

Enable target mode

By default, the upstream qla2xxx driver runs in initiator mode. To use it with LIO™, first enable Fibre Channel target mode with the corresponding qlini_mode module parameter.[2]

To enable target mode, add the following parameter to the qla2xxx module configuration file:

options qla2xxx qlini_mode="disabled"

Depending on your distribution, the module configuration file might be different, for instance:

In order for these changes to take effect, the initrd/initramfs will need to be rebuilt.

Please verify that initrd/initramfs is accepting the additional qla2xxx parameter.

targetcli

targetcli from Datera, Inc. is used to configure Fibre Channel targets. targetcli aggregates LIO™ service modules via a core library, and exports them through an API, to provide a unified single-node SAN configuration shell, independently of the underlying fabric(s).

Cheat sheet

Command Comment
/backstores/iblock create my_disk /dev/sdb Create the LUN my_disk on the block device /dev/sdb
/qla2xxx create <WWPN> Create a Fibre Channel target
In /qla2xxx/<WWPN>:
luns/ create /backstores/iblock/my_disk
Export the LUN my_disk
In /qla2xxx/<WWPN>:
acls/ create <Initiator WWPN>
Allow access for the initiator at <WWPN>
/saveconfig Commit the configuration

Startup

targetcli is invoked by running targetcli as root from the command prompt of the underlying RTS OS shell.

# targetcli
Welcome to targetcli:

 Copyright (c) 2014 by Datera, Inc.
 All rights reserved.

Visit us at http://www.datera.io.

Using ib_srpt fabric module.
Using qla2xxx fabric module.
Using iscsi fabric module.
Using loopback fabric module.

/> qla2xxx/ info
Fabric module name: qla2xxx
ConfigFS path: /sys/kernel/config/target/qla2xxx
Allowed WWN list type: free
Fabric module specfile: /var/target/fabric/qla2xxx.spec
Fabric module features: acls
Corresponding kernel module: tcm_qla2xxx
/>

Upon targetcli initialization, the underlying RTSlib loads the installed fabric modules, and creates the corresponding ConfigFS mount points (at /sys/kernel/config/target/<fabric>), as specified by the associated spec files (located in /var/target/fabric/fabric.spec).

Display the object tree

Use ls to list the object hierarchy, which is initially empty:

/> ls
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- fileio ............................................... [0 Storage Object]
  | o- iblock ............................................... [0 Storage Object]
  | o- pscsi ................................................ [0 Storage Object]
  | o- rd_dr ................................................ [0 Storage Object]
  | o- rd_mcp ............................................... [0 Storage Object]
  o- ib_srpt ........................................................ [0 Target]
  o- iscsi .......................................................... [0 Target]
  o- loopback ....................................................... [0 Target]
  o- qla2xxx ........................................................ [0 Target]
/>

Per default, auto_cd_after_create is set to true, which automatically enters an object context (or working directory) after its creation. The examples here are modeled after this behavior.

Optionally, set auto_cd_after_create=false to prevent targetcli from automatically entering new object contexts after their creation:

/> set global auto_cd_after_create=false
Parameter auto_cd_after_create is now 'false'.
/>

Create a backstore

Create a backstore using the IBLOCK or FILEIO type devices.

For instance, enter the top-level backstore context and create an IBLOCK backstore from a /dev/sdb block device:

/> cd backstores/
/backstores> iblock/ create name=my_disk dev=/dev/sdb
Generating a wwn serial.
Created iblock storage object my_disk using /dev/sdb.
Entering new node /backstores/iblock/my_disk.
/backstores/iblock/my_disk>

targetcli automatically creates a WWN serial ID for the backstore device and then changes the working context to it.

The resulting object hierarchy looks as follows (displayed from the root object):

/> ls
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- fileio ............................................... [0 Storage Object]
  | o- iblock ............................................... [1 Storage Object]
  | | o- my_disk .......................................... [/dev/sdb activated]
  | o- pscsi ................................................ [0 Storage Object]
  | o- rd_dr ................................................ [0 Storage Object]
  | o- rd_mcp ............................................... [0 Storage Object]
  o- ib_srpt ........................................................ [0 Target]
  o- iscsi .......................................................... [0 Target]
  o- loopback ....................................................... [0 Target]
  o- qla2xxx ........................................................ [0 Target]
/>

Alternatively, any LVM logical volume can be used as a backstore, please refer to the RTS OS Admin Manual on how to create them properly.

For instance, create an IBLOCK backstore on a logical volume (under /dev/<volume_group_name>/<logical_volume_name>):

/backstores> iblock/ create name=my_disk dev=/dev/vg0/lv1
Generating a wwn serial.
Created iblock storage object my_disk using /dev/vg0/lv1.
Entering new node /backstores/iblock/my_disk.
/backstores/iblock/my_disk>

Again, targetcli automatically creates a WWN serial ID for the backstore devices and then changes the working context to it.

Instantiate a target

The Fibre Channel ports that are available on the storage array are presented in the WWN context with the following WWNPs, for instance:

Instantiate a Fibre Channel target, in this example for QLogic HBAs, on the existing IBLOCK backstore device my_disk (as set up in targetcli):

/backstores/iblock/my_disk> /qla2xxx create 21:00:00:24:ff:31:4c:48
Created target 21:00:00:24:ff:31:4c:48.
Entering new node /qla2xxx/21:00:00:24:ff:31:4c:48.
/qla2xxx/21:0...4:ff:31:4c:48>

targetcli automatically changes the working context to the resulting tagged Endpoint.

Export LUNs

Declare LUNs for the backstore device, to form a valid SAN storage object:

/qla2xxx/21:0...4:ff:31:4c:48> luns/ create /backstores/iblock/my_disk
Selected LUN 0.
Successfully created LUN 0.
Entering new node /qla2xxx/21:00:00:24:ff:31:4c:48/luns/lun0.
/qla2xxx/21:0...:48/luns/lun0>

targetcli per default automatically assigns the default ID '0' to the LUN, and then changes the working context to the new SAN storage object. The target is now created, and exports /dev/sdb as LUN 0.

Return to the underlying Endpoint as the working context, as no attributes need to be set or modified for standard LUNs:

/qla2xxx/21:0...:48/luns/lun0> cd <
Taking you back to /qla2xxx/21:00:00:24:ff:31:4c:48.
/qla2xxx/21:0...4:ff:31:4c:48>

Define access rights

Configure the access rights to allow logins from initiators. This requires setting up individual access rights for each initiator, based on its WWPN.

Determine the WWPN for the respective Fibre Channel initiator. For instance, for Linux initiator systems, use:

# cat /sys/class/fc_host/host*/port_name | sed -e s/0x// -e 's/../&:/g' -e s/:$//

For a simple setup, grant access to the initiator with the WWPN as determined above:

/qla2xxx/21:0...4:ff:31:4c:48> acls/ create 21:00:00:24:ff:31:4c:4c
Successfully created Node ACL for 21:00:00:24:ff:31:4c:4c.
Created mapped LUN 0.
Entering new node /qla2xxx/21:00:00:24:ff:31:4c:48/acls/21:00:00:24:ff:31:4c:4c.
/qla2xxx/21:0...4:ff:31:4c:4c> cd /
/>

targetcli per default automatically adds the appropriate mapped LUNs.

Display the object tree

The resulting Fibre Channel SAN object hierarchy looks as follows (displayed from the root object):

/> ls
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- fileio ............................................... [0 Storage Object]
  | o- iblock ............................................... [1 Storage Object]
  | | o- my_disk .......................................... [/dev/sdb activated]
  | o- pscsi ................................................ [0 Storage Object]
  | o- rd_dr ................................................ [0 Storage Object]
  | o- rd_mcp ............................................... [0 Storage Object]
  o- ib_srpt ........................................................ [0 Target]
  o- iscsi .......................................................... [0 Target]
  o- loopback ....................................................... [0 Target]
  o- qla2xxx ........................................................ [1 Target]
    o- 21:00:00:24:ff:31:4c:48 ....................................... [enabled]
      o- acls .......................................................... [1 ACL]
      | o- 21:00:00:24:ff:31:4c:4c .............................. [1 Mapped LUN]
      |   o- mapped_lun0 ........................................... [lun0 (rw)]
      o- luns .......................................................... [1 LUN]
        o- lun0 .................................... [iblock/my_disk (/dev/sdb)]
/>

Persist the configuration

Use saveconfig from the root context to persist the target configuration across OS reboots:

/> saveconfig
WARNING: Saving rtsnode1 current configuration to disk will overwrite your boot settings.
The current target configuration will become the default boot config.
Are you sure? Type 'yes': yes
Making backup of srpt/ConfigFS with timestamp: 2012-02-27_23:19:37.660264
Successfully updated default config /etc/target/srpt_start.sh
Making backup of qla2xxx/ConfigFS with timestamp: 2012-02-27_23:19:37.660264
Successfully updated default config /etc/target/qla2xxx_start.sh
Making backup of loopback/ConfigFS with timestamp: 2012-02-27_23:19:37.660264
Successfully updated default config /etc/target/loopback_start.sh
Making backup of LIO-Target/ConfigFS with timestamp: 2012-02-27_23:19:37.660264
Successfully updated default config /etc/target/lio_backup-2012-02-27_23:19:37.660264.sh
Making backup of Target_Core_Mod/ConfigFS with timestamp: 2012-02-27_23:19:37.660264
Successfully updated default config /etc/target/tcm_backup-2012-02-27_23:19:37.660264.sh
Generated Target_Core_Mod config: /etc/target/backup/tcm_backup-2012-02-27_23:19:37.660264.sh
Successfully updated default config /etc/target/lio_start.sh
Successfully updated default config /etc/target/tcm_start.sh
/>

Spec file

Datera spec files define the fabric-dependent feature set, capabilities and available target ports of the specific underlying fabric.

In particular, the QLogic spec file /var/target/fabric/qla2xxx.spec is included via RTSlib. WWN values are extracted via /sys/class/fc_host/host*/port_name in wwn_from_files_filter, and are presented in the targetcli WWN working context to register individual Fibre Channel port GUIDs.

# WARNING: This is a draft specfile supplied for demo purposes only.

# The qla2xxx fabric module uses the default feature set.
features = acls

# Non-standard module naming scheme
kernel_module = tcm_qla2xxx

# The module uses hardware addresses from there
wwn_from_files = /sys/class/fc_host/host*/port_name

# Transform '0x1234567812345678' WWN notation to '12:34:56:78:12:34:56:78'
wwn_from_files_filter = "sed -e s/0x// -e 's/../&:/g' -e s/:$//"

# The configfs group is default
# configfs_group = qla2xxx

Scripting with RTSlib

Setup script

The following Python code illustrates how to setup a basic Fibre Channel target and export a mapped LUN:

#!/usr/bin/python
# Fibre Channel setup script example with RTSlib
from rtslib import *

# Setup an IBLOCK backstore
backstore = IBlockBackstore(3, mode='create')
try:
    so = IBlockStorageObject(backstore, "fioa", "/dev/fioa", gen_wwn=True)
except:
    backstore.delete()
    raise

# Create an FC target endpoint using a qla2xxx WWPN
fabric = FabricModule('qla2xxx')
target = Target(fabric, '21:00:00:24:ff:31:4c:48')
tpg = TPG(target, 1)

# Export LUN 0 via the 'so' StorageObject class
lun0 = tpg.lun(0, so, "my_lun")

# Setup the NodeACL for an FC initiator, and create MappedLUN 0
node_acl = tpg.node_acl('21:00:00:24:ff:31:4c:4c')
mapped_lun = node_acl.mapped_lun(0, 0, False)

Note that while Fibre Channel TPGs are masked by targetcli, they are not masked by RTSlib.

Object tree

The resulting object tree looks as follows:

o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- fileio ............................................... [0 Storage Object]
  | o- iblock ............................................... [1 Storage Object]
  | | o- my_disk .......................................... [/dev/sdb activated]
  | o- pscsi ................................................ [0 Storage Object]
  | o- rd_dr ................................................ [0 Storage Object]
  | o- rd_mcp ............................................... [0 Storage Object]
  o- ib_srpt ........................................................ [0 Target]
  o- iscsi .......................................................... [0 Target]
  o- loopback ....................................................... [0 Target]
  o- qla2xxx ........................................................ [1 Target]
    o- 21:00:00:24:ff:31:4c:48 ....................................... [enabled]
      o- acls .......................................................... [0 ACL]
      | o- 21:00:00:24:ff:31:4c:4c .............................. [1 Mapped LUN]
      |   o- mapped_lun0 ........................................... [lun0 (rw)]
      o- luns .......................................................... [1 LUN]
        o- lun0 .................................... [iblock/my_disk (/dev/sdb)]

Specifications

The following specifications are available as T10 Working Drafts:

Glossary

RFCs

See also

Notes

  1. Linus Torvalds (2012-07-21). "Linux 3.5 released". marc.info. 
  2. Nicholas Bellinger (2012-09-05). "Re: targetcli qla2xxx create fails". spinics.net. 

External links

Timeline of the Linux-IO Target
Release Details 2010 2011 2012 2013 2014
123456789101112 123456789101112 123456789101112 123456789101112 123456789101112
4.x Version 4.0
Feature Target Core Loop back FCoE iSCSI Perf SRP
CM WQ FC
USB
1394
vHost Perf Misc 16 GFC iSER Misc VAAI Misc DIF
Ref's
NPIV
iSER DIF
Linux 2.6.38 2.6.39 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15
3.x Version 3.2 3.4 3.5
Feature Misc Open-FCoE Backports
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
Google AdSense