Перенос FreeBSD сервера с ZFS root файловой системой на новый pool

Попались мне под руку пара винтов побольше и еще один компьютер. Наслышан я о чудесах и простоте переноса ZFS и решил попробовать.

Задача перенести сервер под FreBSD, что уже работает, на новый сервер с помощью ZFS.

Ну и так сказать своеобразный бекап.

Бекап это сомнительно. Потому как на исходном тоже стоит всё на «мирроре»

Создаем ключ

# ssh-keygen

# cat /root/.ssh/id_rsa.pub | ssh root@127.0.0.1 ‘cat >> /root/.ssh/authorized_keys’

[root@server ~]# zpool list -v

NAME                                     SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT

Грузимся с CD и работаем в Live-режиме mfsBSD

# mkdir /root/.ssh

# camcontrol devlist

vi /etc/ssh/sshd_config 

В конфиге разрешаем root-у логиниться. 

Отключаем DNS проверку, чтобы побыстрее было немного. 

PermitRootLogin yes 

UseDNS no 

Задаем пароль для пользователя root: 

# passwd root 

Указываем интерфейсу нужный IP адрес 

ifconfig re0 add 127.0.0.0.1/24 

или dhclient re0

запускаем sshd: /etc/rc.d/sshd onestart

Далее создаём разделы…

# gpart create -s gpt ada0

# gpart add -b 40 -s 512k -t freebsd-boot ada0

# gpart add -s 8g -t freebsd-swap ada0

# gpart add -t freebsd-zfs ada0

[root@mfsbsd ~]# gpart show

=>        40  1953522976  ada0  GPT  (932G)

          40        1024     1  freebsd-boot  (512K)

        1064    16777216     2  freebsd-swap  (8.0G)

    16778280  1936744736     3  freebsd-zfs  (924G)

Создаем пул:

# zpool create -f tank /dev/ada0p3

Пул готов к приёму данных.

Переходим на сервер-источник. 

Создаем рекурсивный снапшот, который и будем передавать:

# zfs snapshot -r tank@21-04-13 

Передаем его на сервер приемник:

# screen

# zfs send -vR tank@21-04-13 | ssh 127.0.0.0.1 zfs recv -F tank

Ждем окончания передачи. У меня примерно 213 GB передавалось около 12 часов.

Переходим опять на сервер-приемник root@mfsbsd:~ 

# csh

# zfs list -t snapshot 

# zpool list

# mkdir /tmp/tank

# mount -t zfs tank/root /tmp/tank

# gpart bootcode -b /tmp/tank/boot/pmbr -p /tmp/tank/boot/gptzfsboot -i 1 ada0

# chroot /tmp/tank

Ввиду того, что с сервера-источника нам передалось всё, то поправим немного /etc/fstab. Дело в том, что своп на источнике подключен в fstab по меткам gpt. 

Настройка по меткам

# cat /etc/fstab

/dev/gptid/dadde41e-913d-11eb-92f9-ac1f6bd74a62 none swap sw 0 0

# gpart list

2. Name: ada0p2

   Mediasize: 8589934592 (8.0G)

   Sector Size: 512

   Stripe Size: 4096

   Stripe Offset: 0

   Mode: r0w0e0

   defimedia: HD(2,GPT,fffe5673-d7ad-11dd-a24d-50465d8ab2bb,0x428,0x1000000)

   rawuuid: fffe5673-d7ad-11dd-a24d-50465d8ab2bb

   rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b

   label: (null)

   length: 8589934592

   offset: 544768

   type: freebsd-swap

   index: 2

   end: 16778279

   start: 1064

# vi /etc/fstab 

/dev/gptid/dadde41e-913d-11eb-92f9-ac1f6bd74a62 none swap sw 0 0 >

fffe5673-d7ad-11dd-a24d-50465d8ab2bb

Второй вариант без меток

[root@msfbsd ~]# cat /etc/fstab 

# Device Mountpoint FStype Options Dump Pass#

### /dev/gpt/swap0 none swap sw 0 0

>

/dev/ada0p2 none swap sw 0 0

Правим файлы в скопированной системе.

[root@mfsbsd ~]#

# zfs umount -a

# exit

Скажем кто у нас bootfs и сделаем экспорт:

# zpool set bootfs=tank/root tank

# zpool export tank

# shutdown -r now

На источнике можно удалить ненужный снапшот: 

# zfs destroy -r tank@move

Взял на afabla немного подправил на свой лад. Автору респект!

Добавление жесткого диска в FreeBSD

Вы узнаете, как за 5 минут добавить жесткий диск в FreeBSD. Итак. Сначала будет преведена полная инструкция для понимания процесса, а в конце будет краткий список действий, которое будет содержать лишь список команд в качестве шпаргалки.

Подробная инструкция с пояснениями

Выбор имени жесткого диска

Для начала нужно определить имя устройства, которое мы только что добавили. В этом нам поможет следующая команда:

geom disk list
01 - geom disk list

Или же вот такая команда:

camcontrol devlist
02 - camcontrol devlist

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

До установки нового устройства мы знали, что наша система установлена на ada0, значит по логике вещей наш новый диск ada1. Это вы можете определить по названию нового устройства, его серийному номеру или же объему.

Теперь проверим, имеется ли разметка на нашем новом диске

gpart show ada1
03 - gpart show ada1

Диск не имеет никакой разметки.

Удаление существующей разметки

Если диск уже использовался и есть необходимость удалить с него разметку, просто выполните:

gpart destroy -F ada1

Создание разметки GPT

Для начала мы должны создать разметку диска. Крайне рекомендую забыть о MBR и перейти на новую, более удобную и функциональную — GPT.

Создаем разметку GPT на диске, затем проверяем, что вышло:

gpart create -s gpt /dev/ada1
gpart show ada1
04 - gpart create gpt

Теперь у нас диск имеет разметку GPT. Из вывода можно увидеть, что абсолютно весь диск, начиная с LBA 34 и заканчивая LBA 8388541 пуст. LBA 0−33 — зарезервированы системой под таблицу разделов.

Допустим, нам необходимо создать два раздела на этом диске:

  • swap — раздел подкачки
  • data — раздел типа ufs для хранения каких либо, необходимых нам, данных.

Создание разделов (слайсов)

Если установка производится на современные жесткие диски, у которых размер сектора = 4 кб, то при создании разделов (партиций) необходимо использовать выравнивание. Можно поступить двумя способами: 1) если указываем параметры раздела в блоках, то номер блока вводить кратным 8, например: -b 40; 2) если указываем размер раздела в байтах, либо не указываем вообще начало и размер, использовать параметр -a 4k, который подгонит начало и конец раздела под секторы, размером 4 кб. Так как мы в данном примере производим тестовую установку на виртуальный жесткий диск, то этого можно не делать. В любом случае перед созданием разделов нужно точно знать размер сектора вашего накопителя, иначе это выльется жуткими тормозами в работе.

Теперь создадим разделы. Для этого существует команда gpart add с различными параметрами. Первый параметр -t — указывает на тип создаваемой файловой системы. В нашем случае будет использовано два типа: freebsd-swap и freebsd-ufs. Далее идут два необязательных параметра: -b — указывает на номер LBA, начиная с которого необходимо создать раздел. Если не указать данный параметр, то раздел будет создан автоматически с первого свободного LBA. -s — указывает на размер раздела в LBA. Размер одного блока LBA = 512 байт. Желательно указывать в количестве блоков LBA, но можно и в кило/мега/гига/… байтах (суффикс k/M/G). Если не указать данный параметр, то раздел будет создан до максимально возможного LBA в пределах пустой области. Также в качестве параметра можно указать метку раздела, например: -l swap1 — в этом случае будет создана метка /dev/gpt/swap1, по которой можно более удобно обращаться к разделу. Последним обязательным параметром идет путь к диску. В нашем случае: /dev/ada1.

Давайте создадим два раздела, а затем посмотрим, что у нас получилось. Первый раздел будем создавать без указания начального LBA, но с указанием размера 1 Гб (2097152 блоков). Второй раздел создадим без указания начального LBA и без указания размера — таким образом он будет создан на всем свободном пространстве.

gpart add -t freebsd-swap -s 2097152 /dev/ada1
gpart add -t freebsd-ufs /dev/ada1
gpart show ada1
05 - gpart add

Размер можно указывать в байтах, а не блоках. Это значительно удобней. Единственный минус — система не всегда может корректно рассчитать количество блоков. Возможны случаи, когда на диске останется пустовать некоторое количество блоков при указании размера раздела в байтах.

Создание файловой системы (форматирование)

Разделы типа swap форматировать нет необходимости. А вот разделы типа ufs перед использованием должны быть отформатированы. Правильнее сказать: на них должна быть создана файловая система.

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

newfs -U /dev/ada1p2
06 - newfs

В данном случае использовался параметр -U — он говорит о том, что в данной файловой системе должен использоваться механизм Soft Updates. Вы можете не использовать этот параметр, чтобы не включать данный механизм.

Монтирование

Следующим шагом будет монтирование разделов. Для начала, чтобы не забыть, добавим наши новые разделы в /etc/fstab. Мой файл после редактирования выглядит вот так:

07 - etc fstab

Я добавил две строки: первая монтирует swap, вторая монтирует новый раздел в каталог /mnt. На деле у вас должен быть какой-то более значимый каталог. Каталог /mnt служит для временно монтированных устройств.

Для того, чтобы перемонтировать все разделы согласно файла /etc/fstab, просто выполним команду:

mount -a
08 - mount a

Как видно из вывода, раздел /dev/ada1p2 смонтирован. Теперь посмотрим, что произошло с разделом SWAP. Выполним команду:

swapinfo
09 - swapinfo 1

Как видно, новый раздел SWAP не смонтирован. Чтобы смонтировался SWAP, необходимо его включить специальной командой:

swapon /dev/ada1p1
10 - swapon

Точно так же при помощи команды swapoff нужно отключать раздел SWAP перед тем, как произвести над ним какие-то действия.

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

Краткая инструкция

Дано: жесткий диск /dev/ada1

Цель: удалить существующую разметку, создать новую разметку GPT, создать два раздела: подкачка и данные и подключить их к рабочей системе.

После каждого действия выполняйте gpart show, чтобы наблюдать за результатом. Последовательность действий:

  1. Удалить существующую разметку: gpart destroy -F ada1
  2. Создать новую разметку: gpart create -s gpt /dev/ada1
  3. Создать два раздела: подкачка и данные: gpart add -t freebsd-swap -s 2097152 /dev/ada1 gpart add -t freebsd-ufs /dev/ada1
  4. Создать файловую систему UFSv2 на втором разделе: newfs -U /dev/ada1p2
  5. Добавить в файл /etc/fstab строки для автомонтирования при загрузке: /dev/ada1p1 none swap sw 0 0 /dev/ada1p2 /mnt ufs rw 2 2
  6. Смонтировать новый раздел (команда монтирует все разделы из файла /etc/fstab): mount -a
  7. Включить в работу новый раздел swap командой: swapon /dev/ada1p1

На этом настройка завершена.

Из материалов denisbondar.com