FreeBSD с корнем на CDROM и разделами на программном RAID-1.
Copyleft Polina Soloviova
RAID-1 с использованием vinum(8)
В FreeBSD партицией (partition) называется то, к чему во многих других системах обращаются как к разделу. Партиции в FreeBSD создаются и изменяются утилитой disklabel(8) и именуется ad0s1a, ad0s1e и так далее. В то же время слайс (slice) FreeBSD по сути напоминает расширенный DOS раздел, на котором можно создавать логические диски (партиции FreeBSD). Обычно при стандартной установке системы FreeBSD создается один слайс FreeBSD, который средствами утилиты disklabel(8) логически размечается на партиции.
vinum(8) при первой инициализации займет 265 блоков по 512 байт (132,5 Кбайт) на каждой партиции, которую вы ему укажете при создании программного RAID-1. При этом информация, записанная в этих блоках, будет утрачена. Для того, чтобы сохранить данные, необходимо изменить логическую разметку диска таким образом, чтобы 265 блоков, необходимых vinum(8) пришлись на область диска, в которой заведомо нет полезных вам данных. Такой областью является swap-партиция. Кроме того, необходимо объединить все остальные партиции в одну, а логическую разметку поручить vinum(8). Это позволит вам сэкономить на каждую следующую партицию по 132,5 Кбайт свободного места на диске, и, что наиболее важно, сохранить информацию.
- создайте новый каталог vinum где-нибудь в корневой директории новой системы.
# mkdir /usr/local/cdsystem/root/vinum
здесь вы будете хранить все файлы, необходимые для запуска vinum(8).
- перейдите в только что созданный каталог и сделайте резервную копию таблицы партиций первого жесткого диска. Это позволит в случае неудачи с vinum(8) быстро вернуть разметку диска на партиции в первоначальное состояние, с большой степенью вероятности, что информация, находящаяся на этих партициях, не пострадает. Кроме того, созданный таким образом файл послужит шаблоном для создания новой, измененной для использования vinum(8) таблицы партиций.
# cd /usr/local/cdsystem/root/vinum
# disklabel ad0s1 > ad0s1
- продублируйте только что созданный файл - его необходимо отредактировать.
# cp ad0s1 ad0s1.vinum
- откройте новый файл в любом, удобном вам, текстовом редакторе и отредактируйте, следуя дальнейшим инструкциям
# vi ad0s1.vinum
с
этого момента необходимо действовать очень внимательно и осторожно. От этого
зависит судьба всей информации, записанной на диск.
В данном примере файл ad0s1.vinum выглядит так:
# /dev/ad0s1c:
type: ESDI
disk: ad0s1
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 4864
sectors/unit: 78156162
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2097152 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
1048576 |
3145728 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
f: |
524288 |
4194304 |
4.2BSD |
2048 |
16384 |
94 |
# (Cyl. 261*- 293*) |
g: |
41943040 |
4718592 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 293*- 2904*) |
Таблица, расположенная в самом низу - это и есть таблица партиций. Вы будете работать с первыми тремя столбцами - size (размер, в блоках), offset (смещение) и fstype (тип файловой системы). Отредактируйте эту таблицу следующим образом:
- измените размер swap партиции (b), уменьшив его на 265. Эти 265 блоков vinum(8) будет использовать для своих служебных нужд
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2096887 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
1048576 |
3145728 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
f: |
524288 |
4194304 |
4.2BSD |
2048 |
16384 |
94 |
# (Cyl. 261*- 293*) |
g: |
41943040 |
4718592 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 293*- 2904*) |
- измените смещение партиции e, уменьшив его на 265
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2096887 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
1048576 |
3145463 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
f: |
524288 |
4194304 |
4.2BSD |
2048 |
16384 |
94 |
# (Cyl. 261*- 293*) |
g: |
41943040 |
4718592 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 293*- 2904*) |
- измените размер партиции e. Чуть позже вы удалите партиции f и g и создадите вместо них одну партицию e, размером, равным сумме размеров всех трех партиций e,f и g + 265. То есть новый размер партиции е = старый размер е + размер f + размер g + 265.
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2096887 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
43516169 |
3145463 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
f: |
524288 |
4194304 |
4.2BSD |
2048 |
16384 |
94 |
# (Cyl. 261*- 293*) |
g: |
41943040 |
4718592 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 293*- 2904*) |
- измените тип файловой системы партиции е на "vinum"
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2096887 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
43516169 |
3145463 |
vinum |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
f: |
524288 |
4194304 |
4.2BSD |
2048 |
16384 |
94 |
# (Cyl. 261*- 293*) |
g: |
41943040 |
4718592 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 293*- 2904*) |
- удалите партиции f и g
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2096887 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
43516169 |
3145463 |
vinum |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
Таблица партиций для первого жесткого диска готова. Даже если ваш второй жесткий диск физически не идентичен первому, то нет необходимости повторять все предыдущие действия по изменению таблицы партиций во второй раз.
- теперь настало время для изменения таблицы партиций второго жесткого диска. Для этого выполните следующие действия:
- продублируйте файлы ad0s1 и ad0s1.vinum. С небольшими изменениями, описанными ниже, их можно использовать для второго жесткого диска
# cp ad0s1 ad2s1
# cp ad0s1.vinum ad2s1.vinum
отредактируйте файлы ad2s1 и ad2s1.vinum в любом, удобном для вас текстовом редакторе. Таблицы партиций будут практически идентичными, изменится только название устройства
# vi ad2s1
замените в первой строке
# /dev/ad0s1c:
на
# /dev/ad2s1c:
замените в третьей строке
disk: ad0s1
на
disk: ad2s1
проделайте то же самое с файлом ad2s1.vinum
- если диски разные, у них будет разным количество цилиндров и секторов. В этом случае, для того, чтобы получить эту информацию для второго жесткого диска, выполните следующие действия:
- посмотрите на вывод команды:
# disklabel ad2
# /dev/ad2c:
type: ESDI
disk: ad2s1
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 5004
sectors/unit: 80405262
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
c: |
80405262 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
Эта команда выводит данные о количестве секторов и цилиндров вашего диска. Ее вывод в вашем случае может сильно отличаться от приведенного выше, однако структура вывода сохранится такой же в любом случае.
- отредактируйте файлы ad2s1 и ad2s1.vinum
измените количество цилиндров на значение из вывода предыдущей команды
cylinders: 5004
измените количество секторов в соответствии с выводом предыдущей команды
sectors/unit: 80405262
измените размер партиции c в соответствии с выводом disklabel(8)
c: |
80405262 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
На данном этапе вы готовы к изменению таблиц партиций дисков для реализации программного RAID-1 с помощью vinum(8).
- создайте на втором жестком диске slice FreeBSD
# /stand/sysinstall -> configure -> fdisk -> ad2 -> create (C)
Другой способ сделать то же самое с использованием команды fdisk(8), приведен ниже:
# fdisk -BI ad2
- разметьте второй жесткий диск на партиции, аналогичные по размерам партициям на первом жестком диске и создайте на них файловую систему ufs
# cd /usr/local/cdsystem/root/vinum
# disklabel -R ad2s1 ad2s1
# newfs /dev/ad2s1a
# newfs /dev/ad2s1e
# newfs /dev/ad2s1f
# newfs /dev/ad2s1g
теперь логическая конфигурация второго диска полностью аналогична конфигурации первого.
vinum(8) не имеет конфигурационных файлов. Для создания нового тома необходимо воспользоваться командой vinum create <аргументы>,
где аргументы - что именно надо создать (например, volume), и параметры того,
что надо создать. Нет необходимости общаться с vinum(8) из командной строки. Вместо
этого можно создать файл, в котором будет указана вся конфигурация программного RAID. Этот файл будет использован только один раз - при первой инициализации vinum(8). В дальнейшем он вам не понадобится.
Итак, выполните следующие действия:
- создайте "конфигурационный" файл для vinum(8).
# cd /usr/local/cdsystem/root/vinum
# touch raid.create
- отредактируйте raid.create. В данном примере он должен содержать следующее:
drive first device /dev/ad0s1e
drive second device /dev/ad2s1e
volume var
plex name var.p0 org concat volume var
sd name var.p0.s0 drive first plex var.p0 len var_len driveoffset var_offset
plex name var.p1 org concat volume var
sd name var.p1.s0 drive second plex var.p1 len var_len driveoffset var_offset
volume tmp
plex name tmp.p0 org concat volume tmp
sd name tmp.p0.s0 drive first plex tmp.p0 len tmp_len driveoffset tmp_offset
plex name tmp.p1 org concat volume tmp
sd name tmp.p1.s0 drive second plex tmp.p1 len tmp_len driveoffset tmp_offset
volume local
plex name local.p0 org concat volume local
sd name local.p0.s0 drive first plex local.p0 len local_len driveoffset local_offset
plex name local.p1 org concat volume local
sd name local.p1.s0 drive second plex local.p1 len local_len driveoffset local_offset
Здесь:
var_len - размер партиции var, взятый из файла ad0s1
e: |
1048576 |
3145728 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
var_offset - смещение партиции var, равное смещению партиции e из файла ad0s1, минус размер swap партиции, минус смещение swap партиции плюс 265 блоков.
# |
size |
offset |
fstype |
[fsize bsize bps/cpg] |
a: |
1048576 |
0 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 0 - 65*) |
b: |
2097152 |
1048576 |
swap |
|
# (Cyl. 65*- 195*) |
c: |
78156162 |
0 |
unused |
0 |
0 |
|
# (Cyl. 0 - 4864*) |
e: |
1048576 |
3145728 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
то есть: var_offset = 3145728 - 2097152 - 1048576 + 265 = 265
Проще посчитать это так: первая партиция после swap-партиции будет иметь смещение
в 265 блоков. Все остальные партиции будут иметь смещение, равное их смещению
в файле ad0s1 минус смещение первой после swap партиции плюс 265 блоков.
на примере остальных двух партиций:
e: |
1048576 |
3145728 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 195*- 261*) |
f: |
524288 |
4194304 |
4.2BSD |
2048 |
16384 |
94 |
# (Cyl. 261*- 293*) |
g: |
41943040 |
4718592 |
4.2BSD |
2048 |
16384 |
89 |
# (Cyl. 293*- 2904*) |
tmp_offset = 4194304 - 3145728 + 265 = 1048841
local_offset = 4718592 - 3145728 + 265 = 1573129
В данном примере в результате получится файл следующего содержания :
drive first device /dev/ad0s1e
drive second device /dev/ad2s1e
volume var
plex name var.p0 org concat volume var
sd name var.p0.s0 drive first plex var.p0 len 1048576b driveoffset 265b
plex name var.p1 org concat volume var
sd name var.p1.s0 drive second plex var.p1 len 1048576b driveoffset 265b
volume tmp
plex name tmp.p0 org concat volume tmp
sd name tmp.p0.s0 drive first plex tmp.p0 len 524288b driveoffset 1048841b
plex name tmp.p1 org concat volume tmp
sd name tmp.p1.s0 drive second plex tmp.p1 len 524288b driveoffset 1048841b
volume local
plex name local.p0 org concat volume local
sd name local.p0.s0 drive first plex local.p0 len 41943040b driveoffset 1573129b
plex name local.p1 org concat volume local
sd name local.p1.s0 drive second plex local.p1 len 41943040b driveoffset 1573129b
vinum(8) оперирует четырьмя типами объектов:
- drive: физические устройства, партиции;
- subdisk: vinum(8) позволяет каждый диск (drive) логически разметить на поддиски (subdisk), аналогично тому, как утилита disklabel(8) логически размечает slice FreeBSD.
- plex: несколько поддисков (subdisk) можно объединить в один логический элемент - плекс (plex) и обращаться к нему как к одному устройству, независимо от того, на одном ли поддиске (subdisk) и на одном ли физическом диске находятся данные одного такого объединенного элемента. vinum(8) поддерживает concatenated plexes - режим, при котором один и более поддисков (subdisk) объединяются в единый логический объект, доступ к которому происходит последовательно (т.е. только при заполнении первого поддиска (subdisk) происходит запись на второй и т.д., что не дает выигрыша в скорости ни записи, ни чтения) и striped plexes - режим, похожий на предыдущий, но доступ к нему происходит "полосами", или "блоками" определенной величины (при достижении границы "полосы" на одном физическом диске, обращение идет на второй физический диск, что может повысить пиковую скорость чтения/записи в 2 раза). Такой режим также имеет название RAID-0.
- volume: виртуальный объект, представляющий собой совокупность одного или нескольких плексов (plex), обращение к которым происходит как к единому целому. Если задействовано 2 и более плексов (plex), между ними происходит зеркалирование.
таким образом, в только что созданном файле находятся команды vinum(8), при выполнении которых будет создано 3 тома (volume), каждый из которых состоит из двух плексов (plex), между которыми и будет происходить зеркалирование. Каждый плекс (plex) представляет собой объединение одного-единственного поддиска (subdisk). Всего поддисков (subdisk) 6 - по три на каждом из двух дисков (drive), представляющих собой в конечном счете партиции.
Подробнее см. vinum(8), disklabel(8), fdisk(8).
Для того, чтобы система знала, что некоторые ее разделы зеркалируются,
ей необходимо об этом сообщить в конфигурационных файлах. Перейдите в каталог
/etc/ будущей системы и отредактируйте несколько конфигурационных файлов.
- отредактируйте файл /usr/local/cdsystem/etc/fstab
# cd /usr/local/cdsystem/etc/
# vi fstab
в данном примере изначально он выглядит так:
/dev/ad0s1a |
/ |
ufs |
rw |
1 |
1 |
/dev/ad0s1b |
none |
swap |
sw |
0 |
0 |
/dev/ad0s1e |
/var |
ufs |
rw |
2 |
2 |
/dev/ad0s1f |
/tmp |
ufs |
rw |
2 |
2 |
/dev/ad0s1g |
/usr/local |
ufs |
rw |
2 |
2 |
proc |
/proc |
procfs |
rw |
0 |
0 |
измените его таким образом:
- удалите упоминание о корне (ad0s1a), если оно у вас есть. Корень будет монтироваться с CDROM, причем информация о том, с какого именно устройства, уже содержится в самом ядре.
- добавьте swap со второго винчестера. Этот шаг не обязателен, однако, без него, место отведенное под swap-партицию на втором жестком диске, не будет использоваться.
/dev/ad0s1b |
none |
swap |
sw |
0 |
0 |
/dev/ad2s1b |
none |
swap |
sw |
0 |
0 |
- измените устройства для партиций на "vinum"
/dev/vinum/var |
/var |
ufs |
rw |
2 |
2 |
/dev/vinum/tmp |
/tmp |
ufs |
rw |
2 |
2 |
/dev/vinum/local |
/usr/local |
ufs |
rw |
2 |
2 |
В результате внесенных поправок, файл fstab будет содержать:
/dev/ad0s1b |
none |
swap |
sw |
0 |
0 |
/dev/ad2s1b |
none |
swap |
sw |
0 |
0 |
/dev/vinum/var |
/var |
ufs |
rw |
2 |
2 |
/dev/vinum/tmp |
/tmp |
ufs |
rw |
2 |
2 |
/dev/vinum/local |
/usr/local |
ufs |
rw |
2 |
2 |
proc |
/proc |
procfs |
rw |
0 |
0 |
- отредактируйте файл /usr/local/cdsystem/etc/rc.conf
# vi rc.conf
добавьте туда строку:
start_vinum="YES"
с этой строкой при каждой загрузке системы в память будет загружаться модуль vinum.ko, в обязанности которого и входит поддержка программного RAID.
Самый трудный этап позади, и теперь вы готовы к запуску vinum(8) . Проверьте
еще раз, все ли правильно вы сделали, от этого будет зависеть успех дальнейших
ваших действий. Убедившись, что все в порядке, перейдите к разделу Запись новой системы на диск.
Copyleft Polina Soloviova