Настройка SCST Target на CentOS 7 с использованием FC QLogic адаптера

Предыстория


В моей инфраструктуре в числе прочего работают три 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 ни к чему не привели, так что пришлось довольно долго собирать информацию по кусочкам. В результате все получилось и я доволен, готов закупать новые диски. Пока наивно жду денег, пишу данный howto для таких же озадаченных людей, как я. И так поехали!

Экшн


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

Update 05.10.2016! Собрался поднимать таргет по своей же статье, но при патче ядра вылелза ошибка: No matching put_page_callback patch found for kernel version.
Разрабы SCST избавили нас от необходимости патчить ядро в последней версии 3.3. Так что секцию про пересборку ядра можно пропускать, вместо этого просто делаем следующие шаги:
После [root@localhost scst]# ln -s ../scst-qla2xxx/drivers/scsi/qla2xxx qla2x00t_git:
[root@localhost scst] yum isntall -y bzip2 rpm-build
[root@localhost scst] make rpm
В процессе скорее всего вылезет ошибка, которая связана с нехваткой определенных Perl модулей, надо будет ее загуглить и сразу в первых стрницах будет решение, я просто уже сделал и забыл записать — каюсь.
После этого устонить RPMы и продолжить с этого места:
[root@localhost /]# echo blacklist qla2xxx >/etc/modprobe.d/blacklist-qla2xxx.conf
Поделиться публикацией

Комментарии 23

    0
    Практически 1:1 переведённый официальный how-to: scst.sourceforge.net/qla2x00t-howto.html

    Также в случае с ESXi после настройки таргета, а также в случае его перезагрузки, нужно перезагружать все хосты-инициаторы, иначе диск не подцепится.

    Ого! Это ещё зачем, можно узнать? Всё работает и без таких суровых мер.
      +1
      Целью статьи было сделать how-to, по которому любой сможет сделать себе хранилище от нуля до конца, не отвлекаясь постоянно на гуглёж ньюансов. Тот how-to мной безусловно использовался, до до 1:1 ему аки до луны. Насчет суровых мер: я не из головы придумал, у меня было именно так, не исключаю возможность того, что я где-то что-то недокрутил — буду рад подсказке, дополню статью.
        0
        Целью статьи было сделать how-to, по которому любой сможет сделать себе хранилище от нуля до конца, не отвлекаясь постоянно на гуглёж ньюансов.

        Гуглёж полезен для усвоения :)

        Насчет суровых мер: я не из головы придумал, у меня было именно так, не исключаю возможность того, что я где-то что-то недокрутил — буду рад подсказке, дополню статью.

        Ничего специально не надо делать — просто активируешь SCST и пересканируешь FC адаптер на стороне ESXi. Обычно даже и пересканировать не нужно — лун и так появится.
          0
          Ничего специально не надо делать — просто активируешь SCST и пересканируешь FC адаптер на стороне ESXi. Обычно даже и пересканировать не нужно — лун и так появится.


          Ну вот с полкой HP MSA1000 никаких проблем, ее перезагружаю и все авто-подцепляется. А с SCST нет — перезагружаю сервак и он сразу исчезает из стораджей ESXi. Нужно перезагрузить ESXi, чтобы хранилище прицепилось.
            0
            Возможно есть какие-то проблемы с FC фабрикой и\или зонингом.
            Либо дело в том, что собрана транк-ветка SCST, а не стабильная.
            Транк, в основном, очень стабилен, но всякое бывает.
      0
      А скорости?
      dd if=/dev/zero of=tst conv=fdatasync bs=384k count=1k


      с ESXi
      dd if=/dev/zero of=tst bs=384k count=1k
        0
        Как пример, собрал полку из старого серва, просто купил 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/s
          +1
          Вы тоже с использованием SCST собирали? Мои убогие WD Green показывают сейчас 82 мб/с, но полка сейчас нагружена. Как нормальные диски куплю, замеряю со всех сторон обязательно.
          Спасибо, что напомнили!
            0
            Без патчей в ядре
            uname -r
            3.10.0-229.11.1.el7.x86_64

            Только дрова свежие собрал, да контроллер прошил.

            Пока эта полка просто как эксперимент, решение под бекапы дешевое ищется с максимально возможной скоростью для быстрого восстановления обратно и как временный датастор при миграции наживую при тех работах.

            К хостам esxi заплено пока по nfs, дабы сетка 10гб\с. ISCSI планировал на выходных опробовать, сравнить скорости.

            Винты, кстати не самые быстрые Seagate ST8000AS0002 .
              –1
              В некоторых случаях, ATA over Ethernet уделывает iSCSI по двум пунктам:
              1. Скорость при линейном копировании
              2. Простота и быстрота развертывания, в том числе и multipath-решений.

                0
                Проблема только в том, что он никакими стандартными инициаторами практически не поддерживается, в ESXi уж точно… По сути его можно юзать только с Linux.
                  0
                  Почему не поддерживает, vmware поддерживает AOE
                  kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1031322
                    0
                    Я имею в виду софтовый адаптер, как iSCSI или FCoE.
                    Через хитрый HBA то он может всё что угодно поддерживать :)
                      0
                      Тут уж у каждого свой загашник, у меня, к примеру, нет ничего из FB, и не планирую в будущем его даже, а 10 гигабитный езернет как-то поудобней будет, железки доступней и нет узкости в применении.

                      PS. iscsi показал не слишком большую разницу в скоростях на 10 гигабитах против nfs(к машине прицепил два винта с датасторов прицеплеными по nfs и iscsi. И после dd по очереди на обоих разделах), плюс только от использования плюшек VMFS5, которые правда мне так и не удалось заметить.
                        0
                        а 10 гигабитный езернет как-то поудобней будет, железки доступней и нет узкости в применении.

                        О том и речь — FCoE или iSCSI можно гонять на ESXi без спецательного HBA, а этот AoE или FC — нет.

                        PS. iscsi показал не слишком большую разницу в скоростях на 10 гигабитах против nfs, плюс только от использования плюшек VMFS5, которые правда мне так и не удалось заметить.

                        Это извечный спор физиков с лириками, лично я пока держусь VMFS5 + блочный доступ.
                        С ним есть примитивы VAAI из коробки, для NFS же нужны какие-то storage-specific плагины для этого.
                        Плюс, тут нет чёрных ящиков (с точки зрения ESXi) в виде файловой системы, которая экспортируется по NFS и можно получать более консистентные резульататы.
          0
          Большое спасибо за понятную статью. Официальный HOWTO гораздо труднее для понимания.
            0
            Папка /scst-qla2xxx/drivers/scsi/qla2xxx отсутствует.
              0
              Это на каком шаге?
                0
                На шаге «В директории SCST делаем софт линк на драйвер QLogic SCST»
                  0
                  Это не забыли?

                  [root@localhost /]# cd scst

                  Напишите, какие команды вы вводили последовательно.
                    0
                    Ах, прошу прощения, проглядел. Эта папка из драйверов а не из архива SCST.
                    Правда я всё клал в /opt, подумал что не стоит создавать в корне новые папки.
              0
              В trank версии вроде даже прикрутили dkms. И ещё, когда таргете вроде всё нормально, но инициатор луны всё равно не видит может помочь подмена прошивок до старых из Openfiler (например, ql2500_fw.bin)
                0
                И модули ядра не обязательно вручную где то прописывать. В RPM-ку входит init демон scst, который загружает только те что упоминаются в scst.conf. Демон тоже чуть надо поправить до вида
                    103     SCST_MODULES="qla2xxx_scst"
                    104     SCST_OPT_MODULES="scst"
                

                чтобы соблюсти верную последовательность загрузки модулей.
                И настоятельно рекомендую генерить scst.conf с помощью scstadmin.
                Верно для CentOS 6.8.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое