Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> Удаленное разбиение HDD

Выделение дискового пространства на удаленно доступном сервере.

Автор: bisyarin.


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

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

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

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

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

Тестируем в 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, например, в этом.

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

Создаем BSD-раздел с помощью sysinstall

Отлично, слайс добавили, хотя немного и поплясали с бубном. Следующая часть решения задачи состоит в добавления нового BSD-раздела.

Здесь стоит сразу же сказать о еще одной проблеме sysinstall. Эта утилита при добавлении слайса или BSD-раздела, не создает
соответствующих устройств в devfs. А чтобы что-нибудь сделать с только что созданным устройством, например, создать BSD-раздел на слайсе, этот слайс должен быть виден системой. Я пока не нашел другого решения этой проблемы кроме перезагрузки. PR об этом.

Перед перезагрузкой можно временно добавить в /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 

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

Вместо титров

Рад видеть дочитавшего до этого места читателя и буду рад в двойне если информация предоставленная здесь оказалась кому-нибудь хоть чем-то полезной.

СпасиБо.



размещено: 2007-09-17,
последнее обновление: 2007-09-17,
автор: bisyarin


gruz0, 2007-09-18 в 6:16:48

Спасибо за статью, если бы можно было промотать время и запостить статью двумя неделями раньше, я бы не страдал о потерянных данных после связки bsdlabel + newfs :)

Желаю всем удачи в этом бою!

yolkov, 2007-09-18 в 9:33:54

а мне недели не хватило!!!

Спасибо

unisol, 2007-09-24 в 19:25:31

Приходилось довольно нередко переразбивать диски целиком на удалённых серверах - в принципе, статья описывает неплохо последовательность действий. Но главное - всегда на кошках тренироваться перед тем, как. Кроме того, второй диск весьма облегчает переразбивку - можно грузить ядро с первого, корневую ФС и далее - со второго. Тогда никаких дебуг-флагов не понадобится - переразбить и написать на первый диск "чего надо" после загрузки со второго.

Tah, 2007-09-26 в 2:38:31

пасиб, но пользовался bsdlabel + newfs, не так уж это и сложно посчитать необходимое кол-во секторов..
sysinstall тогда отказывался напрочь добавлять новый слайс на "системном" диске, хотя было куча перепробованных вариантов...
# sysctl kern.geom.debugflags=16
вроде юзал.. хз...
столкнемся ещё раз - проверим :-)

Shahnazarov, 2007-12-01 в 18:22:49

Очень во время.... как раз сидел занимался -) спс огромное

nero777, 2008-02-03 в 19:29:41

Преогромное спасибо.наконец то разобрался.
Ещё раз.... спасибо. FreeBSD 5.4R

VVD, 2008-03-22 в 16:59:50

Но тут-то как раз и засада. Дело в том, что добавляя второй слайс, sysinstall, судя по выводу fdisk, назначает их оба активными:
— SKIPPED —
Из-за этого мы получаем сообщение об испорченной таблице разделов при загрузке:

А зачем использовать стандартный загрузчик? Ставьте "FreeBSD Boot Manager" и вам будет всё равно на этот флаг активности. Да и вообще он гораздо удобней, чем стандартный. Не говоря уже о multi-boot (несколько операционок).

Jungo, 2008-09-07 в 21:14:27

Помогло) но a на d можно и не менять)
Спасибо большое

Clamath, 2010-03-24 в 18:52:43

Спасибо.

trumpl, 2010-04-25 в 22:38:20

Отличная статья!
Большое спасибо автору, разжевал буквально до невозможного)
С Уважением.

Dusya, 2010-07-27 в 14:55:52

Статья дибильная
Через сисинстал добавил новый хард с разделом уфс за пару нажатий на клавиатуру.
Никаких ребутов по 100 раз, никаких плясок с бубном.

asPagurus, 2010-10-25 в 2:07:09

спасибо большое!
занес в избранное)
если б не эта статья, как минимум день бы вылетел...

Артем, 2011-06-30 в 21:53:03

Спасибо, благодаря статье почта пользователей жива, сервак не упал, все подводные камни удалось обойти с первого раза !

Dmitriy_K, 2011-11-14 в 12:18:18

Тем, кто делает дисковую разметку во FreeBSD начиная с версии 8.0, часто приходится сталкиваться с ошибками вида "Class not found", которые не позволяют отработать по традиционным методам.
Я кое-что написал о возможном решении таких проблем в конференции:
http://forum.lissyara.su/viewtopic.php?f=8&t=22712&p=312929

Vasya, 2013-10-22 в 17:07:07

НАчиная с версии версии 8.0 есть GPART
Перестаньте уже дурью маятся.

Alex Keda, 2013-10-22 в 17:33:30

Вася, ты ли это?!
я в шоке, первый пост без мата и по делу.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.074 секунд
Из них PHP: 32%; SQL: 68%; Число SQL-запросов: 82 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 60450