О: Я обнаружил, что планирование файловой системы одна из труднейших задач конфигурирования 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
. Делайте старательно, это не опасно.- наслаждайтесь!
mdadd
, mdrun
,
и т.д. командами, и raidadd
, raidrun
командами?
О: Имена утилит сменились начиная с релиза 0.5 пакета raidtools.md
схема именования использовалась в 0.43 и более старых версиях, в то время какraid
используется в 0.5 и более новых версиях.
О: Это трудный вопрос, в самом деле, новый пакет 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 страницы, и т. д. с обычного пакета утилит.
/
)?
Почему я не могу загружать 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-dev0x900
для/dev/md0
) и выхожу изlinuxrc
. Далее загрузка продолжается обычно.
- Я собрал большинство функций как модули кроме драйвера AHA1452, который будит файловую систему
initrd
. Таким образом у меня очень маленькое ядро. Этот метод простой и надежный, я делаю так с 2.1.26 и никогда не было проблем, которых не мог бы запросто решить. Файловая система даже выжила несколько 2.1.4[45] тяжелых разрушений без реальных проблем.
- В одно время у меня были размечены raid диски так, что начальные цилиндры первого raid диска содержали ядро и начальные цилиндры второго raid диска содержали образ начальной файловой системы, вместо этого я использовал начальные цилиндры raid дисков для подкачкм, так как они более быстрые цилиндры (зачем терять их на загрузку?).
- Хорошо иметь недорогой диск для загрузки, так как с него просто загрузиться и, при необходимости, можно использовать как восстановительный диск. Если Вы интересуетесь, Вы можете взглянуть на скрипт, который создает мой начальный образ ramdisk и потом запускает
LILO
.Его достаточно для того, чтобы обрисовать картину. Он не очень хорош, и, конечно, можно создать более маленький образ файловой системы для начального ramdisk. Было бы проще создать его более действенным. Но он используетhttp://www.realtime.net/~welbon/initrd.md.tar.gz
LILO
как есть. Если вы сделаете любые усовершенствования, пожалуйста, отправьте копию мне. 8-)
О: Да, но не наоборот. Вы можете поместить stripe поверх нескольких дисков, и затем строить зеркализацию на базе этого. Однако, striping не может быть помещен на зеркало.Короткое техническое объяснение этого - особенностью linear и stripe является использования
ll_rw_blk
процедуры для доступа.ll_rw_blk
процедура отображает дисковые устройства и сектора, но не блоки. Блочные устройства могут быть размещены одно поверх другого; но устройства, которые делают прямой, низкоуровневый доступ к дискам, такие какll_rw_blk
, не могут.
На текущий момент (Ноябрь 1997) RAID не может быть создан на петлевом (loopback) устройстве, однако возможно, это скоро будет исправлено.
О: Сейчас (Ноябрь 1997), для массива RAID-5, нет. Сейчас, это можно сделать только для RAID-1 повер объединенных дисков.
О: Нет разницы в емкости. Также нельзя добавить диски ни в один из массивов для увеличения емкости (для деталей, смотрите вопрос ниже).RAID-1 предоставляет преимущество в производительности чтения: драйвер RAID-1 использует технологию распределенного чтения для одновременного чтения двух секторов, по одному с каждого устройства, это удваивает скорость считывания.
Драйвер RAID-5, хотя и содержит много оптимизаций, сейчас (Сентябрь 1997) не реализует то, что паритетный диск - фактически зеркальная копия диска с данными. Таким образом, выполняется последовательное чтение данных.
О: Некоторые из алгоритмов RAID дают отказоустойчивость при отказе нескольких дисков, но на данный момент это не реализовано в Linux. Однако, программный RAID Linux может защитить от множественных отказов дисков размещая массив поверх массива. Например, девять дисков могут быть использованы для создания трех массивов raid-5. Затем, эти три массива могут быть объединены в один массив RAID-5. Фактически, этот тип конфигурации защищает от отказа трех дисков. Заметьте, что много дискового пространства ''тратится'' на избыточность информации.В общем, массив MxN будет использовать M+N-1 дисков на паритет. Наименьшее количество пространства "теряется", когда M=N.
Для NxN массива raid-5, N=3, 5 из 9 дисков используется для паритета (=55%) N=4, 7 из 16 дисков N=5, 9 из 25 дисков ... N=9, 17 из 81 дисков (=~20&процентов;)Другая альтернатива создать массив RAID-1 с тремя дисками. Заметьте, что все три диска содержат идентичные данные, и 2/3 пространства ''теряется''.
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-1. В (2a), может случиться, что перед аварией небольшое количество блоков данных было успешно записано только на несколько из зеркал, таким образом при следующей загрузке, зеркала уже не будут идентичными. Если мы проигнорировали разницу в зеркалах, the raidtools-0.36.3 код балансировки чтения может выбрать для чтения блоки из любого зеркала, что приведет к противоречивому поведению (например, вывод
- При возникновении аварийного завершения дисковый кеш в памяти был синхронизирован с RAID набором; потерь данных нет.
- При возникновении аварийного завершения в памяти дискового кеша было более новое содержимое, чем в RAID наборе; в результате повреждена файловая система и возможно потеряны данные. Это состояние может быть далее разделено на два других состояния:
- При аварийном завершении Linux записывал данные.
- При аварийном завершении Linux не записывал данные.
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
завершился с ошибкой.)
О: С текущими утилитами - нет, во всяком случае не простым способом. В частности, вы не можете просто скопировать содержимое одного диска на другой и затем их спаровать. Это потому, что драйвера RAID используют часть пространства в конце раздела для размещения суперблока. Это слегка уменьшает количество пространства, доступного для файловой системы; если Вы просто попробуете принудительно поставить RAID-1 на раздел с существующей файловой системой, raid суперблок перезапишет часть файловой системы и обрубит данные. Так как ext2fs файловая система разбрасывает фалы по разделу случайным образом (для избежания фрагментации), есть хороший шанс, что файл будет лежать в самом конце раздела перед окончанием диска.Если Вы сообразительны, я предлагаю Вам вычислить сколько места нужно под суперблок RAID, и сделать вашу файловую систему немного короче, оставив место на перспективу. Но тогда, если вы такой умный, Вы должны также быть способны модифицировать утилиты для автоматизации этого процесса. (Утилиты не так уж сложны).
Заметка: Внимательный читатель заметит, что следующий трюк может сработать; я не пытался проверить это: Сделайте
mkraid
с/dev/null
, как одним из устройств. Тогдаmdadd -r
с только одним, истинным диском (не делайте mdadd/dev/null
).mkraid
должен быть успешно создать raid массив, когда mdadd шаг выполняется - файловая система запущена в "деградированном" режиме, как если бы один из дисков отказал.