Предыстория
В моей инфраструктуре в числе прочего работают три ESXi 5.5 сервера, подключенных к SAN HP MSA1000 (железяке уже в районе 10 лет) по оптике через свитч HP StorageWorks 2/8q, с использованием адаптеров QLogic QLA200. Разумеется, хранилище очень производительное, но также и очень скромное по объему. Так как виртуализация нынче — тренд, возникло непреодолимое желание получить реально большое хранилище, также подключенное по оптике с блочным доступом. Не буду обьяснять, почему именно блочным – холивары на эту тему начались еще на Ноевом Ковчеге, и это не относится к предмету данной статьи. Ну и как это всегда бывает, бюджет даже близко не позволяет прикупить некое брендовое решение, поэтому остается только становиться героем программы «Очумелые ручки».
В результате не очень продолжительного исследования был выбран таргет SCST по следующим причинам:
- Высокая производительность
- Стабильность
- Возможность установки на Centos (наш стандарт для Linux серверов)
- Поддержка FC адаптеров QLogic
- Поддержка VAAI
Далее нужно было подобрать аппаратную часть. В закромах был найден 2U сервер c 6ю корзинами, 4 диска по 3ТБ (плохонькие правда, два из них – WD Green), FC адаптер QLogic 2460 (SCST поддерживает QLogic 22xx/23xx/24xx/25xx/26xx адаптеры).
Поиски готовых мануалов по связке Centos 7 + FC SCST ни к чему не привели, так что пришлось довольно долго собирать информацию по кусочкам. В результате все получилось и я доволен, готов закупать новые диски. Пока
Экшн
Осуществляем установку и базовую настройку Centos 7 в сборке Minimal (это мое предпочтение, можно ставить любую сборку). «Базовая настройка» у каждого своя, поэтому не буду вдаваться в подробности. Не забываем обновиться:
[root@localhost ~]# yum update -y
[root@localhost ~]# reboot
Узнаем название нашего FC адаптера, а также его RISC ID:
[root@localhost ~]# dmesg | grep -E 'qla2xxx .* QLogic | Found an ISP'
Получаем что-то вроде этого:
[ 1.881084] qla2xxx [0000:05:04.0]-001d: Found an ISP2422 irq 24 iobase 0xffffc90001e06000.
[ 2.901460] qla2xxx [0000:05:04.0]-00fb:1: QLogic QLA2460 - PCI-X 2.0 Single Channel 4Gb Fibre Channel HBA.
Где RISC ID — ISP2422, а модель — QLogic QLA2460.
Далее нужно скачать и установить утилиту QConvergeConsoleCLI и последнюю прошивку для нашего адаптера отсюда. Извлекаем .BIN файл прошивки, переименовываем его в соответствии с RISC ID (см. таблицу ниже), и помещаем его в /lib/firmware на сервере. Скорее всего там уже будет такой файл, поэтому просто следует заменить имеющийся.
RISC ID — Firmware
ISP 21XX — ql2100_fw.bin
ISP 22XX — ql2200_fw.bin
ISP 2300 — ql2300_fw.bin
ISP 2322 — ql2322_fw.bin
ISP 24XX — ql2400_fw.bin
ISP 25XX — ql2500_fw.bin
ISP 2031 — ql2600_fw.bin
ISP 27XX — ql2700_fw.bin
В моем случае — ql2400_fw.bin
Обновляем прошивку нашего адаптера:
[root@localhost ~]# /opt/QLogic_Corporation/QConvergeConsoleCLI/qaucli -fc -b all /lib/firmware/ql2400_fw.bin
Качаем актуальный драйвер QLogic SCST:
[root@localhost ~]# yum install git -y
[root@localhost ~]# git clone git://git.QLogic.com/scst-qla2xxx.git
Устанавливаем необходимые пакеты для последующей сборки ядра, а также svn:
[root@localhost ~]#yum install gcc ncurses-devel kernel-devel lsscsi patch subversion bc bison net-tools -y
Качаем исходники SCST:
[root@localhost ~]# cd /
[root@localhost /]# svn co https://svn.code.sf.net/p/scst/svn/trunk scst
В директории SCST делаем софт линк на драйвер QLogic SCST:
[root@localhost /]# cd scst
[root@localhost scst]# ln -s ../scst-qla2xxx/drivers/scsi/qla2xxx qla2x00t_git
Далее, в соответствии с рекомендациями разработчиков SCST, следует пропатчить ядро.
Собирать новое ядро будем в среде нового пользователя:
[root@localhost /]# useradd builder
Даем права на использование yum и yum-builddep без пароля:
[root@localhost /]# echo 'builder ALL=(ALL) NOPASSWD: /usr/bin/yum, /usr/bin/yum-builddep' >>/etc/sudoers
[root@localhost /]# visudo –sc
Переходим в среду нового пользователя:
[root@centos-test /]# su builder
Запускаем скрипт, любезно подготовленный для нас разработчиками:
[builder@localhost /]# ./scst/scripts/rebuild-rhel-kernel-rpm
Устанавливаем новое ядро:
[builder@localhost /]$ su -c 'rpm -ivh --force /home/builder/rpmbuild/RPMS/x86_64/kernel-*.rpm'
Перезагружаемся:
[builder@localhost /]$ su –c reboot
Проверяем текущее ядро:
[root@localhost ~]# uname -r
3.10.0-229.el7.centos.scst.x86_64
Если все ок, идем дальше. Выгрузим и добавим в черный список дефолтовый модуль ядра qla2xxx:
[root@localhost /]# echo blacklist qla2xxx >/etc/modprobe.d/blacklist-qla2xxx.conf
[root@localhost /]# rmmod qla2xxx
Установим режим сборки SCST на release:
[root@localhost /]# cd /scst
[root@localhost scst]# make 2release
Соберем необходимые модули ядра:
[root@localhost scst]# BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y CONFIG_SCSI_QLA2XXX_TARGET=y make all install
Проверяем, что все прошло успешно:
[root@localhost ~]# ls -l /lib/modules/`uname -r`/extra/qla2*
-rw-r--r-- 1 root root 1511833 Sep 10 11:10 /lib/modules/3.10.0-229.11.1.el7.centos.scst.x86_64/extra/qla2x00tgt.ko
-rw-r--r-- 1 root root 10699423 Sep 10 11:10 /lib/modules/3.10.0-229.11.1.el7.centos.scst.x86_64/extra/qla2xxx_scst.ko
Можно проверить полный список установленных модулей:
[root@localhost ~]# ls -l /lib/modules/`uname -r`/extra
total 25128
drwxr-xr-x 2 root root 4096 Sep 10 11:10 dev_handlers
-rw-r--r-- 1 root root 4309043 Sep 10 11:10 iscsi-scst.ko
-rw-r--r-- 1 root root 3100544 Sep 10 11:10 isert-scst.ko
-rw-r--r-- 1 root root 1511833 Sep 10 11:10 qla2x00tgt.ko
-rw-r--r-- 1 root root 10699423 Sep 10 11:10 qla2xxx_scst.ko
-rw-r--r-- 1 root root 5619115 Sep 10 11:10 scst.ko
-rw-r--r-- 1 root root 474173 Sep 10 11:10 scst_local.ko
[root@localhost ~]# ls -l /lib/modules/`uname -r`/extra/dev_handlers
total 3960
-rw-r--r-- 1 root root 305582 Sep 10 11:10 scst_cdrom.ko
-rw-r--r-- 1 root root 292948 Sep 10 11:10 scst_changer.ko
-rw-r--r-- 1 root root 328092 Sep 10 11:10 scst_disk.ko
-rw-r--r-- 1 root root 308934 Sep 10 11:10 scst_modisk.ko
-rw-r--r-- 1 root root 292972 Sep 10 11:10 scst_processor.ko
-rw-r--r-- 1 root root 292876 Sep 10 11:10 scst_raid.ko
-rw-r--r-- 1 root root 312024 Sep 10 11:10 scst_tape.ko
-rw-r--r-- 1 root root 704076 Sep 10 11:10 scst_user.ko
-rw-r--r-- 1 root root 1199482 Sep 10 11:10 scst_vdisk.ko
Добавляем их все в ядро:
[root@localhost ~]# for m in scst qla2xxx_scst qla2x00tgt scst_vdisk scst_user scst_disk ...; do modprobe $m; done
В dmesg должно появиться нечто вроде (привожу пример из своего варианта):
[10753.981044] [21513]: scst: SCST version 3.1.0-pre1 loaded successfully (max mem for commands 709MB, per device 283MB)
[10753.981051] [21513]: scst: Enabled features: TRACING
[10753.982152] [21519]: scst: Management thread started
[10754.024379] qla2xxx [0000:00:00.0]-0005: QLogic Fibre Channel HBA Driver: 8.04.00.05.2.2-SCST.03-k-p.
[10754.030864] [21527]: qla2x00t: Initializing QLogic Fibre Channel HBA Driver target mode addon version 3.1.0-pre1
[10754.032397] [21527]: qla2x00t: Target mode driver for QLogic 2x00 controller registered successfully
[10754.032409] [21527]: scst: Target template qla2x00t registered successfully
[10754.038638] [21528]: scst: Virtual device handler vdisk_fileio for type 0 registered successfully
[10754.038647] [21528]: scst: Virtual device handler vdisk_blockio for type 0 registered successfully
[10754.038653] [21528]: scst: Virtual device handler vdisk_nullio for type 0 registered successfully
[10754.038658] [21528]: scst: Virtual device handler vcdrom for type 5 registered successfully
[10754.044786] [21529]: scst: Virtual device handler "scst_user" registered successfully
[10754.048905] [21530]: scst_user: Cleanup thread started
[10754.052682] [21531]: scst: Device handler "dev_disk" for type 0 registered successfully
[10754.052691] [21531]: scst: Device handler "dev_disk_perf" for type 0 registered successfully
Перестроим ram-диск для начальной инициализации (initrd) так, чтобы модуль ядра qla2xxx был заменен на qla2xxx_scst:
[root@localhost ~]# mkinitrd -f /boot/initramfs-`uname -r`.img `uname -r`
Установим scstadmin:
[root@localhost /]# cd scst
[root@localhost scst]# make -C scstadmin -s install
Далее нужно создать файл /etc/scst.conf, я приведу пример своего:
HANDLER vdisk_blockio {
DEVICE disk1 {
filename /dev/sdb
}
}
TARGET_DRIVER qla2x00t {
TARGET ХХ:ХХ:ХХ:ХХ:ХХ:ХХ:ХХ:ХХ {
enabled 1
LUN 0 disk1
}
}
Пояснение:
HANDLER vdisk_blockio – выбор хендлера, в моем случае я хотел блочный доступ, если вы желаете файловый, то будет vdisk_fileio.
Filename /dev/sdb – диск для вашего таргета
TARGET ХХ: ХХ: ХХ: ХХ: ХХ: ХХ: ХХ: ХХ – вместо иксов впишете WWN вашего FC адаптера
Пример команды, с помощью которой можно узнать WWN:
cat /sys/class/scsi_host/host*/device/fc_host/host*/node_name
Применяем наш конфигурационный файл:
[root@localhost scst]# scstadmin -config /etc/scst.conf
Collecting current configuration: done.
-> Checking configuration file '/etc/scst.conf ' for errors.
-> Done, 0 warnings found.
-> Opening device 'disk1' using handler 'vdisk_blockio': done.
-> Adding device 'disk1' at LUN 0 to driver/target 'qla2x00t/ХХ:ХХ:ХХ:ХХ:ХХ:ХХ:ХХ:ХХ': done.
-> Enabling driver/target 'qla2x00t/ХХ:ХХ:ХХ:ХХ:ХХ:ХХ:ХХ:ХХ': done.
All done.
Ну и наверно мы хотим, чтобы все это дело запускалось автоматом в случае перезагрузки таргета.
Включаем автозагрузку самого SCST:
[root@localhost /]# systemctl enable scst.service
Добавляем в автозагрузку модули ядра:
[root@localhost /]# vi /etc/modules-load.d/scst_modules.conf
scst_disk
scst_user
scst_vdisk
scst
libcrc32c
crc_t10dif
qla2x00tgt
Ну и напоследок добавим в rc.local применение конфига:
[root@localhost /]# chmod +x /etc/rc.d/rc.local
[root@localhost /]# vi /etc/rc.d/rc.local
scstadmin –config /etc/scst.conf
Если все сделано правильно, то если после перезагрузки сервера запустить:
[root@localhost ~]# scstadmin -config /etc/scst.conf
Выйдет следующее:
Collecting current configuration: done.
-> Checking configuration file '/etc/scst.conf' for errors.
-> Done, 0 warnings found.
-> Applying configuration.
-> Done, 0 change(s) made.
All done.
На этом настройка таргета завершена. Ниже приведу пару полезных заметок.
Важно! Не забудьте настроить Zoning на вашем FC свитче, если таковой используется, иначе инициаторы не увидят новый таргет.
Также в случае с ESXi после настройки таргета, а также в случае его перезагрузки, нужно перезагружать все хосты-инициаторы, иначе диск не подцепится.
Еще такая маленькая заметка о производительности. На виртуалке Centos 7 с помощью fio я замерил 84 iops и avg latency 12 msec на запись при iodepth=1. Что на самом деле неплохо для WD Green.
Комментарии (15)
fleaump
18.09.2015 15:38А скорости?
dd if=/dev/zero of=tst conv=fdatasync bs=384k count=1k
с ESXi
dd if=/dev/zero of=tst bs=384k count=1k
fleaump
18.09.2015 15:46Как пример, собрал полку из старого серва, просто купил 8 винтов по 8 тб SATA и собрал в 60 рейд на контроллере lsi 9261 без SSD кеша.
dd if=/dev/zero of=tst conv=fdatasync bs=384k count=40k
40960+0 records in
40960+0 records out
16106127360 bytes (16 GB) copied, 25.2041 s, 639 MB/sMcicool
18.09.2015 15:56+1Вы тоже с использованием SCST собирали? Мои убогие WD Green показывают сейчас 82 мб/с, но полка сейчас нагружена. Как нормальные диски куплю, замеряю со всех сторон обязательно.
Спасибо, что напомнили!fleaump
18.09.2015 16:06Без патчей в ядре
uname -r
3.10.0-229.11.1.el7.x86_64
Только дрова свежие собрал, да контроллер прошил.
Пока эта полка просто как эксперимент, решение под бекапы дешевое ищется с максимально возможной скоростью для быстрого восстановления обратно и как временный датастор при миграции наживую при тех работах.
К хостам esxi заплено пока по nfs, дабы сетка 10гб\с. ISCSI планировал на выходных опробовать, сравнить скорости.
Винты, кстати не самые быстрые Seagate ST8000AS0002 .
gbg
18.09.2015 19:29-1В некоторых случаях, ATA over Ethernet уделывает iSCSI по двум пунктам:
- Скорость при линейном копировании
- Простота и быстрота развертывания, в том числе и multipath-решений.
blind_oracle
19.09.2015 15:16Проблема только в том, что он никакими стандартными инициаторами практически не поддерживается, в ESXi уж точно… По сути его можно юзать только с Linux.
fleaump
19.09.2015 18:56Почему не поддерживает, vmware поддерживает AOE
kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1031322blind_oracle
19.09.2015 21:09Я имею в виду софтовый адаптер, как iSCSI или FCoE.
Через хитрый HBA то он может всё что угодно поддерживать :)fleaump
19.09.2015 21:34Тут уж у каждого свой загашник, у меня, к примеру, нет ничего из FB, и не планирую в будущем его даже, а 10 гигабитный езернет как-то поудобней будет, железки доступней и нет узкости в применении.
PS. iscsi показал не слишком большую разницу в скоростях на 10 гигабитах против nfs(к машине прицепил два винта с датасторов прицеплеными по nfs и iscsi. И после dd по очереди на обоих разделах), плюс только от использования плюшек VMFS5, которые правда мне так и не удалось заметить.blind_oracle
19.09.2015 21:40а 10 гигабитный езернет как-то поудобней будет, железки доступней и нет узкости в применении.
О том и речь — FCoE или iSCSI можно гонять на ESXi без спецательного HBA, а этот AoE или FC — нет.
PS. iscsi показал не слишком большую разницу в скоростях на 10 гигабитах против nfs, плюс только от использования плюшек VMFS5, которые правда мне так и не удалось заметить.
Это извечный спор физиков с лириками, лично я пока держусь VMFS5 + блочный доступ.
С ним есть примитивы VAAI из коробки, для NFS же нужны какие-то storage-specific плагины для этого.
Плюс, тут нет чёрных ящиков (с точки зрения ESXi) в виде файловой системы, которая экспортируется по NFS и можно получать более консистентные резульататы.
blind_oracle
Практически 1:1 переведённый официальный how-to: scst.sourceforge.net/qla2x00t-howto.html
Ого! Это ещё зачем, можно узнать? Всё работает и без таких суровых мер.
Mcicool
Целью статьи было сделать how-to, по которому любой сможет сделать себе хранилище от нуля до конца, не отвлекаясь постоянно на гуглёж ньюансов. Тот how-to мной безусловно использовался, до до 1:1 ему аки до луны. Насчет суровых мер: я не из головы придумал, у меня было именно так, не исключаю возможность того, что я где-то что-то недокрутил — буду рад подсказке, дополню статью.
blind_oracle
Гуглёж полезен для усвоения :)
Ничего специально не надо делать — просто активируешь SCST и пересканируешь FC адаптер на стороне ESXi. Обычно даже и пересканировать не нужно — лун и так появится.
Mcicool
Ну вот с полкой HP MSA1000 никаких проблем, ее перезагружаю и все авто-подцепляется. А с SCST нет — перезагружаю сервак и он сразу исчезает из стораджей ESXi. Нужно перезагрузить ESXi, чтобы хранилище прицепилось.
blind_oracle
Возможно есть какие-то проблемы с FC фабрикой и\или зонингом.
Либо дело в том, что собрана транк-ветка SCST, а не стабильная.
Транк, в основном, очень стабилен, но всякое бывает.