Установщик TrueNAS не предоставляет возможность самостоятельной настройки таблицы разделов, таким образом, необходимо выделять отдельный диск для загрузки операционной системы. Если учесть, что сейчас не продаются SSD меньше 120 гигабайт, хотелось бы использовать излишки. Трюк заключается в установке TrueNAS на флешку с последующим клонированием на SSD.

Введение

Поскольку установленная TrueNAS Core (ранее FreeNAS) занимает практически буквально пару гигабайт, то возникает естественное желание задействовать драгоценное место на SSD (а, как мы знаем, лучше даже двух – для зеркалирования). В реальности использовать флешку для загрузки ОС на постоянной основе конечно же не стоит – об этом нас предупреждает установщик, да и вообще. Кстати про реальность – кажется с флешками на 8 гигов (и менее) возможны проблемы, так что лучше с запасом взять на 16 (что мы виртуально и сделаем).

Статья основывается на темах форума по TrueNAS – HOWTO: setup a pair of larger SSDs for boot pool and data (как настроить пару больших SSD для загрузочного пула и данных) и How to setup FreeNAS on a (partitioned) single SSD with boot and jails (как установить FreeNAS на одиночный SSD с разбиением на загрузку и клетки), а также пары статей по FreeBSD как таковой (напомню, что «под капотом» у TrueNAS ни что иное, как именно эта операционная система) - FreeBSD and UEFI Boot (FreeBSD и загрузка через UEFI) и Установка FreeBSD (как ни странно на русском в отличие от всех остальных).

Последние две статьи намекают на то, что в примере мы будем использовать именно загрузку в режиме UEFI, а не BIOS, поскольку полюбившийся мне VirtualBox позволяет загружаться с виртуальных USB и NVMe только таким образом. Кстати будьте внимательны – в интернете (и в частности второй теме форума) чаще подразумевается «старомодный» режим BIOS’а.

TL;DR

Что-то статья получилась весьма и весьма длинной, поэтому если вам не слишком интересно читать про развертывание виртуальной машины, установку TureNAS под UEFI и подробное объяснение, откуда что берется, то можно сразу перейти к разделу «Если применяются два SSD» – там без лишних слов приводится сводка команд. Также хотелось бы анонсировать задачу синхронизации в конце.

Создание виртуальной машины

При написании статьи использовался VirtualBox 6.1.20 с установленным набором расширений – это важно, поскольку именно через этот набор реализуются контроллеры USB 2.0/3.0 и NVMe.

 

Я предпочитаю «экспертные» режимы. Начало создания виртуальной машины стандартное: тип – BSD, версия FreeBSD (x64), объем памяти не менее 8192 MB.

 

На втором шаге создается основной диск ВМ. По умолчанию предлагается 16 гигабайт, но давайте поставим 120 и в дальнейшем будем рассматривать этот диск как SSD на NVMe. При «динамическом» формате хранения можно не переживать за место на реальном диске (хоста).

 

Переходим в настройки вновь созданной машины, вкладку «Система». В настройке материнской платы я обычно меняю чипсет на ICH9, а также включаю «Часы в системе UTC». В обязательном порядке включаем EFI.

 

Вкладку «Дисплей» пропускаем, переходим к «Носителям» – здесь-то и начинается самое интересное. По умолчанию созданный диск подключается к IDE контроллеру. Добавим NVMe (PCIe) контроллер, перенесем наш диск в него и включим режим твердотельного накопителя.

 

Добавим контроллер USB и создадим для него диск на 16 гигабайт, на сей раз для имитации «маленькой» флешки для первоначальной установки. Можно установить флаг «С горячей заменой», хотя влияет это наверное только на порядок следования дисков в перечне устройств. Для определенности – я этот флаг взвел.

Добавляем контроллер SCSI или SATA, давайте на сей раз остановимся на AHCI (SATA) как более близкому к «потребительской» платформе. Как обычно, добавляем два или три диска, чтобы TrueNAS не ругался. Объем для наглядности опять же поставим какой-то отличающийся от предыдущих двух, главное чтобы он был одинаковым для всех двух/трех. Сделал три по 500, чтобы мало не показалось.

 

Аудио отключаем и переходим в «Сеть». Воспользуемся «неразборчивым» режимом сетевого моста, чтобы работал DHCP для клеток (которые jail, напомню, что это «легковесная» виртуализация FreeBSD).

 

Остальные вкладки можно не трогать, параметры по умолчанию подходят (в частности в разделе USB должен быть включен USB-контроллер 2.0).

Установка TrueNAS Core

На момент написания статьи актуальной версией являлась TrueNAS CORE 12.0-U3 на основе FreeBSD 12.2. Справедливости ради, в апреле 2021 года уже вышла 13.0, слегка отстаем… Запускаем нашу виртуальную машину и попадаем в, не побоюсь этого слова, UEFI Interactive Shell v2.2.

 

Хм… И что тут делать? smile Монтируем скачанный ISO-образ на оптический привод (в меню окна виртуальной машины: Устройства – Оптические диски – Выбрать файл диска) и либо перезагружаем машину командой reset, либо выходим в некий «эмулятор BIOS» (штука сама по себе весьма интересная, но заострять на ней внимание не будем) командой exit, а затем возвращаемся в оболочку командой меню Continue либо опять-таки перезагружаем систему (Reset).

 

Несмотря на то, что вроде бы настроена загрузка с компакт-диска, все равно попадаем в оболочку UEFI, только теперь нам доступна файловая система оптического диска. Переходим в FS1: (именно так и вводим), а далее нам помогут «традиционные» команды dir и cd. В конечном итоге нам надо запустить bootx64.efi из \efi\boot. На скриншоте показан «подробный» путь к нужному файлу (на тот случай, если вдруг что-то изменится в последующих релизах).

 

Но вообще можно было бы сразу после перехода в FS1: запустить \efi\boot\bootx64.efi (обратите внимание – используются обратные слэши).

 

Начнется загрузка установщика, сначала появится меню, в котором в принципе особо ничего и не надо делать (можно нажать Enter, чтобы сэкономить несколько секунд). Вот оно, для контроля:

 

А затем мы наконец попадем собственно в программу установки. Сама по себе процедура установки достаточно обыденная (описываю сокращенно) – выбираем нашу флешку в качестве диска для установки:

 

При нашей настройке виртуальной машины ее определить очень просто – не только по размеру, но и по названию: SATA-шные (и IDE) диски называются ada; NVMe – nvd; SCSI и, как видим, USB – просто da. Модель, к сожалению, в VirtualBox одна – VBOX HARDDISK (за исключением NVMe), что таки слегка сбивает с толку.

На следующем шаге подтверждаем установку на выбранный диск (da0 в нашем случае). В диалоговом окне как раз говорится о том, о чем я в немалой степени говорил в начале: систему не рекомендуется устанавливать на флешки и вы не сможете использовать этот диск для пользовательских данных (позволю себе так перевести «You can’t use da0 for sharing data»). Также нас предупреждают об удалении всех разделов и данных с диска.

После подтверждения установки задаем пароль root и наконец выбираем загрузку по UEFI:

 

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

В нем, соответственно, нужно выбрать Reboot System. При этом нужно умудриться вовремя виртуально извлечь комакт-диск (примерно когда секунду-другую висит черный экран, как я полагаю — хотя проще наверное нажать Esc когда идет обратный отсчет, спокойно «изъять диск из привода» и сделать reset), иначе есть опасность, что загрузка теперь пойдет автоматически с привода (где он раньше был, спрашивается), а не с виртуальной флешки. Отличить их можно по загрузочному меню – одно я показывал ранее на скриншоте (и называется TrueNAS Installer), а другое называется Welcome to TrueNAS и состав пунктов слегка отличается.

 

Дожидаемся генерации неких параметров DH, после чего наконец-то системой можно начинать пользоваться.

 

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

Народ на форумах рекомендует также включить SSH, хотя отчасти это не обязательно – есть веб-консоль, да и окно самой виртуальной машины никто не отменял. Хотя «родным» PuTTY пользоваться удобнее, особенно Midnight Commander’ом, который любезно предустановлен разработчиками.

Итак, в разделе Services сначала в настройках сервиса SSH разрешаем вход под root по паролю (Log in as Root with Password), а затем включаем сервис и делаем загрузочным (Start Automatically).

2021-04-26_14-19-48.png
2021-04-26_14-20-31.png

 

На этом будем считать установку системы завершенной.

Клонирование флешки на SSD

Потихоньку подбираемся к тому, ради чего мы здесь собственно и собрались – взяв за основу нашу «маленькую» флешку, сделать ее клон на SSD. Внимание! В любом случае подобные «финты ушами» не являются поддерживаемыми TrueNAS, а если проводить подобные манипуляции в реальности, то в случае ошибки можно уничтожить данные.

Проверка состава дисков

Почти все операции проводятся в консоли, в немалой степени ради этого в предыдущем разделе включали SSH. Для начала еще раз перепроверим, где какой диск. Понятно, что их список был выведен в процессе установки, но мало ли. К примеру можно вернуться к веб-интерфейсу: Storage – Disks.

 

Если же говорить о консоли, то:

# geom disk list

Пример вывода для виртуальной машины:

root@truenas[~]# geom disk list
Geom name: nvd0
Providers:
1. Name: nvd0
   Mediasize: 128849018880 (120G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: ORCL-VBOX-NVME-VER12
   lunid: 3660c1d85dfc854f8598698c7c9faf84
   ident: VB1234-56789
   rotationrate: 0
   fwsectors: 0
   fwheads: 0

Geom name: cd0
Providers:
1. Name: cd0
   Mediasize: 0 (0B)
   Sectorsize: 2048
   Mode: r0w0e0
   descr: VBOX CD-ROM
   ident: (null)
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: ada0
Providers:
1. Name: ada0
   Mediasize: 536870912000 (500G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: VBOX HARDDISK
   ident: VBcd896337-0fff11f0
   rotationrate: unknown
   fwsectors: 63
   fwheads: 16

Geom name: ada1
Providers:
1. Name: ada1
   Mediasize: 536870912000 (500G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: VBOX HARDDISK
   ident: VBfdb0b20d-54b78a8e
   rotationrate: unknown
   fwsectors: 63
   fwheads: 16

Geom name: ada2
Providers:
1. Name: ada2
   Mediasize: 536870912000 (500G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: VBOX HARDDISK
   ident: VB2295d677-41b6ce8d
   rotationrate: unknown
   fwsectors: 63
   fwheads: 16

Geom name: da0
Providers:
1. Name: da0
   Mediasize: 17179869184 (16G)
   Sectorsize: 512
   Mode: r1w1e2
   descr: VBOX HARDDISK
   ident: (null)
   rotationrate: unknown
   fwsectors: 63
   fwheads: 255

Эмм, какие-то геомы, провайдеры… В официальной документации GEOM названа модульной инфраструктурой преобразования дисковых запросов, что как-то не проясняет ситуацию! smile Но в нашем простейшем случае разобраться несложно, поскольку видим только по одному провайдеру на каждое имя.

Итак, сверим часы: флешка - da0, SSD – nvd0.

Подготовка SSD

Посмотрим текущее состояние таблиц разделов:

# gpart show

Пример вывода:

root@truenas[~]# gpart show
=>      40  33554352  da0  GPT  (16G)
        40    532480    1  efi  (260M)
    532520  32997376    2  freebsd-zfs  (16G)
  33529896     24496       - free -  (12M)

Как видим, на данный момент таблица разделов (GPT) существует только на устройстве da0. В упор не понимаю, зачем установщик выделил под раздел efi аж 260 мегабайт, ну да ладно.

Кстати мы же можем посмотреть содержимое этого раздела:

root@truenas[~]# cd /media
root@truenas[/media]# mkdir efi
root@truenas[/media]# mount -t msdosfs /dev/da0p1 /media/efi
root@truenas[/media]# cd efi
root@truenas[/media/efi]# ls -Rl ./
total 16
drwxr-xr-x  1 root  wheel  16384 Apr 26 13:35 efi

./efi:
total 16
drwxr-xr-x  1 root  wheel  16384 Apr 26 13:35 boot

./efi/boot:
total 112
-rwxr-xr-x  1 root  wheel  94208 Apr 26 13:35 BOOTx64.efi
-rwxr-xr-x  1 root  wheel     12 Apr 26 13:35 startup.nsh
root@truenas[/media/efi]# cd ~
root@truenas[~]# umount /media/efi

Да уж, какие-то жалкие два файла на 100 килобайт. Ладно, едем дальше, и тут-то как раз начинаются деструктивные операции.

Если вдруг на ssd уже есть какая-то таблица разделов, то удалим ее:

# gpart destroy -F nvd0

Копируем таблицу разделов с флешки на SSD:

# gpart backup da0 | gpart restore nvd0

Еще раз обращаю внимание на имена устройств: backup с флешки, restore на ssd. Проверяем:

root@truenas[~]# gpart backup da0 | gpart restore nvd0
root@truenas[~]# gpart show
=>      40  33554352  da0  GPT  (16G)
        40    532480    1  efi  (260M)
    532520  32997376    2  freebsd-zfs  (16G)
  33529896     24496       - free -  (12M)

=>       40  251658160  nvd0  GPT  (120G)
         40     532480     1  efi  (260M)
     532520   32997376     2  freebsd-zfs  (16G)
   33529896  218128304        - free -  (104G)

Отлично, теперь необходимо сделать SSD загрузочным. Два варианта: скопировать раздел efi командой dd либо прописать загрузчик с помощью gpart bootcode.

# dd if=/dev/da0p1 of=/dev/nvd0p1 bs=1M

На всякий случай напомню, что if – источник, of – приемник, bs – размер блока. Последний параметр указать очень важно, иначе копирование будет происходить крайне медленно. В примере используются блоки по 1 мегабайту.

root@truenas[~]# dd if=/dev/da0p1 of=/dev/nvd0p1 bs=1M
260+0 records in
260+0 records out
272629760 bytes transferred in 48.835848 secs (5582574 bytes/sec)

В любом случае gpart работает как-то быстрее:

# gpart bootcode -p /boot/boot1.efifat -i 1 nvd0

Во FreeBSD есть заранее подготовленный образ EFI-загрузчика, это как раз файл /boot/boot1.efifat, указанный в параметре -p. Об этом можно узнать, видимо, из man uefi, поскольку man gpart подробно расписывает только вариант с BIOS (а то еще и MBR вдобавок). Хотя нашлось упоминание и в документации (примечание к разделу 20.3.11). Оставшиеся параметры говорят о том, что загрузчик надо записать в первый раздел устройства (геома) nvd0.

Пример вывода:

root@truenas[~]# gpart bootcode -p /boot/boot1.efifat -i 1 nvd0
partcode written to nvd0p1

Перенос загрузочного пула

Теперь начинается, пожалуй, самое интересное: делаем загрузочный пул зеркалом, а затем удаляем из него флешку. Сначала выведем список пулов ZFS:

# zpool list

В виртуальной машине на данный момент он всего один и называется boot-pool:

root@truenas[~]# zpool list
NAME        SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
boot-pool  15.5G  1.16G  14.3G        -         -     0%     7%  1.00x    ONLINE  -

Проверим состояние (zpool status [pool]):

root@truenas[~]# zpool status boot-pool
  pool: boot-pool
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        boot-pool   ONLINE       0     0     0
          da0p2     ONLINE       0     0     0

errors: No known data errors

Как и следовало ожидать, загрузочный пул работает на da0p2 (вспомним gpart show – раздел 2 на устройстве da0). Преобразовываем пул в зеркало из da0p2 и nvd0p2:

# zpool attach boot-pool da0p2 nvd0p2

Меня немного смущало указание имеющегося устройства, но таков синтаксис команды.

Проверяем (я не указываю пул при получении статуса, поскольку он один):

root@truenas[~]# zpool attach boot-pool da0p2 nvd0p2
root@truenas[~]# zpool status
  pool: boot-pool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Mon Apr 26 17:10:21 2021
        1.16G scanned at 10.7M/s, 407M issued at 3.67M/s, 1.16G total
        405M resilvered, 34.20% done, no estimated completion time
config:

        NAME        STATE     READ WRITE CKSUM
        boot-pool   ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            da0p2   ONLINE       0     0     0
            nvd0p2  ONLINE       0     0     0  (resilvering)

errors: No known data errors

Процесс, как говорится, пошел. Меня вновь смущало слово resilvering, но используется именно такой термин. Можно заняться какими-то другими делами, периодически опрашивая статус, пока пул не приобретет примерно следующий вид:

root@truenas[~]# zpool status
  pool: boot-pool
 state: ONLINE
  scan: resilvered 1.19G in 00:04:47 with 0 errors on Mon Apr 26 17:15:08 2021
config:

        NAME        STATE     READ WRITE CKSUM
        boot-pool   ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            da0p2   ONLINE       0     0     0
            nvd0p2  ONLINE       0     0     0

errors: No known data errors

Теперь можем удалить флешку из пула:

# zpool detach boot-pool da0p2

На форумах зачем-то перед этим переводят da0p2 в оффлайн, но этого не следует ни из man zpool-deatch (где предлагается использовать offline вместо detach, если нужно временно отключить диск), ни из моих испытаний перед написанием статьи (zpool status все равно показывал online).

Проверяем:

root@truenas[~]# zpool detach boot-pool da0p2
root@truenas[~]# zpool status
  pool: boot-pool
 state: ONLINE
  scan: resilvered 1.19G in 00:04:47 with 0 errors on Mon Apr 26 17:15:08 2021
config:

        NAME        STATE     READ WRITE CKSUM
        boot-pool   ONLINE       0     0     0
          nvd0p2    ONLINE       0     0     0

errors: No known data errors

Создание пула на свободном месте

Осталось задействовать свободное место на SSD. Создаем раздел с параметрами по умолчанию:

# gpart add -t freebsd-zfs -l ssd0 nvd0

На всякий случай присвоил метку ssd0 (параметр -l). Параметр -t определяет тип файловой системы, ну а в конце – наш любимый геом (диск).

Пример вывода:

root@truenas[~]# gpart add -t freebsd-zfs -l ssd0 nvd0
nvd0p3 added

Прежде чем создавать новый пул, необходимо узнать GUID созданного раздела. Честно говоря, даже немного странно, что загрузочный пул установщик создает на именах разделов типа da0p2, а пулы для данных – на gptid. Возможно изменение размещения загрузочного диска представляется намного менее вероятным, чем устройств для хранения данных. Хотя для проверки в виртуальной машине я легким движением руки перенес «SSD» в IDE-контроллер, и все загрузилось. Немного отвлеклись – для определения GUID’ов воспользуемся командой gpart list:

# gpart list nvd0

Пример вывода:

root@truenas[~]# gpart list nvd0
Geom name: nvd0
modified: false
state: OK
fwheads: 255
fwsectors: 63
last: 251658199
first: 40
entries: 128
scheme: GPT
Providers:
1. Name: nvd0p1
   Mediasize: 272629760 (260M)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 20480
   Mode: r0w0e0
   efimedia: HD(1,GPT,6a48fe3b-a696-11eb-a80c-0800270ddf06,0x28,0x82000)
   rawuuid: 6a48fe3b-a696-11eb-a80c-0800270ddf06
   rawtype: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
   label: (null)
   length: 272629760
   offset: 20480
   type: efi
   index: 1
   end: 532519
   start: 40
2. Name: nvd0p2
   Mediasize: 16894656512 (16G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 272650240
   Mode: r1w1e1
   efimedia: HD(2,GPT,6a4958c7-a696-11eb-a80c-0800270ddf06,0x82028,0x1f78000)
   rawuuid: 6a4958c7-a696-11eb-a80c-0800270ddf06
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 16894656512
   offset: 272650240
   type: freebsd-zfs
   index: 2
   end: 33529895
   start: 532520
3. Name: nvd0p3
   Mediasize: 111681691648 (104G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 4282404864
   Mode: r0w0e0
   efimedia: HD(3,GPT,3a94404d-a69b-11eb-a80c-0800270ddf06,0x1ffa028,0xd005fb0)
   rawuuid: 3a94404d-a69b-11eb-a80c-0800270ddf06
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: ssd0
   length: 111681691648
   offset: 17167306752
   type: freebsd-zfs
   index: 3
   end: 251658199
   start: 33529896
Consumers:
1. Name: nvd0
   Mediasize: 128849018880 (120G)
   Sectorsize: 512
   Mode: r1w1e2

Как видим, вывод достаточно большой (опять же проявляется польза от PuTTY, кстати веб-консоль плохо работает с буфером обмена), из всего этого благополучия нам требуется значение rawuuid 3-го раздела:

3. Name: nvd0p3
   …
   rawuuid: 3a94404d-a69b-11eb-a80c-0800270ddf06

В вашем случае он разумеется будет другим. Итак, зная GUID раздела, создаем на нем пул под названием ssd (для примера):

# zpool create ssd gptid/3a94404d-a69b-11eb-a80c-0800270ddf06

Проверяем:

root@truenas[~]# zpool create ssd gptid/3a94404d-a69b-11eb-a80c-0800270ddf06
root@truenas[~]# zpool list
NAME        SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
boot-pool  15.5G  1.16G  14.3G        -         -     0%     7%  1.00x    ONLINE  -
ssd         104G   100K   104G        -         -     0%     0%  1.00x    ONLINE  -
root@truenas[~]# zpool status ssd
  pool: ssd
 state: ONLINE
config:

        NAME                                          STATE     READ WRITE CKSUM
        ssd                                           ONLINE       0     0     0
          gptid/3a94404d-a69b-11eb-a80c-0800270ddf06  ONLINE       0     0     0

errors: No known data errors

Отлично, для пущей важности отмонтируем новый пул, удалим директорию (чтобы не мешалась) и экспортируем его (хотя вроде бы это не обязательно – импорт в веб-интерфейс выполнялся и так).

root@truenas[~]# umount /ssd
root@truenas[~]# rmdir /ssd
root@truenas[~]# zpool export ssd

Что интересно, после команды экспорта пул пропадает из списка:

root@truenas[~]# zpool list
NAME        SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
boot-pool  15.5G  1.16G  14.3G        -         -     0%     7%  1.00x    ONLINE  -

Вроде бы на этом почти все, выключаем машину:

# poweroff

В настройках виртуальной машины удаляем USB-контроллер из накопителей, а также отключаем USB на одноименной вкладке.

2021-04-26_18-11-04.png
2021-04-26_18-11-47.png

 

Если все сделано правильно, машина должна стартовать «как ни в чем ни бывало».

Если применяются два SSD

В этом случае большинство вышеуказанных команд надо повторять дважды для каждой SSD: очистить таблицу разделов (повторюсь, при наличии), склонировать, записать загрузчик:

# gpart destroy -F nvd0
# gpart destroy -F nvd1
# gpart backup da0 | gpart restore nvd0
# gpart backup da0 | gpart restore nvd1
# gpart bootcode -p /boot/boot1.efifat -i 1 nvd0
# gpart bootcode -p /boot/boot1.efifat -i 1 nvd1

Пул преобразовывать, как ни странно, тоже нужно поэтапно (я почему-то первоначально думал, что тройное зеркало можно сделать одной командой):

# zpool attach -w boot-pool da0p2 nvd0p2
# zpool attach -w boot-pool da0p2 nvd1p2

Я добавил опцию -w, чтобы сразу же дождаться этого самого resilvering. Хотя конечно же опросить состояние в любом случае не повредит.

Исключение флешки, очевидно, делается однократно:

# zpool detach boot-pool da0p2

Вновь дважды создаем разделы на свободных местах:

# gpart add -t freebsd-zfs nvd0
# gpart add -t freebsd-zfs nvd1

И создаем зеркальный пул на созданных разделах (получаем GUID’ы командой gpart list). Как видите, после имени пула добавил слово mirror, иначе создалось бы «линейное» объединение (stripe) дисков.

# zpool create ssd mirror gptid/f91a81d6-a914-11eb-9fd6-080027a663cc gptid/fa35b9dd-a914-11eb-9fd6-080027a663cc

Очистка и экспорт ради приличия:

# umount /ssd
# rmdir /ssd
# zpool export ssd

Завершение настройки в веб-интерфейсе

Переходим в раздел Storage – Pools, он скорее всего будет пустым. Сначала предлагаю импортировать пул, созданный нами на SSD. Добавляем пул (Add), на первом шаге выбираем «Import an existing pool», на втором оставляем вариант по умолчанию – No, continue with import (мы же ведь не шифровали ничего), на третьем выбираем ssd (в соответствии с тем, как он был назван командой zpool create), и на последнем шаге (забыл сделать скриншот) подтверждаем импорт (Import).

2021-04-26_18-22-48.png
2021-04-26_18-23-04.png
2021-04-26_18-23-15.png

 

Поскольку при создании пула не использовались какие-либо дополнительные параметры, то сжатие отключено. Дедупликацию по большому счету лучше вообще никогда не включать (если только речь не идет о реально каких-то промышленных установках).

 

В настройках пула можно, к примеру, отключить Atime (обновление времени доступа к файлам, т.е. отключение по идее должно благотворно сказаться на ресурсе SSD) и включить сжатие (LZ4 по умолчанию, впрочем смотря что предполагается на этом пуле хранить – может ZLE в каких-то случаях типа h264/ac3 окажется уместнее).

 

С импортированным пулом обнаружился нюанс. Прежде чем сохранять настройки, нужно раскрыть Advanced options и установить ACL Mode – Passthrough. Поскольку изначально никакого значения там не установлено, это приводит к ошибке при сохранении.

 

Теперь стандартным образом создаем «основной» пул из подготовленных SATA-дисков. На первом шаге выберем (фактически оставим) Create New Pool, в окне Pool Manager нажимаем Suggest Layout, на трех дисках создастся Raid-z (что и предполагалось). Имя пусть будет традиционным для TrueNAS – tank.

 

Итак, должно получиться примерно следующее:

 

Сравним с консолью:

root@truenas[~]# zpool list
NAME        SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
boot-pool  15.5G  1.16G  14.3G        -         -     0%     7%  1.00x    ONLINE  -
ssd         104G  94.8M   104G        -         -     0%     0%  1.00x    ONLINE  /mnt
tank       1.45T   768K  1.45T        -         -     0%     0%  1.00x    ONLINE  /mnt

Хочу обратить внимание на то, что веб-интерфейс присвоил пулам так называемый ALTROOT. На прикладном уровне это означает, что «точки монтирования» находятся внутри /mnt, т.е. /mnt/ssd и /mnt/tank соответственно. Еще почему-то неправильно вывелся размер «танка», веб-интерфейс показывает более реалистичную цифру.

root@truenas[~]# zpool status
  pool: boot-pool
 state: ONLINE
  scan: resilvered 1.19G in 00:04:47 with 0 errors on Mon Apr 26 17:15:08 2021
config:

        NAME        STATE     READ WRITE CKSUM
        boot-pool   ONLINE       0     0     0
          nvd0p2    ONLINE       0     0     0

errors: No known data errors

  pool: ssd
 state: ONLINE
config:

        NAME                                          STATE     READ WRITE CKSUM
        ssd                                           ONLINE       0     0     0
          gptid/3a94404d-a69b-11eb-a80c-0800270ddf06  ONLINE       0     0     0

errors: No known data errors

  pool: tank
 state: ONLINE
config:

        NAME                                            STATE     READ WRITE CKSUM
        tank                                            ONLINE       0     0     0
          raidz1-0                                      ONLINE       0     0     0
            gptid/5083b011-a6a6-11eb-b83f-0800270ddf06  ONLINE       0     0     0
            gptid/5090d879-a6a6-11eb-b83f-0800270ddf06  ONLINE       0     0     0
            gptid/509a7fa4-a6a6-11eb-b83f-0800270ddf06  ONLINE       0     0     0

errors: No known data errors

Хочу поделиться «приколом». Как вы наверняка заметили, swap-раздел на установочном диске отсутствовал, так вот судя по всему веб-интерфейс создает разделы подкачки на дисках для данных при создании основного пула.

oot@truenas[~]# gpart show
=>       40  251658160  nvd0  GPT  (120G)
         40     532480     1  efi  (260M)
     532520   32997376     2  freebsd-zfs  (16G)
   33529896  218128304     3  freebsd-zfs  (104G)

=>        40  1048575920  ada2  GPT  (500G)
          40          88        - free -  (44K)
         128     4194304     1  freebsd-swap  (2.0G)
     4194432  1044381528     2  freebsd-zfs  (498G)

=>        40  1048575920  ada1  GPT  (500G)
          40          88        - free -  (44K)
         128     4194304     1  freebsd-swap  (2.0G)
     4194432  1044381528     2  freebsd-zfs  (498G)

=>        40  1048575920  ada0  GPT  (500G)
          40          88        - free -  (44K)
         128     4194304     1  freebsd-swap  (2.0G)
     4194432  1044381528     2  freebsd-zfs  (498G)

Причем swap отзеркаленный.

root@truenas[~]# swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/mirror/swap0.eli   2097152        0  2097152     0%

Репликация пула ssd

Если не путаю, на форумах было предложено делать периодические бэкапы SSD-пула на основной. Давайте так и поступим, но прежде надо сказать пару слов о снимках, поскольку система репликации в конечном итоге основана на них. Снимок можно представить как копию файловой системы, хотя есть пример сравнения снимка с некоей ссылкой на версию данных. На файловых системах типа copy-on-write снимки создаются очень быстро, однако при этом возникает такой нюанс: если вы удаляете файл, который есть в снимке, свободное место не высвобождается, нужно удалить все снимки, в которые входил удаленный файл.

Возвращаясь к резервному копированию, для начала создадим так называемый датасет (dataset) – если совсем уж на пальцах, его можно представить как продвинутую директорию – на основном пуле в качестве места назначения (Storage – Pools, меню пула – Add Dataset). К примеру назовем его ssd_backup, настройки в принципе можно не трогать (разве что сжатие переопределить, если установленное на уровне всего пула не подходит).

 

Добавляем задачу репликации (Tasks – Replication Tasks, Add). Source Location (источник): On this System (на этой системе), ssd. Destination Location (назначение): On this System (на этой системе), tank/ssd_backup.

 

Описание флага Recursive несколько вводит в заблуждение – в нем говорится о снимках, но по факту если внутри источника есть вложенные датасеты, то флаг нужно взводить.

На втором шаге предлагается настроить расписание, по умолчанию ежедневно в полночь (Daily). Также есть варианты Hourly (ежечасно), Weekly (по воскресеньям) и Monthly (ежемесячно). Конечно же можно указать и собственное расписание, однако для теста я выберу ежечасную репликацию. Получается как-то так: Replication Schedule – Run On a Schedule (запуск по расписанию), Destination Snapshot Lifetime – Same as Source, т.е. время жизни снимков будет совпадать с исходным (по умолчанию используется две недели).

 

Я нажал Run now, вроде что-то нареплицировал.

 

 

Задача репликации создала в свою очередь задачу периодического создания снимков (snapshot). Повторный ручной запуск задачи репликации уже ни к чему не приведет, поскольку новых снимков нет. Так что для проверки нужно будет создать какой-нибудь файл и дождаться начала следующего часа.

Список снимков находится в Storage – Snapshots, имеются команды удаления, клонирования снимка в новый датасет и отката.

 

Последний штрих, что называется – теперь при желании можно использовать пул ssd для размещения клеток (jail) и плагинов (которые по сути преднастроенные jail). При первом переходе в любой из этих разделов (т. е. Plugins или Jails) будет запрошен выбор пула. Укажем ssd:

 

В результате всех настроек наши пулы приобретают следующий вид:

 

Что интересно, ssd_backup переведен в режим «только чтение». Вот теперь, пожалуй, все.

Заключение

Очень жаль, что для казалось бы элементарного действия – разбиения загрузочного диска – приходится выполнять столь изощренную процедуру. Хотелось бы конечно пожелать добавить подобный функционал в установщик, но увы. Вероятность этого «крайне мала» ©. Стоит ли заморачиваться? Если найдется «маленький» SSD, то может быть и нет. А вот на относительно большом велик соблазн использовать клетки и/или плагины и тогда уже придется пуститься во все тяжкие… Будьте внимательны и не уничтожте случайно данные.


Категория: Решение проблем | Опубликовано 29.04.2021 | Редакция от 20.01.2022

Похожие материалы:


Комментарии, обсуждение

комментарии простроенны на платформе Disqus