Подключение iscsi в linux

Обновлено: 04.07.2024

Еще раз коротко напомним, сервер iSCSI называется портал, он содержит цели (таргет, Target), каждая цель предоставляет доступ к одному или нескольким блочным устройствам. Клиент iSCSI называется инициатор (Initiator), одна цель может быть подключена только к одному инициатору, исключения - кластерные системы.

В качестве инициатора в Linux системах используется Open-iSCSI, установим его, перед установкой не забудем обновить список пакетов. Здесь и далее все команды выполняются от имени суперпользователя или через sudo.

Затем перейдем в /etc/iscsi и откроем файл iscsid.conf. Найдем и раскомментируем опцию:

Ниже обязательно закомментируем:

Затем зададим параметры аутентификации инициатора, раскомментировав опции:

Если предполагается работа только с одной целью, то можно сразу указать здесь используемые логин и пароль, можно же оставить как есть, указав нужные данные уже при настройке подключения к цели.

Сохраним файл и перезапустим службу:

Теперь попробуем подключиться к порталу и получить список доступных целей:

Это короткая запись команды, полная будет выглядеть так:

Из чего становится понятно, что мы должны подключиться к порталу 192.168.111.153 в режиме обнаружения и получить него все доступные цели.

После успешного выполнения данной команды в /etc/iscsi появятся две директории nodes - которая содержит вложенные каталоги для каждого IQN - и send_targets - с вложенными каталогами для каждой цели. Перейдем в nodes и провалимся в каталог с IQN нашей цели, в нем откроем еще один каталог с адресом и портом, в котором обнаружим файл default. Откроем его на редактирование.

Прежде всего убедимся, что

Если же вам нужно, чтобы указанная цель не подключалась автоматически при загрузке, то измените automatic на manual.

И укажите там логин и пароль для подключения к вашей цели.

Теперь можно подключить цель, для этого можно использовать команду:

Которая подключит все цели, конфигурационные файлы которых находятся в каталоге nodes, если требуется подключить только отдельную цель, то укажите ее явно:

Для отключения выполните:

Данная команда отключит все цели, либо:

Для отключения только определенной.

Для проверки можем выполнить:

Которая покажет все подключенные блочные устройства, среди которых должен оказаться и предоставляемый целью диск, в нашем случае на скриншоте ниже виден 2 ГБ диск sdb. Также можно посмотреть все текущие подключения iSCSI:

open-iscsi-debian-ubuntu-001.jpg

Для удаления ненужных целей воспользуйтесь командой:

Которая удалит все связанные с указанным порталом (опция -p) цели.

Abstract: как работает open-iscsi (ISCSI initiator в linux), как его настраивать и чуть-чуть про сам протокол ISCSI.

Лирика: В интернете есть множество статей довольно хорошо объясняющих, как настроить ISCSI target, однако, почему-то, практически нет статей про работу с инициатором. Не смотря на то, что target технически сложнее, административной возни с initiator больше — тут больше запутанных концепций и не очень очевидные принципы работы.

Перед тем, как рассказать про ISCSI — несколько слов о разных типах удалённого доступа к информации в современных сетях.

NAS vs SAN

Существует два метода доступа к данным, находящимся на другом компьютере: файловый (когда у удалённого компьютера запрашивают файл, а какими файловыми системами это сделано — никого не волнует), характерные представители NFS, CIFS (SMB); и блочный — когда у удалённого компьютера запрашивают блоки с дискового носителя (аналогично тому, как их читают с жёсткого диска). В этом случае запрашивающая сторона сама себе делает на блочном устройстве файловую систему, а сервер, отдающий блочное устройство, знать не знает про файловые системы на нём. Первый метод называют NAS (network attached storage), а второй — SAN (storage area network). Названия вообще указывают на другие признаки (SAN подразумевает выделенную сеть до хранилищ), но так сложилось, что NAS — это файлы, а SAN — это блочные устройства по сети. И хотя все (?) понимают, что это неправильные названия, чем дальше, тем больше они закрепляются.

scsi over tcp

Одним из протоколов доступа к блочным устройствам является iscsi. Буква 'i' в названии относится не к продукции эппл, а к Internet Explorer. По своей сути это 'scsi over tcp'. Сам протокол SCSI (без буквы 'i') — это весьма сложная конструкция, поскольку он может работать через разные физические среды (например, UWSCSI — параллельная шина, SAS — последовательная — но протокол у них один и тот же). Этот протокол позволяет делать куда больше, чем просто «подтыкать диски к компьютеру» (как это придумано в SATA), например, он поддерживает имена устройств, наличие нескольких линков между блочным устройством и потребителем, поддержку коммутации (ага, SAS-коммутатор, такие даже есть в природе), подключение нескольких потребителей к одному блочному устройству и т.д. Другими словами, этот протокол просто просился в качестве основы для сетевого блочного устройства.

Терминология

В мире SCSI приняты следующие термины:
target — тот, кто предоставляет блочное устройство. Ближайший аналог из обычного компьютерного мира — сервер.
initiator — клиент, тот, кто пользуется блочным устройством. Аналог клиента.
WWID — уникальный идентификатор устройства, его имя. Аналог DNS-имени.
LUN — номер «кусочка» диска, к которому идёт обращение. Ближайший аналог — раздел на жёстком диске.

ISCSI приносит следующие изменения: WWID исчезает, на его место приходит понятие IQN (iSCSI Qualified Name) — то есть чистой воды имя, сходное до степени смешения с DNS (с небольшими отличиями). Вот пример IQN: iqn.2011-09.test:name.

IETD и open-iscsi (сервер и клиент под линукс) приносят ещё одну очень важную концепцию, о которой чаще всего не пишут в руководствах по iscsi — portal. Portal — это, если грубо говорить, несколько target'ов, которые анонсируются одним сервером. Аналогии с www нет, но если бы веб-сервер можно было попросить перечислить все свои virtualhosts, то это было бы оно. portal указывает список target'ов и доступные IP, по которым можно обращаться (да-да, iscsi поддерживает несколько маршрутов от initiator к target).

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

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

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

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

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

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

Второй вопрос, который многих мучает по-началу — куда оно попадает после подключения? open-iscsi создаёт хоть и сетевое, но БЛОЧНОЕ устройство класса SCSI (не зря же оно «я сказя»), то есть получает букву в семействе /dev/sd, например, /dev/sdc. Используется первая свободная буква, т.к. для всей остальной системы это блочное устройство — типичный жёсткий диск, ничем не отличающийся от подключенного через usb-sata или просто напрямую к sata.

В отличие от SAS/UWSCSI, ISCSI доступно для подключения кому попало. Для защиты от таких, есть логин и пароль (chap), и их передача iscsiadm'у — ещё одна головная боль для начинающих пользователей. Она может осуществляться двумя путями — изменением свойств уже найденного ранее target'а и прописываем логина/пароля в файле конфигурации open-iscsi.
Причина подобных сложностей — в том, что пароль и процесс логина — это атрибуты не пользователя, а системы. ISCSI — это дешёвая версия FC-инфраструктуры, и понятие «пользователь» в контексте человека за клавиатурой тут неприменимо. Если у вас sql-база лежит на блочном устройстве iscsi, то разумеется, вам будет хотеться, чтобы sql-сервер запускался сам, а не после минутки персонального внимания оператора.

Это очень важный файл, потому что помимо логина/пароля он описывает ещё поведение open-iscsi при нахождении ошибок. Он может отдавать ошибку «назад» не сразу, а с некоторой паузой (например, минут в пять, чего достаточно для перезагрузки сервера с данными). Так же там контролируется процесс логина (сколько раз пробовать, сколько ждать между попытками) и всякий тонкий тюнинг самого процесса работы. Заметим, эти параметры довольно важны для работы и вам нужно обязательно понимать, как поведёт ваш iscsi если вынуть сетевой шнурок на 10-20с, например.

Я не очень люблю цитировать легконаходимые маны и строчки, так что приведу типовой сценарий употребения iscsi:

сначала мы находим нужные нам target, для этого мы должны знать IP/dns-имя инициатора: iscsiadm -m discovery -t st -p 192.168.0.1 -t st — это команда send targets.

iscsiadm -m node (список найденного для логина)
iscsiadm -m node -l -T iqn.2011-09.example:data (залогиниться, то есть подключиться и создать блочное устройство).
iscsiadm -m session (вывести список того, к чему подключились)
iscsiadm -m session -P3 (вывести его же, но подробнее — в самом конце вывода будет указание на то, какое блочное устройство какому target'у принадлежит).
iscsiadm - m session -u -T iqn.2011-09.example:data (вылогиниться из конкретной )
iscsiadm -m node -l (залогиниться во все обнаруженные target'ы)
iscsiadm -m node -u (вылогиниться из всех target'ов)
iscsiadm -m node --op delete -T iqn.2011-09.example:data (удалить target из обнаруженных).

Ещё один вопрос, важный в серьёзных решениях — поддержка нескольких маршрутов к источнику. Прелесть iscsi — в использовании обычного ip, который может быть обычным образом обработан, как и любой другой трафик (хотя на практике обычно его не маршрутизируют, а только коммутируют — слишком уж великая там нагрузка). Так вот, iscsi поддерживает multipath в режиме «не сопротивляться». Сам по себе open-iscsi не умеет подключаться к нескольким IP одного target'а. Если его подключить к нескольким IP одного target'а, то это приведёт к появлению нескольких блочных устройств.

Сервер Ubuntu может быть настроен как в качестве iSCSI инициатора, так и в качестве целевого объекта (сервером). Это руководство описывает команды и опции настройки по установке iSCSI инициатора. Это предполагает, что у вас есть iSCSI устройство в вашей сети и вы обладаете необходимыми правами для подключения к нему. Инструкции по установке iSCSI устройств очень сильно зависят от производителя, поэтому обратитесь к документации производителя для настройки вашего конкретного iSCSI устройства.

Установка iSCSI инициатора

Для настройки сервера Ubuntu в качестве iSCSI инициатора, установите пакет open-iscsi. Введите в терминале:

Настройка iSCSI инициатора

Как только пакет open-iscsi установлен, отредактируйте /etc/iscsi/iscsid.conf, изменив следующее:

Вы можете определить какие целевые объекты вам доступны с помощью утилиты iscsiadm. Введите следующую команду в терминале:

-m: определяет режим, в котором работает iscsiadm.

-t: определяет тип поиска.

-p: опция, определяющая IP адрес целевого объекта.

Замените 192.168.0.10 в примере на IP адрес вашего объекта в сети.

Если целевой объект доступен, вы увидите вывод, подобный следующему:

Номер iqn и Ip адрес будут сильно зависеть от вашего оборудования.

Теперь вы можете соединиться с iSCSI сервером и в зависимости от его настроек вам возможно придется ввести данные учетной записи пользователя. Подключение к iSCSI узлу:

Убедитесь, что новый диск определяется с помощью dmesg:

В приведенном выводе sdb - это новый iSCSI диск. Помните, что это всего лишь пример; вывод на вашем экране может сильно отличаться.

Далее создадим раздел, отформатируем файловую систему и подсоединим новый iSCSI диск. Введите в терминале:

Команды выше выполняются внутри утилиты fdisk; смотрите man fdisk для дополнительных деталей. Также утилита cfdisk иногда более дружелюбна к пользователям.

Теперь форматируем файловую систему и монтируем ее, например, в /srv:

Наконец добавим запись в /etc/fstab для монтирования iSCSI устройства в процесе загрузки:

Хорошей идеей будет убедиться, что все работает как надо, перегрузив сервер.

Решил для себя поэкспериментировать с iSCSI . Не то, чтобы я являюсь большим фанатом подобных эрзац-решений (из SAN мне приходилось иметь дело только с Fibre Channel), но в свете недавних событий весьма вероятно, что многие покупатели оборудования Enterprise-уровня решат сэкономить, поэтому уметь пользоваться этой технологией весьма полезно.

iSCSI - это протокол, предназначенный для отдачи от сервера к клиенту блочных устройств по протоколу TCP/IP, в отличие от NFS и CIFS, отдающих готовую файловую систему. В iSCSI используется своя терминология, например, сервер называется target , а клиент - initiator . Я буду придерживаться этих терминов в статье. Для экономии ресурсов тестовый стенд сделал на двух виртуальных машинах под управлением VirtualBox 5.0 .

Небольшое отступление: статья не претендует на всеобъемлющую инструкцию по администрированию SAN на iSCSI, это просто заметки для начинающих.

Настройка адаптера в VirtualBox

Создадим две виртуальные машины и поставим туда Oracle Enterprise Linux 6.7 . Для той, которая будет target'ом, хватит 1Гб ОЗУ, для второй (initiator) сделаем 2 Гб, т.к. на ней будет работать небольшая БД Oracle с ASM. Кроме того, для обеих машин нужно создать по 2 сетевых адаптера. Первый сделаем в режиме "сетевой мост", он понадобится для того, чтобы наши виртуалки были доступны извне, чтобы на них можно было ходить по ssh, использовать внешние репозитории yum и т.д. Второй же будет работать в режиме "внутренняя сеть". Он нам понадобится для интерконнекта, по ней будет ходить трафик iSCSI.

Настройка дисков в VirtualBox

Кроме того, к target-виртуалке приделаем 4 тома по 1 Гб - их мы и будем отдавать потом по сети.

Осталось создать пользователей, настроить ssh и сделать остальные тривиальные вещи на новых системах.

Настройка Interconnect.

Дадим нашим виртуалкам следующие IP-адреса на внутренних сетевых адаптерах (внешние получают сетевой адрес по DHCP): 192.168.0.1 для target и 192.168.0.2 для initiator. Создаём файлик /etc/sysconfig/network-scripts/ifcfg-eth1 и пишем туда настройки сети:

Читайте также: