Решение проблемы с неправильной геометрией диска при попытке поставить 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 /usr4. Делаю диск загрузочным
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
Неплохой ман по GPT. На самом деле станно, что система не поняла ТБ. Обычно fdisk, bsdlabel и иже с ними сливаются реально только на каких нибудь рейдах более 2ТБ.
Проблемы с определением геометрии диска у fdisk действительно есть.
Я даже когда патч писал. Что-то вроде:--- sbin/fdisk/fdisk.c.orig Thu May 31 17:52:24 2005
+++ sbin/fdisk/fdisk.c Mon Dec 17 18:16:51 2005
@@ -844,7 +847,19 @@
error = ioctl(fd, DIOCGMEDIASIZE, &o);
if (error == 0) {
disksecs = o / u;
- cyls = dos_cyls = o / (u * dos_heads * dos_sectors);
+ cyls = dos_cyls = o / (u * heads * sectors);
+ if (cyls > 1023 && heads > 16 && sectors > 63)
+ return (disksecs);
+ if (cyls > 1023 || heads > 255 || sectors > 63) {
+ sectors = dos_sectors = 63;
+ heads = dos_heads = 16;
+ cyls = dos_cyls = o / (u * heads * sectors);
+ if (cyls > 1023) {
+ heads = dos_heads = 255;
+ cyls = dos_cyls = o / (u * heads * sectors);
+ }
+ dos_cylsecs = cylsecs = heads * sectors;
+ }
}
return (disksecs);Но сейчас, когда есть gpart, format/bsdlabel не нужны.
Попросите закомиттеть в исходники патч. Не всегда есть под рукой диск с установленной системой а с сидирома проделать такие операции проблематично.
>[оверквотинг удален]
>+
>
>dos_cylsecs = cylsecs = heads * sectors;
>+
> }
> }
>
> return (disksecs);
>
>Но сейчас, когда есть gpart, format/bsdlabel не нужны.
интересно поддержка GPT в sysinstall когданить появится?
О господи, кто-то все еще использует CHS-адресацию вместо LBA?Какое ретроградство!
Делал
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
в последней строке вылезло сообщение что /dev/ad4p1 invalid argument
и так же не загружается с этого винта(
Кто-нибудь сталкивался с подобным?
Хороший MAN
Спасибо
В этой строке либо ошибка
gpart add -b 34 -s 16 -t freebsd-boot ad4
либо размер блока может быть разным.
В моём случае со старым сказёвым винтом:
gpart add -b 34 -s 256 -t freebsd-boot ad4
только что угробил на ту тему день. :) короче - можнго и не gpt(у меня биос как раз не умел), достаточно вместо mbr/dos type указать bsd type для винта - и все работает. то есть во время разметки - в описании самого винта - modify - и выбираем bsd. далее - безслайсовая структура, просто перечень разделов. все встало и загрузилось.