В этой заметке будет рассмотрен пример того, как настроить многоканальное (Multipath) подключение оптических хост-контроллеров (FC HBA) Emulex/QLogic, установленных в сервере на базе ОС CentOS Linux 7.2, к системе хранения данных (СХД) HP 3PAR 7200 (версия firmware 3PAR OS - 3.2.2). Для настройки multipath в CentOS мы будем использовать возможности модуля ядра Linux - dm-multipath (Device Mapper Multipath, DM Multipath).
Онлайн документация по DM Multipath, доступная на сайте CentOS.org по сути дублирует документацию с сайта RedHat и является уже устаревшей. Более актуальную версию (для 7 ветки RHEL) можно найти на сайте RedHat. Если с английским языком есть сложности, то для общего понимания первично можно заглянуть в переведённое на русский язык руководство для RHEL 6.
Компоненты DM Multipath
Процитирую документацию для того, чтобы отразить основные компоненты DM Multipath:
- dm-multipath (модуль ядра) - Перенаправляет ввод-вывод и обеспечивает
отказоустойчивость маршрутов и их групп. - multipathd (служба) - Следит за маршрутами, инициализирует переключение групп маршрутов и позволяет изменять устройства интерактивно. Чтобы изменения в /etc/multipath.conf вступили в силу, необходим перезапуск этой службы.
- mpathconf (утилита) - Используется для настройки и активации многоканальных
возможностей. - multipath (утилита) - Возвращает список многоканальных устройств и позволяет их
настроить. Запускается с помощью /etc/rc.sysinit или во время добавления блочного устройства при помощи udev. - kpartx (утилита) - Создает многоканальные устройства для разделов DOS с DM Multipath. kpartx предоставляется в виде отдельного пакета и требуется для установки device-mapper-multipath.
Модуль ядра dm-multipath поставляется вместе с системой CentOS
Утилита multipath и служба multipathd входят в состав пакета device-mapper-multipath, который мы установим позже.
Порядок настройки
Базовый сценарий настройки DM Multipath подразумевает следующие шаги:
- Установка пакета device-mapper-multipath.
- Создание конфигурационного файла multipath.conf с помощью утилиты mpathconf и его редактирование (при необходимости).
- Запуск службы multipathd.
Помимо этих действий мы выполним рекомендации данные производителем СХД. В нашем случае придётся взять на вооружение документ HPE 3PAR Red Hat Enterprise Linux and Oracle Linux Implementation Guide (emr_na-c04448818-9.pdf), с учётом которого последовательность наших действий будет выглядеть следующим образом:
- Тюнинг драйверов FC HBA
- Зонирование фабрик SAN и СХД
- Установка и настройка DM Multipath (3 шага базового сценария)
- Разметка диска (опционально)
Тюнинг драйверов FC HBA
Документация рекомендует нам выполнить тюнинг драйверов хост-контроллеров с указанием конкретных предложенных параметров в файле /etc/modprobe.d/modprobe.conf с последующей пересборкой образа initramfs
Для контроллеров QLogic строка параметров тюнинга выглядит так:
options qla2xxx ql2xmaxqdepth=16 qlport_down_retry=14
Для контроллеров Emulex строка параметров тюнинга выглядит так:
options lpfc lpfc_devloss_tmo=14 lpfc_lun_queue_depth=16 lpfc_discovery_threads=32
Для контроллеров Brocade тюнинг выполняется отдельной командой:
# bcu fcpim --pathtov 1/0 14
Обратите внимание на то, что указанные опции драйвера справедливы только для прошивки 3PAR OS версии 3.1.1 и новее. Для старых версий 3PAR OS параметры будут несколько иные и их можно найти в ранее упомянутом документе.
В нашем случае используются только контроллеры QLogic и Emulex, поэтому сразу добавим параметры для обоих этих драйверов в файл /etc/modprobe.d/modprobe.conf (если файл в системе отсутствует, то его нужно создать):
# QLogic HBA driver tuning for HP 3PAR Storage
options qla2xxx ql2xmaxqdepth=16 qlport_down_retry=14
# Emulex HBA driver tuning for HP 3PAR Storage
options lpfc lpfc_devloss_tmo=14 lpfc_lun_queue_depth=16 lpfc_discovery_threads=32
Кстати, с помощью утилиты modinfo мы можем посмотреть краткое описание изменяемых параметров:
Теперь нужно пересобрать образ initramfs. Для этого сначала сделаем резервную копию текущего используемого образа для текущей версии ядра, затем вызовем команду пересборки нового образа, в процессе чего будет учтён добавленный нами файл modprobe.conf:
# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# /sbin/dracut -v --force
После того, как последняя команда отработает, перезагружаем сервер и убеждаемся в том, что система успешно загружается с новыми тюнингованными параметрами драйверов HBA. Для того, чтобы проверить то, что модуль с драйвером загружен именно с заданными нами параметрами можно использовать проверку файлов /sys/module/<module>/parameters/*
или же можно воспользоваться утилитой systool из пакета sysfsutils:
# systool -m {имя модуля} -A {имя атрибута}
Зонирование фабрик SAN и СХД
В данный момент наш сервер ничего не видит через свой контроллер FC HBA, так как нам ещё нужно настроить зонирование на оптических коммутаторах (фабриках) SAN и СХД:
# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: HL-DT-ST Model: RW/DVD GCC-C10N Rev: 2.00
Type: CD-ROM ANSI SCSI revision: 05
Для настройки зонирования нам потребуется информация о идентификаторах WWN. Идентифицировать контроллеры HBA в Linux можно разными способами. В частности, чтобы быстро узнать Node WWN, выполним:
# cat /sys/class/fc_host/host*/node_name
0x500143800200c205
0x500143800200c205
Чтобы узнать Port WWN, выполним:
# cat /sys/class/fc_host/host*/port_name
0x500143800200c204
0x500143800200c206
Дополнительные примеры идентификации FC HBA можно посмотреть в Вики-статье Как идентифицировать контроллеры FC HBA в CentOS Linux.
Настройку зонирования на оптических коммутаторах и СХД в данной заметке мы рассматривать не будем. Сделаю только одно важное замечание по настройке зонирования в СХД HP 3PAR 7200. При создании записи о хосте на СХД в поле Host OS выбираем наиболее близкую к нам ОС, таким образом, чтобы атрибут Persona был определён как 2-Generic-ALUA (согласно стр.12 используемого нами руководства это рекомендуемый вид для RHEL7).
Итак, предполагается, что зонирование сделано, и теперь наш сервере с CentOS 7.2 уже имеет доступ к дискам через HBA. Заставим систему обновить информацию о подключенных дисках методом описанным здесь:
# ls -la /sys/class/scsi_host/
# echo "- - -" > /sys/class/scsi_host/host[0-9]/scan
После этого посмотрим, какие устройства видит наш сервер:
# cat /proc/scsi/scsi
В нашем случае после зонирования SAN сервер увидел презентованный с 3PAR дисковый том (3PARdata Model: VV) доступный по 4 путям.
Установка и настройка DM Multipath
Устанавливаем пакет device-mapper-multipath
# yum install device-mapper-multipath
После установки нужно настроить основной конфигурационный файл /etc/multipath.conf, которого по умолчанию не существует. Чтобы создать этот файл в конфигурации "по умолчанию" можно воспользоваться утилитой mpathconf:
# mpathconf --enable
Без учёта комментариев, создаваемый файл multipath.conf по умолчанию будет иметь следующее содержимое:
defaults {
user_friendly_names yes
find_multipaths yes
}
blacklist {
}
Как я понял, до версии RHEL/CentOS 6 не существовало параметра автоматической настройки find_multipaths и поэтому устройства, подлежащие включению/исключению из механизма multipath, приходилось всегда прописывать в файле multipath.conf в ручную. В современной версии RHEL/CentOS всё несколько упрощено. Цитата по этому поводу из документации:
В Red Hat Enterprise Linux 6 появился новый способ настройки многоканальных устройств с
помощью параметра find_multipaths. Раньше устройства создавались для всех путей, не
внесенных в черный список. Теперь, если параметр find_multipaths имеет значение yes,
метаустройство будет создано только в одном из следующих случаев:
* Существует по крайней мере два пути с одним и тем же WWID, не указанных в списке
исключений.
* Пользователь создает устройство вручную с помощью multipath.
* Путь имеет тот же WWID что и созданное ранее метаустройство (даже если это
устройство в настоящий момент уже не существует). Раздел 4.2, «Секция blacklist»
объясняет, что делать, если многоканальные устройства были созданы, в то время как
параметр find_multipaths не был определен.
Поэтому, наверняка, в большинстве случаев можно оставить предложенный по умолчанию файл multipath.conf. Что ж, попробуем…
Выполняем запуск службы multipathd и после этого выполняем команду вывода информации о топологи multipath:
# service multipathd start
# multipath -ll
В нашем случае из вывода последней команды стало понятно, что, во-первых, не смотря на параметр find_multipaths yes, DM Multipath пытается обработать multipath для локального логического диска cciss/c0d0 с контроллера HP Smart Array P400i, на котором установлена сама CentOS 7.2 (это также хорошо видно в выводе команды multipath -v3), а во-вторых multipath с настройками по умолчанию таки смог собрать мультиканальное устройство используя все 4 пути до СХД:
Добавим регулярное выражение определяющее любые диски с контроллера Smart Array в секцию blacklist в конфигурационном файле multipath.conf.
...
blacklist {
devnode "^cciss\/c[0-9]d[0-9]*"
}
...
Кстати довольно странно, что в уважаемых источниках, например здесь или здесь можно встретить пример неработающего регулярного выражения для определения дисков с контроллера Smart Array. Но наш вариант рабочий:
А чтобы более правильно настроить DM Multipath на работу СХД 3PAR, всё таки нам придётся воспользоваться точной настройкой файла multipath.conf в соответствии с рекомендацией из руководства HP, согласно которой, настройки конфигурации под хост ALUA Persona 2 (а мы помним, что именно этот тип выбран при создании записи о нашем сервере на СХД 3PAR) имеют свои особенности. В итоге результирующий файл в нашем случае примет следующий вид:
defaults {
polling_interval 10
user_friendly_names no
find_multipaths yes
}
blacklist {
devnode "^cciss\/c[0-9]d[0-9]*"
}
devices {
device {
vendor "3PARdata"
product "VV"
path_grouping_policy group_by_prio
path_selector "round-robin 0"
path_checker tur
features "0"
hardware_handler "1 alua"
prio alua
failback immediate
rr_weight uniform
no_path_retry 18
rr_min_io_rq 1
detect_prio yes
}
}
Для вступления в силу изменений конфигурационного файла выполним перезапуск службы multipathd:
# service multipathd restart
Теперь снова проверим состояние multipath:
# multipath -ll
Теперь видно, что наше multipath-устройство работает с другими настройками, а предупреждений по поводу локального контроллера Smart Array нет.
Разметка диска (опционально)
Описанные в данном разделе действия по разметке multipath-диска являются опциональными, и приведены исключительно для примера. Предположим, что нам нужно создать раздел диска с файловой системой ext4 размером всего multipath-диска.
Как видно на предыдущем скриншоте, наш multipath-диск в системе доступен по 4 путям в виде равнозначных устройств /dev/sda, /dev/sdb, /dev/sdc, /dev/sdd. Выполнить разметку можно на любом из этих устройств, но нельзя выполнять эту операцию обращаясь к устройству как к multipath-диску через /dev/mapper/* (об этом в руководстве сделано отдельное замечание). Для разметки воспользуемся утилитой parted, все действия будем выполнять на любом из дисков, например /dev/sdd. Пошагово процедуру разметки диска с помощью parted я рассматривал в статье Вики, поэтом здесь приведу лишь последовательный набор команд:
# parted /dev/sdd
(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) quit
В документации отдельное внимание обращается на то, что при создании раздела диска нужно выбрать оптимальную конфигурацию для 3PAR, а именно учесть то, что раздел должен начинаться с сектора 32768. Это нужно учесть, если для разметки диска вы используете утилиту fdisk, которая по умолчанию начальным сектором устанавливает 30876, что в последствии, как я понял, может отрицательно сказаться на производительности будущего дискового раздела в Linux. Поэтому я и использую утилиту parted, которая по умолчанию при создании раздела использует правильный, с точки зрения 3PAR, начальный сектор.
В случае, если вы всё же для создания раздела будете использовать утилиту fdisk, то вызывать её нужно с соответствующими ключами (пример взят из документации и мной не проверялся):
# fdisk -c -u /dev/sdd
Command (m for help): p
Partition number (1-4): 1
First sector (32768-10485759, default 32768):
Using default value 32768
...
Далее созданный раздел диска нам нужно добавить к мультиканальным устройствам в /dev/mapper/. Для этого используем утилиту kpartx и ID корневого multipath-диска. ID видно как в выводе утилиты multipath, так и собственно в каталоге /dev/mapper/
Выполним команду добавления раздела в /dev/mapper/:
# kpartx -a -p p /dev/mapper/360002ac000000000000000160000cec9
После этого появится новое multipath-устройство (360002ac000000000000000160000cec9p1), олицетворяющее собой ранее созданный нами раздел на корневом multipath-диске (360002ac000000000000000160000cec9).
Форматируем multipath-раздел в нужную нам файловую систему, например ext4:
# mkfs.ext4 -E nodiscard /dev/mapper/360002ac000000000000000160000cec9p1
Монтируем раздел:
# mkdir /mnt/3par-vv1
# mount -t ext4 -o discard /dev/mapper/360002ac000000000000000160000cec9p1 /mnt/3par-vv1
Теперь пропишем в файл /etc/fstab информацию для автоматического монтирования multipath-раздела в точку монтирования /mnt/3par-vv1. Для этого сначала узнаем UUID раздела:
# blkid /dev/mapper/360002ac000000000000000160000cec9p1
Потом добавим информацию о монтировании в конец файла /etc/fstab
...
# mount backup disk /dev/mapper/360002ac000000000000000160000cec9p1 on /mnt/3par-vv1
UUID=2697868a-88fd-4867-879d-629830186637 /mnt/3par-vv1 ext4 discard,defaults 0 2
После этого перезагружаем сервер и убеждаемся в том, что конечный результата достигнут и multipath-раздел автоматически монтируется в точку монтирования /mnt/3par-vv1
Пробуем создать новый пустой файл в смонтированном в каталог разделе, проверяя тем самым возможность записи в этот каталог. Затем пробуем удалить созданный файл:
# touch /mnt/3par-vv1/write-test.txt
# rm /mnt/3par-vv1/write-test.txt
Замечание. Multipath в кластерных конфигурациях
Если сервер, на котором мы настраиваем multipath, в дальнейшем будет использоваться в качестве узла кластера с общим дисковым хранилищем, то для возможно потребуется обеспечить то, чтобы все узлы кластера имели одинаковые настройки multipath. Для этого можно использовать механизм алиасов. В таком случае для каждого multipath-устройства можно задать опцию alias в секции multipaths конфигурационного файла multipath.conf, например:
multipaths {
multipath {
wwid 3600508b4000156d700012000000b0000
alias yellow
}
multipath {
wwid 1DEC_____321816758474
alias red
}
}
Настройку алиасов имеет смысл делать лишь в том случае, если в секции defaults значение параметра user_friendly_names равно yes. Дополнительную информацию об этом можно найти здесь: Consistent Multipath Device Names in a Cluster.
Дополнительные источники информации:
Можно еще гайдик ))) по настройке сетевых интерфейсов - network teaming + создания сетевых интрефейсов c vlan при условии серверу выделен trunk?
Кстати при сборке network teaming, yасколько понял в rhe 7 появился новый модуль team введен для полной поддержки протокола LACP, теперь работает в режиме active-active, в отличие от bond
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Comparison_of_Network_Teaming_to_Bonding.html
Да Team выглядит интересно. Не уверен, что в ближайшее время получится с этим поиграться, но вопрос, безусловно, заслуживает внимания. Спасибо за наводку.
как сделать так чтоб fdisk -l показывал правильную картину.. сейчас вываливает все диски какие есть и не раз
Обратная ссылка: Развёртывание и настройка oVirt 4.0. Часть 1. Создание кластера виртуализации в конфигурации Hosted Engine | Блог IT-KB /
Спасибо! Получилось. Но почему-то в я теперь вижу мой формаченый готовый диск. Но я также вижу диска по 4 путям мультипаса. Разве они должны отображаться?
А что Вас смущает? Почему диски не должны отображаться? Разве от того, что Вы собрали из них Multipath-устройства они перестали быть дисками? Или Вы ждали эффекта, как в диспетчере устройств Windows ? :)
Спасибо огромное за статью
Очень качественный, полезный и редкий (особенно для русского сегмента интернета) материал. Спасибо автор, статья очень помогла в работе. Сайт однозначно - в избранное