ISCSI

From Nix-Pro
Jump to: navigation, search

Terminology

  • target — The target is the name of the iSCSI server. The iSCSI server offers its devices (disks, tape, dvd/cd ... etc.) to the clients. One device can by accessed by one client.
  • initiator — The initiator is the name of the iSCSI client. The iSCSI client has a block level access to the iSCSI devices, which can be a disk, tape drive, DVD/CD writer. One client can use multiple iSCSI devices.
  • IQN — ISCSI brings some changes: WWID is replaced by concept of IQN (iSCSI Qualified Name) - it's very similar to DNS name (with small differences).
  • LUN — In SCSI terminology, LUN stands for logical unit number. A LUN represents an individually addressable (logical) SCSI device that is part of a physical SCSI device (target). In an iSCSI environment, LUNs are essentially numbered disk drives. An initiator negotiates with a target to establish connectivity to a LUN; the result is an iSCSI connection that emulates a connection to a SCSI hard disk. Initiators treat iSCSI LUNs the same way as they would a raw SCSI or IDE hard drive; for instance, rather than mounting remote directories as would be done in NFS or CIFS environments, iSCSI systems format and directly manage filesystems on iSCSI LUNs.
  • Portal - IETD and open-iscsi (server and client in Linux) bring one more important concept, which in not well documented in scsi manuals, it's a portal. Portal is generally speaking multiple targets that are announced by a single server. There is no analogy with www, but if Apache could be asked to provide a page with all it's virtualhosts that would be a Portall. Thus portal lists all available targets and IPs.

Understanding iSCSI Naming and Addressing

In an iSCSI network, each iSCSI element that uses the network has a unique and permanent iSCSI name and is assigned an address for access.

iSCSI Name

Identifies a particular iSCSI element, regardless of its physical location. The iSCSI name can use IQN or EUI format.

IQN (iSCSI qualified name). Can be up to 255 characters long and has the following format:

iqn.yyyy-mm.naming-authority:unique name
  • yyyy-mm - The year and month when the naming authority was established.
  • naming-authority - Usually reverse syntax of the Internet domain name of the naming authority. For example, the iscsi.vmware.com naming authority could have the iSCSI qualified name form of iqn.1998-01.com.vmware.iscsi. The name indicates that the vmware.com domain name was registered in January of 1998, and iscsi is a subdomain, maintained by vmware.com.
  • unique name - Any name you want to use, for example, the name of your host. The naming authority must make sure that any names assigned following the colon are unique. For example, iqn.1998-01.com.vmware.iscsi:name1.

EUI (extended unique identifier). Includes the eui. prefix, followed by the 16-character name. The name includes 24 bits for the company name assigned by the IEEE and 40 bits for a unique ID, such as a serial number. For example:

eui.0123456789ABCDEF

iSCSI Alias

A more manageable, easy-to-remember name to use instead of the iSCSI name. iSCSI aliases are not unique, and are intended to be just a friendly name to associate with the node. IP Address

An address associated with each iSCSI element so that routing and switching equipment on the network can establish the connection between different elements, such as the host and storage. This is just like the IP address you assign to a computer to get access to your company's network or the Internet.

Target

Статья не про target, так что даю очень краткое описание того, что делает target. Он берёт блочное устройство, пришлёпывает к нему имя и LUN и публикет его у себя на портале, после чего позволяет всем желающим (авторизация по вкусу) обращаться к нему.

Вот пример простенького файла конфигурации, думаю, из него будет понятно что делает target (файл конфигурации на примере IET):

Target iqn.2011-09.example:data
        IncomingUser username Pa$$w0rd
        Lun 0 Path=/dev/md1

(сложный от простого отличается только опциями экспорта). Таким образом, если у нас есть target, то мы хотим его подключить. И тут начинается сложное, потому что у initiator'а своя логика, он совсем не похож на тривиальное mount для nfs.

Реализации iSCSI-таргетов

Для Ubuntu возможно использовать различные iSCSI-таргеты. Вот неполный их список:

  • ISCSI Enterprise Target — одна из самых старых реализаций iSCSI-таргета на Linux. Насколько мне известно, жива и здравствует, однако требует установки (в Ubuntu) через DKMS и совсем лёгкого дребезга бубнов. На opennet.ru есть рабочий HOWTO, применимый и к более поздним версиям ОС (Precise)
  • SCSI Target Framework (STGT/TGT) — реализация iSCSI-таргета, портированная из BSD-систем. В отличии от IET, позволяет использовать не только iSCSI, но и другие родственные технологии (такие, как, например, SRP). К сожалению, код STGT в части iSCSI в линуксе работает в userspace. Как следствие, производительность получается где-то в районе плинтуса.
  • SCST — новая реализация универсального таргета для Linux. По заявлениям разработчиков обладает массой преимуществ и фишек. В ядро не включена, для установки требует патчей исходников ядра и продолжительного зубодробительного секса. По слухам, мила, прекрасна и похожа на сакуру. Когда-то давно ее использовали, например, в Оверсан-Скалакси (их опыт вкратце описан на хабре). Пакеты для Ubuntu перестали поддерживаться около полутора лет назад, в SVN есть некоторая активность, то есть проект жив и здравствует. Кстати, разработчики — русские парни :)
  • LIO — Linux Unified Target, универсальная система, реализующая iSCSI, SRP, FCoE и несколько других вариантов экспорта устройств в сеть. Официально включена в ядро и является стандартным таргетом, начиная с версии 2.6.38. К ней есть определенные претензии в плане того, что на официальном сайте активно продвигается проприетарная сборка, обладающая большим функционалом, но оставим вопли RMS.

LIO Linux iSCSI target

General information

Before LIO, the iSCSI target implementation in Ubuntu was iET. Compared to iET, LIO is implemented as a pure kernel driver. Operations for LIO is done via configFS special filesystem.

These packages are related to LIO:

  • targetcli - provides targetcli command-line utility. This is the standard way to manipulate LIO.
  • python-rtslib - provides rtslib, a full-fledged python API library over configFS.

Web sites:

Concepts

In addition to the standard iSCSI concepts, you should know some LIO specific ones. For the standard concepts, read RFC3720.

  • Fabric - Fabric modules implement the "frontend" of the target. They "speak" specific protocols that transport SCSI commands. The Fabric Hardware Abstraction Layer (F-HAL) allows all protocol-specific processing to be encapsulated in fabric modules.LIO supports all common storage fabrics, including FCoE, Fibre Channel, IEEE 1394, iSCSI, SCSI RDMA Protocol (SRP) and USB, with iSCSI Extensions for RDMA (iSER) support under development. LIO supports several other fabrics than iSCSI. Look for /var/target/fabric/ directory for available fabric specifications.
  • Backstores - LIO supports several storage types as backing storage for LUNs. Specifically, PSCSI passes SCSI commands through to a (real) SCSI device. IBLOCK emulates SCSI devices on top of block devices such as LVM logical volume.

Linux TGT iSCSI target

Setting up TGT target

  • Installing packages (for CentOS):
yum install scsi-target-utils
  • Starting the service:
service tgtd start
  • List all available targets:
tgtadm --lld iscsi --op show --mode target
  • Create a new empty target. Syntax:
tgtadm --lld iscsi --op new --mode target --tid {tid} -T {target_name}

example:

tgtadm --lld iscsi --mode target --op new --tid=1 --targetname iqn.2009-02.com.example:for.all
  • Add a logical unit (LUN). Syntax:
tgtadm --lld iscsi --op new --mode logicalunit --tid {tid} --lun {lun} -b {block_device}

example:

tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 -b /tmp/iscsi-disk1
  • You can delete a target using the following command:
tgtadm --lld iscsi --op delete --mode target --tid <target ID>

Permissions

  • To display a list of all configured user accounts, type:
tgtadm --lld iscsi --mode account --op show
  • Add IP wildcard to allow all initiators:
tgtadm --lld iscsi --mode target --op bind --tid 1 -I ALL

IP-based restrictions

  • If you've previously configured this target to accept ALL initiators, you'll need to remove that first.
tgtadm --lld iscsi --mode target --op unbind --tid 1 -I ALL
  • Now, restrict access to a specific IP ...
tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.10.0.24
  • Or, restrict access to a subnet ...
tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.10.0.0/24

Initiator

В качестве инициатора используется open-iscsi. Итак, самое важное — у него есть режимы работы и состояние. Если мы дадим команду не в том режиме или не учтём состояние, результат будет крайне обескураживающий.

Итак, режимы работы:

  • Поиск target'ов (discovery)
  • Подключение к target'у
  • Работа с подключенным target'ом

Из этого списка вполне понятен жизненный цикл — сначала найти, потом подключиться, потом отключиться, потом снова подключиться. Open-iscsi держит сессию открытой, даже если блочное устройство не используется. Более того, он держит сессию открытой (до определённых пределов, конечно), даже если сервер ушёл в перезагрузку. Сессия iscsi — это не то же самое, что открытое TCP-соединение, iscsi может прозрачно переподключаться к target'у. Отключение/подключение — операции, которыми управляют «снаружи» (либо из другого ПО, либо руками).

Немного о состоянии. После discovery open-iscsi запоминает все найденные target'ы (они хранятся в /etc/iscsi/), другими словами, discovery — операция постоянная, совсем НЕ соответствующая, например, dns resolving). Найденные target можно удалить руками (кстати, частая ошибка — когда у open-iscsi, в результате экспериментов и настройки, пачка найденных target'ов, при попытке логина в которые выползает множество ошибок из-за того, что половина target'ов — старые строчки конфига, которые уже давно не существуют на сервере, но помнятся open-iscsi). Более того, open-iscsi позволяет менять настройки запомненного target'а — и эта «память» влияет на дальнейшую работу с target'ами даже после перезагрузки/перезапуска демона.

open-iscsi CLI

NOTE!!! iscsid has to be running.

  • Discover a list of available targets on 192.168.0.100 host:
iscsiadm -m discovery -t sendtargets -p 192.168.0.100:3260
  • List all previously discovered targets:
ls /var/lib/iscsi/nodes/

or

iscsiadm -m node
  • Delete obsolete targets
iscsiadm -m discovery -p <portalip> -o delete
  • Login to available target
iscsiadm -m node -L all

or login to specific target

iscsiadm -m node --targetname=<targetname> --login
  • Login a session with mutual CHAP authentication
iscsiadm -m node -T iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY -o update -n node.session.auth.authmethod -v CHAP
iscsiadm -m node -T iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY -o update -n node.session.auth.username -v initiatorusername
iscsiadm -m node -T iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY -o update -n node.session.auth.password -v sv0+XgpE46TB
iscsiadm -m node -T iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY -o update -n node.session.auth.username_in -v targetusername
iscsiadm -m node -T iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY -o update -n node.session.auth.password_in -v B/J1nSaWbvIt
iscsiadm -m node -T iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY -p XX.XX.XX.XX --login
  • Get active sessions
iscsiadm -m session -P 3
  • Logout a particular session
iscsiadm -m session --logout iqn.2006-06.com.qnap:xx-YYYx:iscsi.yXXX.yXyXxY
  • logout all sessions
 iscsiadm -m node -U all

or

iscsiadm -m node --logout all

Mount the discovered iSCSI target

  • Partition the discovered block device and build a filesystem on it, as shown here:
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
  • Check the UUID of the new partition.
blkid /dev/sdb1
/dev/sdb1: UUID="eac38663-e202-4920-b046-93b798db18b1" TYPE="ext4"
  • This UUID should be used for mounting the device, thus preventing problems if device names change. Create a new mount point.
mkdir /rhce2_drive1
  • Add the following entry into the "/etc/fstab" file.
UUID="eac38663-e202-4920-b046-93b798db18b1"    /rhce2_drive1    ext4    defaults    0 0
  • Mount the device.
mount /rhce2_drive1

The drive is now mounted and will be available on reboot.

Online resize of volumes

If the iscsi blockdevice contains a partitiontable, you will not be able to do an online resize. In this case you have to unmount the filesystem and alter the size of the affected partition.

  • Rescan active nodes in current session
iscsiadm -m node -R
  • If you use multipath, you also have to rescan multipath volume information.
multipathd -k"resize map sdx"
  • Finally resize the filesystem.
resize2fs /dev/sdx

Tips

You can also check where the attached iSCSI devices are located in the /dev tree with

ls -lh /dev/disk/by-path/* | grep ip

FAQ/Fixes

  • Add the following to sysctl.conf to allow two interfaces in the same subnet:
net.ipv4.conf.eth3.rp_filter = 0
net.ipv4.conf.eth4.rp_filter = 0
net.ipv4.conf.eth3.arp_ignore=1
net.ipv4.conf.eth4.arp_ignore=1
net.ipv4.conf.eth3.arp_announce=2
net.ipv4.conf.eth4.arp_announce=2
  • Be sure to not disable ipv6 on the storage interfaces, this will result in a error message not loading bnx2i.ko

Documentation

LIO target overview
Бездисковая загрузка с использованием PXE и iSCSI на примере Ubuntu
Quick LIO iSCSI target setup
official LIO iSCSI documentation
Fast tgt target HowToForge
TGT Arch wiki
Ubuntu iscsi initiator guide
[http://www.oracle-base.com/articles/linux/linux-iscsi-targets-and-initiators.php
Scsi-target-utils Quickstart Guide
Quick TGT CLI usage guide