Пример переразбиения диска во FreeBSD с помощью gpart
Рассмотрим реальную задачу, с которой мне пришлось не так давно столкнуться. Есть инсталляция FreeBSD. Используется таблица разделов GPT, все лежит на одном-единственном UFS разделе. Проблема – оказывается, чтобы ядро FreeBSD могло записать свою собственную корку, ему требуется swap-раздел. Притом, не обязательно использовать его именно как swap, просто нужен дополнительный раздел без файловой системы. Воспользоваться md или еще какими-то хаками это обойти не выходит.
Начальные условия:
$ gpart show
=> 40 234441568 ada0 GPT (112G)
40 409600 1 efi (200M)
409640 234031967 2 freebsd-ufs (112G)
234441607 1 - free - (512B)
Трогать разделы на живой системе мне лично как-то стремно, понадобится загрузочная флешка:
sudo dd if=FreeBSD-11.0-RC2-amd64-memstick.iso of=/dev/da0 bs=1
Я лично все делал в однопользовательском режиме, но в рамках данной статьи это не принципиально. Интересно, что если бы корень (/) лежал на отдельном разделе, по идее можно было бы безо всяких флэшек и Live CD загрузиться в однопользовательском режиме и потрогать все остальные разделы. К сожалению, на момент установки системы я был еще молод и глуп :)
Примечание: В интернетах пишут, что при очень сильном желании можно все делать прямо на работающей системе, временно приказав:
sudo sysctl kern.geom.debugflags=16
Но я бы так делать не советовал.
Первым делом после загрузки с флэшки делаем бэкап с помощью утилиты dump. Для бэкапа я лично использовал отдельный USB-накопитель:
mount /dev/da1 /mnt
dump -af /mnt/root.dmp /dev/ada0p2
# или то же самое, только со сжатием:
# dump -af - /dev/ada0p2 | gzip > /mnt/root.dmp.gz
Меняем размер партиции (ключ -a задает выравнивание, см man gpart):
gpart resize -i 2 -a 4k -s 96G ada0
gpart show
Сразу создаем swap-раздел (без указания размера будет использовано все свободное место):
gpart add -t freebsd-swap -a 4k ada0
gpart show
Если бы мы увеличивали, а не уменьшали размер партиции, в этом месте можно было бы просто сказать:
growfs ada0p2
К сожалению, мы уменьшаем, а UFS из коробки сжиматься не умеет. Поэтому говорим:
newfs /dev/ada0p2
mount /dev/ada0p2 /mnt/e733mnt
cd /mnt/e733mnt
# утилите restore нужен записываемый /tmp
mount -t tmpfs tmpfs /tmp
restore -r -f /mnt/root.dmp
В итоге получилось:
$ gpart show
=> 40 234441568 ada0 GPT (112G)
40 409600 1 efi (200M)
409640 201326592 2 freebsd-ufs (96G)
201736232 32705368 3 freebsd-swap (16G)
234441600 8 - free - (4.0K)
После загрузки системы в /etc/rc.conf дописываем (см man dumpon):
dumpdev="/dev/ada0p3"
ddb_enable="YES"
Говорим:
sudo sysctl debug.kdb.panic=1
… и убеждаемся, что теперь корки пишутся в /var/crash!
А часто ли вам приходится трогать gpart и вообще что-то менять в разбиении дисков?