В статье «Автоматическая установка платформы TrueNAS» мы рассказывали, что для автоматической установки на виртуальные и физические серверы теперь доступна операционная система TrueNAS SCALE. Расскажем об автоматической установке подробнее.

Почему мы запустили именно SCALE, а не CORE? Давайте сравнивать и выбирать. Разработчик этих операционных систем собрал основные различия в таблицу. Видим, что с точки зрения функционала их почти нет. Основное отличие между версиями заключается в базовой ОС и, соответственно, в типе встроенной виртуализации, а еще у SCALE-версии заявлена возможность масштабирования ZFS на несколько узлов при помощи распределенной файловой системы Gluster. И да, поддержка ZFS на SCALE-версии реализована все же через DKMS.

Затем нужно было выяснить, на какие серверы мы сможем ставить тот или иной TrueNAS. Мы поддерживаем единый список операционных систем как для «дедиков», так и для «виртуалок». В теории (по инструкциям для установки Install и Installing SCALE) список поддерживаемого оборудования и систем виртуализации тоже не особенно отличается, но будем проверять. С поддержкой физических серверов у обеих систем проблем нет, но вот наша стандартная конфигурация клиентской VM с диском Virtio-SCSI не нравится инсталлятору TrueNAS CORE, а точнее — он не видит такой тип диска. Подобная ситуация была и с автоматизацией установки Windows, и решали мы ее добавлением необходимых драйверов в инсталлятор. Установщик TrueNAS SCALE же видит диск «из коробки». А еще CORE-версия поддерживает меньшее количество разнообразных 10G-адаптеров. В общем, если не видно разницы, то зачем платить больше дорабатывать CORE под наши реалии, когда можно взять SCALE? Берем.

Следующий шаг — автоматизация установки. Официальная документация предлагает нам всего один вариант — установка с ISO-образа посредством инсталлятора, управляемого исключительно клавиатурой. Что ж, будем пробовать подход, который мы уже применяли для автоматизации установки Cloud Hosted Router (там этот способ правда является официальным), а именно заливать на диск образ частично установленной операционной системы и донастраивать ее «по месту». У того же Cloud Hosted Router для финишной конфигурации есть специальный файл в файловой системе, куда просто пишется набор команд на его стандартном языке скриптов, и он выполняется один раз при первой загрузке. TrueNAS нам такого «подарка» не делает, во всяком случае официально, так что будем разбираться самостоятельно.

Для начала ставим TrueNAS SCALE 22 с ISO на минимальный диск, который одобрит инсталлятор (это 8 ГБ) и до первой загрузки ОС сразу снимаем получившийся полный образ диска в архив. Вот с этим образом и будем потом работать. Судя по сообщениям в консоли, родной инсталлятор на самом деле делает именно распаковку на диск некоего образа, только предварительно проверяет, что оборудование соответствует минимальным требованиям, а еще умеет собрать два диска в зеркало и поставить ОС на него. Спасибо разработчикам, разбивка диска и загрузчик сделаны универсальными и работают как с UEFI, так и с Legacy, а значит, одним вопросом меньше.

Как мы рассказывали в статье «От DVD и флешек до современных решений: как мы автоматизировали установку ОС на серверы», основным установщиком у нас является Live-образ, основанный на Rocky Linux 8, который загружается на деплоящийся сервер по PXE, выполняет зачистку дисков, выбор диска для инсталляции, скачивает и распаковывает образ нужной системы на подготовленные диски, делает финишную настройку. Первые шаги для TrueNAS выполняем те же, затем заливаем снятый «минимальный» образ на диск без предварительной нарезки разделов, потому что они уже есть в образе, а вот затем все уже нестандартно.

Под корневую файловую систему у TrueNAS используется ZFS, настройки ОС хранятся именно там, и нам нужен туда доступ из-под нашего инсталлятора. Поскольку это пока единственный случай, когда драйвер ZFS понадобился в нашем Live-образе, встраивать его «на постоянку» и, соответственно, раздувать размер загружаемого образа не стали. Ничто не мешает добавить поддержку ZFS «на лету» при работе инсталляционного скрипта.

dnf install -y epel-release
dnf install https://zfsonlinux.org/epel/zfs-release-2-2$(rpm --eval "%{dist}").noarch.rpm -y
dnf install -y dkms
dnf config-manager --disable zfs
dnf config-manager --enable zfs-kmod
dnf install zfs -y
modprobe zfs

Затем импортируем zpool и монтируем в удобное место.

zpool import boot-poolmount -t zfs boot-pool/ROOT/22.12.1 /mnt

Как выяснилось, все основные настройки TrueNAS SCALE хранит в SQLite-базе в файле /data/freenas-v1.db. Соответственно, доустанавливаем необходимый инструментарий необходимый для работы с этой базой данных:

dnf install sqlite -y

После копания в базе настроенного экземпляра TrueNAS, а также сравнения с «голым» экземпляром, были найдены записи, содержащие нужные нам настройки, и затем написаны команды для создания необходимой минимальной конфигурации:

sqlite3 /mnt/data/freenas-v1.db "INSERT INTO network_interfaces VALUES(1,'$inetif','',0,0,'',NULL,0,NULL,NULL,'<%= @host.mac %>',
 '<%= host_param('ip')%>','',<%= host_param('cidr')%>,4);"
 ## inetif — имя активного сетевого интерфейса
 ## <%= @host.mac %>,<%= host_param('ip')%>,<%= host_param('cidr')%> — соответственно
 ##   MAC-адрес, IP и маска подсети из параметров, передаваемых в Foreman при создании конфигурации
sqlite3 /mnt/data/freenas-v1.db "DELETE FROM network_globalconfiguration WHERE id=1"
 ## Эта запись нам не нужна
sqlite3 /mnt/data/freenas-v1.db "INSERT INTO network_globalconfiguration VALUES(1,'TrueNAS','TrueNAS-b','local','<%= host_param('gateway')%>','','8.8.8.8',
 '','','',0,'','','',NULL,'{\"mdns\": false, \"wsd\": false, \"netbios\": false}',
 '{\"type\": \"DENY\", \"activities\": []}');"
 ## Тут задаются шлюз, DNS-сервер, а также разрешенная Outbound activity через интерфейс
pass=$(openssl passwd -6 <%= host_param("password") %>)
 sqlite3 /mnt/data/freenas-v1.db "UPDATE account_bsdusers SET bsdusr_unixhash='$pass'
  WHERE bsdusr_username='admin'"
 ## Задаем пароль пользователя-администратора из Foreman-конфигурации сервера
sqlite3 /mnt/data/freenas-v1.db "UPDATE system_settings SET stg_guihttpsredirect=1 WHERE id=1"
 ## Пусть web-интерфейс установленной ОС работает только через HTTPS  	

В принципе, на этом можно было бы и закончить настройку, но есть один нюанс. Во-первых, GPT-таблица у нас от диска на 8ГБ и хорошо бы ее поправить под размер реального диска. А во-вторых, хочется обойти ограничение операционной системы на использование отдельного диска под ОС и отдельных дисков под данные. При установке на физический сервер с несколькими дисками клиент сможет на них самостоятельно создать ZFS pool через web-интерфейс TrueNAS, но в случае однодисковой конфигурации, которая является стандартной для наших виртуальных серверов, web-интерфейс такого не позволит, хоть свободное место там, конечно, останется (мы заняли всего 8ГБ нашим образом). Без создания еще хотя бы одного пула не удастся ни разместить пользовательские данные, ни создать shares, ни активировать встроенные приложения. Поэтому создаем пул из-под нашего инсталлятора и добавляем в конфигурацию:

 echo w | fdisk /dev/$INST_DRIVE
 ## исправляем GPT таблицу. INST_DRIVE — диск, на который ставится ОС
parted -s /dev/$INST_DRIVE mkpart primary 8590 100%
 ## создаем дополнительный раздел
if [[ $(echo $INST_DRIVE | grep -c nvme) -eq 0 ]]; then
 ## для не-nvme дисков:
   	wipefs -a /dev/${INST_DRIVE}4
   	dd if=/dev/zero of=/dev/${INST_DRIVE}4 bs=512k count=20
    	## Эти две команды затрут возможные сохранившиеся артефакты предыдущей инсталляции
   	zpool create init-pool /dev/${INST_DRIVE}4
    	## Создаем ZFS pool под данные/приложения
else
 ## аналогично для nvme дисков, различие только в имени раздела.
   	wipefs -a /dev/${INST_DRIVE}p4
   	dd if=/dev/zero of=/dev/${INST_DRIVE}p4 bs=512k count=20
   	zpool create init-pool /dev/${INST_DRIVE}p4
fi
## Теперь нужно добавить получившийся пул в «импортированные» в конфигурацию ОС
sqlite3 /mnt/data/freenas-v1.db "INSERT INTO system_systemdataset
  VALUES(1,'init-pool',1,'8f179c8648fc4419af075a5cf26c19f8',NULL);"
sqlite3 /mnt/data/freenas-v1.db "INSERT INTO storage_volume
  VALUES(1,'init-pool','14024449139687287443',0,'');"

На этом настройка закончена, остается перезагрузить сервер уже с системного диска. Первый запуск TrueNAS будет чуть дольше обычного, потому что будут отрабатывать родные инициализационные скрипты, но через пару минут мы получим операционную систему с настроенной сетью, доступным по HTTPS конфигурационным web-интерфейсом, заданным паролем администратора и активным ZFS pool под данные и приложения. Если на сервере несколько дисков, на них можно будет создать пул средствами web-интерфейса ОС и тогда использовать уже этот пул, как это и задумано разработчиками TrueNAS.

Комментарии (2)


  1. 13werwolf13
    23.05.2023 03:54

    можно взять opensuse/rh/etc где zfs есть в виде нормального kmp модуля, но разработчики системы для которой zfs является критично важной частью берут за основу debian где zfs нету, присерают его при помощи сомнительного костыля (да да, dkms это очень сомнительный костыль)..
    уже пора говорить что truenas не торт?


    1. dasgutenberg
      23.05.2023 03:54

      Спасибо за комментарий. Мы описываем наш опыт работы с TrueNAS Scale. Пока массовых жалоб на отвал ZFS в этой системе не наблюдается, она продолжает оставаться популярным вариантом для использования ZFS в качестве хранилища данных.