Рассмотрим реальную задачу, с которой мне пришлось не так давно столкнуться. Есть инсталляция FreeBSD. Используется таблица разделов GPT, все лежит на одном-единственном UFS разделе. Проблема — оказывается, чтобы ядро FreeBSD могло записать свою собственную корку , ему требуется swap-раздел. Притом, не обязательно использовать его именно как swap, просто нужен дополнительный раздел без файловой системы. Воспользоваться md или еще какими-то хаками это обойти не выходит.
Начальные условия:
=> 40 234441568 ada0 GPT (112G)
40 409600 1 efi (200M)
409640 234031967 2 freebsd-ufs (112G)
234441607 1 — free — (512B)
Трогать разделы на живой системе мне лично как-то стремно, понадобится загрузочная флешка:
Я лично все делал в однопользовательском режиме, но в рамках данной статьи это не принципиально. Интересно, что если бы корень (/) лежал на отдельном разделе, по идее можно было бы безо всяких флэшек и Live CD загрузиться в однопользовательском режиме и потрогать все остальные разделы. К сожалению, на момент установки системы я был еще молод и глуп 🙂
Примечание: В интернетах пишут, что при очень сильном желании можно все делать прямо на работающей системе, временно приказав:
Но я бы так делать не советовал.
Первым делом после загрузки с флэшки делаем бэкап с помощью утилиты dump. Для бэкапа я лично использовал отдельный USB-накопитель:
dump -af / mnt / root.dmp / dev / ada0p2
# или то же самое, только со сжатием:
# dump -af — /dev/ada0p2 | gzip > /mnt/root.dmp.gz
Меняем размер партиции (ключ -a задает выравнивание, см man gpart ):
gpart show
Сразу создаем swap-раздел (без указания размера будет использовано все свободное место):
gpart show
Если бы мы увеличивали, а не уменьшали размер партиции, в этом месте можно было бы просто сказать:
К сожалению, мы уменьшаем, а UFS из коробки сжиматься не умеет. Поэтому говорим:
mount / dev / ada0p2 / mnt / e733mnt
cd / mnt / e733mnt
# утилите restore нужен записываемый /tmp
mount -t tmpfs tmpfs / tmp
restore -r -f / mnt / root.dmp
В итоге получилось:
=> 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 ):
ddb_enable=»YES»
Говорим:
… и убеждаемся, что теперь корки пишутся в /var/crash!
А часто ли вам приходится трогать gpart и вообще что-то менять в разбиении дисков?