Next Previous Contents

## 3. Установка и установочные соображения

1. В: Как лучше сконфигурировать программный RAID?

   > О: Я обнаружил, что планирование файловой системы одна из труднейших задач конфигурирования Unix. Для ответа на Ваш вопрос, я могу написать, что мы сделаем. Мы планируем следующую установку:
   > - два EIDE диска, 2.1Гб каждый.

   >   > `

   >   >     диск раздел т.монтирования размер   устройство
   >   >       1      1       /        300M   /dev/hda1
   >   >       1      2       swap      64M   /dev/hda2
   >   >       1      3       /home    800M   /dev/hda3
   >   >       1      4       /var     900M   /dev/hda4

   >   >       2      1       /root    300M   /dev/hdc1
   >   >       2      2       swap      64M   /dev/hdc2
   >   >       2      3       /home    800M   /dev/hdc3
   >   >       2      4       /var     900M   /dev/hdc4

   >   > `

   > - Каждый диск на отдельном контроллере (и отдельном кабеле). Теоретически отказ контроллера и/или отказ кабеля не запретит доступ к обоим дискам. Также, мы возможно сможем получить повышение производительности от параллельных операций на двух контроллерах/кабелях.
   > - Установим ядро Linux в корневой (`/`) раздел `/dev/hda1`. Пометим этот раздел как загрузочный.
   > - `/dev/hdc1` должен содержать ``холодную'' копию `/dev/hda1`. Это НЕ raid копия, просто один-в-один копия. Только для использования в качестве восстановительного диска в случая отказа основного диска; пометим `/dev/hdc1` как загрузочный, и используем его для хранения без переустановки системы. Вы можете также поместить копию `/dev/hdc1` ядра в LILO для упрощения загрузки в случае отказа. Теоретически, в случае отказа, так я все еще могу загрузить систему вне зависимости от повреждения суперблока raid или других видов отказов и случаев, которые мне не понятны.
   > - `/dev/hda3` и `/dev/hdc3` будут зеркалами `/dev/md0`.
   > - `/dev/hda4` и `/dev/hdc4` будут зеркалами `/dev/md1`.
   > - мы выбрали `/var` и `/home` для зеркализации, и в разных разделах, основываясь на следующей логике:
   >   - `/` (корневой раздел ) будет содержать относительно статическую, не изменяющуюся информацию: для всех практических применений, он должен быть только для чтения, без фактической отметки и монтирования только для чтения.
   >   - `/home` должен содержать ''медленно изменяющиеся'' данные.
   >   - `/var` должен содержать быстро изменяющиеся данные, включая спул почты, содержимое баз данных и логи web сервера.
   >   Идея использования нескольких отдельных разделов такова если, по некоторой странной причине, при ошибках человека, пропадении питания, или ошибках операционной системы происходят повреждения - они ограничиваются одним разделом. Типичный случай - исчезновение питания при записи на диск. Это должно привести к повреждению файловой системы, что должно быть исправлено программой `fsck` при следующей загрузке. Если даже `fsck` делает восстановление без создания дополнительных повреждений этим восстановлением, можно утешиться тем, что любые повреждения были ограничены одним разделом. В другом типичном случае системный администратор делает ошибку в процессе операции восстановления, что приводит к стиранию и разрушению всех данных. Разделы могут помочь ограничить влияние ошибок оператора.
   > - Разумно обдумать размещение разделов `/usr` или `/opt`. В общем, `/opt` и `/home` - лучший выбор для RAID-5 разделов, если есть еще диски. Предостережение: НЕ помещайте `/usr` в RAID-5 раздел. В случае серьезного отказа, вы можете обнаружить, что не можете примонтировать `/usr`, и необходимый набор утилит на нем (таких как сетевые утилиты или компилятор.) С RAID-1, если произошел отказ, и Вы не можете заставить RAID работать, Вы можете, по крайней мере, смонтировать одно из двух зеркал. Вы не можете сделать это с любым другим уровнем RAID (RAID-5, striping, или линейным соединением).

   > Итак, чтобы завершить ответ на вопрос:

   > - устанавливаем ОС на диск 1, раздел 1. Не монтируем любые другие разделы.
   > - устанавливаем по инструкции RAID.
   > - конфигурирует `md0` и `md1`.
   > - убеждаемся, что знаем что делать в случае отказа! Делаем ошибку администратора сейчас и не ждем реального кризиса. Эксперимент! (мы выключаем питание при дисковой активности — это нехорошо, но показательно).
   > - делаем несколько плохих mount/copy/unmount/rename/reboot для записи `/var` на `/dev/md1`. Делайте старательно, это не опасно.
   > - наслаждайтесь!

2. В: Какое различие между `mdadd`, `mdrun`, и т.д. командами, и `raidadd`, `raidrun` командами?

   > О: Имена утилит сменились начиная с релиза 0.5 пакета raidtools. `md` схема именования использовалась в 0.43 и более старых версиях, в то время как `raid` используется в 0.5 и более новых версиях.

3. В: Я хочу запустить RAID-linear/RAID-0 на 2.0.34 ядре . Я не хочу применять raid патчи, так как они не нужны для RAID-0/linear. Где я могу взять raid-утилиты для управления?

   > О: Это трудный вопрос, в самом деле, новый пакет raid утилит при сборке требует установленных патчей RAID-1,4,5. Я не знаю ни одной предкомпилированной двоичной версии raid утилит, которые доступны на текущий момент. Однако, эксперименты показывают, что бинарники raid утилит, когда скомпилированы с ядром 2.1.100, кажется хорошо работающими при создании RAID-0/linear раздела под 2.0.34. Смельчаки спрашивали об этом, и я временно поместил бинарники mdadd, mdcreate, и т.д. на http://linas.org/linux/Software-RAID/ Вы должны взять man страницы, и т. д. с обычного пакета утилит.

4. В: Могу ли я strip/зеркализировать корневой раздел (`/`)? Почему я не могу загружать Linux прямо с `md` диска?

   > О: И LILO и Loadlin требуют не stripped/mirrored раздел для считывания образа ядра. Если Вы хотите strip/зеркализировать корневой раздел (`/`), вы должны создать не striped/mirrored раздел для хранения ядра(ядер). Обычно, этот раздел называют `/boot`. Тогда Вы должны либо использовать начальную поддержку виртуального диска(initrd), или патчи от Harald Hoyer < HarryH@Royal.Net> которые позволяют использовать stripped раздел, как корневой раздел. (Эти патчи - стандартная часть последних ядер серии 2.1.x)

   > Существуют несколько подходов, которые могут быть использованы. Один подход детально документирован в Bootable RAID mini-HOWTO: ftp://ftp.bizsystems.com/pub/raid/bootable-raid.

   > Как альтернативу, используйте `mkinitrd` для построения образа ramdisk, как показано ниже.

   > Edward Welbon < welbon@bga.com> написал:

   > - ... все, что нужно - скрипт для управления установкой. Для монтирования `md` файловой системы как корневой, главное - построить начальный образ файловой системы, который содержит необходимые модули и md утилиты для запуска `md`. У меня есть простой скрипт, который это делает.
   > - Для загрузочной среды, у меня есть маленький дешевый SCSI диск (170MB я получил его за 20долларов ). Этот диск работает на AHA1452, им также может быть недорогой IDE диск на родном IDE интерфейсе. От этого диска не требуется скорости, так как он предназначен, в основном, для загрузки.
   > - На диске создана маленькая файловая система содержащая ядро и образ `initrd`. Начальной файловой системы должно хватать для загрузки модуля драйвера raid SCSI устройства и запуска raid раздела, который будет корневым. Тогда я делаю

   >   > `

   >   >     echo 0x900 > /proc/sys/kernel/real-root-dev

   >   > `

   >   (`0x900` для `/dev/md0`) и выхожу из `linuxrc`. Далее загрузка продолжается обычно.
   > - Я собрал большинство функций как модули кроме драйвера AHA1452, который будит файловую систему `initrd`. Таким образом у меня очень маленькое ядро. Этот метод простой и надежный, я делаю так с 2.1.26 и никогда не было проблем, которых не мог бы запросто решить. Файловая система даже выжила несколько 2.1.4[45] тяжелых разрушений без реальных проблем.
   > - В одно время у меня были размечены raid диски так, что начальные цилиндры первого raid диска содержали ядро и начальные цилиндры второго raid диска содержали образ начальной файловой системы, вместо этого я использовал начальные цилиндры raid дисков для подкачкм, так как они более быстрые цилиндры (зачем терять их на загрузку?).
   > - Хорошо иметь недорогой диск для загрузки, так как с него просто загрузиться и, при необходимости, можно использовать как восстановительный диск. Если Вы интересуетесь, Вы можете взглянуть на скрипт, который создает мой начальный образ ramdisk и потом запускает `LILO`.

   >   > `http://www.realtime.net/~welbon/initrd.md.tar.gz`

   >   Его достаточно для того, чтобы обрисовать картину. Он не очень хорош, и, конечно, можно создать более маленький образ файловой системы для начального ramdisk. Было бы проще создать его более действенным. Но он использует `LILO` как есть. Если вы сделаете любые усовершенствования, пожалуйста, отправьте копию мне. 8-)

5. В: Я слышал, что я могу запустить зеркализацию поверх striping. Это правда? Могу ли я запускать зеркализацию поверх петлевого устройства?

   > О: Да, но не наоборот. Вы можете поместить stripe поверх нескольких дисков, и затем строить зеркализацию на базе этого. Однако, striping не может быть помещен на зеркало.

   > Короткое техническое объяснение этого - особенностью linear и stripe является использования `ll_rw_blk` процедуры для доступа. `ll_rw_blk` процедура отображает дисковые устройства и сектора, но не блоки. Блочные устройства могут быть размещены одно поверх другого; но устройства, которые делают прямой, низкоуровневый доступ к дискам, такие как `ll_rw_blk`, не могут.

   > На текущий момент (Ноябрь 1997) RAID не может быть создан на петлевом (loopback) устройстве, однако возможно, это скоро будет исправлено.

6. В: У меня есть два маленьких диска и три больших диска. Могу ли я соединить два маленьких диска в RAID-0, и затем создать RAID-5 из этого и больших дисков?

   > О: Сейчас (Ноябрь 1997), для массива RAID-5, нет. Сейчас, это можно сделать только для RAID-1 повер объединенных дисков.

7. В: Какая разница между RAID-1 и RAID-5 для двух дисковой конфигурации (имеется в виду разница между массивом RAID-1 построенном на двух дисках, и массивом RAID-5 построенном на двух дисках)?

   > О: Нет разницы в емкости. Также нельзя добавить диски ни в один из массивов для увеличения емкости (для деталей, смотрите вопрос ниже).

   > RAID-1 предоставляет преимущество в производительности чтения: драйвер RAID-1 использует технологию распределенного чтения для одновременного чтения двух секторов, по одному с каждого устройства, это удваивает скорость считывания.

   > Драйвер RAID-5, хотя и содержит много оптимизаций, сейчас (Сентябрь 1997) не реализует то, что паритетный диск - фактически зеркальная копия диска с данными. Таким образом, выполняется последовательное чтение данных.

8. В: Как я могу защититься от отказа двух дисков?

   > О: Некоторые из алгоритмов RAID дают отказоустойчивость при отказе нескольких дисков, но на данный момент это не реализовано в Linux. Однако, программный RAID Linux может защитить от множественных отказов дисков размещая массив поверх массива. Например, девять дисков могут быть использованы для создания трех массивов raid-5. Затем, эти три массива могут быть объединены в один массив RAID-5. Фактически, этот тип конфигурации защищает от отказа трех дисков. Заметьте, что много дискового пространства ''тратится'' на избыточность информации.

   > > `

   > >         Для NxN массива raid-5,
   > >         N=3, 5 из 9 дисков используется для паритета (=55%)
   > >         N=4, 7 из 16 дисков
   > >         N=5, 9 из 25 дисков
   > >         ...
   > >         N=9, 17 из 81 дисков (=~20&процентов;)

   > > `

   > В общем, массив MxN будет использовать M+N-1 дисков на паритет. Наименьшее количество пространства "теряется", когда M=N.

   > Другая альтернатива создать массив RAID-1 с тремя дисками. Заметьте, что все три диска содержат идентичные данные, и 2/3 пространства ''теряется''.

9. В: Я хочу понять, существует-ли что-то типа `fsck`: если раздел не был правильно демонтирован, `fsck` запускается и исправляет файловую систему более 90% времени. Так как машина способна исправлять это сама с помощью `ckraid --fix`, почему не автоматизировать это?

   > О: Это возможно сделать добавлением следующие строки в `/etc/rc.d/rc.sysinit`:

   >         mdadd /dev/md0 /dev/hda1 /dev/hdc1 || {
   >             ckraid --fix /etc/raid.usr.conf
   >             mdadd /dev/md0 /dev/hda1 /dev/hdc1
   >         }

   > или

   >         mdrun -p1 /dev/md0
   >         if [ $? -gt 0 ] ; then
   >                 ckraid --fix /etc/raid1.conf
   >                 mdrun -p1 /dev/md0
   >         fi

   > Перед предоставлением более полного и надежного скрипта, рассмотрим теорию операций. Gadi Oxman написал: При неправильном завершении, Linux может быть в одном их следующих состояний:
   > - При возникновении аварийного завершения дисковый кеш в памяти был синхронизирован с RAID набором; потерь данных нет.
   > - При возникновении аварийного завершения в памяти дискового кеша было более новое содержимое, чем в RAID наборе; в результате повреждена файловая система и возможно потеряны данные. Это состояние может быть далее разделено на два других состояния:
   >   - При аварийном завершении Linux записывал данные.
   >   - При аварийном завершении Linux не записывал данные.
   > Допустим мы используем массив RAID-1. В (2a), может случиться, что перед аварией небольшое количество блоков данных было успешно записано только на несколько из зеркал, таким образом при следующей загрузке, зеркала уже не будут идентичными. Если мы проигнорировали разницу в зеркалах, the raidtools-0.36.3 код балансировки чтения может выбрать для чтения блоки из любого зеркала, что приведет к противоречивому поведению (например, вывод `e2fsck -n /dev/md0` будет отличаться от запуска к запуску).

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

   > Например, по умолчанию `ckraid --fix` будет выбирать содержимое первого действующего зеркала и обновлять другие зеркала. Однако, в зависимости от точного времени аварии, данные на другом зеркале могут быть более свежие, и мы можем пожелать использовать их как источник для восстановления зеркал, или, возможно, использовать другой метод восстановления.

   > Следующий скрипт реализует одну из самых здравых последовательностей загрузки. В частности, он принимает меры предосторожности длинными, повторяющимися `ckraid`-ов при не совместных дисках, контроллерах, или драйверах контроллеров дисков. Модифицируйте его, для соответствия своей конфигурации, и скопируйте в `rc.raid.init`. Затем вызовите `rc.raid.init` после проверки fsck-ом монтирования rw корневого раздела, но перед проверкой fsck-ом оставшихся разделов. Убедитесь, что текущий каталог в путях поиска (переменная PATH).

   >         mdadd /dev/md0 /dev/hda1 /dev/hdc1 || {
   >             rm -f /fastboot             # force an fsck to occur
   >             ckraid --fix /etc/raid.usr.conf
   >             mdadd /dev/md0 /dev/hda1 /dev/hdc1
   >         }
   >         # if a crash occurs later in the boot process,
   >         # we at least want to leave this md in a clean state.
   >         /sbin/mdstop /dev/md0

   >         mdadd /dev/md1 /dev/hda2 /dev/hdc2 || {
   >             rm -f /fastboot             # force an fsck to occur
   >             ckraid --fix /etc/raid.home.conf
   >             mdadd /dev/md1 /dev/hda2 /dev/hdc2
   >         }
   >         # if a crash occurs later in the boot process,
   >         # we at least want to leave this md in a clean state.
   >         /sbin/mdstop /dev/md1

   >         mdadd /dev/md0 /dev/hda1 /dev/hdc1
   >         mdrun -p1 /dev/md0
   >         if [ $? -gt 0 ] ; then
   >             rm -f /fastboot             # force an fsck to occur
   >             ckraid --fix /etc/raid.usr.conf
   >             mdrun -p1 /dev/md0
   >         fi
   >         # if a crash occurs later in the boot process,
   >         # we at least want to leave this md in a clean state.
   >         /sbin/mdstop /dev/md0

   >         mdadd /dev/md1 /dev/hda2 /dev/hdc2
   >         mdrun -p1 /dev/md1
   >         if [ $? -gt 0 ] ; then
   >             rm -f /fastboot             # force an fsck to occur
   >             ckraid --fix /etc/raid.home.conf
   >             mdrun -p1 /dev/md1
   >         fi
   >         # if a crash occurs later in the boot process,
   >         # we at least want to leave this md in a clean state.
   >         /sbin/mdstop /dev/md1

   >         # OK, just blast through the md commands now.  If there were
   >         # errors, the above checks should have fixed things up.
   >         /sbin/mdadd /dev/md0 /dev/hda1 /dev/hdc1
   >         /sbin/mdrun -p1 /dev/md0

   >         /sbin/mdadd /dev/md12 /dev/hda2 /dev/hdc2
   >         /sbin/mdrun -p1 /dev/md1

   > В дополнение к указанному, Вы должны создать `rc.raid.halt`, который должен выглядеть как показано ниже:

   >         /sbin/mdstop /dev/md0
   >         /sbin/mdstop /dev/md1

   > Модифицируйте оба `rc.sysinit` и `init.d/halt` для включения этого в место, где файловая система уже демонтирована при halt/reboot. (Заметьте что `rc.sysinit` демонтирует и перезагружает если `fsck` завершился с ошибкой.)

10. В: Могу я установить одну половину RAID-1 зеркала на один диск, который есть у меня сейчас и затем позже взять другой диск и просто его добавить?

    > О: С текущими утилитами - нет, во всяком случае не простым способом. В частности, вы не можете просто скопировать содержимое одного диска на другой и затем их спаровать. Это потому, что драйвера RAID используют часть пространства в конце раздела для размещения суперблока. Это слегка уменьшает количество пространства, доступного для файловой системы; если Вы просто попробуете принудительно поставить RAID-1 на раздел с существующей файловой системой, raid суперблок перезапишет часть файловой системы и обрубит данные. Так как ext2fs файловая система разбрасывает фалы по разделу случайным образом (для избежания фрагментации), есть хороший шанс, что файл будет лежать в самом конце раздела перед окончанием диска.

    > Если Вы сообразительны, я предлагаю Вам вычислить сколько места нужно под суперблок RAID, и сделать вашу файловую систему немного короче, оставив место на перспективу. Но тогда, если вы такой умный, Вы должны также быть способны модифицировать утилиты для автоматизации этого процесса. (Утилиты не так уж сложны).

    > Заметка: Внимательный читатель заметит, что следующий трюк может сработать; я не пытался проверить это: Сделайте `mkraid`с `/dev/null`, как одним из устройств. Тогда `mdadd -r`с только одним, истинным диском (не делайте mdadd `/dev/null`). `mkraid` должен быть успешно создать raid массив, когда mdadd шаг выполняется - файловая система запущена в "деградированном" режиме, как если бы один из дисков отказал.

Next Previous Contents