Настройка iSCSI-таргета в Linux через targetcli/LIO и подключение клиентов Windows, Linux и VMware ESXi | AdminWiki

Настройка iSCSI-таргета в Linux через targetcli/LIO и подключение клиентов Windows, Linux и VMware ESXi

16 сентября 2026 12 мин. чтения

Что такое 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

МеханизмЧто проверяетЗащищает отСлабое место
ACLIQN инициатораПодключения посторонних хостов, которые не знают разрешённый IQNIQN передаётся в открытом виде и легко подделывается
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_timeout12030-60Сколько секунд сессия ждёт ответа до признания её отказавшей и передачи незавершённых команд на повтор
node.conn[0].timeo.noop_out_interval55Частота проверочных пакетов
node.conn[0].timeo.noop_out_timeout55-10Ожидание ответа на проверочный пакет
node.session.queue_depth3264-128Число команд в полёте на сессию
node.session.cmds_max128256Верхняя граница пула команд; должно быть не меньше queue_depth
node.session.err_timeo.abort_timeout1515Ожидание ответа на запрос прерывания команды

Значения применяются либо правкой файла с последующим обновлением записи узла через 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.

Типичные ошибки и их устранение

  1. LUN доступен только для чтения. Демо-режим оставил demo_mode_write_protect=1. Решение: set attribute demo_mode_write_protect=0 и generate_node_acls=0, затем пересессия или переподключение инициатора.
  2. Несовпадение размера логического блока. Файловая система, созданная под 512 байт, при подключении к LUN с 4096 байтами даёт ошибки вида critical target error и I/O error в dmesg. Диагностика: cat /sys/block/sdX/queue/logical_block_size на клиенте и значение hw_block_size у backstore на таргете. Приводите обе стороны к 512 или 4096.
  3. Ошибки после настройки мультипасинга. Два пути не собрались в одно устройство из-за неверного vendor или product в multipath.conf, появились дубликаты sdX, один и тот же LUN монтируется дважды. Проверяйте multipath -ll: две строки с одним wwid означают корректную сборку, две записи mpath с разными wwid говорят об ошибке фильтра.
  4. Падение производительности. Причины: MTU 9000 включён частично (проверка ping -M do -s 8972 ), отсутствие jumbo frames на коммутаторе, агрегация LACP с хешированием по IP при одном TCP-потоке, включённые TSO и GRO на интерфейсе хранилища. Проверка: iperf3 между узлами, iostat -x 2 на таргете для задержки записи.
  5. Сбой CHAP. Несовпадение пароля, лишний пробел, регистр в userid, секрет короче 12 символов в Windows. Диагностика: iscsiadm -m session -P 3 на клиенте, journalctl -u iscsid, targetcli ls /iscsi/.../acls на таргете.
  6. Таргет не виден. Проверьте, слушает ли процесс порт 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 даёт задержки, несовместимые с файловыми системами и СУБД.

Поделиться:
Сохранить гайд? В закладки браузера