Глава 15. NetBSD RAIDframe

Русский перевод: Михаил Сгибнев

Содержание

15.1. Введение в RAIDframe
15.1.1. Общие сведения о RAIDframe
15.1.2. Предупреждение о целостности данных, резервных копиях и высокой доступности
15.1.3. Получение помощи
15.2. Установка поддержки RAIDframe
15.2.1. Поддержка в ядре
15.2.2. Избыточность питания и кэширование дисков:
15.3. Пример: реализация RAID-1
15.3.1. Схема псевдо-процессов
15.3.2. Обзор аппаратного обеспечения
15.3.3. Начальная установка на Disk0/wd0
15.3.4. Подготовка Disk1/wd1
15.3.5. Инициализация устройства RAID
15.3.6. Установка файловой системы
15.3.7. Перенос системы на RAID
15.3.8. Первая загрузка с RAID
15.3.9. Добавление Disk0/wd0 в RAID
15.3.10. Тестирование загрузочной области

15.1. Введение в RAIDframe

15.1.1. Общие сведения о RAIDframe

NetBSD использует подсистему CMU RAIDframe. RAIDframe впервые появился именно в NetBSD и впоследствии был перенесен в OpenBSD и FreeBSD. NetBSD в составе ядра имеет еще несколько RAID систем называемых Vinum и Глава 14, Конфигурация Concatenated Disk Device (CCD), которые здесь не рассматриваются. Возможно. вам стоит посмотреть начальную информацию для получения начальных знаний о терминологии и концепции RAID. Как минимум вы должны быть знакомы с уровнями RAID. RAID — Adaptec предоставляет превосходное руководство, некоторый обьем информации содержится в raid(4)

15.1.2. Предупреждение о целостности данных, резервных копиях и высокой доступности

Во-первых, потому что RAIDframe является программной реализацией RAID, в отличие от аппаратной реализации, нуждающейся в специальном контроллере, системные администраторы должны обратить пристальное внимание к работе «критических» приложений. Для таких проектов стоит рассмотреть возможность использования поддерживаемых NetBSD RAID устройств. В этом случае вы самостоятельно принимаетет решение о выборе модели, но я рекомендую вам обратить внимание на такие факторы как управляемость, поддержка производителем, балансировка нагрузки и отказоустойчивость.

Во-вторых, в зависимости от используемого уровня RAID, RAIDframe обеспечивает некоторую избыточность в случае аппаратного сбоя. Однако это не является заменой резервному копированию! Программные и пользовательские ошибки все еще могут привести к потере данных. RAIDframe может использоваться как механизм облегчающий резервное копирование при отсутствии соответствующих аппаратных средств. И наконец, «высокая доступность» RAID является только малым компонентом обеспечения доступности данных в целом.

Дадим хороший совет: Резервируйте ваши данные!

15.1.3. Получение помощи

Если вы столкнулись с проблемами при использовании RAIDframe, то у вас есть несколько путей получения помощи.

  1. Чтение страниц руководства по RAIDframe: raid(4) и raidctl(8).
  2. Поиск в архивах списков рассылки. К сожалению, нет списка рассылки NetBSD, непосредственно посвященному RAIDframe. В связи с этим, разные темы могут начинаться и заканчиваться в разных списках. Как минимум, просмотрите netbsd-help@NetBSD.org, netbsd-users@NetBSD.org, current-users@NetBSD.org. Также стоит обратить на список рассылки используемой платформы: port-${ARCH}@NetBSD.org.

    Предостережение

    Поскольку RAIDframe постоянно развивается, имеющаяся в списках рассылки информация может быть уже неактуальной и неверной.

  3. Поиск в Базе данных сообщений о проблемах.
  4. Если в не смогли решить проблему, то сделайте следующее: пошлите сообщение в список рассылки, содержащее наиболее полное описание проблемы, сопроводив его всей доступной вам отладочной информацией и сообщениями об ошибках, включая выводом dmesg(8) из файла /var/run/dmesg.boot, файл конфигурации ядра config(8), /etc/raid[0-9].conf, /var/log/messages или stdout/stderr raidctl(8). Также включите описание предпринятых вами шагов для решения проблемы. Будьте терпеливы в ожидании ответа.

15.2. Установка поддержки RAIDframe

Для использования RAID требуется внесение изменений в программную и аппаратную конфигурацию.

15.2.1. Поддержка в ядре

Мы должны удостовериться, что имеется поддержка RAID в текущем ядре, в ядре GENERIC необходимые опции уже включены. Если вы используете собственное ядро, то удостоверьтесь, что оно содержит следущие опции:

pseudo-device   raid            8       # RAIDframe disk driver
options         RAID_AUTOCONFIG         # auto-configuration of RAID components

Поддержка RAID должна быть обнаружена ядром NetBSD, что может быть проверено с помощью команды dmesg(8).

# dmesg|grep -i raid
Kernelized RAIDframe activated

Ядро также должно содержать статическую привязку адресов шины и устройств в /dev. Это позволит гарантировать правильное размещение дисков в RAID в случае сбоя после перезагрузки. Обратитесь к главе Глава 28, Компиляция ядра для настройки, сборки и установки нового ядра.

В случае SCSI привязка будет выглядеть примерно таким образом:

sd0 at scsibus0 target 0 lun ?  # SCSI disk drives
sd1 at scsibus0 target 1 lun ?  # SCSI disk drives
sd2 at scsibus0 target 2 lun ?  # SCSI disk drives
sd3 at scsibus0 target 3 lun ?  # SCSI disk drives
sd4 at scsibus0 target 4 lun ?  # SCSI disk drives
sd5 at scsibus0 target 5 lun ?  # SCSI disk drives
sd6 at scsibus0 target 6 lun ?  # SCSI disk drives

Или для дисков EIDE/ATA:

wd0 at atabus0 drive 0 flags 0x0000
wd1 at atabus0 drive 1 flags 0x0000
wd2 at atabus1 drive 0 flags 0x0000
wd3 at atabus1 drive 1 flags 0x0000

Как только вы закончите этот процесс, возможно вас заинтересует распределение дисков относительно controller/bus/ID. Для системы, содержащей более чем два диска можно составить некоторый порядок действий, особенно важный для i386:

Таблица 15.1. Пример аппаратной конфигурации для i386

Component BIOS Mapping Boot Block Device Kernel Device
Disk0 0x80 hd0 wd0 at atabus0 drive 0 flags 0x0000
Disk1 0x81 hd1 wd1 at atabus0 drive 1 flags 0x0000

15.2.2. Избыточность питания и кэширование дисков:

Если ваша система располагает источником бесперебойного питания (UPS) и/или несколькими блоками питания, то вам стоит рассмотреть вопрос включения кэша на чтение/запись. На системах без резервирования питания есть риск потери данных, находящихся в кэше, в случае пропадания электроэнергии.

Для SCSI дисков вы можете использовать утилиту scsictl(8):

# scsictl /dev/rsd0{c,d} getcache
/dev/rsd0d: no caches enabled
/dev/rsd0d: caching parameters are savable
# scsictl /dev/rsd0{c,d} setcache rw save 
# scsictl /dev/rsd0{c,d} getcache
/dev/rsd0d: read cache enabled
/dev/rsd0d: write-back cache enabled
/dev/rsd0d: caching parameters are savable

Для дисков на других шинах (EIDE, SATA, USB, IEEE1394) можно использовать atactl(8) или пользоваться виртуальной шиной SCSI.

15.3. Пример: реализация RAID-1

В этом примере рассказывается про установку RAID-1. В случае RAID-1 компоненты зеркалируются и сервер сохранит функциональность при выходе из строя одного из дисков. Целью примера и будет обеспечение необходимого уровня избыточности для:

  • Нормального выполнения операций до появления технологического окна.
  • В том маловероятном случае, когда отказ вызовет перезагрузку системы, система будет способно быстро реконфигурироваться для загрузки с оставшегося компонента (зависит от платформы).

Рисунок 15.1. Размещение логических дисков в RAID-1

Размещение логических дисков в RAID-1
Поскольку RAID-1 обеспечивает и избыточность и повышение производительности, самым разумным будет его использование для критических «системных» разделов, таких как /, /usr, /var, swap, где операции чтения чаще, чем операции записи. Для других файловых систем, таких как /home или /var/{application} стоит рассмотреть другой уровень RAID. В случае простого создания тома RAID-1 для не корневого раздела можно воспользоваться готовым примером из страницы руководства man, но поскольку корневой раздел должен быть загрузочным, нам придется предпринять некоторые шаги в ходе начальной установки.

Замечание

В этом примере будет совсем немного отличий при работе на платформах i386 и sparc64 в процессе уменьшения черезмерного дублирования. Эти моменты являются косметическими и будут указываться особо. В случае серьезных отличий порядок действий для разных платформ будет описан отдельно.

15.3.1. Схема псевдо-процессов

Хотя довольно много наработок было сделано в специализированных копиях NetBSD для специфичных мобильных носителей, инструментарий и поддержка RAIDframe находится на недостаточно высоком уровне. Вследствие этого, нижеследующий псевдо-процесс является стандартом де-факто при установке RAID-1.

  1. Установка заготовки NetBSD на Disk0.

    Рисунок 15.2. Подготовка к первичной установке на Disk0/wd0

    Подготовка к первичной установке на Disk0/wd0

  2. Используйте установленную на Disk0/wd0 систему для создания RAID состоящего из одного Disk1/wd1.

    Рисунок 15.3. Setup RAID Set

    Setup RAID Set

  3. Перезагрузите систему после создания на Disk1/wd1 тома RAID.

    Рисунок 15.4. Reboot using Disk1/wd1 of RAID

    Reboot using Disk1/wd1 of RAID

  4. Add / re-sync Disk0/wd0 back into the RAID set.

    Рисунок 15.5. Зеркалируйте Disk1/wd1 на Disk0/wd0

    Зеркалируйте Disk1/wd1 на Disk0/wd0

15.3.2. Обзор аппаратного обеспечения

В настоящее время NetBSD для платформ i386 sparc64 поддерживается загрузка только с RAID-1. Загрузка с RAID осуществляется на первом этапе работы загрузчика и заключается в определении 4.2BSD/FFS и RAID разделов. Код первого загрузочного кода должен только получить данные о файловых системах и разделах, чтобы передать их второму этапу загрузки. Поэтому, в любое время, BIOS или другое программное обеспечение низкого уровня должно быть способно прочитать и выполнить первый блок начального загрузчика. На платфирме i386 это реализуется производителем дискового контроллера, на sparc64 за это отвечает IEEE 1275 Sun OpenBoot Firmware.

В этой статье рассматриваются два идентичных диска IDE (/dev/wd{0,1}), которые и будут зеркалированы RAID-1). Эти диски идентифицируются как:

 # grep ^wd /var/run/dmesg.boot
wd0 at atabus0 drive 0: <WDC WD100BB-75CLB0>
wd0: drive supports 16-sector PIO transfers, LBA addressing
wd0: 9541 MB, 19386 cyl, 16 head, 63 sec, 512 bytes/sect x 19541088 sectors
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(piixide0:0:0): using PIO mode 4, Ultra-DMA mode 2 (Ultra/33) (using DMA data transfers)

wd1 at atabus1 drive 0: <WDC WD100BB-75CLB0>
wd1: drive supports 16-sector PIO transfers, LBA addressing
wd1: 9541 MB, 19386 cyl, 16 head, 63 sec, 512 bytes/sect x 19541088 sectors
wd1: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd1(piixide0:1:0): using PIO mode 4, Ultra-DMA mode 2 (Ultra/33) (using DMA data transfers)

Замечание

Если вы используете SCSI, замените /dev/{,r}wd{0,1} на /dev/{,r}sd{0,1}

В этом примере оба наших диска выставлены как Master на разных каналах. Иметь два Master диска на одном канале врядли получится. В идеальном случае стоило бы иметь диски на отдельных каналах разных контроллеров. Некоторые SCSI контроллеры имеют несколько каналов на том же самом контроллере, однако шинный сброс SCSI на одном канале мог бы неблагоприятно затронуть другой канал, в случае перегрузки ASIC/IC.

Замечание

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

Подсказка

Даже два диска одного производителя могут иметь различную геометрию вследствие «дефектов производства». Используйте низкоуровневое программное обеспечение для составления таблицы дефектов дисков. После этого уже можно определить кандидатов в RAID.

15.3.3. Начальная установка на Disk0/wd0

Установите систему на ваш диск Disk0/wd0, руководствуясь инструкциями в файле INSTALL для вашей платформы. Устанавливайте все наборы, но не беспокойтесь о настройке, так как это все равно будет перезаписано.

Подсказка

На платформе i386 при вопросе программы установки sysinst «use the entire disk for NetBSD» ответьте «yes».

После завершения установки воспользуйтесь утилитами disklabel(8) and fdisk(8) / sunlabel(8) для просмотра данных:

# df
Filesystem  1K-blocks     Used     Avail Capacity  Mounted on
/dev/wd0a     9343708   191717   8684806     2%    /

На i386:

# disklabel -r wd0
type: unknown
disk: Disk00
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 19386
total sectors: 19541088
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0

16 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  19276992        63     4.2BSD   1024  8192 46568  # (Cyl.      0* - 19124*)
 b:    264033  19277055       swap                     # (Cyl.  19124* - 19385)
 c:  19541025        63     unused      0     0        # (Cyl.      0* - 19385)
 d:  19541088         0     unused      0     0        # (Cyl.      0 - 19385)

# fdisk /dev/rwd0d
Disk: /dev/rwd0d
NetBSD disklabel disk geometry:
cylinders: 19386, heads: 16, sectors/track: 63 (1008 sectors/cylinder)
total sectors: 19541088

BIOS disk geometry:
cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 19541088

Partition table:
0: NetBSD (sysid 169)
    start 63, size 19541025 (9542 MB, Cyls 0-1216/96/1), Active
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.

На Sparc64 команда и вывод немного отличается:

# disklabel -r wd0
type: unknown
disk: Disk0
[...snip...]
8 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  19278000         0     4.2BSD   1024  8192 46568  # (Cyl.      0 -  19124)
 b:    263088  19278000       swap                     # (Cyl.  19125 -  19385)
 c:  19541088         0     unused      0     0        # (Cyl.      0 -  19385)

# sunlabel /dev/rwd0c
sunlabel> P
a: start cyl =      0, size = 19278000 (19125/0/0 - 9413.09Mb)
b: start cyl =  19125, size =   263088 (261/0/0 - 128.461Mb)
c: start cyl =      0, size = 19541088 (19386/0/0 - 9541.55Mb)

15.3.4. Подготовка Disk1/wd1

Как только вы установили NetBSD на Disk0/wd0, можно начинать самое интересное. Disk1/wd1 должен быть виден и неиспользуем системой. Для распределения набора RAID-1 на диск Disk1/wd1 мы будем использовать disklabel(8).

Подсказка

Лучший способ гарантировать, что Disk1/wd1 является полностью пустым, состоит в том, чтобы ‘обнулить’ первые сектора диска с помощью dd(1). Это сотрет MBR (i386) или метку диска Sun (sparc64), так же как м метку диска NetBSD. Если Вы делаете ошибку в любой точке в течение процесса установки RAID, вы можете всегда вернуться сюда, чтобы очистить диск от следов предыдущей попытки.

Замечание

На sparc64 используйте /dev/rwd1c вместо /dev/rwd1d!

# dd if=/dev/zero of=/dev/rwd1d bs=8k count=1
1+0 records in
1+0 records out
8192 bytes transferred in 0.003 secs (2730666 bytes/sec)

После завершения процесса, убедитесь, что на i386 удалена MBR и метки диска NetBSD, а на sparc64 метка диска Sun.

На i386:

# fdisk /dev/rwd1d

fdisk: primary partition table invalid, no magic in sector 0
Disk: /dev/rwd1d
NetBSD disklabel disk geometry:
cylinders: 19386, heads: 16, sectors/track: 63 (1008 sectors/cylinder)
total sectors: 19541088

BIOS disk geometry:
cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 19541088

Partition table:
0: <UNUSED>
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.

# disklabel -r wd1

[...snip...]
16 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 c:  19541025        63     unused      0     0        # (Cyl.      0* - 19385)
 d:  19541088         0     unused      0     0        # (Cyl.      0 - 19385)

На sparc64:

# sunlabel /dev/rwd1c

sunlabel: bogus label on `/dev/wd1c' (bad magic number)

# disklabel -r wd1

[...snip...]
3 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 c:  19541088         0     unused      0     0        # (Cyl.      0 -  19385)
disklabel: boot block size 0
disklabel: super block size 0

После того, как вы убедились, что второй диск пуст, на i386 необходимо установить MBR используя значения, полученные с Disk0/wd0. Вы должны помнить, что необходимо сделать раздел NetBSD активным, иначе система не будет загружаться. Также вы должны создать метку диска NetBSD на Disk1/wd1, которая будет использоваться для создания и работы RAID. На sparc64 вам необходимо просто воспользоваться disklabel(8) для записи метки диска Sun.

Подсказка

disklabel(8) может использовать переменную среды $EDITOR для установки редактора, в котором будет осуществляться правка. По умолчанию используется vi(1)

На i386:

# fdisk -0ua /dev/rwd1d
fdisk: primary partition table invalid, no magic in sector 0
Disk: /dev/rwd1d
NetBSD disklabel disk geometry:
cylinders: 19386, heads: 16, sectors/track: 63 (1008 sectors/cylinder)
total sectors: 19541088

BIOS disk geometry:
cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 19541088

Do you want to change our idea of what BIOS thinks? [n]

Partition 0:
<UNUSED>
The data for partition 0 is:
<UNUSED>
sysid: [0..255 default: 169]
start: [0..1216cyl default: 63, 0cyl, 0MB]
size: [0..1216cyl default: 19541025, 1216cyl, 9542MB]
bootmenu: []
Do you want to change the active partition? [n] y
Choosing 4 will make no partition active.
active partition: [0..4 default: 0] 0
Are you happy with this choice? [n] y

We haven't written the MBR back to disk yet.  This is your last chance.
Partition table:
0: NetBSD (sysid 169)
    start 63, size 19541025 (9542 MB, Cyls 0-1216/96/1), Active
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.
Should we write new partition table? [n] y

# disklabel -r -e -I wd1
type: unknown
disk: Disk1
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 19386
total sectors: 19541088
[...snip...]
16 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  19541025        63       RAID                     # (Cyl.      0*-19385)
 c:  19541025        63     unused      0     0        # (Cyl.      0*-19385)
 d:  19541088         0     unused      0     0        # (Cyl.      0 -19385)

На sparc64:

# disklabel -r -e -I wd1
type: unknown
disk: Disk1
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 19386
total sectors: 19541088
[...snip...]
3 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  19541088         0       RAID                     # (Cyl.      0 -  19385)
 c:  19541088         0     unused      0     0        # (Cyl.      0 -  19385)

# sunlabel /dev/rwd1c 
sunlabel> P
a: start cyl =      0, size = 19541088 (19386/0/0 - 9541.55Mb)
c: start cyl =      0, size = 19541088 (19386/0/0 - 9541.55Mb)

Замечание

На i386 слайсы c: и d: зарезервированы. c: представляет собой часть диска, d: представляет собой весь диск. Поскольку мы будем использовать под NetBSD весь диск, слайс a: находится в границах слайса c: и имеют одинаковые размеры и смещение. Смещение должно начаться в границе дорожки (приращение секторов, соответствующих значению sectors/track в метке диска). Однако, на sparc64 c: представляет полный раздел NetBSD и в метке диска Sun d: не зарезервирован. Также обратите внимание, что на sparc64 c: и a: не требуют никакого смещения с начала диска, однако если оно есть, то должно начаться в границе цилиндра (приращение секторов, соответствующих значению sectors/cylinder).

15.3.5. Инициализация устройства RAID

Затем создаем файл конфигурации для RAID. Традиционно он находится в /etc , читается и нициализируется во время загрузки. Но, поскольку мы создаем самозагружаемый том RAID, данные конфигурации будут фактически записаны в том RAID, используя возможность «автоматического выбора конфигурации». Поэтому файлы необходимы только в течение начальной установки и не должны постоянно находиться в /etc.

# vi /var/tmp/raid0.conf
START array
1 2 0

START disks
/dev/wd9a
/dev/wd1a

START layout
128 1 1 1

START queue
fifo 100

Обратите внимание, что wd9 — несуществующий диск. Это позволит нам устанавливать том RAID с поддельным компонентом, которым мы несколько позже заменим Disk0/wd0. Независимо от того, устройство в /dev для wd9 должно существовать.

# cd /dev
# sh MAKEDEV wd9
# cd -

Подсказка

В NetBSD 2.0+ в качестве «поддельного» устройства /dev/wd9a вы можете использовать специальное имя диска «absent».

Затем мы конфигурируем устройство RAID и инициализуем уникальный серийный номер. В этом примере мы используем схему «YYYYMMDDRevision«. Вы можете выбирать формат полностью на свое усмотрение, учтите только, что в нашей схеме не должно быть два набора RAID с одним номером в единицу времени.

После чего мы инициализируем набор RAID, ингнорируя ошибки, связанные с «поддельным» диском.

# raidctl -v -C /var/tmp/raid0.conf raid0
raidlookup on device: /dev/wd9a failed!
raid0: Component /dev/wd9a being configured at col: 0
	 Column: 0 Num Columns: 0
	 Version: 0 Serial Number: 0 Mod Counter: 0
	 Clean: No Status: 0
Number of columns do not match for: /dev/wd9a
/dev/wd9a is not clean!
raid0: Component /dev/wd1a being configured at col: 1
	 Column: 0 Num Columns: 0
	 Version: 0 Serial Number: 0 Mod Counter: 0
	 Clean: No Status: 0
Column out of alignment for: /dev/wd1a
Number of columns do not match for: /dev/wd1a
/dev/wd1a is not clean!
raid0: There were fatal errors
raid0: Fatal errors being ignored.
raid0: RAID Level 1
raid0: Components: /dev/wd9a[**FAILED**] /dev/wd1a
raid0: Total Sectors: 19540864 (9541 MB)
# raidctl -v -I 2004082401 raid0
# raidctl -v -i raid0
Initiating re-write of parity
# tail -1 /var/log/messages
raid0: Error re-writing parity!
# raidctl -v -s raid0
Components:
	   /dev/wd9a: failed
	   /dev/wd1a: optimal
No spares.
/dev/wd9a status is: failed.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 2004082401, Mod Counter: 7
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 19540864
   RAID Level: 1
   Autoconfig: No
   Root partition: No
   Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

15.3.6. Установка файловой системы

Устройство RAID теперь сконфигурирован и доступен. Он является псевдо дисковым устройством. Теперь вам остается определиться с размерами слайсов. В целях упрощения примеров, на нашей системе 8.5 гигабайт выделено для / как /dev/raid0a и все остальное под swap как /dev/raid0b.

Предостережение

Эта схема разбиения диска неподходит для сервера. Руководство NetBSD затрагивает вопрос выделения дискового пространства в Глава 2, Установка.

Замечание

Обратите внимание, что 1 Гб это 2*1024*1024=2097152 blocks (1 блок это 512 байт или 0.5 килобайта). Несмотря на используемое оборудование, в псевдо диске RAID всегда будет 512 байтов/сектор.

Замечание

В этом примере пространство, выделенное слайсу a:, различается между i386 и sparc64, поэтому различается размер томов RAID:

На i386:

 # disklabel -r -e -I raid0
type: RAID
disk: raid
label: fictitious
flags:
bytes/sector: 512
sectors/track: 128
tracks/cylinder: 8
sectors/cylinder: 1024
cylinders: 19082
total sectors: 19540864
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0

#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  19015680         0     4.2BSD      0     0     0  # (Cyl.      0 - 18569)
 b:    525184  19015680       swap                     # (Cyl.  18570 - 19082*)
 d:  19540864         0     unused      0     0        # (Cyl.      0 - 19082*)

На sparc64:

# disklabel -r -e -I raid0
[...snip...]
total sectors: 19539968
[...snip...]
3 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  19251200         0     4.2BSD      0     0     0  # (Cyl.      0 -  18799)
 b:    288768  19251200       swap                     # (Cyl.  18800 -  19081)
 c:  19539968         0     unused      0     0        # (Cyl.      0 -  19081)

Затем, форматируем созданный раздел / как 4.2BSD FFSv1:

# newfs -O 1 /dev/raid0a
/dev/rraid0a: 9285.0MB (19015680 sectors) block size 16384, fragment size 2048
	using 51 cylinder groups of 182.06MB, 11652 blks, 22912 inodes.
super-block backups (for fsck -b #) at:
       32,   372896,   745760,  1118624,  1491488,  1864352,  2237216, 2610080,
  2982944,  3355808,  3728672,  4101536,  4474400,  4847264,  5220128, 5592992,
  5965856,  6338720,  6711584,  7084448,  7457312,  7830176,  8203040, 8575904,
  8948768,  9321632,  9694496, 10067360, 10440224, 10813088, 11185952,11558816,
 11931680, 12304544, 12677408, 13050272, 13423136, 13796000, 14168864,14541728,
 14914592, 15287456, 15660320, 16033184, 16406048, 16778912, 17151776,17524640,
 17897504, 18270368, 18643232,

# fsck -fy /dev/rraid0a
** /dev/rraid0a
** File system is already clean
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
1 files, 1 used, 4680062 free (14 frags, 585006 blocks, 0.0% fragmentation)

15.3.7. Перенос системы на RAID

Теперь файловая система RAID готова к использованию. Мы монтируем ее в /mnt и копируем все файлы со старой системы. Это можно сделать, используя утилиты dump(8) или pax(1).

# mount /dev/raid0a /mnt
# df -h /mnt
Filesystem    Size     Used     Avail Capacity  Mounted on
/dev/raid0a   9.0G     2.0K      8.6G     0%    /mnt
# cd /; pax -v -X -rw -pe / /mnt
[...snip...]

Теперь NetBSD установлена на файловой системе RAID. Мы должны установить точки монтирования в новой копии /etc/fstab иначе не произойдет монтирования разделов. Замените wd0 на raid0.

# vi /mnt/etc/fstab

/dev/raid0a  /  ffs  rw  1  1
/dev/raid0b  none  swap  sw  0  0
kernfs    /kern  kernfs  rw
procfs    /proc  procfs  rw

Раздел подкачки должен быть расконфигурирован перед выключением системы, для избежания ошибок четности на устройстве RAID. Это очень легко сделать добавив одну строку в /etc/rc.conf.

# vi /mnt/etc/rc.conf
swapoff=YES

Затем загрузчик должен быть установлен на Disk1/wd1. Ошибка на этом этапе оставит загрузочным только Disk0/wd0 и сделает RAID-1 бессмысленным в случае отказа загрузочного диска.

Подсказка

Поскольку на многих материнских платах i386 меню BIOS/CMOS может вводить в заблуждение относительно порядка опроса загрузочных устройств, я настоятельно рекомендую использовать опцию начального загрузчика «-o timeout=X». Установка уникального значения для каждого диска позволит точно определить, с какого диска загружается система.

Предостережение

Хотя может казаться логичным установить 1-ый блок начальной загрузки в /dev/rwd1{c,d}, (что являтся идеологически верным для NetBSD 1.6.x installboot(8)) сейчас это не так. Если вы делаете эту ошибку, загрузочный сектор будет поврежден без возможности восстановления и вам придется начать процесс сначала.

На i386 установка загрузчика в /dev/rwd1a :

# /usr/sbin/installboot -o timeout=30 -v /dev/rwd1a /usr/mdec/bootxx_ffsv1
File system:         /dev/rwd1a
File system type:    raw (blocksize 8192, needswap 1)
Primary bootstrap:   /usr/mdec/bootxx_ffsv1
Preserving 51 (0x33) bytes of the BPB

На sparc64 также устанавливаем загрузчик в /dev/rwd1a на флаг «-o» не поддерживается (и ненужен, благодаря OpenBoot):

# /usr/sbin/installboot -v /dev/rwd1a /usr/mdec/bootblk
File system:         /dev/rwd1a
File system type:    raw (blocksize 8192, needswap 0)
Primary bootstrap:   /usr/mdec/bootblk
Bootstrap start sector: 1
Bootstrap byte count:   4915
Writing bootstrap

В заключение, RAID необходимо установить как авто-конфигурируемый и система должна быть перезагружена. После этого все должно монтироваться с устройства RAID.

# raidctl -v -A root raid0
raid0: Autoconfigure: Yes
raid0: Root: Yes
# tail -2 /var/log/messages
raid0: New autoconfig value is: 1
raid0: New rootpartition value is: 1
# raidctl -v -s raid0
[...snip...]
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
[...snip...]
# shutdown -r now

Внимание

Всегда используйте shutdown(8) для выключения системы. Не используйте просто reboot(8). reboot(8) не совсем корректно отрабатывает скрипты rc и не отключает раздел подкачки. Это приведет к ошибкам четности после каждой перезагрузки.

15.3.8. Первая загрузка с RAID

В этой точке временно сконфигурируйте вашу систему для загрузки с Disk1/wd1. Для получения дополнительной информации обратитесь к Раздел 15.3.10, «Тестирование загрузочной области». Теперь система должна загрузиться и все файловые системы должны находиться на RAID. RAID будет функционален с единственным компонентом, однако набор не реализован полностью, потому что поддельный диск (wd9) считается аварийным.

# egrep -i "raid|root" /var/run/dmesg.boot
raid0: RAID Level 1
raid0: Components: component0[**FAILED**] /dev/wd1a
raid0: Total Sectors: 19540864 (9541 MB)
boot device: raid0
root on raid0a dumps on raid0b
root file system type: ffs

# df -h
Filesystem    Size     Used     Avail Capacity  Mounted on
/dev/raid0a   8.9G     196M      8.3G     2%    /
kernfs        1.0K     1.0K        0B   100%    /kern

# swapctl -l
Device      1K-blocks     Used    Avail Capacity  Priority
/dev/raid0b    262592        0   262592     0%    0
# raidctl -s raid0
Components:
	  component0: failed
	   /dev/wd1a: optimal
No spares.
component0 status is: failed.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 2004082401, Mod Counter: 65
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 19540864
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

15.3.9. Добавление Disk0/wd0 в RAID

Теперь мы добавим Disk0/wd0 как компонент RAID. Это уничтожит первоначальную структуру файловой системы. На i386, метка диска MBR не будет затронута (помните, что мы скопировали метку wd0 к wd1), поэтому нет никакой потребности «обнулять» Disk0/wd0. Однако, мы должны повторно маркировать Disk0/wd0, чтобы иметь идентичную метку диска NetBSD, как и на Disk1/wd1. Тогда мы добавляем Disk0/wd0 как «горячее резервирование» к набору RAID и инициализируем реконструкцию четности для всех устройств RAID, фактически добавляя Disk0/wd0 в RAID-1 набор и «синхронизируя» оба диска.

# disklabel -r wd1 > /tmp/disklabel.wd1
# disklabel -R -r wd0 /tmp/disklabel.wd1

В качестве последней проверки, можно воспользоваться diff(1), чтобы гарантировать соответствие метки диска Disk0/wd0 и Disk1/wd1. Вы должны также зарезервировать эти файлы для изучения в случае аварии.

# disklabel -r wd0 > /tmp/disklabel.wd0
# disklabel -r wd1 > /tmp/disklabel.wd1
# diff /tmp/disklabel.wd0 /tmp/disklabel.wd1
# fdisk /dev/rwd0 > /tmp/fdisk.wd0
# fdisk /dev/rwd1 > /tmp/fdisk.wd1
# diff /tmp/fdisk.wd0 /tmp/fdisk.wd1
# mkdir /root/RFbackup
# cp -p /tmp/{disklabel,fdisk}* /root/RFbackup

Как только вы будете готовы, добавьте Disk0/wd0 как резервный компонент и начинайте реконструкцию:

# raidctl -v -a /dev/wd0a raid0
/netbsd: Warning: truncating spare disk /dev/wd0a to 241254528 blocks
# raidctl -v -s raid0
Components:
	  component0: failed
	   /dev/wd1a: optimal
Spares:
	   /dev/wd0a: spare
[...snip...]
# raidctl -F component0 raid0
RECON: initiating reconstruction on col 0 -> spare at col 2
 11% |****                                   | ETA:    04:26

В зависимости от имеющихся аппаратных средств, время реконструкции может отличаться. Вы можете наблюдать на другой консоли:

# raidctl -S raid0
Reconstruction is 0% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
Reconstruction status:
  17% |******                                 | ETA: 03:08 -

После перезагрузки оба диска должны быть «optimal».

# tail -f /var/log/messages
raid0: Reconstruction of disk at col 0 completed
raid0: Recon time was 1290.625033 seconds, accumulated XOR time was 0 us (0.000000)
raid0:  (start time 1093407069 sec 145393 usec, end time 1093408359 sec 770426 usec)
raid0: Total head-sep stall count was 0
raid0: 305318 recon event waits, 1 recon delays
raid0: 1093407069060000 max exec ticks

# raidctl -v -s raid0
Components:
	   component0: spared
	   /dev/wd1a: optimal
Spares:
     /dev/wd0a: used_spare
     [...snip...]

Когда реконструкция закончена, мы должны установить загрузчик на Disk0/wd0. На i386 установка загрузчика в /dev/rwd0a:

# /usr/sbin/installboot -o timeout=15 -v /dev/rwd0a /usr/mdec/bootxx_ffsv1
File system:         /dev/rwd1a
File system type:    raw (blocksize 8192, needswap 1)
Primary bootstrap:   /usr/mdec/bootxx_ffsv1
Preserving 51 (0x33) bytes of the BPB

На sparc64:

# /usr/sbin/installboot -v /dev/rwd0a /usr/mdec/bootblk
File system:         /dev/rwd0a
File system type:    raw (blocksize 8192, needswap 0)
Primary bootstrap:   /usr/mdec/bootblk
Bootstrap start sector: 1
Bootstrap byte count:   4915
Writing bootstrap

И снава перезагрузка. Это необходимо для перевода Disk0/wd0 из состояния «used_spare» как «Component0» в «optimal». Обратитесь к комментариям следующей секции для контроля за состоянием четности после каждой перезагрузки.

# shutdown -r now

15.3.10. Тестирование загрузочной области

В этой точке вы должны гарантировать, что аппаратные средства вашей системы могут должным образом обработать загрузочные блоки на любом диске. На i386 это аппаратно-зависимый процесс, и выполняется через меню CMOS/BIOS или меню конфигурации платы контроллера.

На i386 используется система меню для установки приоритетов загрузки устройств (Disk1/wd1 прежде Disk0/wd0). Приведем пример для Award BIOS.

Рисунок 15.6. Award BIOS i386. Загрузка с Disk1/wd1

Award BIOS i386. Загрузка с Disk1/wd1

Сохраняем изменения и выходим.

>> NetBSD/i386 BIOS Boot, Revision 3.1
>> (seklecki@localhost, Fri Aug 13 08:08:47 EDT 2004)
>> Memory: 640/31744 k
Press return to boot now, any other key for boot menu
booting hd0a:netbsd - starting in 30

Вы можете убедиться, что BIOS читает Disk1/wd1, поскольку таймаут загрузчика составляет 30 секунд вместо 15. После перезагрузки верните настройки BIOS для загрузки по умолчанию:

Рисунок 15.7. Award BIOS i386. Загрузка с Disk0/wd0

Award BIOS i386. Загрузка с Disk0/wd0
Сохраняем изменения и выходим.

>> NetBSD/i386 BIOS Boot, Revision 3.1
>> (seklecki@localhost, Fri Aug 13 08:08:47 EDT 2004)
>> Memory: 640/31744 k
Press return to boot now, any other key for boot menu
booting hd0a:netbsd - starting in 15

Обратите внимание, как ваше ядро обнаруживает controller/bus/drive, независимо от того, что назначает BIOS в качестве загрузочного диска. Это нормальное поведение.

На sparc64 используйте Sun OpenBoot devalias для подтверждения загрузки:

Sun Ultra 5/10 UPA/PCI (UltraSPARC-IIi 400MHz), No Keyboard
OpenBoot 3.15, 128 MB memory installed, Serial #nnnnnnnn.
Ethernet address 8:0:20:a5:d1:3b, Host ID: nnnnnnnn.

ok devalias
[...snip...]
cdrom /pci@1f,0/pci@1,1/ide@3/cdrom@2,0:f
disk /pci@1f,0/pci@1,1/ide@3/disk@0,0
disk3 /pci@1f,0/pci@1,1/ide@3/disk@3,0
disk2 /pci@1f,0/pci@1,1/ide@3/disk@2,0
disk1 /pci@1f,0/pci@1,1/ide@3/disk@1,0
disk0 /pci@1f,0/pci@1,1/ide@3/disk@0,0
[...snip...]

ok boot disk0 netbsd
Initializing Memory [...]
Boot device /pci/pci/ide@3/disk@0,0 File and args: netbsd
NetBSD IEEE 1275 Bootblock
>> NetBSD/sparc64 OpenFirmware Boot, Revision 1.8
>> (lavalamp@j8, Thu Aug 19: 15:45:42 EDT 2004)
loadfile: reading header
elf64_exec: Booting [...]
symbols @ [....]
 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001
     The NetBSD Foundation, Inc.  All rights reserved.
 Copyright (c) 1982, 1986, 1989, 1991, 1993
     The Regents of the University of California.  All rights reserved.
[...snip...]

И второй диск:

ok boot disk2 netbsd
Initializing Memory [...]
Boot device /pci/pci/ide@3/disk@2,0: File and args:netbsd
NetBSD IEEE 1275 Bootblock
>> NetBSD/sparc64 OpenFirmware Boot, Revision 1.8
>> (lavalamp@j8, Thu Aug 19: 15:45:42 EDT 2004)
loadfile: reading header
elf64_exec: Booting [...]
symbols @ [....]
 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001
     The NetBSD Foundation, Inc.  All rights reserved.
 Copyright (c) 1982, 1986, 1989, 1991, 1993
     The Regents of the University of California.  All rights reserved.
[...snip...]

При каждой последующей загрузку ядро NetBSD должно выдать сообщение, видимое dmesg(8) как:

raid0: RAID Level 1
raid0: Components: /dev/wd0a /dev/wd1a
raid0: Total Sectors: 19540864 (9541 MB)
boot device: raid0
root on raid0a dumps on raid0b
root file system type: ffs

Как только вы убедитесь, что оба диска загрузочные, проверьте четность RAID после перезагрузки:

# raidctl -v -s raid0
Components:
	  /dev/wd0a: optimal
	  /dev/wd1a: optimal
No spares.
[...snip...]
Component label for /dev/wd0a:
   Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 2004082401, Mod Counter: 67
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 19540864
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 2004082401, Mod Counter: 67
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 19540864
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.