Перемещение FreeBSD на диск меньшего размера
Как известно, ZFS не может быть уменьшена, но это не значит что ничего нельзя сделать.
Это краткий мануал, здесь не будет расписано что какая команда делает, документация к каждой команде идёт в комплекте с FreeBSD.



Структура диска:

Код:
# gpart show -p
=>      40  234441568    ada0  GPT  (112G)
        40    131072  ada0p1  efi  (64M)
    131112      1024  ada0p2  freebsd-boot  (512K)
    132136  234309472  ada0p3  freebsd-zfs  (112G)

Различия с исходным HDD на 500G только в размере ada0p3.



Грузимся в Live USB/CD/DVD FreeBSD (на которой заранее размечен дополнительный раздел в UFS2+SU: da0s4).

Код:
zpool import -R /mnt freebsd0
mkdir -p /tmp/backup
mount /dev/da0s4 /tmp/backup
zfs snap -r freebsd0@MOVE
// Если есть возможность воткнуть сразу два диска, то send|recv и dd можно совместить. В этом случае не понадобится временный раздел.
Код:
zfs send -Lwp freebsd0@MOVE >/tmp/backup/freebsd0.zfs
dd if=/dev/ada0p1 of=/tmp/backup/ada0p1.efi.img bs=8m
dd if=/dev/ada0p2 of=/tmp/backup/ada0p2.gptboot.img bs=512k
sync;sync;sync;reboot

Меняем диски…

Код:
gpart create -s gpt ada0
gpart add -t efi -s 64m -a 4k -l efiboot0 -i 1 ada0
gpart add -t freebsd-boot -s 512k -l gptboot0 -i 2 ada0
gpart add -t freebsd-zfs -l freebsd0 -i 3 ada0
zpool create -O compress=lz4 -O atime=off -m none -o failmode=continue -O utf8only=on freebsd0 /dev/gpt/freebsd0
mkdir -p /tmp/backup
mount /dev/da0s4 /tmp/backup
dd of=/dev/ada0p1 if=/tmp/backup/ada0p1.efi.img bs=8m
dd of=/dev/ada0p2 if=/tmp/backup/ada0p2.gptboot.img bs=512k
zfs recv -e freebsd0 </tmp/backup/freebsd0.zfs
zfs rename ... # перемещаем ВСЕ датасеты из freebsd0/freebsd0/* в freebsd0/*
zfs destroy freebsd0/freebsd0
zpool set bootfs=freebsd0/ROOT/13.1R freebsd0
gpart bootcode -b /boot/pmbr ada0
sync;sync;sync;reboot

Первая загрузка может быть с проблемами по ряду причин, ещё одна перезагрузка после полной загрузки ставит всё на свои места.
Правила форума
[Новичкам] Как правильно задавать вопросы, чтобы Вам помогли

«Буду бить аккуратно, но сильно!» © Лёлик, х/ф «Бриллиантовая рука»
Ответ
(30.10.2022 02:Oct)mord0d Написал: Первая загрузка может быть с проблемами по ряду причин, ещё одна перезагрузка после полной загрузки ставит всё на свои места.

Это как? Само починится?
Ответ
(01.11.2022 07:Nov)Zhbert Написал:
(30.10.2022 02:Oct)mord0d Написал: Первая загрузка может быть с проблемами по ряду причин, ещё одна перезагрузка после полной загрузки ставит всё на свои места.

Это как? Само починится?

Есть ненулевая вероятность, что при штатном завершении работы останется рантайм мусор (pid-файлы, lock-файлы), которые при штатной загрузке система сама определит как мусор и зачистит перед запуском соответствующих сервисов. Но при (после) переносе этого может не произойти с первого раза (atime?). Если дождаться этапа LOGIN и перезагрузиться, то вероятнее всего оно отдуплится и пропердится. Если не помогло — загрузиться в Single User, пройтись лапками по /var/run (который в FreeBSD не в tmpfs) и зачистить мусор (можно грохнуть всю диру, неотключаемый сервис /etc/rc.d/var создаст всё нужное при следующей multi-user загрузке), но мне этого делать не пришлось.
Правила форума
[Новичкам] Как правильно задавать вопросы, чтобы Вам помогли

«Буду бить аккуратно, но сильно!» © Лёлик, х/ф «Бриллиантовая рука»
Ответ