Задать вопрос

Как восстановить систему FreeBSD с ZFS?

Добрый день!
Уже несколько дней разбираюсь со скриптом на восстановление системы, проверил каждый кусок работы скрипта отдельно, кроме последней части.
Скрип отрабатывает нормально кроме последних нескольких строк.
Скрипт 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

Кучу материала уже перечитал но не как не могу разобраться чтобы заработало.
  • Вопрос задан
  • 1204 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы