...slogans are forgotten like fairy-tales were
Статьи и переводы » Удаленная разбивка HDD
Хочу поделиться опытом полученным при решении одной, довольно тривиальной, на первый взгляд, задачи.
Условия задачи просты:
Имеем доступный только по сети сервер, т.е. физического доступа, в случае какой-либо моей ошибки, к нему не предвидится. На этом сервере есть винчестер разбитый всего на один слайс не занимающий всего доступного пространства. То есть на диске есть неутилизированное место и нужно подготовить это место к использованию.
Замечание: здесь нет подробных описаний работы с утилитами, так как это прекрасно описано в других источниках.
Решив в начале потренироваться на кошках, устанавливаю на виртальную машину VMware операционную систему FreeBSD 6.2. Размер виртуального диска я взял 2 гигабайта. При установке был создан один слайс размером 1 гигабайт. Остальное место послужит испытательным полигоном:
Необходимо добавить еще один слайс объемом 1 гигабайт, добавить в него один BSD-раздел, на этом BSD-разделе создать UFS2 файловую систему и прописать монтирование BSD-раздела в /etc/fstab. После этого, для уверенности, перезагрузимся и посмотрим загружается ли FreeBSD вообще и монтируется ли файловая система при загрузке.
Итак, первая мысль приходящая в голову, это сделать все с помощью утилиты sysinstall, ведь она и слайс сделает с BSD-разделом и файловую систему создаст. Sysinstall — и дело с концом.
Перед работой с дисками в sysinstall следует сказать:
sysctl kern.geom.debugflags=16
Это включит ``foot shooting'' в GEOM (см. geom(4)), без этого sysinstall не сможет изменить таблицу разделов на работающей системе:
а с этим сможет:
Но тут-то как раз и засада. Дело в том, что добавляя второй слайс, sysinstall, судя по выводу fdisk, назначает их оба активными:
The data for partition 1 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 2096577 (1023 Meg), flag 80 (active) beg: cyl 0/ head 1/ sector 1; end: cyl 1023/ head 15/ sector 63 The data for partition 2 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 2096640, size 2097648 (1024 Meg), flag 80 (active) beg: cyl 1023/ head 255/ sector 63; end: cyl 1023/ head 15/ sector 63
Из-за этого мы получаем сообщение об испорченой таблице разделов при загрузке:
...или не получаем ICMP-ответа от сервера, если он доступен только по сети.
Оказывается, это поведение уже описано в нескольких PR. Например, в этом: http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/72895
Обойти эту проблему можно, если, в том же sysinstall, сразу же после добавления нового слайса явно указать активный раздел.
Отлично, слайс добавили, хотя немного и поплясали с бубном. Следующая часть решения задачи состоит в добавления нового BSD-раздела.
Здесь стоит сразу же сказать о еще одной проблеме sysinstall. Эта утилита при добавлении слайса или BSD-раздела, не создает соответсвующих устройств в devfs. А чтобы что-нибудь сделать с только что созданным устройством, например, создать BSD-раздел на слайсе, этот слайс должен быть виден системой. Я пока не нашел другого решения этой проблемы кроме перезагрузки. PR об этом: http://www.freebsd.org/cgi/query-pr.cgi?pr=79621
Перед перезагрузкой можно временно добавить в /etc/sysctl.conf строку устанавливающую kern.geom.debugflags в 16, чтобы не выставлять эту sysctl-переменную каждый раз после перезагрузки.
Перезагружаемся и проверяем наличие нового слайса в /dev. Добавляем новый BSD-раздел. Перед записью данных на диск, Toggle Newfs со спокойной душой можно поставить в ``N'', так как файловая система все равно не может быть создана, потому, что новый BSD-раздел будет доступен только после перезагрузки. Игнорируем ошибки о невозможности смонтировать этот раздел и, в итоге, получаем примерно такое:
Если сейчас выйти из sysinstall и перегрузить сервер, то повторится тоже самое, что и при добавлении слайса. И все из-за тех же двух активный разделов. Решение аналогично. Необходимо после добавления нового BSD-раздела с помощью меню label сразу же зайти в меню fdisk и выставить нужный активный раздел.
Перезагружаемся :-) Проверяем наличие нового BSD-раздела в /dev.
Теперь нужно создать файловую систему на новом разделе. Заходим в сисинсталовский disklabel editor. Встаем на наш новый раздел, назначаем mount point, и не забудем воспользоватся Toggle Newfs. После записи данных на диск, снова идем в редактор слайсов и назначаем активный раздел. Команда mount показывает, что новый раздел смонтирован:
/dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1e on /tmp (ufs, local, soft-updates) /dev/ad0s1f on /usr (ufs, local, soft-updates) /dev/ad0s1d on /var (ufs, local, soft-updates) /dev/ad0s2d on /newspace (ufs, local, soft-updates)
Не забудем убрать из /etc/sysctl.conf то, что временно добавляли.
На этом большая часть задачи решена. Хотя мне, после всего этого, перехотелось использовать sysinstall на живом сервере и я решил попробовать связку fdisk+bsdlabel+newfs.
Чтобы добавить новый слайс воспользуемся утилитой fdisk:
fdisk -u /dev/ad0
fdisk встречает нас такой речью:
******* Working on device /dev/ad0 ******* parameters extracted from in-core disklabel are: cylinders=4161 heads=16 sectors/track=63 (1008 blks/cyl)
Используем данные о цилиндах, головках и секторах для выяснения размера диска: 4161*16*63 = 4194288 (секторов). Это число нам понадобится для вычисления размера второго слайса.
Далее fdisk говорит, что
The data for partition 1 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 2096577 (1023 Meg), flag 80 (active)
Значит следующий слайс будет начинатся с 2096577+63=2096640-го сектора. И размер его будет составлять 4194288-2096640=2097648 (секторов).
Когда fdisk спросит про редактирование второго раздела мы укажем только что вычисленные данные.
Проверяем присутствие нового слайса:
# fdisk -- SKIPPED -- sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 2096577 (1023 Meg), flag 80 (active) beg: cyl 0/ head 1/ sector 1; end: cyl 1023/ head 15/ sector 63 The data for partition 2 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 2096640, size 2097648 (1024 Meg), flag 0 beg: cyl 32/ head 0/ sector 1; end: cyl 64/ head 15/ sector 63 -- SKIPPED --
ls -l /dev/ad0s2
crw-r----- 1 root operator 0, 95 Sep 15 19:15 /dev/ad0s2
Пишем стандартную метку BSD (на весь раздел):
bsdlabel -w /dev/ad0s2
После этого метка будет иметь такой вид:
# size offset fstype [fsize bsize bps/cpg] a: 2097632 16 unused 0 0 c: 2097648 0 unused 0 0 # "raw" part, don't edit
Открываем метку на редактирование:
bsdlabel -e /dev/ad0s2
В открывшемся текстовом редакторе редактируем первую строку с разделом ``a''. Поскольку на разделе ``a'' обычно корневая система, на ``b'' swap, а ``с'' используется для доступа ко всему слайсу, то изменим букву раздела с ``a'' на ``d''. Также нужно прописать ``4.2BSD'' в поле fstype. Сохранив изменения и выйдя из редактора, должно получится следующее:
# size offset fstype [fsize bsize bps/cpg] c: 2097648 0 unused 0 0 # "raw" part, don't edit d: 2097632 16 4.2BSD 0 0 0
Проверим наличие BSD-раздела:
ls -l /dev/ad0s2d
crw-r----- 1 root operator 0, 97 Sep 15 19:15 /dev/ad0s2d
На созданном BSD-разделе создаем файловую систему UFS2 с Soft Updates:
newfs -U /dev/ad0s2d
Что ж, сапог оказался в бою надежнее, и я на живом сервере предпочту воспользоваться этой связкой для разбивки диска, а не sysinstall.
Заранее создав точку монтирования, прописываем новый BSD-раздел в /etc/fstab:
/dev/ad0s2d /newspace ufs rw 2 2
Перед перезагрузкой лучше всего убедится, что с новой файловой системой все в порядке:
# fsck /dev/ad0s2d ** /dev/ad0s2d (NO WRITE) ** Last Mounted on /newspace ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups 2 files, 2 used, 506609 free (25 frags, 63323 blocks, 0.0% fragmentation)
После чего, перезагружаемся и проверяем корректность всего, чего натворили.
Перед началом работы с реальной машиной я предпочел перезагрузить ее. Это дало точное знание того, что если она не загрузится после моих действий с диском, то в этом я сам и виноват.
Также очень хорошей идеей будет сохранить информацию о дисках где-то в безопасном месте, например, на своей рабочей машине. При чем, информацию о ВСЕХ дисках в системе, даже если мы их трогать не собираемся.
Получаем информацию о слайсах:
fdisk ad0
Получаем информацию о BSD-разделах:
bsdlabel /dev/ad0s1
Потом, положив полученный вывод в файл, можно восстановить BSD-разделы командой:
bsdlabel -R /dev/ad0s1 file
Теперь, в случае чего, у нас будет достаточно информации для восстановления. Остается только пожелать того, чтобы по прямому назначению эту информацию применять не пришлось.
Рад видеть дочитавшего до этого места читателя и буду рад в двойне если информация предоставленная здесь оказалась кому-нибудь хоть чем-то полезной.
СпасиБо.
Аналогичная ситуация.
Необходимо выполнить миграцию с софтового райда на новые харды сделать и загнать их в райд
При использовании sysinstall, при разметке диска (задание точек монтирования), они автоматически монтируются, например создается раздел /usr, сразу же (при записи) монтируется в /usr - в этом загвоздка, если можно как-то отменить такое поведение было вообще супер
ps: FreeBSD-7.2
Автор daemon666, 28/03/2011 9:49am (9 лет назад)