Что такое iSCSI-таргет и зачем использовать targetcli/LIO в Linux
iSCSI передаёт SCSI-команды внутри TCP/IP. Инициатор на клиенте видит удалённый LUN как локальный блочный диск, а серверную часть, которая отдаёт этот диск в сеть, называют таргетом. В Linux таргет поднимают через LIO (Linux-IO Target) и утилиту targetcli: это бесплатный и производительный способ получить сетевое блочное хранилище для гипервизоров, кластеров и систем резервного копирования, не покупая аппаратную СХД.
LIO входит в ядро Linux с версии 2.6.38. Модуль target_core_mod отвечает за ядро подсистемы хранения, iscsi_target_mod добавляет транспорт iSCSI, а targetcli через configfs (/sys/kernel/config/target) управляет конфигурацией. Один backstore можно отдавать наружу по iSCSI, Fibre Channel, FCoE и через loopback одновременно.
Типовые сценарии: раздел данных под базы, датастор VMware ESXi, диски для Windows-кластера, LUN под файловую систему Linux, ленточный привод через pscsi. Для сравнения iSCSI с Fibre Channel, NFS и SMB по задержкам и совместимости с гипервизорами есть отдельный разбор протоколов доступа к СХД, а если нужен готовый массив с веб-интерфейсом вместо ручной настройки, посмотрите сравнение «Русский Щит 500» и Kraftway Storage.
Практическая выгода LIO перед userspace-реализациями (tgt, IET) и SCST: код работает в ядре, нет переключений контекста на каждый I/O, поддерживаются persistent reservations для кластеров, ALUA для активных/активных массивов, ACL и CHAP, а конфигурация хранится в одном JSON-файле /etc/target/saveconfig.json. Правила доступа к остальным протоколам сетевого хранилища разобраны в материале про iSCSI, NFS, SMB и Fibre Channel.
Подготовка системы и установка targetcli
Требования простые: ядро Linux с configfs (смортировано по умолчанию), права root, статический IP на выделенном интерфейсе. Отдельный физический порт или VLAN для iSCSI упрощает тюнинг MTU и держит трафик хранилища вне пользовательской сети.
# RHEL, CentOS Stream, Rocky, AlmaLinux dnf install -y targetcli # Debian, Ubuntu apt update && apt install -y targetcli-fb
Дальше проверьте модули, службу и дерево configfs:
systemctl enable --now target systemctl status target lsmod | grep -E 'iscsi_target|target_core' ls /sys/kernel/config/target/iscsi
Утилита targetcli это интерактивная оболочка с автодополнением путей. Запускается командой targetcli от root; после каждого изменения конфигурация пишется в /etc/target/saveconfig.json, а служба target восстанавливает её при загрузке. На RHEL с SELinux порт 3260 уже размечен (iscsi_target_port_t), дополнительных действий обычно не требуется. Если стенд тестовый, таргет удобно развернуть на отдельной ВМ: подойдёт облачный сервер из Timeweb Cloud с дополнительным диском под образ iSCSI.
Выбор backstore: fileio, blockio или pscsi
Backstore это источник данных для LUN. Тип определяет производительность, набор поддерживаемых SCSI-команд и удобство эксплуатации: снапшоты, тонкое выделение, persistent reservations, работа в кластере.
| Тип | Что отдаёт | Плюсы | Ограничения | Когда выбирать |
|---|---|---|---|---|
| fileio | Файл-образ на ext4 или XFS | Снапшоты и тонкое выделение средствами ФС, файл легко скопировать и перенести | Двойной слой: страничный кэш и журнал ФС добавляют задержку, важна корректная настройка write_back | Тесты, шаблоны, миграция LUN копированием файла |
| blockio | Блочное устройство: LVM-том, ZFS zvol, раздел | Минимум накладных расходов, поддержка persistent reservations и ALUA, предсказуемая задержка | Том создаётся заранее, изменение размера только через LVM или ZFS | Продакшен: СУБД, кластеры, датасторы гипервизоров |
| pscsi | Физическое SCSI/SAS-устройство | Проброс полного набора SCSI-команд, включая ленточные приводы | Нет persistent reservations, устройство занимает один инициатор, возможны проблемы с отдельными драйверами | Ленты, специфичное оборудование, лабораторные задачи |
Для продакшена выбирайте blockio поверх LVM-тома или ZFS zvol. Под iSCSI-нагрузку zvol создавайте с volblocksize 8K или 16K: мелкий блок 4K при случайной записи даёт повышенную фрагментацию, крупный снижает эффективность при randread. Образец настройки ZFS-пула и extent-ов под виртуализацию описан в руководстве по iSCSI-таргету в TrueNAS.
Создание backstore через targetcli
targetcli # fileio: файл-образ cd /backstores/fileio create name=disk1 file=/mnt/iscsi/disk1.img size=10G # blockio: LVM-том или ZFS zvol cd /backstores/block create name=disk2 dev=/dev/vg0/lv_iscsi # pscsi: физическое устройство cd /backstores/pscsi create name=disk3 dev=/dev/sdb
Обязательны два параметра: name (имя, которое увидят инициаторы в INQUIRY) и file/dev. Для fileio параметр size задаёт размер файла, а sparse=1 включает тонкое выделение. Атрибут write_back=1 разрешает кэширование записи, но при обрыве питания данные в кэше теряются, поэтому для баз данных и кластеров оставляйте write_back=0. Проверить результат можно командой ls в текущем каталоге или общим выводом targetcli ls.
Создание iSCSI-таргета и LUN
Имя таргета (IQN) должно быть уникальным в сети и строится по шаблону iqn.ГГГГ-ММ.домен-в-обратном-порядке:идентификатор, например iqn.2026-09.ru.example:storage1. Часть после двоеточия произвольна, но менять IQN после подключения клиентов нельзя: он попадёт в конфиги инициаторов.
cd /iscsi create iqn.2026-09.ru.example:storage1 cd iqn.2026-09.ru.example:storage1/tpg1/luns create /backstores/block/disk2 cd ../portals create 10.0.20.10 3260 delete 0.0.0.0 3260
TPG (Target Portal Group) объединяет порталы, LUN и ACL одного таргета. Порталов может быть несколько: их удобно привязать к разным сетевым интерфейсам и получить два независимых пути для мультипасинга. Порталом 0.0.0.0 таргет слушает все адреса, для продакшена лучше указать конкретный IP.
Отдельно проверьте атрибуты TPG. Демо-режим (generate_node_acls=1) пускает любого инициатора, а demo_mode_write_protect=1 в этом режиме оставляет LUN доступным только для чтения, что часто выглядит как «диск примонтировался, но писать нельзя»:
cd /iscsi/iqn.2026-09.ru.example:storage1/tpg1 set attribute authentication=1 set attribute generate_node_acls=0 set attribute cache_dynamic_acls=0 set attribute demo_mode_write_protect=0 saveconfig exit
Конфигурация целиком лежит в /etc/target/saveconfig.json. Изменения применяются сразу, а saveconfig фиксирует их для следующей перезагрузки.
Настройка ACL и CHAP-аутентификации
Различия между ACL и CHAP
| Механизм | Что проверяет | Защищает от | Слабое место |
|---|---|---|---|
| ACL | IQN инициатора | Подключения посторонних хостов, которые не знают разрешённый IQN | IQN передаётся в открытом виде и легко подделывается |
| CHAP | Логин и пароль | Перехвата IQN и подмены инициатора | Пароль идёт по сети без шифрования, нужен сложный секрет |
| Mutual CHAP | Пароль в обе стороны | Подключения к подделанному таргету | Требует согласованных пар на обеих сторонах |
Для продакшена включайте ACL и CHAP вместе. Пароли храните в менеджере секретов, для Windows длина CHAP-секрета должна укладываться в 12-16 символов, иначе оснастка откажется его принять.
Список ACL создаётся внутри TPG по IQN клиентов. Windows по умолчанию формирует IQN вида iqn.1991-05.com.microsoft:имя-хоста, Linux берёт свой из /etc/iscsi/initiatorname.iscsi:
cd /iscsi/iqn.2026-09.ru.example:storage1/tpg1/acls create iqn.1991-05.com.microsoft:win-srv01 create iqn.2026-09.ru.client:node1
CHAP задаётся на уровне TPG атрибутом authentication=1, а учётные данные прописываются в каждом ACL. Поле userid это логин, под которым инициатор входит на таргет, mutual_userid и mutual_password нужны для двусторонней проверки:
cd /iscsi/iqn.2026-09.ru.example:storage1/tpg1/acls/iqn.1991-05.com.microsoft:win-srv01 set auth userid=win_srv01 set auth password=Str0ngChapPass set auth mutual_userid=target_chap set auth mutual_password=TargetCh4pPass get auth
Логин и пароль чувствительны к регистру, поэтому admin и Admin это разные пользователи. Если нужно закрыть и discovery-сессию, включите аутентификацию на уровне /iscsi:
cd /iscsi set discovery_auth enable=1 userid=disc_user password=DiscoveryCh4p saveconfig exit
Проверка выполняется с клиента: неудачный CHAP виден в /var/log/messages как «CHAP login failed», а на таргете командой targetcli ls /iscsi/.../acls можно убедиться, что IQN инициатора создан без опечаток.
Подключение клиентов: Windows, Linux, VMware ESXi
Подключение из Windows Server и Windows 11
Оснастка запускается командой iscsicpl.exe. На вкладке Discovery добавьте портал 10.0.20.10:3260, на вкладке Targets выберите таргет и нажмите Connect, поставив галочку Add this connection to the list of Favorite Targets. Для CHAP откройте Advanced, включите Enable CHAP logon и введите userid с password; для mutual CHAP заполните поля target name и target secret. Отказоустойчивость даёт MPIO: компонент Multipath I/O добавляется через Enable-MSDSMAutomaticClaim в PowerShell, после чего на вкладке Targets включается галочка Enable multi-path. Детали инициализации диска, MPIO и разбора ошибок входа собраны в отдельном руководстве по iSCSI-инициатору в Windows Server и Windows 11. После подключения новый диск появится в diskpart со статусом Offline, его переводят в Online, инициализируют как GPT и форматируют NTFS.
Подключение из Linux
На клиенте ставят пакет open-iscsi (на RHEL это iscsi-initiator-utils), задают уникальное имя инициатора и запускают службу iscsid:
cat /etc/iscsi/initiatorname.iscsi systemctl enable --now iscsid iscsiadm -m discovery -t st -p 10.0.20.10 iscsiadm -m node -T iqn.2026-09.ru.example:storage1 -p 10.0.20.10 -l iscsiadm -m session -P 3
Для автозапуска сессии при загрузке выставьте node.startup = automatic в /etc/iscsi/iscsid.conf и выполните iscsiadm -m node -T iqn.2026-09.ru.example:storage1 -p 10.0.20.10 -o update -n node.startup -v automatic. В fstab указывайте не /dev/sdX, а устойчивый путь /dev/disk/by-path или mapper-устройство multipath, добавляя опции _netdev и x-systemd.device-timeout=30, чтобы загрузка не зависала при недоступном таргете.
Особенности подключения из VMware ESXi
В vSphere Client перейдите в Storage Adapters, добавьте Software iSCSI Adapter и на вкладке Dynamic Discovery укажите IP портала с портом 3260. Для изоляции трафика создайте отдельный vSwitch с vmkernel-портом, привяжите адаптер через Network Port Binding и включите Jumbo Frames 9000 на vSwitch и портале, если MTU согласован на всём пути. CHAP настраивается в свойствах адаптера или в записи конкретного таргета; для mutual CHAP задаются оба секрета.
ESXi требует, чтобы таргет отвечал на REPORT LUNS, а LIO это поддерживает. Логический размер блока у LUN и в ESXi должен совпадать: 512 или 4096 байт. После ресканирования устройства появляется новый LUN, на нём создаётся VMFS-датастор. Для активных/активных массивов оставляйте политику Round Robin, при задержках задайте лимит IOPS 1, чтобы трафик распределялся между путями. Не отдавайте один и тот же LUN двум независимым кластерам без общего кластерного ПО: обе стороны начнут писать в одну область.
Таймауты, очереди и защита от потери данных
При обрыве связи поведение определяют параметры в /etc/iscsi/iscsid.conf. Слишком короткие таймауты вызывают ложные отключения и ошибки ввода-вывода даже при секундных всплесках потерь пакетов; слишком длинные затягивают восстановление и подвешивают приложения.
| Параметр | По умолчанию | Рекомендация | Что меняет |
|---|---|---|---|
| node.session.timeo.replacement_timeout | 120 | 30-60 | Сколько секунд сессия ждёт ответа до признания её отказавшей и передачи незавершённых команд на повтор |
| node.conn[0].timeo.noop_out_interval | 5 | 5 | Частота проверочных пакетов |
| node.conn[0].timeo.noop_out_timeout | 5 | 5-10 | Ожидание ответа на проверочный пакет |
| node.session.queue_depth | 32 | 64-128 | Число команд в полёте на сессию |
| node.session.cmds_max | 128 | 256 | Верхняя граница пула команд; должно быть не меньше queue_depth |
| node.session.err_timeo.abort_timeout | 15 | 15 | Ожидание ответа на запрос прерывания команды |
Значения применяются либо правкой файла с последующим обновлением записи узла через iscsiadm -m node -T ... -o update, либо повторным логином. После смены replacement_timeout проверьте сессию командой iscsiadm -m session -P 3 и убедитесь, что параметр подхватился, а не остался дефолтным.
Настройка мультипасинга
Multipath даёт отказоустойчивость и суммарную пропускную способность, но при неверной конфигурации приводит к ошибкам ввода-вывода и повреждению данных. Основной файл настроек это /etc/multipath.conf:
defaults {
user_friendly_names no
find_multipaths yes
}
devices {
device {
vendor "LIO-ORG"
product ".*"
path_grouping_policy multibus
path_checker tur
failback immediate
no_path_retry 5
fast_io_fail_tmo 5
dev_loss_tmo 30
}
}
Идентификаторы vendor и product берите у реального устройства: cat /sys/block/sdX/device/vendor и cat /sys/block/sdX/device/model, а затем сверьте вывод multipath -ll. Для проверки путей используйте tur, он точен и дешевле readsector0. Параметр no_path_retry=5 даёт до пяти попыток, после чего ввод-вывод вернёт ошибку; значение queue заставляет копить запросы бесконечно, и при долгом отказе хоста приложения зависают так же, как при NFS с hard mount.
При включённой поддержке ALUA на таргете (set attribute alua_support=1 на двух TPG с разными порталами) переходите на path_grouping_policy group_by_prio и path_selector round-robin 0: инициатор сам направит поток на активный/оптимизированный путь. Учитывайте, что одна iSCSI-сессия это один TCP-поток, поэтому агрегация каналов через LACP с хешированием по IP не увеличит скорость одного LUN. Для роста пропускной способности поднимайте несколько сессий на разные порталы и собирайте их мультипасом. Сетевые настройки для хранилища, включая MTU 9000 и LACP, подробно разобраны в статье про сетевой доступ к СХД через iSCSI, NFS и SMB.
Типичные ошибки и их устранение
- LUN доступен только для чтения. Демо-режим оставил demo_mode_write_protect=1. Решение: set attribute demo_mode_write_protect=0 и generate_node_acls=0, затем пересессия или переподключение инициатора.
- Несовпадение размера логического блока. Файловая система, созданная под 512 байт, при подключении к LUN с 4096 байтами даёт ошибки вида critical target error и I/O error в dmesg. Диагностика: cat /sys/block/sdX/queue/logical_block_size на клиенте и значение hw_block_size у backstore на таргете. Приводите обе стороны к 512 или 4096.
- Ошибки после настройки мультипасинга. Два пути не собрались в одно устройство из-за неверного vendor или product в multipath.conf, появились дубликаты sdX, один и тот же LUN монтируется дважды. Проверяйте multipath -ll: две строки с одним wwid означают корректную сборку, две записи mpath с разными wwid говорят об ошибке фильтра.
- Падение производительности. Причины: MTU 9000 включён частично (проверка ping -M do -s 8972 ), отсутствие jumbo frames на коммутаторе, агрегация LACP с хешированием по IP при одном TCP-потоке, включённые TSO и GRO на интерфейсе хранилища. Проверка: iperf3 между узлами, iostat -x 2 на таргете для задержки записи.
- Сбой CHAP. Несовпадение пароля, лишний пробел, регистр в userid, секрет короче 12 символов в Windows. Диагностика: iscsiadm -m session -P 3 на клиенте, journalctl -u iscsid, targetcli ls /iscsi/.../acls на таргете.
- Таргет не виден. Проверьте, слушает ли процесс порт 3260 (ss -tlnp | grep 3260), открыт ли порт в firewall (firewall-cmd --add-port=3260/tcp --permanent), активна ли служба target, не блокирует ли трафик iptables или nftables, верен ли IP портала относительно сетевых интерфейсов узла.
Проверка и тестирование конфигурации
Базовая проверка таргета и сессии выполняется тремя командами: targetcli ls показывает дерево backstore, LUN, ACL и порталов; iscsiadm -m session -P 3 выводит состояние сессии, negotiated параметры и таймауты; multipath -ll перечисляет пути и их состояние (active/ready или failed/faulty).
targetcli ls iscsiadm -m session -P 3 multipath -ll dmesg | grep -i iscsi journalctl -u target -n 50
Производительность измеряйте на неразрушенном LUN: сначала только чтение, иначе тест уничтожит файловую систему.
fio --name=randread --filename=/dev/mapper/mpatha --direct=1 --rw=randread \
--bs=4k --iodepth=32 --numjobs=4 --time_based --runtime=60 --group_reporting
Ориентиры для одного сеанса: 1 GbE даёт около 110-115 МБ/с, 10 GbE около 1,1 ГБ/с, 25 GbE упирается в возможности дисков. Добавьте тест отказа: отключите один путь (отключение порта коммутатора или iscsiadm -m node -T -p -u для конкретной сессии), убедитесь, что multipath -ll показал failed/faulty, а запись продолжилась без ошибок. Повторите проверку для второго пути и восстановите оба.
Безопасность и изоляция iSCSI-трафика
iSCSI не шифрует данные и отдаёт блочное устройство целиком, поэтому сеть хранилища изолируют. Работающая схема: отдельный VLAN или физический интерфейс, доступ к порту 3260 только с адресов инициаторов (nft add rule inet filter input tcp dport 3260 ip saddr != 10.0.20.0/24 drop), ACL плюс CHAP с длинными секретами, отключённый доступ с внешних интерфейсов.
Если требуется шифрование, применяйте IPsec между таргетом и инициаторами: он скрывает и данные, и учётные данные CHAP, но добавляет нагрузку на CPU и уменьшает полезный MTU, что стоит учесть при переходе на jumbo frames. Публиковать iSCSI-портал в интернет нельзя: единственная защита в этом случае сводится к CHAP, а блочный доступ по WAN даёт задержки, несовместимые с файловыми системами и СУБД.