Доброго всем времени суток.
Прежде чем писать пост, я изучал freebsd с начала года, читал много статей, старался вникнуть во все, что с этим связано, постоянно спотыкался и вставал вновь, но сейчас я решился обратиться сюда.
Мне была поставлена задача настроить backup-копирование или репликацию сервера Freebsd 10.3, сервер боевой, крутится БД Postgress, php, веб-сервер и т.д., гасить его ни в коем случае нельзя.
На тот момент я в глаза не видел ZFS и всё, что с ним связано.
Прочитал мануал от oracle по zfs я понял, что смогу реализовать два варианта:
1. Выгрузить все дата сеты в архив, скопировать архивы из удаленного сервера на новый и развернуть локально.
2. Отправить целиком пул с датасетами на новый сервер zfs send & zfs receive по ssh.
Вариант 1 мне не понравился сразу, т.к. когда я запустил выгрузку всех снэпшотов в архив
Код:
cd /var/backups/
zfs send main-pool@snapshot_2018.03.19 | gzip -9 > backup_main-pool_`date +%Y.%m.%d`.gz
zfs send main-pool/ROOT@snapshot_2018.03.19 | gzip -9 > backup_main-pool_root_`date +%Y.%m.%d`.gz
zfs send main-pool/ROOT/default@snapshot_2018.03.19 | gzip -9 > backup_main-pool_root_default_`date +%Y.%m.%d`.gz
zfs send main-pool/tmp@snapshot_2018.03.19 | gzip -9 > backup_main-pool_tmp_`date +%Y.%m.%d`.gz
zfs send main-pool/usr@snapshot_2018.03.19 | gzip -9 > backup_main-pool_usr_`date +%Y.%m.%d`.gz
zfs send main-pool/usr/home@snapshot_2018.03.19 | gzip -9 > backup_main-pool_usr_home_`date +%Y.%m.%d`.gz
zfs send main-pool/usr/ports@snapshot_2018.03.19 | gzip -9 > backup_main-pool_usr_ports_`date +%Y.%m.%d`.gz
zfs send main-pool/usr/src@snapshot_2018.03.19 | gzip -9 > backup_main-pool_usr_src_`date +%Y.%m.%d`.gz
zfs send main-pool/var@snapshot_2018.03.19 | gzip -9 > backup_main-pool_var_`date +%Y.%m.%d`.gz
zfs send main-pool/var/audit@snapshot_2018.03.19 | gzip -9 > backup_main-pool_var_audit_`date +%Y.%m.%d`.gz
zfs send main-pool/var/crash@snapshot_2018.03.19 | gzip -9 > backup_main-pool_var_crash_`date +%Y.%m.%d`.gz
zfs send main-pool/var/log@snapshot_2018.03.19 | gzip -9 > backup_main-pool_var_log_`date +%Y.%m.%d`.gz
zfs send main-pool/var/mail@snapshot_2018.03.19 | gzip -9 > backup_main-pool_var_mail_`date +%Y.%m.%d`.gz
zfs send main-pool/var/tmp@snapshot_2018.03.19 | gzip -9 > backup_main-pool_var_tmp_`date +%Y.%m.%d`.gz
сервер начал работать на пределе (хотя сервер у нас арендован не самой слабой мощности), и получилось так, что обработка 500GB данных main-pool/ROOT/default@snapshot_2018.03.19 практически парализовало работу офиса днем, хотя запускал процесс вечером и за ночь он не завершился.
Вариант запуска на выходные можно конечно рассматривать, но я решил идти по пути варианта 2, он мне показался менее нагруженным.
Постараюсь описать подробно, возможно вы мне поможете скорректировать инструкцию, за это вам будет плюс к карме

.
Один сервер находится в Германии, виртуальный сервер я развернул в Москве.
Загружаемся на новом сервере "Freebsd03" с liveCD
Настраиваем сетку. У меня сетевой интерфейс называется em0.
Код:
ifconfig em0 add 192.168.0.9 netmask 255.255.255.0
route add default 192.168.0.254
Для настройки ssh подгружаемся в файловую систему unionfs.
Код:
mkdir /tmp/etc
mount_unionfs /tmp/etc /etc
Редактируем конфиг sshd чтобы подключаться по ssh root-ом.
Код:
ee /etc/ssh/sshd_config
Строка "PermitRootLogin yes"
Создаем любой простой пароль для подключения к этому хосту по ssh.
Код:
passwd root
Запускаем сервис sshd.
Код:
service sshd onestart
Далее я уже подключился для удобства к новому серверу по ssh для вставки всех команд.
Смотрим диски в системе. У меня диск называется da0.
Код:
sysctl -a | grep disk
Смотрим таблицу разметки.
Код:
gpart show
Удаляем ее командой. У меня диск пустой, поэтому аккуратнее с этой командой надо быть
Код:
gpart destroy -F da0
Создаем новую таблицу и делаем разметку диска. Постарался сделать по аналогии с сервером в Германии, только у меня на виртуальном сервере нет зеркала и размер диска будет 800gb.
Цитата:
=> 34 3907029101 ada0 GPT (1.8T)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 3902832640 3 freebsd-zfs (1.8T)
3907028992 143 - free - (72K)
=> 34 3907029101 ada1 GPT (1.8T)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 3902832640 3 freebsd-zfs (1.8T)
3907028992 143 - free - (72K)
Код:
gpart create -s GPT da0
gpart add -t freebsd-boot -s 512 da0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
gpart add -t freebsd-swap -s 2G da0
gpart add -t freebsd-zfs da0
Создаем pool "main-pool".
Вот тут я долго топтался, если исключал ключ -m, то у меня была ошибка, что нельзя смонтировать в "/". Так же читал по другим ключам, но информации по ним очень мало...
Еще на будущее зафиксировал себе, что -f используем в случае, когда устройства при создании зеркала имеют разный размер, пул создастся, но размер будет соответствовать меньшему устройству.
Код:
zpool create -f -O canmount=off -m none main-pool /dev/da0p3
Если посмотреть боевой сервер и новый, то разница в mount-point, я не знаю пока, критично это или нет, но я стараюсь сделать идентичные настройки.
Цитата:
Боевой сервер
zfs list
NAME USED AVAIL REFER MOUNTPOINT
main-pool 1.59G 866G 96K /main-pool
main-pool/ROOT 449M 866G 96K none
main-pool/ROOT/default 449M 866G 448M /
main-pool/tmp 160K 866G 96K /tmp
main-pool/usr 1.15G 866G 96K /usr
main-pool/usr/home 96K 866G 96K /usr/home
main-pool/usr/ports 628M 866G 628M /usr/ports
main-pool/usr/src 547M 866G 547M /usr/src
main-pool/var 900K 866G 96K /var
main-pool/var/audit 104K 866G 96K /var/audit
main-pool/var/crash 96K 866G 96K /var/crash
main-pool/var/log 336K 866G 240K /var/log
main-pool/var/mail 172K 866G 108K /var/mail
main-pool/var/tmp 96K 866G 96K /var/tmp
Новый сервер
zfs list
NAME USED AVAIL REFER MOUNTPOINT
main-pool 85K 771G 19K none
root@:~ # zfs list
Перешел на боевой сервер, с которого буду переносить "main-pool".
Сделал рекурсивный снэпшот пула с дочерними файловыми системами.
Код:
zfs snapshot -r main-pool@snapshot
Список снэпшотов.
Код:
zfs list -t snapshot
Цитата:
NAME USED AVAIL REFER MOUNTPOINT
main-pool@snapshot 0 - 96K -
main-pool/ROOT@snapshot 0 - 96K -
main-pool/ROOT/default@snapshot 460K - 447M -
main-pool/tmp@snapshot 64K - 96K -
main-pool/usr@snapshot 0 - 96K -
main-pool/usr/home@snapshot 0 - 96K -
main-pool/usr/ports@snapshot 8K - 628M -
main-pool/usr/src@snapshot 0 - 547M -
main-pool/var@snapshot 0 - 96K -
main-pool/var/audit@snapshot 8K - 96K -
main-pool/var/crash@snapshot 0 - 96K -
main-pool/var/log@snapshot 96K - 144K -
main-pool/var/mail@snapshot 64K - 96K -
main-pool/var/tmp@snapshot 0 - 96K -
Далее я отправил снэпшот со старого на новый сервер, на котором буду разворачивать main-pool.
Список ключей отметил для себя:
Цитата:
// -R zfs send используется для отправки потока репликации всех дочерних файловых систем
-i zfs send создает инкрементные снэпшоты
-F zfs receive означает перезаписать файловую систему, в том случае если она уже создана
-v zfs receive отображение текущего прогресса
Код:
zfs send -R main-pool@snapshot | ssh 192.168.0.9 zfs receive -vFd main-pool
Прописываем загрузку пула. (Начиная с FreeBSD версии 10, у нас корень является "/ROOT/default", я убил на это понимание 2 дня)
Код:
zpool set bootfs=main-pool/ROOT/default main-pool
Указываем mountpoint для пула main-pool
Код:
zfs set mountpoint=/main-pool main-pool
Делаем экспорт хранилища.
Код:
zpool export main-pool
Подгружаем pool. Импорт экспортированного хранилища.
Цитата:
Если ключ -d не задан, команда ищет /dev/disk. но я все равно указал.
Если размонтировать какую-либо из файловых систем не удается, ее можно размонтировать принудительно с помощью параметра "-f"
Проверяю какой пул готов для импорта
Код:
zpool import
Цитата:
root@:~ # zpool import
pool: main-pool
id: 18244119390875913029
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
main-pool ONLINE
da0p3 ONLINE
Далее моя проблема, в которую я упёрся и не могу понять, что я сделал не так...
Подгружаем pool. Импорт экспортированного хранилища.
Код:
zpool import -f -d /dev/da0p3 main-pool
Далее я проверяю список zfs
Код:
zpool list
И у меня валится ошибка инициализации библиотеки ZFS
Цитата:
root@:~ # zpool list
internal error: failed to initialize ZFS library
root@:~ #
Теперь вопросы по существу:
1. Как мне победить ошибку "failed to initialize ZFS library". Я явно накосячил либо в "zpool create", либо zpool export/import.
2. Подскажите мне как работать со снэпшотами, если их выгрузить в архив, скачать и пытаться развернуть локально. Конкретно я не понимаю как указать эти архивы в livecd и запустить zfs receive из архива в пул. Буду очень рад конструктивному ответу.
3. И третий момент вылез буквально вчера: При тестировании с виртуального сервера на виртуальный, в рамках одного гипервизора, у меня 25GB передает по ssh минут 5, но когда я запустил "zfs send -R main-pool@snapshot | ssh 192.168.0.9 zfs receive -vFd main-pool" из Германии в Москву через интернет - у меня за сутки передалось всего 26GB, причем на сервере-приемнике загрузка памяти была максимальная 10GB из 10GB, и мне кажется, что передача данных застопорилась именно из-за этого.
Пробелы у меня есть, но сразу всю систему осилить после windows очень сложно. Спасибо всем за внимание.