22 августа 2019 г.

Ubuntu 18.04 Шифрованный ISCSI том для бэкапов


Всем бобра.

Был DAS cfi-b8253jdgg на 5 дисков по 4Тб (для NAS WD) в 5 рэйд массиве. Места стало мало (под бэкапы), решили расширить. Купили диски по 6Тб, предел для аппарата, из линейки для датацентров. Такой выбор связан с большой ежедневной нагрузкой во время бэкапа, речь идет не о 20 Гб, а о примерно 150 в сутки с последующим архивированием, а также архивирования 1,5Тб раз в неделю. При попытке перегнать данные на новоиспеченный DAS он просто зависал на смерть, как потом выяснилось проблема была в бракованном диске. Но к этому моменту я понял, что покупать такие диски в такой коробок не имеет смысла, т.к. коробок ограничен портами SATA2, с выходом через USB3.0 и слабым охлаждением (для этих дисков). Плюс невозможность контролировать состояние дисков в автоматическом режиме (Zabbix).
Было принято решение собрать NAS на базе Unix системы.

Конфигурация (делал 2 коробки, цена 1 штука):

  1. Корпус FRACTAL DESIGN Node 304 - 5612 руб
  2. Материнская плата ASRock H370 S1151 MITX H370M-ITX/AC - 7240 руб
  3. Накопитель SSD Patriot PS128GPM280SSDR - 1916 руб
  4. Блок питания AeroCool VX-500 PLUS ATX 500W -1613 руб
  5. Видеокарта MSI PCIE16 GT710 1GB GDDR3 GT 710 1GD3H LP - 2158
  6. Оперативная память Kingston DDR4 4Gb 2666MHz KVR26N19S6/4 RTL PC4-21300 CL19 DIMM 288-pin 1.2В - 1308 руб
  7. Процессор Intel Original Core i3 9100F Soc-1151v2 Box - 6683
  8. Жесткий диск WD Ultrastar DC HC310 HUS726T6TALE6L4, 6Тб - 5 штук


В ходе реализации были внесены изменения, связанные с ошибками в общей настройке (в самом конце)

Комментарии к конфигурации:
ОЗУ можно больше, т.к. ISCSI ее использует.
Процессор можно проще, если отказаться от шифрования
Видеокарта нужна только из-за "F" в процессоре - без видео
Выбор материнской платы основан на:
  1. Порты: 6*SATA3 и 1*M.2 NVMe (если установить накопитель не SATA, то будут работать все SATA порты)
  1. Форм-фактор: micro-ITX
  1. Интерфейсы: 2*1Gbps порта
Корпус позволяет установить до 6ти 3,5 дюймовых дисков. Диски располагаются в воздушный поток, создаваемый двумя кулерами спереди и одним большим сзади. Размер корпуса минимален относительно общих характеристик.
Материнские платы мне пришлось брать в других магазинах, все остальные запчасти, кроме дисков, купил в одном магазине. Стоимость одной коробки составила 26950, плюс диски 63500. Итого: 90 450
Слева новая коробка, справа старая



Решили в итоге сделать так:
  1. Установить Ubuntu Server 18.04 LTS
  2. Создать RAID5 силами mdadm (источник)
  3. Зашифровать раздел силами Crypt (источник)
  4. Создать ISCSI (источник и источник)
  5. Подключить к Windows (10)
  6. Подключить к Ubuntu 14.04,18.04 (источник)

I

С установкой ОС проблем возникнуть не должно. На одном из этапов установки создаем bond c BondMode 802.03d. XMIT HASH policy подбираем, если он неправильно указан DHCP не отработает. Соответственно на коммутаторе также должен быть настроен LACP на эти порты. В моем случае это управляемый коммутатор D-Link DGS-1210-24.
При разметке диска 60Гб оставил не занятым, т.к. думаю выделить его под SWAP

II

Создаем рэйд. В моем случае нужно было сначала удалить разделы со всех дисков

user@fnode1: ls /dev/sd*
user@fnode1: sudo fdisk /dev/sda
Command (m for help): d
Command (m for help): w

Потом создаем массив:

user@fnode1: sudo mdadm --create --verbose /dev/md0 --level=5 --raid-device=5 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde

На синхронизацию понадобилось около 8 часов. Один из дисков в /proc/mdstat отображался как потерянный [UUUU_], но общее состояние массива было нормальным. Оставил как есть и спустя 8 часов все встало на место. Мы получили массив 21.9Тб

В моем случае были какие то левые разделы на md0, все решилось форматированием:

user@fnode1: sudo mkfs.ext4 -b 4096 -E stride=16,stripe-width=64 /dev/md0

III

Устанавливаем пакеты crypt:

user@fnode1: sudo apt-get install cryptsetup

Инициализируем диск для шифрования, открываем его и форматируем:
user@fnode1: sudo cryptsetup luksFormat /dev/md0
user@fnode1: sudo cryptsetup luksOpen /dev/md0 md0_crypt
user@fnode1: sudo mkfs.ext4 -v -L DATA /dev/mapper/md0_crypt

IV

Устанавливаем пакеты для ISCSI:

user@fnode1: sudo apt-get install targetcli-fb

Вот тут начинается самое веселое:

Если нужен автозапуск, то в этой версии Ubuntu настраивается так:
user@fnode1: sudo systemctl enable rtslib-fb-targetctl.service
user@fnode1: sudo systemctl start rtslib-fb-targetctl.service
Но не забываем, для автозапуска ISCSI нужно чтобы шифрованный раздел был доступен, а также жесткая привязка массива к своему имени. Но в это случае какой смысл в шифровании если достаточно обойти пароль рут пользователя? Поэтому я делаю без автозапусков.

Потом создаем массив:

user@fnode1: sudo targetcli
>cd /backstores/block/
>create backup_block /dev/mapper/md0_crypt
>cd /iscsi
>create wwn=iqn.2003-05.ru.example.iscsi:fnode1
Правило создания wwn - iqn.YYYY-MM.zone.domain.iscsi:uniq_name
YYYY-MM - год-месяц регистрации домена
zone - зона домена (например .ru)
domain - сам домен
uniq_name - уникальное имя

Прошу обратить внимание, по умолчанию uniq_name равен имени ПК, и если делать на автомате, то можно получить ошибку:

wwn not valid as iqn naa eui
Т.к. имя может содержать недопустимые знаки, например нижнее подчеркивание. У меня проблема решилась перезагрузкой системы без сохранения конфигурации.

Портал создается автоматически, если нет пожеланий, то оставляем как есть. Просто проверим
>cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/portals/
>ls
o- 0.0.0.0:3260 ...........................................................[OK]
Создаем юниты (LUNs):

>cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/luns
>create /backstores/block/backup_block

V

Основная часть работы проделана. Я хотел обязательно делать с авторизацией и тут возник затык. Для авторизации нужно для LUN указать "учетные данные". Их может быть некоторое количество для каждого юнита. В таргете может быть несколько юнитов и т.д. Мы рассматриваем вариант 1 блок > 1 таргет > 1 юнит > 1 acl
На примере подключения для Windows. Нужно изменить или узнать iqn клиента (инициатора) (Панель управления - Инициатор ISCSI - конфигурация - изменить)
я указал здесь: iqn.2003-05.ru.example.iscsi:aa

ВНИМАНИЕ. Для ОС семейства Windows длина пароля должна быть между 12-16 байтами, т.е. 12-16 символов латинской раскладки

Создаем  ACL, и привязываем пароль к iqn

>cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/acls/
>create iqn.2003-05.ru.example.iscsi:aa
>cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/acls/iqn.2003-05.ru.example.iscsi:aa
>set auth userid=iqn.2003-05.ru.example.iscsi:aa password=MoyParol

Если мы хотим настроить двухстороннюю проверку, то нужно узнать iqn самого сервера (target) хранится в файле /etc/iscsi/initiatorname.iscsi:

user@fnode1: sudo cat /etc/iscsi/initiatorname.iscsi
В моем случае это: iqn.1993-08.org.debian:01:bla

user@fnode1: sudo targetcli
>cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/acls/iqn.2003-05.ru.example.iscsi:aa/
>set auth mutual_userid=iqn.1993-08.org.debian:01:bla mutual_password=MutalParol
На стороне клиента пароль Mutal указывается в разделе CHAP:


Далее пробуем подключиться (имя указанное в поле имя игнорируется!):


Если настроен Mutal, то нужно поставить галочку "Выполнить взаимную проверку подлинности".

Если все прошло хорошо, состояние должно измениться на подключено, а в диспетчере дисков должен появится непроинициализированный диск на 22Тб.

VI

В моем случае инициатором будет выступать Ubuntu 14.04 (также подходит для 18.04), поэтому инструкция для нее:

Я создал отдельный ACL для этого инициатора:


  >cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/acls/
  >create iqn.2003-05.ru.example.iscsi:vsv01
  >cd /iscsi/iqn.2003-05.ru.example.iscsi:fnode1/tpg1/acls/iqn.2003-05.ru.example.iscsi:vsv01
  >set auth userid=iqn.2003-05.ru.example.iscsi:vsv01 password=MoyParol mutual_userid=iqn.1993-08.org.debian:01:bla mutual_password=MutalParol

Устанавливаем пакет и настраиваем:

user@vsv01: sudo apt-get install open-iscsi
user@vsv01: sudo nano /etc/iscsi/iscsid.conf
  node.session.auth.authmethod = CHAP
  node.session.auth.username = iqn.2003-05.ru.example.iscsi:vsv01
  node.session.auth.password = MoyParol
  node.session.auth.username_in = iqn.1993-08.org.debian:01:bla
  node.session.auth.password_in = MutalParol
user@vsv01: sudo nano /etc/iscsi/initiatorname.iscsi
   InitiatorName=iqn.2003-05.ru.example.iscsi:vsv01

Далее пытаемся подключиться (10.20.0.14 - адрес fnode1):

user@vsv01: sudo /etc/init.d/open-iscsi restart
user@vsv01: sudo iscsiadm -m discovery -t sendtargets -p 10.20.0.14
user@vsv01: sudo iscsiadm -m node -o show
user@vsv01: sudo iscsiadm  -m node --login
user@vsv01: 
Проверяем наличие нового устройства:
user@vsv01: cat /proc/partitions
....
   8       48 23441559552 sdd
....
user@vsv01: sudo fdisk -l /dev/sdd



Создаем раздел:

user@vsv01: parted --script /dev/sdd "mklabel gpt"
user@vsv01: parted --script /dev/sdd "mkpart primary 0% 100%"
user@vsv01: mnt /dev/sdd1 /mnt/

Отключаем так:
user@vsv01: sudo iscsiadm -m node -o delete -T iqn.2003-05.ru.example.iscsi:fnode1 -p  10.20.0.14
user@vsv01: sudo iscsiadm -m node -u -T iqn.2003-05.ru.example.iscsi:fnode1 -p  10.20.0.14

скрипт для подключения шифрованного устройства и запуск службы iscsi (предварительно сделать резервную копию в файл:/etc/rtslib-fb-target/backup.json):
if [[ $EUID -ne 0 ]]
then
        echo "This script must be run as root"
        exit 1
else
        cryptsetup luksOpen /dev/md0 md0_crypt && sleep 5 && systemctl start rtslib-fb-targetctl.service && targetcli restoreconfig /etc/rtslib-fb-target/backup.json
fi
Разбор ошибок

Конфигурация. Объем SSD (системного диска) 128Гб великоват, 60Гб за глаза.
Процессор можно было и по проще взять, например Intel Pentium Gold G5400 за 3800, а не 6700. Экономия 3000 с коробки.
Плюс Gold имеет графическое ядро, т.о. экономим еще 2200 рублей с каждой коробки.
Итого стоимость сборки можно было снизить на (3000+2200)=5200, и стоимость сборки обошлась бы в 26950-5200=21750.
На эту разницу с двух коробок (5200*2=10400) плюс стоимость 1 процессора (3800) можно было бы в одну коробку поставить процессор по-мощнее - INTEL Core i5 9500, который не на много слабее  E3-1246 v3 (именно этот процессор отвечает за архивирование) и перевести полностью процесс резервного копирования на 1 одну коробку. Этим убили бы еще одного зайца - сервер отвечающий за процесс резервного копирования зависает на смерть при попытке копирования большого объема на максимально возможной скорости, пришлось занижать скорость копирования файлов и ждать дольше.

Конфигурация. Диски. Из 11 купленных дисков, два оказались бракованными. Перед вводом в эксплуатацию каждый диск проверяется на последовательное чтение/запись от начала до конца, а по завершении проверяется в режиме butterfly значок  >?< на запись и чтение по 5 часов.

Второй коробок начал капризничать - после перезагрузки массив терял диски.
Восстанавливал и снова терял после перезагрузки. Как выяснилось, ASrock может удалять superblock с дисков о_О. Поэтому пришлось создавать массив не на самих устройствах, а на разделах этих устройств (желательно со смещением на пару мегабайт).

Далее, я создавал раздел на подключенном устройстве, но этого не обязательно было делать. Не уверен что потом удастся локально примонтировать такой раздел, т.к. локально он не определяется.

Комментариев нет:

Отправить комментарий