iSCSI: Internet Small Computer System Interface - это протокол передачи данных, предназначенный для обмена данными между серверами и системами хранения данных (Storage Area Network, SAN). iSCSI представляет из себя комбинацию протокола SCSI и стека протоколов TCP/IP и предназначен для передачи блоков данных через сети Ethernet. Управляющие команды SCSI передаются внутри IP-пакетов, а протокол TCP обеспечивает управление потоком и надежность передачи данных.
При использовании iSCSI данные между сервером и системой хранения передаются блоками, в необработанном виде. Это позволяет использовать SAN практически так же, как если бы они были подключены к серверу напрямую, а не по сети. Хост-система может создавать на SAN логические разделы, форматировать их и использовать как обычные локальные жесткие диски. В этом заключается основное отличие SAN от сетевых хранилищ (Network Attached Storage, NAS), которые работают на уровне файловой системы и используют протоколы передачи файлов, такие как SMB или CIFS.
Типы хранилищ:
- DAS: Direct Attached Storage (СХД с прямым подключением диков);
- NAS: Network Attached Storage (nfs, smb, webdav);
- SAN: Storage Area Network (fc, iscsi, fcoe);
iSCSI: Основные термины
- Target: Cерверный компонент который принимает соединения от Initiator, также к нему привязываются диски LUN, которые будут доступны клиентам.
- iSCSI Qualified Name: iqn.<yyyy-mm>.<reverse_fqdn>:<unique_name> - полное имя участника взаимодействия.
- LUN: Logical Unit Number - номер объекта внутри цели (target). Аналоги - раздел диска, том.
- Port: TCP/3260
- Initiator: Клиентский компонент, служит для установки соединений с Target.
Создание дисков в виде файла:
- Thin Disk: Тонкий диск
# dd if=/dev/zero of=/mnt/san/hdd/lun1.img bs=1 count=0 seek=325G
- Thik Disk: Толстый диск
# dd if=/dev/zero of=/mnt/san/hdd/lun1.img bs=1G count=3
- Преобразовать Thik в Thin:
# cp --sparse=always oldfilename newfilename
На примере TGT и LIO Targetcli-FB:
Эти пакеты пример разных реализаций iSCSI. tgt - настраивается через конфигурационный файл, targetcli-fb - через command line interface.
TGT:
Поддерживает работу только в пространстве пользователя (user space only) и поэтому уступает в производительности LIO targetcli-fb. Не имеет расширенного контроля доступа к устройствам.
На примере ОС Debian Bullseye настроем таргет и инициатор. + Инициатор на Windows 10.
Target Linux:
# apt install tgt
# nano /etc/tgt/conf.d/nas.conf
- Вариант 1:
# for ws1
<target iqn.2022-01.lan.int:san0>
# LUN 1
backing-store /dev/disk/by-id/scsi-***
# LUN 2
backing-store /dev/disk/by-id/scsi-***
initiator-address 172.16.5.8/29
incominguser in-ws pass # for initiator
outgoinguser out-ws pass # for target(s)
</target>
# for ws2
<target iqn.2022-01.lan.int:san1>
# LUN 1
backing-store /dev/disk/by-id/scsi-***
initiator-address 172.16.5.242
incominguser in-acer pass # for initiator
outgoinguser out-acer pass # for target(s)
</target>
- Вариант 2:
<target iqn.2022-01.lan.int:san0>
<backing-store /dev/sdc>
write-cache off
</backing-store>
<backing-store /dev/sdd>
params thin_provisioning=1
</backing-store>
initiator-address 172.16.255.242
incominguser in-user1 pass
vendor_id int.lan
</target>
В параметре "backing-store" м.б. указано блочное устройство, логичиский раздел, LVM, файлы виртуальных дисков (Thin, Thick). Параметр "write-cache on" - is default;
Перезапускаем демон:
# systemctl restart tgt.service
Проверяем что iSCSI target доступны:
# tgtadm --mode target --op show
- или
# tgtadm -m target -o show
# tgt-admin -s
Когда указывается блочное устройство:
Если после перезапуска хоста диск sdb стал sdc, a sdc стал sdb.
# ls -l /dev/disk/by-id
- Вывести название диска iscsi числящегося за /dev/sdx;
# /lib/udev/scsi_id -g -u -d /dev/sdd
# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdd
UNMAP/Trim + iSCSI: При использовании LVM-Thin дисков
Trim позволяет после удаления файлов из файловой системы уведомить контроллер дика о том, какие блоки данных больше не хранят инфомацию и их можно очистить. Это актуально как для SSD, NVMe, так и для обычных HDD. Например, будет полезно при создании бэкапов диска, т.к. в бэкап попадет только занятое данными пространство.
Проверил, работает: (trimcheck + очистка занятого пространства в Proxmox VM хранилище после удаления файлов)
- Для тонких дисков когда в "backing-store" указывается хранилище в виде файла (на блочном устройстве создан раздел и в этом разделе создан файл "Thin Disk");
- Когда в VM прокинут с помощью "PCI Passthrough" NVMe диск, а он в свою очередь раздается по iSCSI;
В данной схеме "Proxmox" -> "Physical Disk" <-> "LVM" (Thin provisioning Pool) <-> "VM" (LVM Thin Disk 10GB) <-> "iSCSI Target LUN" (File .img Thin Disk 5GB) <-> "iSCSI Initiator". Виртуальной машине предоставлен тонкий LVM том размером 10GB. Создан раздел и назначена ФС, раздел смонтирован в каталог. В каталоге создан файл диска .img размером 5GB (File .img Thin Disk). Через iSCSI Target, хост с Initiator получает этот тонкий том и, после того, как в этом томе будет созданы данные размером 1GB, занятое пространство увеличится, а после удаления данных, Trim должен сообщить контроллеру диска о освободившимся месте. Это можно проверить, наблюдая в Proxmox VM подключенное хранилище с типом "LVM-Thin" в разделе "Датацентр -> Название хранилища -> Сводка -> Использование".
Проверил, частино работает: ( только trimcheck, - свободное место не высвобождается)
- Для тонких дисков когда в "backing-store" указывается хранилище в виде блочного устройства /dev/sdx;
Включение: +trimcheck
Чтобы для тонких iSCSI томов TRIM работал, необходимо для "backing store" передать параметр "params thin_provisioning=1".
# nano /etc/tgt/conf.d/nas.conf
params thin_provisioning=1
- Проверяем работоспособность Thin-provisioning в необходимом LUN, должно быть Yes
# tgt-admin -s
И не забыть в Proxmox на VM в свойствах диска включить опцию Discard. После этого драйвер контроллера "VirtIO SCSI" будет передавать от VM команды TRIM для физического диска. Для проверки работоспособности TRIM мне помогла программа "trimcheck".
Initiator Linux:
# apt install open-iscsi
Настройка подключения к Target:
С проверкой подлинности - Взаимный CHAP.
# nano /etc/iscsi/iscsid.conf
node.startup = automatic
node.session.auth.authmethod = CHAP
# for initiator
node.session.auth.username = in-mtv
node.session.auth.password = pass
# for target(s)
node.session.auth.username_in = out-mtv
node.session.auth.password_in = pass
Обнаружение Targets на iSCSI сервере:
Эти команды сгенерируют или перегенерируют файлы настроек "default" и "st_config (discovery)".
# iscsiadm -m discovery -t st -p ip-target
- или так,
# iscsiadm --mode discovery --type sendtargets --portal ip-target
- Просмотреть сгенерированные файлы:
# less /etc/iscsi/nodes/../../default
# less /etc/iscsi/send_targets/../../st_config
- Перезапускаем сервис:
# systemctl restart open-iscsi.service
- Проверяем доступность Target на стороне Initiator:
# iscsiadm -m session
- более детально:
# iscsiadm --mode session -P0 до P3
- Проверяем подключенных Initiator на стороне Target:
# tgtadm --mode conn --op show --tid 1
Попытка войти с помощью iSCSI LUN:
# iscsiadm -m node --login
# iscsiadm -m node --targetname "iqn.2022-01.lan.int:san0" --login
# iscsiadm -m node --logout
# iscsiadm -m node --targetname "iqn.2022-01.lan.int:san0" --logout
# iscsiadm -m discovery -p ip-target -o delete
Опции fstab:
- nofail: загрузка будет продолжена без ожидания монтирования FS;
- _netdev: позволяет примонтировать FS после старта юнита network-online.target;
Initiator Windows:
С проверкой подлинности - Взаимный CHAP.
Администрирование -> Инициатор iSCSI
-> Конфигурация
Изменить,
- Имя инициатора: in-ws
CHAP,
- Секрет инициатора CHAP: (out-ws) pass
-> Конечные объекты:
Объект -> nas.int.lan -> Быстрое подключение -> Готово
Подключить -> Дополнительно (Добавить это подключение в список предпочитаемых конечных объектов)
- Локальный адаптер: Microsoft iSCSI инициатор
- IP-Адрес инициатора: ip-initiator
- IP-Адрес конечного портала: ip-target / 3260
- Разрешить вход CHAP -> Имя: in-ws, Секрет: pass
- Выполнять взаимную проверку подлинности: yes
Переходим в свойства и в "Проверке подлинности" должно быть - "Взаимный CHAP".
Тома и устройства -> Добавить (Без ручного добавления, после перезагрузки, не будут автоматически добавляться блочные устройства)
- E:\
- F:\
Разрешить сетевые подключения:
Брандмауэр Защитника Windows -> Служба iSCSI -> Выбрать необходимый профиль;
Ссылки по теме:
- targets.conf - Linux man page [link];
- scsi_id - Linux man page [link];
- targets.conf - Linux man page [link];
- Что такое хранилище iSCSI и как построить iSCSI SAN? [link];
- Применение iSCSI в СХД [link];
LIO Targetcli-FB:
Поддерживает работу только в ядре ОС (kernel space only), соответственно производительность будет выше, имеет расширенный контроль доступа к устройствам. В отличии от TGT, в LIO "Trim/Umap" корректно работает еще и для устройств с типом "block".
Установка пакета:
# apt install targetcli-fb
Настройка For Target
:nas - tgt (hostname), :ws - initiator (hostname)
# targetcli
/> help
- Назначаем устройства хранения:
/> /backstores/block create dev=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 name=hdd.ws
/> /backstores/block create dev=/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4 name=nvme.ws
- Создание IQN для iSCSI:
Это по умолчанию создаст TPG (Target Portal Group).
/> /iscsi create wwn=iqn.2022-01.lan.int:nas
- Настройка ACL:
Позволит указанным инициаторам получить доступ к таргету.
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/acls create wwn=iqn.2022-01.lan.int:ws
- Настройка CHAP аутентификации: + взаимную проверку "mutual_"
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/acls/iqn.2022-01.lan.int:ws set auth userid=mtv password=pass mutual_userid=m_mtv mutual_password=pass
- Создание LUN:
Для связывания устройства хранения с определенным TPG (Target Portal Group).
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/luns create /backstores/block/hdd.ws
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/luns create /backstores/block/nvme.ws
- Создание Portal:
Чтобы настроить target для предоставления услуг по определенному адресу.
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/portals create ip_address=172.16.5.74 ip_port=3260
- Включение Unmap/Trim:
* emulate_tpu=1 - Включает команду UNMAP, которая функционально аналогична TRIM для SSD. Также хорошо использовать для Thin хранилищ HDD, т.к. поможет высвобождать пространство от удаленных файлов.
* is_nonrot=1 - Позволяет корректно определить тип носителя: 1-ssd, 0-hdd (в Windows будет отображаться). Windows использует это, чтобы решить, делать ли диск iSCSI дефрагментируемым.
/> /backstores/block/hdd.ws set attribute emulate_tpu=1
/> /backstores/block/nvme.ws set attribute emulate_tpu=1
/> /backstores/block/nvme.ws set attribute is_nonrot=1
- Если отключено автоматическое добвление LUN'ов в ACL:
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/acls/iqn.2022-01.lan.int:ws create mapped_lun=0 tpg_lun_or_backstore=/backstores/block/hdd.ws
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/acls/iqn.2022-01.lan.int:ws create mapped_lun=1 tpg_lun_or_backstore=/backstores/block/nvme.ws
- Если отключено автосоздание дефолтного портала:
/> /iscsi/iqn.2022-01.lan.int:nas/tpg1/portals create ip_address=172.16.5.74 ip_port=3260
- Сохранение конфигурационного файла:
/> saveconfig
/> exit
Вывод всех глобальных параметров:
/> get global
- Отключить автоматическое добвление LUN'ов в ACL:
При создании ACL.
/> set global auto_add_mapped_luns=false
- Отключить автосоздание дефолтного портала:
/> set global auto_add_default_portal=false
Проверить слушает ли сервер порот 3260:
# ss -l4tn
# ss -na | grep 3260
Ссылки по теме:
- How Install and Configure iSCSI Storage - [link];
- Wiki LIO iSCSI- [link];
- Wiki LIO targetcli - [link];
- LIO Admin Manual - [link];