RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
FreeBSD: Перенос системы на диск размером более 2TB [2009]
0. Введение
Администраторы FreeBSD, в том числе и я, столкнулись с очередным
ограничением файловой системы. Традиционными средствами невозможно
разбить на разделы диск, размер которого превышает 2TB (два терабайта).
В статье описано, как разбить диск размером более 2TB на разделы,
сделать загрузочным, а затем перенести на него информацию с рабочей
системы — донора.
Статья относится к версиям FreeBSD 6.4 и старше (если такие будут) и FreeBSD 7.1 и старше.
Процесс переноса прост для понимания. Может быть легко автоматизирован.
Мало того. Использовать таблицу разделов GPT, лежащую в основе данного
метода, вместо MBR имеет смысл даже для дисков имеющих размер менее
2TB, т.к. несколько копий GPT размещаются в разных частях диска. В
случае гибели одной копии, структура разделов будет прочитана из
другой. (Кто плакал над смертью нулевого сектора MBR, тот меня поймет.)
Увы, пока невозможно установить FreeBSD напрямую. Инсталлятор sysinstall не умеет работать с GPT.
Второй серьезный недостаток — после аварийной остановки (напр. при
аварии по питанию) проверка файловой системы на крупных разделах
выполняется очень долго.
Было бы кардинальным решением проблемы перейти на ZFS, но такой переход
требует значительно больше телодвижений (в т.ч. построение своего
ядра). Кроме того ZFS требует больше оперативной памяти.
(см. дискуссию на форуме)
В принципе можно начинать пользоваться ZFS, если
1. архитектура amd64
2. в наличии более 2GB оперативки.
3. FreeBSD 7.2+
В чем же суть проблемы? Обратимся за разъяснением к мануалам.
# man bsdlabel СОВМЕСТИМОСТЬ В связи с использованием u_int32_t при сохранении номеров секторов, BSD labels ограничен максимумом из 2^32-1 секторов. Что обычно означает 2TB дискового пространства. Диски большего размера могут быть разбиты посредством другого метода, такого как gpt(8).
Для наших целей достаточно знать, что обычная MBR может хранить
информацию о размещении только 4 первичных разделов, чего явно не
достаточно. Именно это ограничение вынуждает использовать во FreeBSD
двухуровневую структуру слайсы/разделы.
Таблица разделов нового типа GPT, по умолчания может хранить
информацию о размещении 128 разделов. Думаю, что на первое время этого
должно хватить [ шутка :) ]. Соответственно, существует утилита,
которая так и называется gpt(8) и которая позволяет нам проводить с
таблицей GPT все необходимые действия.
Возможности GPT позволяют упростить именование разделов в системе.
Типичный раздел на диске для MBR выглядит так:
/dev/ad4s1d, где ad4 — имя диска; s1 – первый слайс; d – буква раздела
Типичный раздел на таком же же диске но для GPT:
/dev/ad4p5, где ad4 — все то же имя диска; p5 – 5-й раздел.
1. Предварительные действия
На моем «подопытном» сервере, жесткий диск 160GB, мой донор, подключен к контроллеру материнки.
На этот диск я традиционным способом поставил FreeBSD 7.2.
Система будет перенесена на RAID совокупным объемом 4TB.
Размеры всех разделов при переносе решил сохранить.
Кроме /home. Этому разделу я выделю все оставшееся пространство.
Собираем информацию.
(1) Для начала смотрим какие имена дала система нашим накопителям.
# less /var/run/dmesg.boot ad4: 152627MB <WDC WD1600AAJS-00PSA0 05.06H05> at ata2-master SATA300 da0: 3814695MB (7812495360512 byte sectors: 255H 63S/T 486305C)
ad4 — донор ; da0 — получатель
Дополнительно убеждаемся, что da0 состоит из секторов по 1/2 KB. Для
меня это важно т.к. утилита gpt(8) принимает размеры разделов именно в
секторах.
(2) Выясняем каковы размеры разделов в секторах.
Смотрим и запоминаем :) вторую колонку.
(3) Выясняем размер swap раздела т.к. предыдущая команда его не показала.
# swapinfo Device 1K-blocks Used Avail Capacity /dev/ad4s1b 20971528082096344 0%
Вычисляем размер в секторах:
2097152 K * 2= 4051896 секторов
2. Подготовка нового диска
Разбиваем новый диск на разделы. Размеры разделов см. выше.
(1) Создаем на диске таблицу разделов GPT.
# gpt create -f da0
ключ -f - затирать MBR даже если она есть. На диске может быть таблица только одного типа. Наш выбор GPT.)
(2) Создаем бутовый раздел. Размещаем там загрузчик.
# gpt boot -b /boot/pmbr -g /boot/gptboot da0
айлы pmbr и gptboot копируются в директорию /boot в процессе инсталяции системы - донора.
Если ваш сервер бежит под FreeBSD 6.4+ или 7.1+, загляните в /boot. Файлы pmbr и gptboot уже находятся там.
(3) Поочередно создаем разделы, указывая тип файловой системы (ключ -t)
и размер в секторах (ключ -s). Для /home ключ -s не указан. Это
означает «все оставшееся пространство».
(6) Создаем файловые системы в разделах целевого диска.
/dev/da0p2 предназначен для рутового раздела, поэтому без softupdate.
/dev/da0p3 будет содержать своп. Там нечего создавать.
Оставшиеся разделы — стандартные.