Русский перевод: Михаил Сгибнев
Содержание
- 15.1. Введение в RAIDframe
- 15.2. Установка поддержки RAIDframe
- 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, то у вас есть несколько путей получения помощи.
- Чтение страниц руководства по RAIDframe: raid(4) и raidctl(8).
- Поиск в архивах списков рассылки. К сожалению, нет списка рассылки NetBSD, непосредственно посвященному RAIDframe. В связи с этим, разные темы могут начинаться и заканчиваться в разных списках. Как минимум, просмотрите netbsd-help@NetBSD.org, netbsd-users@NetBSD.org, current-users@NetBSD.org. Также стоит обратить на список рассылки используемой платформы: port-
${ARCH}
@NetBSD.org.
Предостережение
Поскольку RAIDframe постоянно развивается, имеющаяся в списках рассылки информация может быть уже неактуальной и неверной.
- Поиск в Базе данных сообщений о проблемах.
- Если в не смогли решить проблему, то сделайте следующее: пошлите сообщение в список рассылки, содержащее наиболее полное описание проблемы, сопроводив его всей доступной вам отладочной информацией и сообщениями об ошибках, включая выводом 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 обеспечивает и избыточность и повышение производительности, самым разумным будет его использование для критических «системных» разделов, таких как /
, /usr
, /var
, swap
, где операции чтения чаще, чем операции записи. Для других файловых систем, таких как /home
или /var/
стоит рассмотреть другой уровень RAID. В случае простого создания тома RAID-1 для не корневого раздела можно воспользоваться готовым примером из страницы руководства man, но поскольку корневой раздел должен быть загрузочным, нам придется предпринять некоторые шаги в ходе начальной установки.{application}
Замечание
В этом примере будет совсем немного отличий при работе на платформах i386 и sparc64 в процессе уменьшения черезмерного дублирования. Эти моменты являются косметическими и будут указываться особо. В случае серьезных отличий порядок действий для разных платформ будет описан отдельно.
15.3.1. Схема псевдо-процессов
Хотя довольно много наработок было сделано в специализированных копиях NetBSD для специфичных мобильных носителей, инструментарий и поддержка RAIDframe находится на недостаточно высоком уровне. Вследствие этого, нижеследующий псевдо-процесс является стандартом де-факто при установке RAID-1.
- Установка заготовки NetBSD на Disk0.
Рисунок 15.2. Подготовка к первичной установке на Disk0/wd0
- Используйте установленную на Disk0/wd0 систему для создания RAID состоящего из одного Disk1/wd1.
Рисунок 15.3. Setup RAID Set
- Перезагрузите систему после создания на Disk1/wd1 тома RAID.
Рисунок 15.4. Reboot using Disk1/wd1 of RAID
- Add / re-sync Disk0/wd0 back into the RAID set.
Рисунок 15.5. Зеркалируйте 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
), которые и будут зеркалированы RAID-1). Эти диски идентифицируются как:{0,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
, (что являтся идеологически верным для NetBSD 1.6.x installboot(8)) сейчас это не так. Если вы делаете эту ошибку, загрузочный сектор будет поврежден без возможности восстановления и вам придется начать процесс сначала.{c,d}
На 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
Сохраняем изменения и выходим.
>> 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
Сохраняем изменения и выходим.
>> 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.