Решение проблемы с неправильной геометрией диска при попытке поставить FreeBSD на жёсткий диск,
на который не получалось поставить систему штатной утилитой sysinstall.
При переносе системы на терабайтник и написании статьи использовались материалы по следующим ссылкам:
http://m8d.de/news/freebsd-on-gpt.php
http://www.lissyara.su/?id=1704Возникла у меня как-то необходимость заменить в домашнем сервере, который работает
под управлением ОС FreeBSD 7.1 Release, жёсткий диск Samsung SP0411N (40GB,
IDE) на Seagate ST31000333AS (1TB, SATAII). Материнская плата, установленная на сервере -
Asus P5V800-MX (чипсет VIA), поддерживает HDD IDE, SATA и SATAII.
Не долго думая, отключил старый винт, подсоединил новый, вставил в привод DVD
с FreeBSD, запустил установку и... столкнулся с сообщением об ошибке от утилиты fdisk, которой показалось, что
диск имеет неправильную геометрию.
Для меня так и осталось загадкой, что же не понравилось этой утилите в моём новом HDD. Судя по хэндбуку,
ОС должна нормально работать с разделами до 2TB.
Позадавав вопросы на разнообразных форумах, решил попробовать использовать GPT.
Итак, к делу:
1. Подготовка
Загружаюсь со старого диска, на который установлена FreeBSD 7.1 Release при подключенном
новом терабайтнике. У меня в ядре уже была включена поддержка GPT, но
перед работой проверьте в конфигурации ядра наличие строчки
options GEOM_GPT
терабайтник у меня определился как ad4 (а как определился Ваш, можно посмотреть в файле /var/run/dmesg.boot).
2. Создаю схему разметки GPT
Зашёл под рутом и дал команду
gpart create -s GPT ad4
Этой командой я создал схему разметки GPT на провайдере, а провайдером в данном случае выступает ad4,
то есть мой новый диск.
Теперь я дам команду gpart show, которая покажет информацию о GPT в системе,
в моём случае покажет, что диск свободен, начинается с 34 и имеет размером какое-то
страшное число логических блоков, которое тут же и в Гб указывается. В процессе
разметки диска я буду эту команду постоянно использовать, так что будьте готовы.
3. Создаю разделы
Теперь создам загрузочный раздел:
gpart add -b 34 -s 16 -t freebsd-boot ad4
эта команда создала раздел, начиная с логического блока 34, размером в 16 логических блоков, имеющий тип
freebsd-boot и размещающийся на ad4, только ad4 в документации теперь называется не "провайдер", а уже Geom.
Создаем остальные разделы:
gpart add -b 50 -s 2097152 -t freebsd-ufs ad4
этой командой я создал раздел для корневой файловой системы размером в 1 Гб, то есть
раздел начинается с логического блока 50 и занимает 2097152 логических блока. Число,
с которого должен начинаться следующий раздел берём из вывода команды gpart show
(просто смотрим там, с какого блока начинается свободное место), а сколько блоков надо
на один Гб, я выяснил, разделив количество блоков на количество Гб на диске
(эти данные тоже можно посмотреть в выводе команды gpart show).
gpart add -b 2097202 -s 8388608 -t freebsd-swap ad4
это 4 Гб под swap (объём свопа я задал, умножив количество имеющейся у меня в сервере оперативки на 2).
gpart add -b 10485810 -s 8388608 -t freebsd-ufs ad4
это 4 Гб под /tmp - с большим запасом. Я запасливый.
gpart add -b 18874418 -s 20971520 -t freebsd-ufs ad4
это 10 Гб под /var на случай разрастания логов.
gpart add -b 39845938 -s 1913679197 -t freebsd-ufs ad4
и всё остальное под /usr.
После этих манипуляций вывод команды gpart show у меня стал такой:
=> 34 1953525101 ad4 GPT (932G)
34 16 1 freebsd-boot (8.0K)
50 2097152 2 freebsd-ufs (1.0G)
2097202 8388608 3 freebsd-swap (4.0G)
10485810 8388608 4 freebsd-ufs (4.0G)
18874418 20971520 5 freebsd-ufs (10G)
39845938 1913679197 6 freebsd-ufs (913G)
То есть я получил такое размещение разделов на диске:
Раздел Тип Размер Файловая система
ad4p1 freebsd-boot 8KB -
ad4p2 freebsd-ufs 1GB /
ad4p3 freebsd-swap 4GB /swap
ad4p4 freebsd-ufs 4GB /tmp
ad4p5 freebsd-ufs 10GB /var
ad4p6 freebsd-ufs 913GB /usr
4. Делаю диск загрузочным
gpart bootcode -b /dist/boot/pmbr ad4
Теперь запишу в загрузочный код загрузчик FreeBSD:
cp /boot/gptboot /tmp
dd if=/dev/zero bs=641 count=1 >> /tmp/gptboot
И запишу загрузочный код в загрузочный сектор:
dd if=/tmp/gptboot of=/dev/ad4p1 bs=512
5. Инициализирую разделы
Дальше созданные разделы необходимо подготовить для работы, то
есть проинициализировать.
Итак, команды:
newfs -O2 /dev/ad4p2 (12)
newfs -O2 -U /dev/ad4p4 (13)
newfs -O2 -U /dev/ad4p5 (14)
newfs -O2 -U /dev/ad4p6 (15)
P.S. Хочу отметить, что вместо команды gpart можно было попробовать воспользоваться командой gpt.
6. Переношу систему на новый жёсткий диск
В качестве подготовки к переносу создал каталоги /mnt/root, /mnt/var и
/mnt/usr:
mkdir /mnt/root; mkdir /mnt/var; mkdir /mnt/usr (16)
смонтировал туда новые разделы:
mount /dev/ad4p2 /mnt/root
mount /dev/ad4p5 /mnt/var
mount /dev/ad4p6 /mnt/usr
И непосредственно перенос системы:
cd /; pax -p eme -X -rw . /mnt/root (20)
cd /var; pax -p eme -X -rw . /mnt/var (21)
cd /usr; pax -p eme -X -rw . /mnt/usr (22)
Теперь редактирую файл /etc/fstab (на новом диске названия разделов не те, что
на старом, так что система при загрузке с терабайтника попытается смонтировать те разделы, которые были на старом диске.
У меня получился вот такой файл:
# Device Mountpoint FStype Options Dump Pass#
/dev/ad4p3 none swap sw 0 0
/dev/ad4p2 / ufs rw 1 1
/dev/ad4p4 /tmp ufs rw 2 2
/dev/ad4p6 /usr ufs rw 2 2
/dev/ad4p5 /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
Выключаю сервер командой shutdown -p now и отключаю старый диск.
7. Заключение
После включения у меня всё заработало как надо, кроме mysql, потому что его сокет лежал в /tmp,
а во время переноса на директорию /tmp изменились права. Починил командой
chmod 1777 /tmp
Ну и всё. Удачи!
URL: http://www.opennet.dev/soft/FreeBSD_GPT.pdf
Обсуждается: http://www.opennet.dev/tips/info/2047.shtml