Установка, настройка и использование ISCSI
Содержание
iSCSI
Для использования дисковых массивов находящихся на одном компьютере другим можно использовать iSCSI.
Термины
- Initiator (Инициатор) - клиент в технологии iSCSI - конечная точка в которой происходит доступ к массиву.
- Target (Программный сервер) - сервер предоставляющий доступ к массиву.
В нашем случае initiator и target являются программными.
Установка
Target
В качестве сервера будем использовать iscsitarget - ссылка
для установки в gentoo - emerge -v sys-block/iscsitarget
в ядре дожна быть включена опция : CRYPTO_CRC32C
Настройка
После установки надо отредактировать файл : /etc/ietd.conf
Target iqn.2008-09.ru.dvo:iscsi.oberon.lvm.1 Lun 0 Path=/dev/mapper/vg-lvol0,Type=fileio MaxConnections 1
где : iqn.2008-09.ru.dvo:iscsi.oberon.lvm.1 - имя узла. iqn обязательный префикс
/dev/mapper/vg-lvol0 - экспортируемое блочное устройство.
Файл /etc/conf.d/ietd интересен возможностью задать адрес на котором будет находится ietd демон
запуск сервиса осуществляется при помощи : /etc/init.d/ietd start
Initiator
для инициатора используется пакет sys-block/open-iscsi
Для работы с ядрами 2.6.26 нужно использовать версию 2.0.870_rc2
В ядре необходимо собрать драйвер iscsi_tcp - CONFIG_ISCSI_TCP (Device Drivers -> SCSI device support -> SCSI low level drivers->iSCSI initiator over TCP/IP), и добавить поддержку CONFIG_CRYPTO_CRC32C (Cryptographic API->CRC32c CRC alroritm).
Настройка
Редактируем файл /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2008-09.ru.dvo:iscsi.beetle.lvm.1 InitiatorAlias=initiator-beetle
Загрузка для систем не имеющих init скриптов
Загружаем модуль
modprobe -q iscsi_tcp
Запускаем
iscsi демон iscsid -c /etc/iscsi/iscsid.conf -i /etc/iscsi/initiatorname.iscsi
Загрузка в Gentoo
В Gentoo имеется инициализирующий скрипт, так что достаточно просто запустить
/etc/init.d/iscsid start
Для того чтобу указать на каком адресе будет работать ietd необходимо заполнить поле ADDRESS в файле
/etc/conf.d/ietd
Настройка сети
iscsiadm -m iface -I iface0 --op=new
Затем зыпускаем ifconfig
и смотрим значение HWaddr для того сетевого интерфейса который мы хотим использовать, например 00:0F:1F:92:6B:BF
iscsiadm -m iface -I iface0 --op=update -n iface.hwaddress -v 00:0F:1F:92:6B:BF
Далее выполняем
iscsiadm -m node -T iqn.2008-09.ru.dvo:iscsi.oberon.lvm.1 -p <IP адрес сервера где расположен target>:3260 -l
Выяснить наличие доступных узлов можно командой
iscsiadm -m discovery -t st -p 10.0.0.1 -P 1
после этого перезапускаем iscsid
после этого у нас должно появиться новое блочное устройство, например /dev/sdb
с ним можно работать как с обычным блочным устройством те fdisk,mkfs,mout etc.
Теперь для того чтобы получить доступ к данному блочному устройству после перезагрузки initiator нужно будет только запустить iscsid (модуль iscsi_tcp должен быть загружен)
Автоматическое подключение нодов при запуске сервиса
Эта возможность присутствует только в дистрибутивах с init скриптом. Подключение определённой цели, находящейся на удаленной машине с ip:port
iscsiadm -m node -T targetname -p ip:port --op update -n node.conn[0].startup -v automatic
Для обепечения подключения для всех порталов и на всех интерфейсах:
iscsiadm -m node -T targetname --op update -n node.conn[0].startup -v automatic
Также, той же цели моно добится изминив в /etc/iscsi/iscsi.conf строчку
node.conn[0].startup = automatic
Для подключения всех нод вручную необходимо набрать
iscsiadm -m node --loginall=automatic
Для отключения от нод
iscsiadm -m node --logoutall=automatic
То же самое может быть выполнено при запуске демона iscsid
iscsi_login_all_nodes() { ebegin "Setting up iSCSI targets: " iscsiadm -m node --loginall=automatic eend $? } iscsi_logout_all_nodes() { ebegin "Deactivating iSCSI targets: " # Logout from all active sessions iscsiadm -m node --logoutall=all ret=$? eend $ret return $ret } start() { checkconfig || return 1 do_modules 'Loading iSCSI modules' 'scsi_transport_iscsi iscsi_tcp' ret=$? [ $ret -ne 0 ] && return 1 ebegin "Starting ${NAME}" start-stop-daemon --start --exec $DAEMON --quiet ret=$? eend $ret if [ "$ret" == "0" ]; then iscsi_login_all_nodes fi return $ret } stop() { iscsi_logout_all_nodes || return 1 ebegin "Stopping ${NAME}" start-stop-daemon --signal HUP --stop --quiet --exec $DAEMON #--pidfile $PID_FILE eend $? # ugly, but pid file is not removed by iscsid rm -f $PID_FILE do_modules 'Removing iSCSI modules' 'iscsi_tcp scsi_transport_iscsi' '-r' ret=$? return $ret }
ВАЖНО!!! Изменения в файле затронут только те узлы, которые были добавлеы после изменения файла. Существовавшие до этого узлы необходимо добавить вручную через команду iscsiadm как показано выше.
Jumbo frames
для увелечения производительности iscsi можно использовать jumbo frames Для этого нужна gigabit ethernet card,switch (with jumbo farmes support) на initiator и target выполняем ifconfig eth0 mtu 9000