Программный RAID-массив в Linux
Вряд ли стоит доказывать, сколь важным является сохранение сервера или станции в рабочем состоянии. Способов повышения надежности сохранения информации немало. Один из них — внесение в нее избыточных данных.
 С ростом вычислительной мощности процессоров и пропускной способности памяти именно дисковые операции ввода-выводa все чаще оказываются "узким местом" системы.
 Посмотрим, как организовать RAID-массив программными средствами в популярной нынче ОС GNU/Linux.
 Немного теории 
Чтобы понимать, о чем идет речь, следует сказать пару слов о самой технологии. Акроним RAID означает Redundant Array of Inexpensive/Independed Disks, что переводится как "избыточный массив из недорогих/независимых дисков". Заметьте — именно независимых дисков, то есть их должно быть, по крайней мере, два (а для некоторых уровней — три, четыре, a то и больше).
 RAID-массив можно организовать при помощи специального контролера, стоимость которого — от 20 у.е за отдельный чип на материнской плате и 200 у.е. за отдельное специализированное устройство.
 Но при покупке компьютера не всегда предусматривается создание RAID, поэтому, чтобы немного сэкономить, можно создать такой массив программно — то есть фактически бесплатно. Но за бесплатность придется платить увеличением нагрузки на процессор. К тому же, soft-RAID — по сравнению с железной реализацией — на всех уровнях показывает более низкую производительность. Так что данный метод лучше задействовать в случаях, когда, во-первых, утилита top показывает, что есть еще порох в пороховницах, и, во-вторых, сохранность данных важнее общей производительности.
 Упоминались уровни RAID. Действительно, отцы-создатели данной технологии Дэвид Паттерсон, Рэнди Катц и Гарт Гибсон предложили шесть способов организации винчестеров в виртуальный диск, при этом сразу оговорив область применения каждого. Один из этих методов позволяет добиться увеличения скорости, а пять других направлены на повышение общей надежности.
 Основой всех способов (кроме RAID-1) является страйпинг — то есть при работе логические блоки RAID-тома (который видится как единое целое, хотя и состоит из нескольких дисков) сопоставляются физическим на различных носителях.
  
- RAID-0 (striping) — последовательный поток данных равномерно записывается на различные носители, контроль четности при этом не производится. Обеспечивает самые быстрые операции ввода/вывода — однако является наименее надежным из методов;
 - RAID-1 (mirroring) — полное зеркалирование (дублирование) данных на другой носитель. Дополнительно обеспечивается повышение производительности при операциях чтения;
 - RAID-2 — этот метод уже практически забыт; информация записывается побайтно на несколько винчестеров, головки которых движутся синхронно. Дополнительно на отдельный носитель (носители) записывается избыточная информация для восстановления;
 - RAID-3 — тоже редко используемый метод. Уже хотя бы по причине трудности реализации. Похож на предыдущий, только избыточная информация высчитывается по "исключаемому ИЛИ", а не ECC;
 - RAID-4 — также предусматривает отдельный диск для контроля четности, что является самым узким местом такой системы. Однако при этом способе данные распределяются по секторам, а не по байтам;
 - RAID-5 — напоминает предыдущий метод, но тут избыточные данные равномерно распределены по всем дискам. Таким образом решается проблема "узкого места" — однако при программной реализации такой способ оказывается для процессора наиболее трудоемким.
  
  
Но это не всё — существуют также производные методы, в которых пытаются устранить некоторые недостатки родительских: RAID-0+1, RAID-10, RAID-30, есть и RAID-6. Ядро Linux поддерживает еще так называемый linear- (известный еще как append) режим. В этом режиме разделы диска просто как бы плюсуются, суммарный объем равен объему всех разделов, участвующих в формировании тома, и запись осуществляется как на обычный диск. При этом не содержится никакой избыточности и скорость записи/считывания не увеличивается (только объем).
 Приступаем 
В некоторых дистрибутивах (например, RedHat) RAID-массив можно создать еще при установке. Но в большинстве случаев все это придется проделывать вручную на уже установленной системе. В ядре программно реализована возможность создания RAID-0, RAID-1, RAID-4 и RAID-5. Хотя следует отметить, что в настоящее время реализована возможность автоматической загрузки системы с RAID-массива, только если загрузочный раздел отформатирован как RAID-1.
 Итак, для начала необходимо иметь поддержку самого RAID в ядре. В большинстве дистрибутивов практически все параметры включены по умолчанию, поэтому можно обойтись без пересборки. Проверить поддержку RAID можно по наличию файла /proc/mdstat.
 #cat /proc/mdstat
 Если же вам не повезло, то в секции Multi-device support (RAID and LVM) после активации параметра с таким же названием должны появиться необходимые опции. Кстати, рекомендую включить еще Boot support и Auto Detect support  — это позволит автоматически поднимать RAID-массив при загрузке системы, а также размещать корневую систему на RAID. При этом все эти параметры лучше "вкомпилировать" в ядро, чем в виде загружаемых модулей. В последнем случае система может иногда повести себя иначе — к примеру, если первый опрашиваемый диск массива не имеет суперблока, то есть помечен как сбойный, вполне возможно, что система откажется запускаться в degraded mode.
  Следующим шагом будет установка и конфигурирование пакета raidtools. Его можно взять с http://people.redhat.com/mingo/raidtools/ (на момент написания статьи последней была версия raidtools-1.00.3.tar.gz). По этому же адресу можно найти патчи к ядрам старых версий, не поддерживающих software-RAID. Установка пакета сводится к его распаковке и стандартной компиляции:
 # cd raidtools-1.00.3
 # ./configure
 # make
 # su
 $ make install
 Далее необходимо создать файл /etc/raidtab приблизительно такого содержания:
 raiddev               /dev/md0
 # имя файла устройств массива
 raid-level            1
 # уровень RAID (возможны значения linear, 0, 1,4,5)
 nr-raid-disks        2
 # указывает сколько дисков будет входить в RAID-массив
 chunk-size          32
 # размер чанка в килобайтах
 persistent-superblock 1
 # эта опция позволяет при создании RAID-массива записывать в каждый дисковый раздел специальный суперблок, наличие которого позволяет ядру при загрузке прочесть конфигурацию RAID автоматически, без монтирования корневой системы
 # далее описываются реальные дисковые разделы, входящие в массив
 device                /dev/hdc2
 # дисковый раздел, участвующий в создании RAID-массива
 raid-disk             0
 device                /dev/hda2
 raid-disk             1
 Пример приведен только для одного массива /dev/md0, если же их потребуется несколько, необходимо будет каждый описать отдельно — за подробностями обращайтесь к одноименному man. Не забывайте, что минимальное количество разделов для каждого уровня RAID разное. Для каждого device обязательно присутствие одного из следующих параметров:
  
- raid-disk — определяет индекс раздела в массиве; 
 - spare-disk — определяет индекс резервного диска; 
 - parity-disk — принудительно определяет данный раздел для хранения информации о контроле четности (для RAID-4,5); 
 - failed-disk — помечает раздел как вышедший из строя (можно использовать для временного отключения, например раздел с работающей ОС).
  
  
Во избежание излишней возни, всем разделам, которые планируется отдать под RAID-массивы, необходимо при помощи утилиты fdisk присвоить тип "fd" (Linux raid autodetect). Примерно так:
 # fdisk /dev/hda
 Command (m for help): t
 Partition number (1-9): 8
 Hex code (type L to list codes): fd
 Changed system type of partition 8 to fd (Linux raid autodetect)
 Command (m for help): p
 Disk /dev/hda: 255 heads, 63 sectors, 3648 cylinders
 Units = cylinders of 16065 * 512 bytes
   Device Boot  Start    End    Blocks    Id    System
 /dev/hda1   *      1     50   2257101    83    Linux
 /dev/hda2         51    314    265072+   82    Linux swap
 /dev/hda3        315   2776   1646631    fd    Linux raid autodetect
 /dev/hda4       2777   3648   7004308+   83    Linux
 Command (m for help): w
 После этого надо убедиться, что в системе присутствуют файлы устройств /dev/md0 (/dev/md1 ... /dev/mdN, если разделов больше одного). В случае отсутствия таких файлов их необходимо создать:
 # mknod /dev/md0 b 9 0
 # mknod /dev/mdN b 9 N
 После этого можно приступать к запуску RAID-массива:
 # mkraid /dev/md0
 Команда cat /proc/mdstat должна показать поддерживаемые ядром и запущенные в данный момент устройства.
 Personalities : [linear] [raid0] [raid1] [raid5]
 read_ahead 1024 sectors
 md0 : active raid0 hda1[1] hdc1[0]
     90069632 blocks 32k chunks
 unused devices: 
 Если все прошло нормально, следующим шагом должно стать форматирование под выбранную (любую) файловую систему, поддерживаемую ядром:
 # mke2fs /dev/md0
 Или лучше:
 # mkreiserfs /dev/md0
 Теперь монтируем в выбранную точку:
 # mkdir /mnt/raid  
# mount /dev/md0 /mnt/raid
 Для автоматического монтирования при загрузке системы в файл /etc/fstab добавляем следующие строки:
 /dev/md0   /mnt/raid   reiserfs   defaults   0 0
 При необходимости можно остановить работу RAID командой:
 # raidstop /dev/md0
 — и затем запустить снова:
 # raidstart /dev/md0
 Перенесем корневой раздел в созданный RAID. Для этого копируем его в смонтированый каталог:
 # cd /
 # find  .  -xdev | cpio -pm /mnt/raid
 Далее модифицируем файл /mnt/raid/etc/fstab, в котором указываем измененные значения точек монтирования. Например, для корневого в нашем случае это будет:
 /dev/md0  /   reiserfs  defaults    0  0
 В новом файле загрузчика LILO /mnt/raid/etc/lilo.conf требуется внести более серьезные изменения. Нужно изменить путь к новому устройству, с которого будет производиться загрузка системы, и устройство, которое будет монтироваться как корневое. Кроме того, следует дополнительно указать устройства, на которые принудительно устанавливается загрузочная запись. Небольшое примечание: очень даже неплохо выносить каталог /boot в небольшой отдельный раздел (50 Мб за глаза хватит) и в файле /etc/fstab прописать такие строки, чтобы он не автоматически монтировался при загрузке:
 /dev/hda1 /boot ext2 noauto 1 2
 Пример файла lilo.conf:
 prompt
 # включает ввод приглашения при загрузке без ожидания каких-либо нажатий клавиш
 timeout=50
 # время ожидания — 5 секунд
 default=linux
 # метка ОС, загружаемой по умолчанию. Если ее нет, будет загружаться ядро, записанное первым
 boot=/dev/md0
 # сектор жесткого диска куда устанавливаем, LILO в нашем случае загрузочным является RAID-массив
 root=/dev/md0
 # указывает на устройство, которое будет монтироваться как корневой раздел
 raid-extra-boot=”/dev/hda, /dev/hdc”
 # без данного параметра LILO не будет изменять MBR дисков, входящих в RAID, поскольку не имеет понятия, какие именно диски туда входят. Желательно указать все диски — тогда при выходе одного из них система загрузится со следующего
 install=/boot/boot.b
 # файл для использования в качестве нового загрузочного сектора
 Когда все необходимые изменения занесены, устанавливаем загрузчик
 # chroot /mnt/raid; lilo
 Если эта команда не выдала ошибок, перезагружаемся. После этого следует проверить работу RAID-массива (просмотрев содержимое /proc/mdstat) — и удостовериться, что все разделы задействованы в массиве. Теперь при выходе диска из строя он будет помечаться в RAID-массиве как сбойный.
 Далее системному администратору необходимо:
  
- остановить работу системы и выключить компьютер;
 - заменить диск, вышедший из строя, новым;
 - включить компьютер, загрузить операционную систему;
 - при помощи fdisk создать раздел необходимого размера и присвоить ему тип "fd";
 - добавить новый раздел в RAID-массив:
  
  
# raidhotadd /dev/mdX /dev/hdX
  
- подождать, пока будет работать реконструкция; 
 - восстановить LILO.
  
  
Все. Как видите, создание RAID-массива — не такая уж сложная штука. Особенно если удается собрать ядро. Однако следует помнить, что применение данной технологии, хоть и позволяет избежать потерь данных, но только при условии, что аппаратные средства способны обнаружить сбои в работе. И уж тем более такой метод не убережет вас от пожара, хищения, потерь при перебоях питания и т.п. Поэтому своевременный бэкап никогда не будет лишним.
 Для тех же, кому нужна гибкость в обращении с данными, может подойти технология LVM, но об этом в следующий раз.
							  	  				  
       Автор: Сергей Яремчук 
	  Источник: www.comizdat.com  
		  
	 |