Решение проблемы с неправильной геометрией диска при попытке поставить 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
И запишу загрузочный код в загрузочный сектор:
gpart bootcode -p /boot/gptboot -i 1 ad4
Другой вариант записи:
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 на ранних версиях FreeBSD можно было воспользоваться
командой gpt, однако во FreeBSD 8.0 команды 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
Ну и всё. Удачи!
|