В virt-manager создаём ВМ, тип FreeBSD, диск qcow2, остальное по умолчанию, кроме cache mode: writeback. Размер диска должен быть не меньше занимаемого данными объёма на physical + swap + запас, но спокойно может быть меньше физического.
Бутимся в неё с iso frenzy, далее поднимаем сеть и sshd:
ifconfig em0 inet 12.34.56.78 netmask 255.255.255.0
route add default 12.34.56.1
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
/etc/rc.d/sshd onestart
passwd root
Двигаем на physical, там:
df -h смотрим имена узлов и занимаемый объём данных на них
Будет что-то вида:
Код:
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 496M 169M 287M 37% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1d 1.5G 26M 1.4G 2% /var
/dev/ad0s1e 496M 10K 456M 0% /tmp
/dev/ad0s1f 15G 410M 13G 3% /usr
bsdlabel ad0s1 > liveSPsizes, там будет что-то вида:
Код:
# /dev/ad0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 1048576 0 4.2BSD 0 0 0
b: 2291584 1048576 swap
c: 39862305 0 unused 0 0
d: 3241984 3340160 4.2BSD 0 0 0
e: 1048576 6582144 4.2BSD 0 0 0
f: 32231585 7630720 4.2BSD 0 0 0
Если размер целевого виртуального диска будет отличаться от исходного (а он скорее всего будет), то этот файлик надо отредактировать:
Код:
# /dev/ad0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 1048576 0 4.2BSD 0 0 0
b: 2291584 1048576 swap
c: * 0 unused 0 0
d: 3241984 3340160 4.2BSD 0 0 0
e: 1048576 6582144 4.2BSD 0 0 0
f: * * 4.2BSD 0 0 0
В этом примере мы оставляем все разделы, кроме f (/usr) старого размера, а тот подгонится автоматически под размер нового носителя. Не забываем про фейковый "раздел" c!
scp liveSPsizes root@12.34.56.78:~ и пока оставляем physical в покое, идём на virtual.
Подготавливаем новый диск, слайсы, разделы, загрузочную запись:
fdisk -BI /dev/ad0
Ругнётся
Код:
Fdisk: invalid fdisk partition table found
Fdisk: Class not found
но это нормально, не обращаем внимания.
bsdlabel -B -w ad0s1
bsdlabel -R ad0s1 liveSPsizes
newfs /dev/ad0s1a; mkdir /mnt/root; mount /dev/ad0s1a /mnt/root
newfs -U /dev/ad0s1d; mkdir /mnt/var; mount /dev/ad0s1d /mnt/var
newfs -U /dev/ad0s1e #это /tmp, копировать его бессмысленно.
newfs -U /dev/ad0s1f; mkdir /mnt/usr; mount /dev/ad0s1f /mnt/usr
Идём опять на physical, где начинается самая нудная часть нашей истории
dump -0aLf - / | ssh root@12.34.56.78 "cd /mnt/root && cat | restore -rf -"
dump -0aLf - /var | ssh root@12.34.56.78 "cd /mnt/var && cat | restore -rf -"
dump -0aLf - /usr | ssh root@12.34.56.78 "cd /mnt/usr && cat | restore -rf -"
Делается это довольно долго, так что имеет смысл заранее остановить все службы, кроме sshd, в особенности СУБД. Скорость порядка 2Мб/сек.
Имеет смысл сделать полный дамп заранее, т.к. это займёт несколько часов, а при окончательном переносе делать инкрементальный дамп, типа:
dump -1aLf - /var | ssh root@12.34.56.78 "cd /mnt/var && cat | restore -rf -"
Идём на virtual, редактируем /mnt/root/etc/fstab в соответствии с изменившимся именем диска и /mnt/root/etc/rc.conf в соответствии с изменившимся именем сетевого интерфейса, который мы пока просто закомментируем.
Shutdown, бросаем последний взгляд на настройки виртуалки и грузимся на этот раз с харда. В принципе всё должно быть ОК, только надо сразу сделать chmod 1777 /tmp
Перегружаемся, убеждаемся, что всё поднялось, отключаем сеть physical и поднимаем сетевой интерфейс у virtual.
Писалось это как памятка для себя, потому без подробных разъяснений, если что-то непонятно, спрашивайте.