Удаленная разбивка HDD

Автор: Артем Бисярин
 

Оглавление:

 

О чем пойдет речь?

Хочу поделиться опытом полученным при решении одной, довольно тривиальной, на первый взгляд, задачи.

Условия задачи просты:

Имеем доступный только по сети сервер, т.е. физического доступа, в случае какой-либо моей ошибки, к нему не предвидится. На этом сервере есть винчестер разбитый всего на один слайс не занимающий всего доступного пространства. То есть на диске есть неутилизированное место и нужно подготовить это место к использованию.

Замечание: здесь нет подробных описаний работы с утилитами, так как это прекрасно описано в других источниках.

Тестируем в VMware

Решив в начале потренироваться на кошках, устанавливаю на виртальную машину VMware операционную систему FreeBSD 6.2. Размер виртуального диска я взял 2 гигабайта. При установке был создан один слайс размером 1 гигабайт. Остальное место послужит испытательным полигоном:

Необходимо добавить еще один слайс объемом 1 гигабайт, добавить в него один BSD-раздел, на этом BSD-разделе создать UFS2 файловую систему и прописать монтирование BSD-раздела в /etc/fstab. После этого, для уверенности, перезагрузимся и посмотрим загружается ли FreeBSD вообще и монтируется ли файловая система при загрузке.

Разбиваем диск

Используем sysinstall

Итак, первая мысль приходящая в голову, это сделать все с помощью утилиты sysinstall, ведь она и слайс сделает с BSD-разделом и файловую систему создаст. Sysinstall — и дело с концом.

Создаем слайс с помощью 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-раздела.

Здесь стоит сразу же сказать о еще одной проблеме 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.

Создаем ФС с помощью sysinstall

Теперь нужно создать файловую систему на новом разделе. Заходим в сисинсталовский 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+bsdlabel+newfs.
Создаем слайс с помощью fdisk

Чтобы добавить новый слайс воспользуемся утилитой 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

Пишем стандартную метку 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
Создаем ФС с помощью newfs

На созданном BSD-разделе создаем файловую систему UFS2 с Soft Updates:

newfs -U /dev/ad0s2d

Что ж, сапог оказался в бою надежнее, и я на живом сервере предпочту воспользоваться этой связкой для разбивки диска, а не sysinstall.

Редактируем /etc/fstab

Заранее создав точку монтирования, прописываем новый 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 лет назад)


Интернет реклама