| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| <title> |
| QLogic FC Target Driver How-to for 22xx/23xx/24xx/25xx/26xx Adapters |
| </title> |
| <style type="text/css"> |
| pre {color:brown;} |
| body > ol > li {padding-bottom:1ex;} |
| </style> |
| <body> |
| |
| <div style="text-align: center;"> |
| <strong>How to Configure the FC QLogic Target Driver for |
| 22xx/23xx/24xx/25xx/26xx Adapters</strong></div> |
| <br><br> |
| |
| <div style="text-align: center;"> <strong>TARGET SYSTEM</strong></div> |
| <br><br> |
| |
| <ol> |
| <li> |
| Look up the model numbers of the FC HBA and of the FC HBA RISC controller. If |
| it is not easy to access the label printed on the HBA, one way to look up |
| these model numbers is as follows: |
| <pre>[root@proj ]# dmesg -c >/dev/null |
| [root@proj ]# rmmod qla2xxx |
| [root@proj ]# modprobe qla2xxx |
| [root@proj ]# dmesg | grep -E 'qla2xxx .* QLogic | Found an ISP' |
| qla2xxx [0000:01:00.0]-001d: Found an ISP2532 irq 16 iobase 0xffffc9000413e000. |
| qla2xxx [0000:01:00.0]-00fb:164: QLogic QLE2562 - PCI-Express Dual Channel 8Gb Fibre Channel HBA. |
| qla2xxx [0000:01:00.1]-001d: Found an ISP2532 irq 17 iobase 0xffffc9000417c000. |
| qla2xxx [0000:01:00.1]-00fb:165: QLogic QLE2562 - PCI-Express Dual Channel 8Gb Fibre Channel HBA.</pre> |
| The above information not only contains the HBA model number (QLE2562) but |
| also the RISC controller ID (ISP2532). |
| </li> |
| <li>(Optional) Download the Linux version of the QConvergeConsoleCLI software package |
| from <a href="http://driverdownloads.qlogic.com/">http://driverdownloads.qlogic.com/</a> |
| and install that software package. |
| </li> |
| <li> |
| Download the appropriate firmware for your QLogic card from |
| <a href="http://driverdownloads.qlogic.com/">http://driverdownloads.qlogic.com/</a>. |
| It is strongly recommended to use firmware version 5.x or higher for |
| 24xx/25xx adapters. More information about this subject can be found in |
| the following e-mail thread: Vladislav Bolkhovitin and Artur Piechocki, |
| <a href="http://sourceforge.net/mailarchive/forum.php?thread_name=4B4CD39F.6020401%40vlnb.net&forum_name=scst-devel"><em>FC |
| session gets closed with qla2x00t</em></a>, scst-devel mailing list, January 2010. |
| |
| <br><br> |
| |
| If no firmware image is available when the QLogic kernel module is loaded, |
| the following error message will appear in the system log |
| (/var/log/messages or /var/log/syslog): |
| |
| <pre>qla2xxx 0000:13:00.0: Firmware image unavailable. |
| qla2xxx 0000:13:00.0: Failed to initialize adapter</pre> |
| </li> |
| |
| <li> |
| Copy the firmware image (.BIN) file to the /lib/firmware directory and |
| rename it such that the kernel driver can find it. The file name that should |
| be used for the firmware file depends on the RISC controller ID: |
| <table border="1"> |
| <tr><th><b>ISP Model</b></th><th><b>Firmware file<br>name</b></th></tr> |
| <tr><td>ISP 21XX</td><td>ql2100_fw.bin</td></tr> |
| <tr><td>ISP 22XX</td><td>ql2200_fw.bin</td></tr> |
| <tr><td>ISP 2300</td><td>ql2300_fw.bin</td></tr> |
| <tr><td>ISP 2322</td><td>ql2322_fw.bin</td></tr> |
| <tr><td>ISP 24XX</td><td>ql2400_fw.bin</td></tr> |
| <tr><td>ISP 25XX</td><td>ql2500_fw.bin</td></tr> |
| <tr><td>ISP 2031</td><td>ql2600_fw.bin</td></tr> |
| <tr><td>ISP 27XX</td><td>ql2700_fw.bin</td></tr> |
| </table> |
| </li> |
| <li> |
| Update the firmware image in the HBA. Although the QLogic kernel driver is |
| able to load the firmware from /lib/firmware, QLogic recommends to update |
| the firmware image that resides in the HBA (see also Quinn Tran, |
| <a href="http://sourceforge.net/p/scst/mailman/message/32801228/"><em>Re: |
| [ANNOUNCE]: qla2x00t QLogic git integration into the SCST build |
| tree</em></a>, scst-devel mailing list, September 5, 2014). An example: |
| <pre>[root@proj ]# /opt/QLogic_Corporation/QConvergeConsoleCLI/qaucli -fc -b all /lib/firmware/ql2500_fw.bin</pre> |
| </li> |
| <li>Install the necessary kernel development packages. On a Debian system |
| these packages can be installed as follows: |
| <pre>[root@proj ]# apt-get install gcc linux-headers-`uname -r` lsscsi patch subversion</pre> |
| On RHEL/CentOS/SL systems these packages can be installed as follows: |
| <pre>[root@proj ]# yum install gcc kernel-devel lsscsi patch subversion</pre> |
| And on SUSE systems these packages can be installed by running the following command: |
| <pre>[root@proj ]# zypper install gcc kernel-devel lsscsi patch subversion</pre> |
| </li> |
| |
| <li> |
| Download the SCST source code. That source code can be downloaded either |
| from the <a href="http://scst.sourceforge.net/downloads.html">SCST |
| downloads page</a> or from the SCST Subversion source code |
| repository.<br><br> |
| |
| In what follows it is assumed that the SCST trunk has been retrieved |
| via Subversion. Installing a released SCST version is identical to |
| installing the trunk after all downloaded SCST source code archives have |
| been extracted in a single directory. The structure of that directory will |
| be identical to that of the SCST trunk. |
| |
| <pre>[root@proj ]# svn co https://svn.code.sf.net/p/scst/svn/trunk scst</pre> |
| |
| After the above command finished a directory called 'scst' will have been |
| created in the current directory, which is /root in this how-to. |
| </li> |
| |
| <li> |
| If you want to use the latest QLogic SCST target driver from the QLogic git, |
| use the driver from the qla2x00t-32gbit directory. Please note that this |
| driver has not yet reached the same maturity level as the driver in the |
| qla2x00t directory. |
| </li> |
| |
| <li id="blacklist"> |
| Unload the qla2xxx kernel module provided by your Linux distribution and blacklist it: |
| <pre>[root@proj ]# echo blacklist qla2xxx >/etc/modprobe.d/blacklist-qla2xxx.conf |
| [root@proj ]# rmmod qla2xxx</pre> |
| </li> |
| |
| <li id="release"> |
| Select a build mode that suits your needs, e.g. optimal performance or |
| debugging SCST. The default mode is debug mode. Here is how to switch to |
| release mode: |
| <pre>[root@proj scst ]# pwd |
| /root/scst |
| [root@proj scst ]# make 2release</pre> |
| </li> |
| |
| <li> |
| Now build the SCST kernel modules. But first verify that the link |
| "/lib/modules/`uname -r`/build" points to the kernel headers of the |
| currently running kernel. Build and install SCST, e.g. as follows: |
| <pre>[root@proj ]# cd /root/scst |
| [root@proj scst ]# BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y CONFIG_SCSI_QLA2XXX_TARGET=y make all install</pre> |
| |
| Verify that compilation and installation succeeded: |
| <pre>[root@proj scst]# ls -l /lib/modules/`uname -r`/extra/qla2* |
| -rw-r--r-- 1 root root 36756 Jun 20 18:46 qla2x00tgt.ko |
| -rw-r--r-- 1 root root 160192 Jun 20 18:46 qla2xxx_scst.ko |
| </pre> |
| </li> |
| |
| <li> |
| Insert the kernel modules.<br> The kernel modules have been installed in |
| '/lib/modules/`your_kernel_version`/extra'.<br> In addition, scst.h, |
| scst_debug.h as well as Module.symvers or Modules.symvers have been copied |
| to '/usr/local/include/scst'.<br> The first file contains all SCST's public |
| interfaces used by target drivers. The other files allow target drivers to |
| generate debug messages and support the kernel module build process. |
| |
| <pre>[root@proj scst]# ls -l /lib/modules/`uname -r`/extra |
| total 232 |
| drwxr-xr-x 2 root root 4096 Jun 20 18:43 dev_handlers |
| -rw-r--r-- 1 root root 36756 Jun 20 18:46 qla2x00tgt.ko |
| -rw-r--r-- 1 root root 160192 Jun 20 18:46 qla2xxx_scst.ko |
| -rw-r--r-- 1 root root 190848 Jun 20 18:43 scst.ko |
| |
| [root@proj scst]# ls -l /lib/modules/`uname -r`/extra/dev_handlers |
| total 192 |
| -rw-r--r-- 1 root root 11757 Jun 20 18:43 scst_cdrom.ko |
| -rw-r--r-- 1 root root 10111 Jun 20 18:43 scst_changer.ko |
| -rw-r--r-- 1 root root 12420 Jun 20 18:43 scst_disk.ko |
| -rw-r--r-- 1 root root 12449 Jun 20 18:43 scst_modisk.ko |
| -rw-r--r-- 1 root root 10131 Jun 20 18:43 scst_processor.ko |
| -rw-r--r-- 1 root root 10081 Jun 20 18:43 scst_raid.ko |
| -rw-r--r-- 1 root root 12563 Jun 20 18:43 scst_tape.ko |
| -rw-r--r-- 1 root root 37937 Jun 20 18:43 scst_user.ko |
| -rw-r--r-- 1 root root 50194 Jun 20 18:43 scst_vdisk.ko</pre> |
| |
| where: |
| <ul> |
| <li>scst - SCST itself.</li> |
| <li>scst_disk - device handler for disks (type 0).</li> |
| <li>scst_tape - device handler for tapes (type 1).</li> |
| <li>scst_processor - device handler for processors (type 3).</li> |
| <li>scst_cdrom - device handler for CDROMs (type 5).</li> |
| <li>scst_modisk - device handler for MO disks (type 7).</li> |
| <li>scst_changer - device handler for medium changers (type 8).</li> |
| <li>scst_raid - device handler for storage array controller (e.g. raid) (type C).</li> |
| <li>scst_vdisk - device handler for virtual disks (file, device or ISO CD image)..</li> |
| <li>scst_user - user space device handler.</li> |
| </ul> |
| <br> |
| |
| You can insert any of these kernel modules with the 'modprobe' program. As |
| you can see, I've inserted all SCST kernel modules !!! |
| <pre>[root@proj ]# for m in scst qla2xxx_scst qla2x00tgt scst_vdisk scst_user scst_disk ...; do modprobe $m; done</pre> |
| |
| This will result in the following dmesg output: |
| |
| <pre>scst: SCST version 2.0.0 loaded successfully (max mem for commands 16251MB, per device 6500MB) |
| scst: Enabled features: TRACING |
| scst: Target template qla2x00tgt registered successfully |
| scst: Virtual device handler vdisk for type 0 registered successfully |
| scst: Virtual device handler "scst_user" registered successfully</pre> |
| </li> |
| |
| <li> |
| Back up and rebuild the initial RAM disk such that the qla2xxx kernel module in |
| that RAM disk will be replaced by qla2xxx_scst. How to do this depends on your |
| Linux distribution. The initial RAM disk can be rebuilt e.g. as follows: |
| <pre>[root@proj ]# type update-initrd >/dev/null 2>&1 && update-initrd -c -k `uname -r` |
| [root@proj ]# type update-initramfs >/dev/null 2>&1 && update-initramfs -c -k `uname -r` |
| [root@proj ]# if type mkinitrd >/dev/null 2>&1; then |
| if { rpm -q sles-release || rpm -q openSUSE-release; } >/dev/null 2>&1; |
| then mkinitrd; else mkinitrd -f /boot/initramfs-`uname -r`.img `uname -r`; fi; fi</pre> |
| </li> |
| |
| <li> |
| Now let's create our virtual device: |
| |
| <pre>[root@proj ]# dd if=/dev/zero of=/mnt/disk1 bs=1024k count=512 |
| 512+0 records in |
| 512+0 records out |
| |
| [root@proj ]# ls -l /mnt/disk1 |
| -rw-r--r-- 1 root root 536870912 Jun 23 13:27 /mnt/disk1 |
| |
| [root@proj ]# file /mnt/disk1 |
| /mnt/disk1: data</pre> |
| </li> |
| |
| <li>The next step is to install scstadmin: |
| <pre>[root@proj ]# make -C scstadmin -s install</pre> |
| </li> |
| |
| <li id="target-mode"> |
| To see the device on the initiator we have to add it in the LUNs set of our |
| target.<br> We must have a LUN with number 0 (LUs numeration must not start |
| from, e.g., 1).<br><br> |
| |
| The simplest way to do that is to generate an scstadmin config file, e.g. as |
| follows: |
| |
| <pre>modprobe qla2x00tgt |
| find /sys/kernel/scst_tgt/targets/qla2x00t -name enabled | \ |
| while read f; do echo 1 >$f & done; wait |
| find /sys -name issue_lip | while read f; do echo 1 >$f & done; wait |
| { |
| cat <<EOF |
| HANDLER vdisk_fileio { |
| DEVICE disk1 { |
| filename /mnt/disk1 |
| } |
| } |
| EOF |
| for p in /sys/kernel/scst_tgt/targets/qla2x00t/*; do |
| [ -d $p ] || continue |
| cat <<EOF |
| |
| TARGET_DRIVER qla2x00t { |
| TARGET $(basename $p) { |
| enabled 1 |
| |
| LUN 0 disk1 |
| } |
| } |
| EOF |
| done |
| } >scst.conf</pre> |
| |
| Check the generated config file. If it looks fine to you, move it to the |
| default location: |
| <pre>mv -i scst.conf /etc/scst.conf</pre> |
| |
| The SCST configuration in that file can be applied via scstadmin: |
| |
| <pre>[root@proj ]# scstadmin -config /etc/scst.conf |
| |
| Collecting current configuration: done. |
| |
| -> Checking configuration file 'qq' for errors. |
| -> Done, 0 warnings found. |
| |
| -> Opening device 'disk1' using handler 'vdisk_fileio': done. |
| -> Adding device 'disk1' at LUN 0 to driver/target 'qla2x00t/25:00:00:f0:98:87:92:f3': done. |
| -> Enabling driver/target 'qla2x00t/25:00:00:f0:98:87:92:f3': done. |
| |
| All done.</pre> |
| |
| |
| The same can be done directly via the sysfs interface of SCST: |
| <pre> |
| [root@proj ]# echo "add_device disk1 filename=/mnt/disk1" >/sys/kernel/scst_tgt/handlers/vdisk_fileio/mgmt |
| [root@proj ]# echo "add disk1 0" >/sys/kernel/scst_tgt/targets/qla2x00t/25:00:00:f0:98:87:92:f3/luns/mgmt |
| [root@proj ]# echo "1" >/sys/kernel/scst_tgt/targets/qla2x00t/25:00:00:f0:98:87:92:f3/enabled |
| </pre> |
| </li> |
| <li>If you want to configure LUN masking the next step is to configure |
| one initiator group per initiator. To do that you need to discover the |
| initiator port WWNs. One way to discover these is as follows: |
| <pre>[root@proj ]# ls -d /sys/kernel/scst_tgt/targets/qla2x00t/*/sessions/*|sed 's,.*/,,' | sort -u |
| 10:00:00:00:c9:95:c7:1a |
| 10:00:00:00:c9:95:c7:1b |
| 21:00:00:24:ff:46:c0:84 |
| 21:00:00:24:ff:46:c0:85 |
| 21:00:00:24:ff:6c:ca:d8 |
| 21:00:00:24:ff:6c:ca:d9 |
| 21:00:00:24:ff:6c:ca:da |
| 21:00:00:24:ff:6c:ca:db</pre> |
| More information about initiator group configuration together with an |
| example can be found in the scst.conf man page.</li> |
| </ol> |
| |
| <br> |
| <div style="text-align: center;"><strong>INITIATOR SYSTEM</strong></div> |
| <br> |
| |
| <ol> |
| <li> |
| A quote from the SCST README:<blockquote><em> Without loading appropriate |
| device handler, corresponding device will be invisible for remote |
| initiators, hence we have to add them manually.</em></blockquote> But as |
| I've already loaded the device handler (scst_vdisk) on the target, I don't |
| have to perform any additional steps. |
| </li> |
| |
| <li> |
| After <a href="#target-mode">enabling the target mode</a> on the target, to |
| see new targets and devices on the initiator you need have to trigger a |
| rescan on the initiator. That is possible either by rebooting the initiator |
| or by unloading and reloading the initiator kernel module. Automatic |
| discovery isn't supported by all known initiators, so you need a way to make |
| SCSI subsystem on the initiator to do the new devices discovery and hence be |
| able to see the new devices attached. |
| |
| Alternatively, if your initiator already connected to the target and you |
| simply added new devices to it, you can try to run a manual rescan as follows: |
| |
| <pre>[root@initiator ]# echo "- - -" >/sys/class/scsi_host/hostX/scan</pre> |
| where X is the host number. |
| </li> |
| |
| </ol> |
| |
| </body> |
| </html> |