Восстановление системы с ZFS

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-11 22:28:45

Здравствуйте!

У кого-нибудь получилось произвести процедуру резервного восстановления с системой zfs по инструкции указанной на сайте Лиссяры?
Тут возникла у меня необходимость сделать это. Переменные в скрипте поменял на свои, но восстановление не проходит. Скрипт спотыкается на пункте "# Работаем над обеспечением геометрии с 4K" zpool create. Пишет, что не возможно создать. И загрузка с фтп не начинается (фтп доступен, т.к. gptzfsboot и pmbr скачиваются нормально). Щас скрин ошибок выложить не могу, сделаю завтра его.
Но может быть что-то изменилось в скрипте, что не поменяли на сайте?
Бэкап прошел успешно, необходимые файлы лежат в папке на фтп.

Прошу помочь разобраться! Нужно сделать восстановление. Случайно удалилась сама :smile: папка /usr/local/etc

Релиз 10.3 amd64

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Восстановление системы с ZFS

Непрочитанное сообщение snorlov » 2016-05-11 22:51:42

Приведите ссылку на лиса, а то скриптов множество имеется. Кстати, а что стояло то? если 10.2 то ее и надо мучать
версии zfs могут быть разные...

vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-11 23:08:19

http://www.lissyara.su/?id=2224#null
Стоит 10.3 (бэкап свежий).
А возможно ли на свеже-установленную систему и с созданым zfs пулом (через bsdinstall), просто залить этот файл бэкапа для восстановления? Железо не менялось.

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Восстановление системы с ZFS

Непрочитанное сообщение snorlov » 2016-05-12 9:35:45

Наверное ругается на тему, что ваш zpool уже имеется, в скрипте восстановления в начале до применения gpart добавьте строчку

Код: Выделить всё

 dd if=/dev/zero of=/dev/ada0 bs=1M count=2048
 
т.е. затерите всю информацию zfs на диске

dimidrol80
рядовой
Сообщения: 38
Зарегистрирован: 2008-06-07 17:50:21
Контактная информация:

Восстановление системы с ZFS

Непрочитанное сообщение dimidrol80 » 2016-05-12 11:57:41

После затирания информации нужно еще раз перезагрузить ПК (так как ошибка все равно будет выскакивать).

vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-12 14:45:42

В общем все затер - перезагрузился.
Запустил скрипт. Восстановление спотыкается в нескольких местах.

Полный вывод лога (сори внутри кода ошибки выделить цветом не получается):
Они тут=>
cannot mount '/mnt/tank': failed to create mountpoint
cp: /tmp/tank/tmp/root/boot/zfs/zpool.cache: No such file or directory

Код: Выделить всё

# sh /tmp/bsdrestor.sh
script: Create GPT, add partitions...
ada1 created
script: add freebsd-boot partition boot0
ada1p1 added
script: add freebsd-swap partition swap0
ada1p2 added
script: blk_begin=34
script: blk_end=234441581
script: blk_swop_begin=2048
script: blk_swop_end=8388608
script: blk_zfs_begin=8390656
script: blk_long=226050952
script: add freebsd-zfs partition data0, long is 226050952 blocks
ada1p3 added

script: GPT on ada1 created, partitions added.

add net default: gateway 192.168.22.1
script: Download backup boot records from ftp start....
Connected to 192.168.22.1.
220 Welcome to ASUS RT-AC68U FTP service.
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
250 Directory successfully changed.
250 Directory successfully changed.
250 Directory successfully changed.
local: /tmp/gptzfsboot remote: fb103.tank.2016.05.08_2213.gptzfsboot
200 EPRT command successful. Consider using EPSV.
150 Opening BINARY mode data connection for /tmp/mnt/FreeAgent_Drive/FreeBSD/Fre
eBSD_Backup_08.05.2016/fb103.tank.2016.05.08_2213.gptzfsboot (42143 bytes).
100% |***********************************| 42143       12.55 MiB/s    00:00 ETA
226 File send OK.
42143 bytes received in 00:00 (11.29 MiB/s)
221 Goodbye.
Connected to 192.168.22.1.
220 Welcome to ASUS RT-AC68U FTP service.
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
250 Directory successfully changed.
250 Directory successfully changed.
250 Directory successfully changed.
local: /tmp/pmbr remote: fb103.tank.2016.05.08_2213.pmbr
200 EPRT command successful. Consider using EPSV.
150 Opening BINARY mode data connection for /tmp/mnt/FreeAgent_Drive/FreeBSD/Fre
eBSD_Backup_08.05.2016/fb103.tank.2016.05.08_2213.pmbr (512 bytes).
100% |***********************************|   512       15.75 MiB/s    00:00 ETA
226 File send OK.
512 bytes received in 00:00 (910.74 KiB/s)
221 Goodbye.
bootcode written to ada1
=>       34  234441581  ada1  GPT  (112G)
         34          6        - free -  (3.0K)
         40       1024     1  freebsd-boot  (512K)
       1064        984        - free -  (492K)
       2048    8388608     2  freebsd-swap  (4.0G)
    8390656  226050952     3  freebsd-zfs  (108G)
  234441608          7        - free -  (3.5K)

=>       34  234441581  ada1  GPT  (112G)
         34          6        - free -  (3.0K)
         40       1024     1  boot0  (512K)
       1064        984        - free -  (492K)
       2048    8388608     2  swap0  (4.0G)
    8390656  226050952     3  data0  (108G)
  234441608          7        - free -  (3.5K)

script: Create ZFS pool...
GEOM_NOP: Device gpt/data0.nop created.
ZFS filesystem version: 5
ZFS storage pool version: features support (5000)
cannot mount '/mnt/tank': failed to create mountpoint
GEOM_NOP: Device gpt/data0.nop removed.
script: Create filesystem...

script: Receive system from ftp start....
receiving full stream of tank@2016.05.08_2213 into tank@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/ROOT@2016.05.08_2213 into tank/ROOT@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/ROOT/default@2016.05.08_2213 into tank/ROOT/default@2016.05.08_2213
received 5.59GB stream in 72 seconds (79.5MB/sec)
receiving full stream of tank/usr@2016.05.08_2213 into tank/usr@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/usr/src@2016.05.08_2213 into tank/usr/src@2016.05.08_2213
received 968MB stream in 7 seconds (138MB/sec)
receiving full stream of tank/usr/home@2016.05.08_2213 into tank/usr/home@2016.05.08_2213
received 732MB stream in 20 seconds (36.6MB/sec)
receiving full stream of tank/usr/ports@2016.05.08_2213 into tank/usr/ports@2016.05.08_2213
received 2.51GB stream in 77 seconds (33.3MB/sec)
receiving full stream of tank/var@2016.05.08_2213 into tank/var@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/var/tmp@2016.05.08_2213 into tank/var/tmp@2016.05.08_2213
received 43.0KB stream in 1 seconds (43.0KB/sec)
receiving full stream of tank/var/mail@2016.05.08_2213 into tank/var/mail@2016.05.08_2213
received 53.6KB stream in 1 seconds (53.6KB/sec)
receiving full stream of tank/var/log@2016.05.08_2213 into tank/var/log@2016.05.08_2213
received 24.7MB stream in 1 seconds (24.7MB/sec)
receiving full stream of tank/var/audit@2016.05.08_2213 into tank/var/audit@2016.05.08_2213
received 44.2KB stream in 1 seconds (44.2KB/sec)
receiving full stream of tank/var/crash@2016.05.08_2213 into tank/var/crash@2016.05.08_2213
received 43.0KB stream in 1 seconds (43.0KB/sec)
receiving full stream of tank/tmp@2016.05.08_2213 into tank/tmp@2016.05.08_2213
received 398KB stream in 1 seconds (398KB/sec)
script: Receive system from ftp finish

script: Copy zpool cache...
cp: /tmp/tank/tmp/root/boot/zfs/zpool.cache: No such file or directory
script: done!
enter please command 'reboot'
Ну и как следствие этих ошибок, при рестарте получаю:

Код: Выделить всё

/
Can't find /boot/zfsloader

FreeBSD/x86 boot
Default: tank:/boot/kernel/kernel
boot:
-
Can't find /boot/kernel/kernel
Выбор boot:/tank/ROOT/default вешает консоль

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Восстановление системы с ZFS

Непрочитанное сообщение snorlov » 2016-05-12 14:58:26

Попробуй вместо

Код: Выделить всё

zpool create -f -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache ${tank} \
 /dev/gpt/data0.nop
записать это

Код: Выделить всё

zpool create -f -o altroot=/tmp -o cachefile=/var/tmp/zpool.cache ${tank} \
 /dev/gpt/data0.nop
ты ведь стартуешь с сд или флешки, которая только на чтение...

vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-12 15:54:28

Первая ошибка ушла. С фтп все затянулось.
Выдало вторую.. Прописал оставшееся руками, все команды без ошибок..
Но.. результат после рестарта тотже. boot не находит, указываю принудительно tank/ROOT/default не стартует, запрашивает снова путь.

lazhu
сержант
Сообщения: 254
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Восстановление системы с ZFS

Непрочитанное сообщение lazhu » 2016-05-12 17:20:48

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

vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-12 18:22:58

По поводу ваших ссылок => ушел на подробное изучение!
По поводу курилки автора статьи => по поискову гугл она всплывает на чуть ли не первой (на первой странице точно)! Ведешься на то, что бэкап проходит как по рельсам.. ну а как часто приходится делать восстановление? В моем случае - это первое.. после первой неудачи много читал по zfs в справке оракла, где по описанию очень легко и просто имея snapshot системы А по факту Нууу очень сложно для понимания новичку восстанавливать из файла img.gz (как и видно по вопросу в соответствующем разделе форума).
По поводу копипаста хомячками => хоть я и новичок, но не делаю ctrC+ctrV. Я этот скрипт старался на элементарные разобрать прежде чем использовать, но согласен что не все в нем понял. Читал также используемые статьи... а вот как раз в части создания zfs-пула и залива на него бэкап образа в статье оочееень скудно описано...

Отправлено спустя 1 минуту 53 секунды:
Спасибо за ваш комментарий!

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Восстановление системы с ZFS

Непрочитанное сообщение snorlov » 2016-05-12 19:44:35

Я лично пользуюсь этой ссылкой для системы https://www.dan.me.uk/blog/2012/08/05/f ... using-zfs/, правда там носитель жесткий диск, а не ftp...

vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-12 19:58:25

У кого есть конструктивные предложения по моему случаю?

Отправлено спустя 33 секунды:
Желательно: что куда зачем :)

lazhu
сержант
Сообщения: 254
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Восстановление системы с ZFS

Непрочитанное сообщение lazhu » 2016-05-12 22:05:58

1. Грузитесь с флешки и заходите в режим командной строки (Fixit, кажется)
2. Выводите список сетевых интерфейсов:

Код: Выделить всё

ifconfig
3. На нужном интерфейсе настраиваете сеть. Например, так (данные подставьте свои):

Код: Выделить всё

ifconfig rl0 192.168.0.10 netmask 255.255.255.0
route add default 192.168.0.1
echo 'nameserver 8.8.8.8' > /etc/resolv.conf
4. Загружаете модули поддержки zfs (в 10-ке, возможно, уже не надо, в этом случае система ругнется, что модули уже загружены):

Код: Выделить всё

kldload opensolaris.ko
kldload zfs.ko
5. Размечаете gpt (имена подставьте свои):

Код: Выделить всё

gpart destroy -F ada0
gpart create -s GPT ada0
gpart add -t freebsd-boot -l boot0 -s 128k ada0
gpart add -t freebsd-swap -l swap -s 2G ada0
gpart add -t freebsd-zfs -l disk0 ada0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
6. Проверяете, доступны ли какие-либо пулы zfs, и, если доступны, удаляете их (имена подставьте свои):

Код: Выделить всё

zpool list
zpool destroy -f zroot
7. Скачиваете файл бэкапа, где бы он у вас ни находился (ssh, ftp, http).
8. Создаете новый пул, заливаете на него бэкап, копируете кэш (имена подставьте свои):

Код: Выделить всё

zpool create zroot /dev/gpt/disk0
zfs receive -vdF zroot < snapshot_file
zfs set mountpoint=/mnt zroot
zpool export zroot
zpool import zroot
cp /boot/zfs/zpool.cache /mnt/boot/zfs/zpool.cache
Если снэпшот сжат gzip'ом, можно заливать так:

Код: Выделить всё

gunzip snapshot_file.gz | zfs receive -vdF zroot
9.

Код: Выделить всё

zfs unmount -a
zfs set mountpoint=legacy zroot
init 6

dimidrol80
рядовой
Сообщения: 38
Зарегистрирован: 2008-06-07 17:50:21
Контактная информация:

Восстановление системы с ZFS

Непрочитанное сообщение dimidrol80 » 2016-05-13 11:39:53

Я сам пользуюсь скриптом который по ссылке на сайте Лиса з небольшими переделками (переделки заключаются в разбиение на партиции при бекапе так и востановлении).
1. Ошибка

Код: Выделить всё

cannot mount '/mnt/tank': failed to create mountpoint
она совсем не критична. Если посмотреть по скрипту то дальше создается папка с названием пула и в него как раз импортируется пул. Лично у меня все работает.
2. lazhu, ошибка загрузки все равно будет так как надо установить корневую файловую систему. У меня zfs set mountpoint=/ ${tank}
судя по логам
vintbsd писал(а): tank/ROOT
или
vintbsd писал(а): tank/ROOT/default
Я не селен в установке по умолчаниюFreeBSD у меня все делает скрипт. Могу ошибаться так что извиняйте

vintbsd
проходил мимо
Сообщения: 7
Зарегистрирован: 2016-05-11 21:58:30

Восстановление системы с ZFS

Непрочитанное сообщение vintbsd » 2016-05-13 19:14:08

dimidrol80, если не трудно, выложите свой скрипт восствновления. Хочу сравнить.

lazhu
сержант
Сообщения: 254
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Восстановление системы с ZFS

Непрочитанное сообщение lazhu » 2016-05-13 21:06:00

dimidrol80, не надо ничего монтировать в /

Код: Выделить всё

~ zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
zroot                      73.5G   155G  1.15G  legacy
zroot/tmp                   316K   155G   316K  /tmp
zroot/usr                  70.2G   155G  3.87G  /usr
zroot/usr/home             64.8G   155G  64.8G  /usr/home
zroot/usr/ports            1.53G   155G   262M  /usr/ports
zroot/usr/ports/distfiles  1.21G   155G  1.21G  /usr/ports/distfiles
zroot/usr/ports/packages   70.5M   155G  70.5M  /usr/ports/packages
zroot/var                  2.16G   155G   199M  /var
zroot/var/crash            31.5K   155G  31.5K  /var/crash
zroot/var/db               1.95G   155G  1.94G  /var/db
zroot/var/db/pkg           11.1M   155G  11.1M  /var/db/pkg
zroot/var/empty              31K   155G    31K  /var/empty
zroot/var/log              13.3M   155G  13.3M  /var/log
zroot/var/mail              488K   155G   488K  /var/mail
zroot/var/run              76.5K   155G  76.5K  /var/run
zroot/var/tmp              33.5K   155G  33.5K  /var/tmp
Загружаться не будет только, если забыли кэш положить в /boot/zfs.

dimidrol80
рядовой
Сообщения: 38
Зарегистрирован: 2008-06-07 17:50:21
Контактная информация:

Восстановление системы с ZFS

Непрочитанное сообщение dimidrol80 » 2016-05-16 11:11:21

vintbsd,
Ок
Скрипт востановления

Код: Выделить всё

#!/bin/sh
# Переменные
# Перед выполнением проверить и отредактировать!

# Имя диска (устройства)
dev=ada0

# Имя создаваемого пула
tank="tank0"
# Имя востанавливаемого Сервера (uname -n)
Uname="exemple.com"
# имя сетевого интерфейса
if_lan=em0
# адрес хоста на момент восстановления
ip_host="192.168.0.116"
# адрес шлюза
ip_gw="192.168.0.1"
# адрес ftp сервера c файлами восстановления
ip_ftp="192.168.0.11"
# порт ftp сервера c файлами восстановления
port_ftp="21"
# логин и пароль ftp сервера c файлами восстановления
usr="backup"
pass="mysuperpass"

awk="/usr/bin/awk"
# Строка даты и времени резервной копии
backup_data="25-04-2016"
# ================= Расcчитываемыt занчения, для, справки ======================
# имя файла-архива с запакованным пулом
#backup_f="$Uname.tank0.${backup_data}.img.gz"
# имя резервных копий файлов загрузчиков
backup_gptzfsboot="$Uname.${tank}.${backup_data}.gptzfsboot"
backup_pmbr="$Uname.${tank}.${backup_data}.pmbr"
backup_snapshot="$Uname.snapshot.${backup_data}.txt"
### =============== Разбивка диска, для, справки ===============================

# =========== Тело скрипта ===================================================
echo "script: Create GPT, add partitions..."
gpart create -s gpt $dev

echo "script: add freebsd-boot partition boot0"
gpart add -b 34 -s 64k -t freebsd-boot -l boot0 ${dev}

echo "script: add freebsd-swap partition swap0"
gpart add -s 4G -t freebsd-swap -l swap0 ${dev}
echo "script: add freebsd-zfs partition disk0"
gpart add -t freebsd-zfs -l disk0 ${dev}

echo " "
echo "script: GPT on $dev created, partitions added."
echo " "

sleep 5
# Настраиваем сеть
ifconfig ${if_lan} inet ${ip_host} netmask 255.255.255.0
# Пропишем шлюз по умолчанию  команда route:
route add default ${ip_gw}
#Обязательно задержка, а то сразу сеть не поднимается!
sleep 10

#Загружаем с FTP серевера резервные копии загрузчиков
# /boot/pmbr и /boot/gptzfsboot
echo "script: Download backup boot records from ftp start...."
ftp -i -A -P ${port_ftp} -o /tmp/gptzfsboot ftp://${usr}:${pass}@${ip_ftp}/${backup_gptzfsboot}
ftp -i -A -P ${port_ftp} -o /tmp/pmbr ftp://${usr}:${pass}@${ip_ftp}/${backup_pmbr}
ftp -i -A -P ${port_ftp} -o /tmp/snapshot ftp://${usr}:${pass}@${ip_ftp}/${backup_snapshot}
#Имя Пула который востанавливаем
Snapshot=`cat /tmp/snapshot | awk -F@ 'FNR==1 {print $1}'`
# Записываем загрузчик в загрузочную область.
# Корректно делать резервную копию /boot/pmbr и /boot/gptzfsboot
# с последующим восстановлением из нее, а не а не с того,
# что подвернется на загрузочной флешке.
# Это нужно, чтобы загрузчик совпадал с загрузчиком исходной системы
# Поэтому вместо
#gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ${dev}
# пишем:
gpart bootcode -b /tmp/pmbr -p /tmp/gptzfsboot -i 1 ${dev}
gpart show ${dev}
sleep 3
gpart show -l ${dev}
sleep 5
# Create ZFS pool
echo "script: Create ZFS pool..."
# Работаем над обеспечением геометрии с 4K
gnop create -S 4096 /dev/gpt/disk0
zpool create -f -o altroot=/mnt -o version=28 -o cachefile=/var/tmp/zpool.cache ${tank} /dev/gpt/disk0.nop
zpool export ${tank}
gnop destroy /dev/gpt/disk0.nop
mkdir /tmp/${tank}
zpool import -o altroot=/tmp/${tank} -o cachefile=/var/tmp/zpool.cache ${tank}
# указываем, что пул загрузочный
zpool set bootfs=${tank} ${tank}
sleep 3
# Create ZFS-filesystem
echo "script: Create filesystem..."
# ну зачем же? для быстродействия синтетического теста? За уши?
zfs set atime=off ${tank}
# Включаем контрольные суммы посерьезнее.
zfs set checksum=fletcher4 $tank
########################
# А так получаем нужный нам поток:
# ftp -i -A -P 8022 -o - ftp://proxy3:proxy3@192.168.16.19/$Uname.tank.2012.11.01_1735.img.gz
# С распаковкой и передачей на вход zfs:
# ftp -i -A -P 8022 -o - ftp://proxy3:proxy3@192.168.16.19/$Uname.tank.2012.11.01_1735.img.gz | gzip -d -с | zfs receive -vF -d tank
# итого с учетом переменных для возможности настройки:
echo "script: Receive system from ftp start...."
cat /tmp/snapshot | $awk '/'${tank}'/ {print $1}' | while read line
do
echo $line
pool=`echo $line | $awk '/'${tank}'/ {gsub("\/",".") ; print $1}'`
echo $pool
ftp -i -A -P ${port_ftp} -o - ftp://${usr}:${pass}@${ip_ftp}/$Uname.${pool}.img.gz | gzip -d -c | zfs receive -vF -d ${tank}
done
echo "script: Receive system from ftp finish"
sleep 5
# вообще это лишнее, но не мешает
#mkdir /tmp/root
# что бы добраться до результирующего "/boot/zfs/zpool.cache"
# приходится стучать в бубен
zfs set mountpoint=/tmp/root ${tank}
# то же лишнее
cd /tmp
zpool export ${tank}
zpool import -o altroot=/tmp/${tank} -o cachefile=/var/tmp/zpool.cache ${tank}
echo "script: Copy zpool cache..."
# Копируем zpool.cache на своё место. Только не пропустите этот шаг, были случаи )
# Сей чудовый путь забавен, но логически верен. Проверено.
# И запись выше "mkdir /tmp/root" вообще лишняя
cp /var/tmp/zpool.cache /tmp/${tank}/tmp/root/boot/zfs/zpool.cache
# отмотируем все это безобразие
zfs unmount -af
# вернем пул в корень
zfs set mountpoint=/ ${tank}
echo "script: done!"
echo "enter please command 'reboot'"
# reboot systemm
#reboot
Только внимание этот скрипт тебе не подойдет потому что у тебя вся система в одном файле у меня разбито по партициям
Для справки скрипт резервного копирования

Код: Выделить всё

#!/bin/sh
# резервное копирование

#имя пула
poolname='tank0'
#дата и время
DATE=`date +%d-%m-%Y`
cd /tmp/
pwd
Uname=`uname -n`
#Делаем рекурсивный снапшот пула с корня
zfs snapshot -r ${poolname}@${DATE}

#рисуем результат
zfs list -t snapshot |awk 'FNR>1 {print}' > /tmp/$Uname.snapshot.${DATE}.txt

ftpkeys="-i -a -A -P 21"
usr="backup"
pass="mysuperpass"
ftpsrv="192.168.0.11"

#отправляем на сервер
uname -n > /tmp/$Uname.txt
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.txt
rm /tmp/$Uname.txt

#отправляем загрузчик и загрузочную область на сервер
gpart show > /tmp/$Uname.gpart.${DATE}.txt
cp /boot/pmbr /tmp/$Uname.${poolname}.${DATE}.pmbr
cp /boot/gptzfsboot /tmp/$Uname.${poolname}.${DATE}.gptzfsboot
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.gpart.${DATE}.txt
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.snapshot.${DATE}.txt
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.${poolname}.${DATE}.pmbr
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.${poolname}.${DATE}.gptzfsboot



#Вариант полный, с запаковкой, медленный
#1160334296 bytes sent in 18:26 (1.00 MiB/s)
#Тут узкое место по времени - процесс сжатия,
#можно попробовать сжимать с меньшей эффективностью,
#но не вижу пока необходимости.
cat $Uname.snapshot.${DATE}.txt | awk '/'${poolname}'/ {print $1}' | while read line
do
#echo $line
pool=`echo $line | awk '/'${poolname}'/ {gsub("\/","."); print $1}'`
#echo $pool
zfs send $line | gzip -7 | ftp ${ftpkeys} -u ftp://${usr}:${pass}@${ftpsrv}/$Uname.$pool.img.gz -
done

###zfs send -R ${poolname}@${DATE} | gzip -4 | ftp ${ftpkeys} -u ftp://${usr}:${pass}@${ftpsrv}/$Uname.${poolname}.${DATE}.img.gz -
###echo "------- end send snapshot '${poolname}.${DATE}', sleep 4c ----"

#Вариант полный, без запаковки, быстрый
#4814869016 bytes sent in 01:07 (68.14 MiB/s)
#zfs send -R ${poolname}@${DATE} | ftp ${ftpkeys} -u \
#ftp://${usr}:${pass}@${ftpsrv}/$Uname.${poolname}.${DATE}.img -
#echo "------- end send snapshot '${poolname}.${DATE}', sleep 4c ----"

sleep 4
echo 'Backup Complete'

#удаляем снапшот
zfs destroy -r ${poolname}@${DATE}
rm /tmp/$Uname.${poolname}.${DATE}.pmbr
rm /tmp/$Uname.${poolname}.${DATE}.gptzfsboot
rm /tmp/$Uname.snapshot.${DATE}.txt
rm /tmp/$Uname.gpart.${DATE}.txt
Отправлено спустя 20 минут 2 секунды:
lazhu,
Загружаться не будет только, если забыли кэш положить в /boot/zfs.
Да все верно.
Я сужу по логам которые выкладывал vintbsd,
receiving full stream of tank/ROOT@2016.05.08_2213 into tank/ROOT@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/ROOT/default@2016.05.08_2213 into tank/ROOT/default@2016.05.08_2213
У него какой то из этих разделов смонтирован в корень. Из этого следует чтоб нормально заработало нужно правильно смонтировать корневой раздел.
vintbsd писал(а): cp: /tmp/tank/tmp/root/boot/zfs/zpool.cache: No such file or directory
В этом месте вместо tank должен быть tank/ROOT или tank/ROOT/default
Зделать вывод команды
lazhu писал(а): zfs list
Мой совет после копирования zpool cache закоментировать все что осталось до конца и вручную посмотреть по какому пути находиться кеш пула и вручнуб его скопировать.
После того как вручную скопировали выполнить команды которые остались.
dimidrol80 писал(а): zfs unmount -af
# вернем пул в корень
zfs set mountpoint=legacy ${tank}
reboot
Отправлено спустя 17 секунд:
lazhu,
Загружаться не будет только, если забыли кэш положить в /boot/zfs.
Да все верно.
Я сужу по логам которые выкладывал vintbsd,
receiving full stream of tank/ROOT@2016.05.08_2213 into tank/ROOT@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/ROOT/default@2016.05.08_2213 into tank/ROOT/default@2016.05.08_2213
У него какой то из этих разделов смонтирован в корень. Из этого следует чтоб нормально заработало нужно правильно смонтировать корневой раздел.
vintbsd писал(а): cp: /tmp/tank/tmp/root/boot/zfs/zpool.cache: No such file or directory
В этом месте вместо tank должен быть tank/ROOT или tank/ROOT/default
Зделать вывод команды
lazhu писал(а): zfs list
Мой совет после копирования zpool cache закоментировать все что осталось до конца и вручную посмотреть по какому пути находиться кеш пула и вручнуб его скопировать.
После того как вручную скопировали выполнить команды которые остались.
dimidrol80 писал(а): zfs unmount -af
# вернем пул в корень
zfs set mountpoint=legacy ${tank}
reboot

kokman
проходил мимо

Восстановление системы с ZFS

Непрочитанное сообщение kokman » 2017-07-13 14:59:28

Добрый день!
Уже несколько дней разбираюсь со скриптом на восстановление системы, проверил каждый кусок работы скрипта отдельно, кроме последней части.
Скрип отрабатывает нормально кроме последних нескольких строк.
Скрипт backup:

Код: Выделить всё

#!/bin/sh
poolname='zroot'
DATE="`date +%Y.%m.%d_%H%M`"
echo "script start in `date +%Y.%m.%d_%H:%M`"
zfs snapshot -r ${poolname}@${DATE}
zfs list -t snapshot

echo "backup start in `date +%Y.%m.%d_%H:%M`"

/usr/sbin/mount_smbfs -I 19x.54.xx.xx //xxxxxxxxxx@storage/lso/ /mnt/

rm -f /mnt/backup/bfg/bfg.*

cp /boot/pmbr /mnt/backup/bfg/bfg.${poolname}.${DATE}.pmbr
cp /boot/gptzfsboot /mnt/backup/bfg/bfg.${poolname}.${DATE}.gptzfsboot

zfs send -R ${poolname}@${DATE} | gzip -9 > /mnt/backup/bfg/bfg.${poolname}.${DATE}.gz

/sbin/umount /mnt/

echo "backup end in `date +%Y.%m.%d_%H:%M`"

zfs destroy -r ${poolname}@${DATE}
Скрипт restore:

Код: Выделить всё

#!/bin/sh

# The name of the disk.
dev=da0

# Name of the created pool.
tank=zroot

# Host network address.
ip_host="19x.54.xx.xx"

# Address of NC server.
ip_ftp="19x.54.xx.xx"

# Port NC server.
port_nc="xxxx"

# Login and password of the NC server.
usr="fsbackup"
pass=${usr}
path="/mnt/drake/lso/backup/bfg"

# Date and time of the backup.
backup_data="2017.07.13_0916"

# Archive name with a packed pool.
backup_f="bfg.zroot.${backup_data}.gz"

# The names of files downloaders.
backup_gptzfsboot="bfg.zroot.${backup_data}.gptzfsboot"
backup_pmbr="bfg.zroot.${backup_data}.pmbr"

# Removing all partitions.
gpart destroy -F ${dev}

# Mashing the beginning of the disc.
dd if=/dev/zero of=/dev/${dev} bs=1M count=2048

# Partitioning the disk and creating partitions.
echo "script: Create GPT, add partitions..."
gpart create -s gpt $dev

echo "script: add freebsd-boot partition boot0"
gpart add -b 40 -s 1024 -t freebsd-boot -l boot0 ${dev}

echo "script: add freebsd-swap partition swap0"
gpart add -b 2048 -s 4G -t freebsd-swap -l swap0 ${dev}

# Calculating long 3, primary partition, ZFS.

# Starting block and long blocks in the entire device (disk).
blk_begin=`gpart show ${dev} | grep '=>' | awk '{a = $2; print a}'`
echo "script: blk_begin=${blk_begin}"
blk_end=`gpart show ${dev} | grep '=>' | awk '{a = $3; print a}'`
echo "script: blk_end=${blk_end}"

# Initial and long block in the blocks section (freebsd-swap).
blk_swop_begin=`gpart show ${dev} | grep 'freebsd-swap' | awk '{a = $1; print a}'`
echo "script: blk_swop_begin=${blk_swop_begin}"
blk_swop_end=`gpart show ${dev} | grep 'freebsd-swap' | awk '{a = $2; print a}'`
echo "script: blk_swop_end=${blk_swop_end}"

# The initial block partition ZFS.
blk_zfs_begin=$((${blk_swop_begin} + ${blk_swop_end}))
echo "script: blk_zfs_begin=${blk_zfs_begin}"

# Long desired in the blocks ZFS partition taking into account the multiplicity 8 blocks (4K).
blk_long=$(( (((${blk_begin}+${blk_end})-${blk_zfs_begin})/8)*8 ))
echo "script: blk_long=${blk_long}"

echo "script: add freebsd-zfs partition data0, long is ${blk_long} blocks"
gpart add -s ${blk_long} -t freebsd-zfs -l data0 ${dev}

echo " "
echo "script: GPT on $dev created, partitions added."
echo " "

sleep 10

/usr/sbin/mount_smbfs -I 19x.54.xx.xx //xxxxxxxxxx@storage/lso/ /mnt/

# Download from FTP server backup loaders (/boot/pmbr и /boot/gptzfsboot)
echo "script: Download backup boot records from ftp start...."
cp /mnt/backup/bfg/${backup_gptzfsboot} /tmp/gptzfsboot
cp /mnt/backup/bfg/${backup_pmbr} /tmp/pmbr

/sbin/umount /mnt/

# Record loader in the boot sector.
gpart bootcode -b /tmp/pmbr -p /tmp/gptzfsboot -i 1 ${dev}

gpart show ${dev}
sleep 3
gpart show -l ${dev}
sleep 5

# Create ZFS pool
echo "script: Create ZFS pool..."

sysctl vfs.zfs.prefetch_disable=1

gnop create -S 4096 /dev/gpt/data0
zpool create -f -o altroot=/tmp -o cachefile=/var/tmp/zpool.cache ${tank} /dev/gpt/data0.nop
zpool export ${tank}
gnop destroy /dev/gpt/data0.nop
mkdir /tmp/${tank}
zpool import -o altroot=/tmp/${tank} -o cachefile=/var/tmp/zpool.cache ${tank}

zpool set bootfs=${tank} ${tank}

sleep 3

echo "script: Create filesystem..."

zfs set checksum=fletcher4 $tank

echo "script: Receive system from nc start...."
echo "Please enter following command on storage: \"cat ${path}/${backup_f} | nc ${ip_host} ${port_nc}\""
nc -l ${port_nc} | gzip -d -c | zfs receive -vF -d ${tank} 

echo "script: Receive system from nc finish"

sleep 5

mkdir /tmp/root
zfs set mountpoint=/tmp/root ${tank}
cd /tmp
zpool export ${tank}
zpool import -o altroot=/tmp/${tank} -o cachefile=/var/tmp/zpool.cache ${tank}
echo "script: Copy zpool cache..."
cp /var/tmp/zpool.cache /tmp/${tank}/tmp/root/boot/zfs/zpool.cache

zfs unmount -af
zfs set mountpoint=legacy ${tank}

echo "script: done!"
echo "enter please command 'reboot'"
Вот на эту команду выдает сообщение:

Код: Выделить всё

cp /var/tmp/zpool.cache /tmp/${tank}/tmp/root/boot/zfs/zpool.cache: No such file or directory
И соответственно при загрузке:

Код: Выделить всё

/
Can't find /boot/zfsloader

FreeBSD/x86 boot
Default: zroot:/boot/kernel/kernel
boot:
-
Can't find /boot/kernel/kernel
Кучу материала уже перечитал но не как не могу разобраться чтобы заработало.