26.02.2011

Настройка Debian в качестве iSCSI-target


Ориентировка для начала. Есть два типа подключения хранилища данных: DAS (прямое подключение стораджа) и NAS (подключение стораджа через сеть). Реализация первого - типичный жесткий диск как у каждого из нас в домашнем компьютере, подключенный по ATA(PATA/SATA) или SCSI(PAS/SAS). Второй вариант состоит из клиентской части (сервера к которому подключают удаленный диск) и серверной. Если серверная часть состоит не из примитивного узла с дисками, а целой сети, отграниченной от клиентской части файбер-свитчем, то это уже называется SAN (сеть хранения данных). Соединять эти две точки между собой можно по Ethernet, FibreChannel или Infiniband. Протоколов подключения NAS и обмену данными существует множество и на разных уровнях приближения к аппаратной части. Есть на уровне файловой системы: SMB, NFS или SSHFS, есть на более глубоком аппаратном уровне: iSCSI, AoE и FCoE.

Теперь поговорим об iSCSI и как поднять сторадж на Debian Squeeze.



Напомню, что iSCSI-target - это сервер, к которому физически прикреплено хранилище на основе SCSI-дисков. Другие машины в сети, которые называются iSCSI-initiator, обращаются к этому хранилищу, спрашивают у него в какой LUN можно писать и начинают с ним обмениваться SCSI-командами.
Существует большое множество аппаратных iSCSI-target'ов, но иногда по бедности или в тестовых целях, требуется простая незатейливая реализация. Для этого придумали программные iSCSI-target'ы.
Существуют целые операционные системы под стандартные серверы со SCSI-выми дисками, например Openfiler (на основе Linux), FreeNAS (на основе FreeBSD с поддержкой ZFS) или FreeSIOS, который не столько операционная система, сколько firmware на DOM (Disk-on-Module). Есть и проприетарные операционные системы, например лидер Open-E или второй после него по функциональности продукт Windows SS.
Но можно поставить просто демон на обычную операционную систему. Один из самых качественных продуктов - платный: StarWind iSCSI SAN. А например в стандартном репозитории Debian Squeeze есть две конкурирующих реализации: iscsitarget и open-iscsi. Естественно бесплатные как и весь Debian :)

Итак приступим:

Первое, что нужно сделать - собрать модуль ядра для этого сервиса. Слава Богу у нас под рукой Squeeze и мы можем собрать модуль одной командой при помощи технологии DKMS.
ВНИМАНИЕ: apt-get не умеет этого. Пользоваться нужно только aptitude.
aptitude install iscsitarget-dkms

Устанавливаем административную утилиту ietadm и демон ietd для работы iscsi:
aptitude install iscsitarget

 Далее включаем поддержку target:
vi /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

Запускаем демон:
invoke-rc.d iscsitarget start

Теперь у нас есть два файлика:
/proc/net/iet/volume - здесь хранятся записи о таргетах
/proc/net/iet/session - здесь хранятся записи о сессиях
Пока оба этих файлика еще пустые.

Создаем таргет (при этом создастся пока еще пустой пул сессий к нему). Имя таргета выбираем по примерам в RFC3721:
ietadm --op new --tid=[id] --params Name=iqn.2011-02.com.nodesquad:test-array
здесь tid[id] - Target ID сессии. Если не писать конкретный номер, а оставить как есть, то поставится первая свободная цифра. В данном случае 1.

Проверяем таргет:
# cat /proc/net/iet/volume
tid:1 name:iqn.2011-02.com.nodesquad:test-array

А вот и наш пул сессий:
# cat /proc/net/iet/session
tid:1 name:iqn.2011-02.com.nodesquad:test-array

Можно посмотреть подробнее со всеми настройками, при помощи утилиты ietadm:
# ietadm --op show --tid=1
Wthreads=8
Type=0
QueuedCommands=32
NOPInterval=0
NOPTimeout=0

Теперь нужно добавить устройство, которое будем раздавать по сети. Это может быть любое блочное устройство или даже файл. В моем случае будем раздавать раздел /dev/sdb1
Если Вы раздаете не блочное устройство, а файл, то blockio замените на fileio, а если сектора, то на nullio.
ietadm --op new --tid=1 --lun=[lun] --params Path=/dev/sdb1,Type=blockio

Теперь мы видим, что наш таргет с ID 1 имеет одно устройство (один LUN) с номером 0:
# cat /proc/net/iet/volume
tid:1 name:iqn.2011-02.com.nodesquad:test-array
        lun:0 state:0 iotype:blockio iomode:wt blocks:481887 blocksize:512 path:/dev/sdb1


Осталось создать пользователя. Он создается в два этапа.
Сначала пользователь для обнаружения таргетов (discovery):
ietadm --op new --user --params=IncomingUser=ivanov,Password=EeGhaer3

И затем ему же даем доступ уже на конкретный таргет:
ietadm --op new --tid=1 --user --params=IncomingUser=ivanov,Password=EeGhaer3


Проверяем работают ли эти настройки, чтобы затем их вписать в конфиг, подключаясь к нему с iscsi-initiator. Если не знаете как, то вот прекрасный мануал.

Теперь уже стало видно сессии:

# cat /proc/net/iet/session
tid:1 name:name:iqn.2011-02.com.nodesquad:test-array
        sid:562949990973952 initiator:iqn.1994-05.com.redhat:acb5c5a9b8e
                cid:0 ip:172.16.89.33 state:active hd:none dd:none
        sid:281474997486080 initiator:iqn.1994-05.com.redhat:acb5c5a9b8e
                cid:0 ip:78.47.190.33 state:active hd:none dd:none

Теперь когда стало понятно как оно настраивается и что значит каждый параметр, нужно засунуть это дело в конфиг:
vi /etc/iet/ietd.conf

Target iqn.2011-02.com.nodesquad:test-array
        IncomingUser ivanov EeGhaer3
        Lun 0 Path=/dev/sdb1,Type=blockio
По образу и подобию примера в том конфиге, можно отрегулировать более детально еще около 2-х десятков параметров, как то максимальное количество сессий или длину очереди.


Перезапускаем ietd-демон, чтобы проверить, остались ли у нас настройки:
invoke-rc.d iscsitarget restart


Проверяем создался ли target:
# cat /proc/net/iet/volume
tid:1 name:iqn.2011-02.com.nodesquad:test-array
        lun:0 state:0 iotype:blockio iomode:wt blocks:481887 blocksize:512 path:/dev/sdb1


После того, как сделали хранилище, необходимо создать на нем файловую систему.
Кроме того, желательно разобраться, что такое multipath и queue if no paths - очень пригодится, если сеть неустойчивая и файловая система не дает нормально писать на нее, постоянно отваливаясь и выкидывая ошибки I/O.

10 комментариев:

  1. Сделал всё по этому Howto (за исключением того, что iSCSI-initiator у меня Windows), но на этапе присоединения получаю сбой проверки подлинности.

    Скриншот: http://i25.fastpic.ru/big/2011/0805/67/9e35d560056d643fc8e1e7effbeb2167.png

    ОтветитьУдалить
  2. Попробуйте в файле /etc/iet/ietd.conf в разделе IncomingUser поставить что-нибудь цифровое, например:
    IncomingUser 1 1
    После этого перезапустите таргет.

    И тоже самое в виндовом инишиаторе - там тоже единички вместо логина и пароля вбейте.

    ОтветитьУдалить
  3. Теперь он добавился без проблем но присоединить его я не могу. Говорит ошибка проверки подлинности.

    А если указываю лоин и пароль, то говорит, что данный CHAP не соответствует стандарту. Может я что-то не так делаю? В каком формате нужно задавать ему пользователя?

    http://i18.fastpic.ru/big/2011/0805/d8/85d4d5368b61940756c4a8cc036af0d8.png

    ОтветитьУдалить
  4. CHAP? Я не знаю Windows-initiator, но Вам нужно найти там где-то где можно отключить хэширование пароля (PAP - без хэширования). А как он хоть называется?

    ОтветитьУдалить
  5. Разобрался!
    Поля IncomingUser и OutgoingUser в /etc/iet/ietd.conf нужно оставить пустыми!

    Правда в такой ситуации не понятно, что с безопасностью.

    ОтветитьУдалить
  6. Понятно что - ее не будет :) Это не решение.
    Нужно ковыряться в логах того приложения и в логах таргета. Боюсь ничем более дельным я помочь не смогу, так как не имею доступа.

    ОтветитьУдалить
  7. пароль должен быть мин 12 символов. но теперь пишет authentication failure. Ковыряю дальше... А за пост спасибо!!!

    ОтветитьУдалить
  8. Приветствую!
    вопрос такой, а как сказать службе чтобы она выставляла луну через определенный интерфейс. У меня их 2 , один менежмент/ssh другой для скази.

    ОтветитьУдалить
    Ответы
    1. Может ещё кому нужно))
      vi /etc/iet/ietd.conf

      Target iqn.2015-05.world.srv:target00
      Lun 0 Path=/iscsi_disk/disk01.img,Type=fileio
      initiator-address 10.0.0.31
      incominguser username password

      Удалить