
igor@0: \section{Программный RAID в Linux}
igor@0: 
igor@0: Здесь рассматриваются вопросы создания и обслуживания программного RAID-массива в операционной системе Linux.
igor@0: 
igor@0: \subsection{mdadm}
igor@0: Управление программным RAID-массивом в Linux
igor@0: выполняется с помощью программы \textbf{mdadm}.
igor@0: 
igor@0: У программы \textbf{mdadm} есть несколько режимов работы.
igor@0: 
igor@0: \begin{itemize}
igor@0: \item \textbf{Assemble (сборка)} — Собрать компоненты ранее созданного массива в массив. Компоненты можно указывать явно, но можно и не указывать — тогда выполняется их поиск по суперблокам.
igor@0: \item \textbf{Build (построение)} — Собрать массив из компонентов, у которых нет суперблоков. Не выполняются никакие проверки, создание и сборка массива в принципе ничем не отличаются.
igor@0: \item \textbf{Create (создание)} — Созать новый массив на основе указанных устройств. Использовать суперблоки размещённые на каждом устройстве.
igor@0: \item \textbf{Monitor (наблюдение)} — Следить на изменением состояния устройств. Для RAID0 этот режим не имеет смысла.
igor@0: \item \textbf{Grow (расширение или уменьшение)} — Расширение или уменьшение массива, включаются или удаляются новые диски.
igor@0: \item \textbf{Incremental Assembly (инкрементальная сборка)} — Добавление диска в массив.
igor@0: \item \textbf{Manage (управление)} — Разнообразные операции по управлению массивом, такие как замена диска и пометка как сбойного.
igor@0: \item \textbf{Misc (разное)} — Действия, которые не относятся ни к одному из перечисленных выше режимов работы.
igor@0: \item \textbf{Auto-detect (автоообнаружение)} — Активация автоматически обнаруживаемых массивов в ядре Linux.
igor@0: \end{itemize}
igor@0: 
igor@0: Формат вызова:
igor@0: 
igor@0: \begin{verbatim}
igor@0:     mdadm [mode] [array] [options]
igor@0: \end{verbatim}
igor@0: 
igor@0: Режимы:
igor@0: \begin{itemize}
igor@0: \item  \texttt{-A}, \texttt{--assemble} — режим сборки
igor@0: \item  \texttt{-B}, \texttt{--build} — режим построения
igor@0: \item  \texttt{-C}, \texttt{--create} — режим создания
igor@0: \item  \texttt{-F}, \texttt{--follow}, \texttt{--monitor} — режим наблюдения
igor@0: \item  \texttt{-G}, \texttt{--grow} — режим расширения
igor@0: \item  \texttt{-I}, \texttt{--incremental} — режим инкрементальной сборки
igor@0: \end{itemize}
igor@0: 
igor@0: \subsection{Настройка программного RAID-массива}
igor@0: Рассмотрим как выполнить настройку RAID-массива 5 уровня
igor@0: на трёх дисковых разделах.
igor@0: Мы будем использовать разделы:
igor@0: \begin{verbatim}
igor@0:    /dev/hde1
igor@0:    /dev/hdf2
igor@0:    /dev/hdg1
igor@0: \end{verbatim}
igor@0: 
igor@0: В том случае если разделы иные, 
igor@0: не забудьте использовать соответствующие имена файлов.
igor@0: 
igor@0: \subsubsection{Создание разделов}
igor@0: Нужно определить на каких физических разделах 
igor@0: будет создаваться RAID-массив.
igor@0: Если разделы уже есть, нужно найти свободные (\textit{fdisk -l}).
igor@0: Если разделов ещё нет, но есть неразмеченное место, 
igor@0: их можно создать с помощью программ \textit{fdisk} или \textit{cfdisk}.
igor@0: 
igor@0: Просмотреть какие есть разделы:
igor@0: 
igor@0: \begin{verbatim}
igor@0:    %# fdisk -l
igor@0: \end{verbatim}
igor@0: 
igor@0: \begin{verbatim}
igor@0:    Disk /dev/hda: 12.0 GB, 12072517632 bytes
igor@0:    255 heads, 63 sectors/track, 1467 cylinders
igor@0:    Units = cylinders of 16065 * 512 = 8225280 bytes
igor@0: \end{verbatim}
igor@0: 
igor@0: \begin{verbatim}
igor@0:    Device Boot    Start       End    Blocks   Id  System
igor@0:    /dev/hda1   *         1        13    104391   83  Linux
igor@0:    /dev/hda2            14       144   1052257+  83  Linux
igor@0:    /dev/hda3           145       209    522112+  82  Linux swap
igor@0:    /dev/hda4           210      1467  10104885    5  Extended
igor@0:    /dev/hda5           210       655   3582463+  83  Linux
igor@0:    ...
igor@0:    ...
igor@0:    /dev/hda15         1455      1467    104391   83  Linux
igor@0: \end{verbatim}
igor@0: 
igor@0: Просмотреть, какие разделы куда смонтированы, 
igor@0: и сколько свободного места есть на них (размеры в килобайтах):
igor@0: 
igor@0: \begin{verbatim}
igor@0:    %# df -k
igor@0:    Filesystem           1K-blocks      Used Available Use% Mounted on
igor@0:    /dev/hda2              1035692    163916    819164  17% /
igor@0:    /dev/hda1               101086      8357     87510   9% /boot
igor@0:    /dev/hda15              101086      4127     91740   5% /data1
igor@0:    ...
igor@0:    ...
igor@0:    ...
igor@0:    /dev/hda7              5336664    464228   4601344  10% /var
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Размонтирование}
igor@0: Если вы будете использовать созданные ранее разделы, 
igor@0: обязательно размонтируйте их. RAID-массив нельзя создавать
igor@0: поверх разделов, на которых находятся смонтированные файловые системы.
igor@0: 
igor@0: \begin{verbatim}
igor@0:    %# umount /dev/hde1
igor@0:    %# umount /dev/hdf2
igor@0:    %# umount /dev/hdg1
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Изменение типа разделов}
igor@0: Желательно (но не обязательно) изменить тип разделов, которые будут
igor@0: входить в RAID-массив и установить его равным FD (Linux RAID autodetect).
igor@0: Изменить тип раздела можно с помощью fdisk.
igor@0: 
igor@0: Рассмотрим как это делать на примере раздела \texttt{/dev/hde1}.
igor@0: \begin{verbatim}
igor@0:     %# fdisk /dev/hde
igor@0:     The number of cylinders for this disk is set to 8355. 
igor@0:     There is nothing wrong with that, but this is larger than 1024,
igor@0:     and could in certain setups cause problems with:
igor@0:     1) software that runs at boot time (e.g., old versions of LILO)
igor@0:     2) booting and partitioning software from other OSs
igor@0:     (e.g., DOS FDISK, OS/2 FDISK)
igor@0: 
igor@0:     Command (m for help):
igor@0: 
igor@0:     Use FDISK Help
igor@0: 
igor@0:     Now use the fdisk m command to get some help:
igor@0: 
igor@0:     Command (m for help): m
igor@0:     ...
igor@0:     ...
igor@0:     p   print the partition table
igor@0:     q   quit without saving changes
igor@0:     s   create a new empty Sun disklabel
igor@0:     t   change a partition's system id
igor@0:     ...
igor@0:     ...
igor@0:     Command (m for help):
igor@0: 
igor@0:     Set The ID Type To FD
igor@0: 
igor@0:     Partition /dev/hde1 is the first partition on disk /dev/hde. 
igor@0:     Modify its type using the t command, and specify the partition number 
igor@0:     and type code. 
igor@0:     You also should use the L command to get a full listing 
igor@0:     of ID types in case you forget.
igor@0: 
igor@0:     Command (m for help): t
igor@0:     Partition number (1-5): 1
igor@0:     Hex code (type L to list codes): L
igor@0: 
igor@0:     ...
igor@0:     ...
igor@0:     ...
igor@0:     16  Hidden FAT16    61   SpeedStor       f2  DOS secondary
igor@0:     17  Hidden HPFS/NTF 63  GNU HURD or Sys fd  Linux raid auto
igor@0:     18  AST SmartSleep  64  Novell Netware  fe  LANstep
igor@0:     1b  Hidden Win95 FA 65  Novell Netware  ff  BBT
igor@0:     Hex code (type L to list codes): fd
igor@0:     Changed system type of partition 1 to fd (Linux raid autodetect)
igor@0: 
igor@0:     Command (m for help):
igor@0: 
igor@0: 
igor@0:     Make Sure The Change Occurred
igor@0: 
igor@0:     Use the p command to get the new proposed partition table:
igor@0: 
igor@0:     Command (m for help): p
igor@0: 
igor@0:     Disk /dev/hde: 4311 MB, 4311982080 bytes
igor@0:     16 heads, 63 sectors/track, 8355 cylinders
igor@0:     Units = cylinders of 1008 * 512 = 516096 bytes
igor@0: 
igor@0:     Device Boot    Start       End    Blocks   Id  System
igor@0:     /dev/hde1             1      4088   2060320+  fd  Linux raid autodetect
igor@0:     /dev/hde2          4089      5713    819000   83  Linux
igor@0:     /dev/hde4          6608      8355    880992    5  Extended
igor@0:     /dev/hde5          6608      7500    450040+  83  Linux
igor@0:     /dev/hde6          7501      8355    430888+  83  Linux
igor@0: 
igor@0:     Command (m for help):
igor@0: 
igor@0: 
igor@0:     Save The Changes
igor@0: 
igor@0:     Use the w command to permanently save the changes to disk /dev/hde:
igor@0: 
igor@0:     Command (m for help): w
igor@0:     The partition table has been altered!
igor@0: 
igor@0:     Calling ioctl() to re-read partition table.
igor@0: 
igor@0:     WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
igor@0:     The kernel still uses the old table.
igor@0:     The new table will be used at the next reboot.
igor@0:     Syncing disks.
igor@0: \end{verbatim}
igor@0: 
igor@0: Аналогичным образом нужно изменить тип раздела
igor@0: для всех остальных разделов, входящих в RAID-массив.
igor@0: 
igor@0: \subsubsection{Создание RAID-массива}
igor@0: Создание RAID-массива выполняется с помощью программы \textbf{mdadm} (ключ \verb|--create|).
igor@0: Мы воспользуемся опцией \verb|--level|, для того чтобы создать RAID-массив 5 уровня.
igor@0: С помощью ключа \verb|--raid-devices| укажем устройства, поверх которых будет собираться
igor@0: RAID-массив.
igor@0: \begin{verbatim}
igor@0:     %# mdadm --create --verbose /dev/md0 --level=5 \
igor@0:     --raid-devices=3 /dev/hde1 /dev/hdf2 /dev/hdg1
igor@0: 
igor@0:     mdadm: layout defaults to left-symmetric
igor@0:     mdadm: chunk size defaults to 64K
igor@0:     mdadm: /dev/hde1 appears to contain an ext2fs file system
igor@0:         size=48160K  mtime=Sat Jan 27 23:11:39 2007
igor@0:     mdadm: /dev/hdf2 appears to contain an ext2fs file system
igor@0:         size=48160K  mtime=Sat Jan 27 23:11:39 2007
igor@0:     mdadm: /dev/hdg1 appears to contain an ext2fs file system
igor@0:         size=48160K  mtime=Sat Jan 27 23:11:39 2007
igor@0:     mdadm: size set to 48064K
igor@0:     Continue creating array? y
igor@0:     mdadm: array /dev/md0 started.
igor@0: \end{verbatim}
igor@0: 
igor@0: Если вы хотите сразу создать массив, где диска не хватает (degraded)
igor@0: просто укажите слово \texttt{missing} вместо имени устройства.
igor@0: Для RAID5 это может быть только один диск; для RAID6 — не более двух;
igor@0: для RAID1 — сколько угодно, но должен быть как минимум один рабочий.
igor@0: 
igor@0: \subsubsection{Проверка правильности сборки}
igor@0: Убедиться, что RAID-массив проинициализирован корректно
igor@0: можно просмотрев файл \texttt{/proc/mdstat}.
igor@0: В этом файле отражается текущее состояние RAID-массива.
igor@0: \begin{verbatim}
igor@0:     %# cat /proc/mdstat
igor@0:     Personalities : [raid5]
igor@0:     read_ahead 1024 sectors
igor@0:     md0 : active raid5 hdg1[2] hde1[1] hdf2[0]
igor@0:         4120448 blocks level 5, 32k chunk, algorithm 3 [3/3] [UUU]
igor@0: 
igor@0:     unused devices: <none>
igor@0: \end{verbatim}
igor@0: 
igor@0: Обратите внимание на то, как называется новый RAID-массив.
igor@0: В нашем случае он называется \texttt{/dev/md0}.
igor@0: Мы будем обращаться к массиву по этому имени.
igor@0: 
igor@0: \subsubsection{Создание файловой системы поверх RAID-массива}
igor@0: Новый RAID-раздел нужно отформатировать, т.е. создать на нём файловую систему.
igor@0: Сделать это можно при помощи программы из семейства \textbf{mkfs}.
igor@0: Если мы будем создавать файловую систему ext3, воспользуемся программой \textbf{mkfs.ext3}:
igor@0: \begin{verbatim}
igor@0:     %# mkfs.ext3 /dev/md0
igor@0:     mke2fs 1.39 (29-May-2006)
igor@0:     Filesystem label=
igor@0:     OS type: Linux
igor@0:     Block size=1024 (log=0)
igor@0:     Fragment size=1024 (log=0)
igor@0:     36144 inodes, 144192 blocks
igor@0:     7209 blocks (5.00%) reserved for the super user
igor@0:     First data block=1
igor@0:     Maximum filesystem blocks=67371008
igor@0:     18 block groups
igor@0:     8192 blocks per group, 8192 fragments per group
igor@0:     2008 inodes per group
igor@0:     Superblock backups stored on blocks: 
igor@0:             8193, 24577, 40961, 57345, 73729
igor@0: 
igor@0:     Writing inode tables: done
igor@0:     Creating journal (4096 blocks): done
igor@0:     Writing superblocks and filesystem accounting information: done
igor@0: 
igor@0:     This filesystem will be automatically checked every 33 mounts or
igor@0:     180 days, whichever comes first.  Use tune2fs -c or -i to override.
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Создание конфигурационного файла mdadm.conf}
igor@0: Система сама не запоминает какие RAID-массивы ей нужно создать
igor@0: и какие компоненты в них входят.
igor@0: Эта информация находится в файле \texttt{mdadm.conf}.
igor@0: 
igor@0: Строки, которые следует добавить в этот файл, 
igor@0: можно получить при помощи команды 
igor@0: \begin{verbatim}
igor@0:  mdadm --detail --scan --verbose
igor@0: \end{verbatim}
igor@0: 
igor@0: Вот пример её использования:
igor@0: 
igor@0: \begin{verbatim}
igor@0:     %# mdadm --detail --scan --verbose
igor@0:     ARRAY /dev/md0 level=raid5 num-devices=4 
igor@0:     UUID=77b695c4:32e5dd46:63dd7d16:17696e09
igor@0:     devices=/dev/hde1,/dev/hdf2,/dev/hdg1
igor@0: \end{verbatim}
igor@0: 
igor@0: Если файла \texttt{mdadm.conf} ещё нет, можно его создать:
igor@0: \begin{verbatim}
igor@0:     %# mdadm --detail --scan --verbose > /etc/mdadm.conf
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Создание точки монтирования для RAID-массива}
igor@0: Поскольку мы создали новую файловую систему, вероятно, 
igor@0: нам понадобится и новая точка монтирования.
igor@0: Назовём её \texttt{/raid}.
igor@0: \begin{verbatim}
igor@0:     %# mkdir /raid
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Изменение /etc/fstab}
igor@0: Для того чтобы файловая система, созданная на новом RAID-массиве автоматически монтировалась
igor@0: при загрузке, добавим соотвествующую запись в файл \texttt{/etc/fstab}
igor@0: хранящий список автоматически монтируемых при загрузке файловых систем.
igor@0: \begin{verbatim}
igor@0:    /dev/md0      /raid     ext3    defaults    1 2
igor@0: \end{verbatim}
igor@0: 
igor@0: Если мы объединяли в RAID-массив разделы, которые использовались раньше, 
igor@0: нужно отключить их монтирование: удалить или закомментировать соответствующие строки
igor@0: в файле \texttt{/etc/fstab}.
igor@0: Закомментировать строку можно символом \texttt{\#}.
igor@0: \begin{verbatim}
igor@0:     #/dev/hde1       /data1        ext3    defaults        1 2
igor@0:     #/dev/hdf2       /data2        ext3    defaults        1 2
igor@0:     #/dev/hdg1       /data3        ext3    defaults        1 2
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Монтирование файловой системы нового RAID-массива}
igor@0: Для того чтобы получить доступ к файловой системе, расположенной на новом RAID-массиве, 
igor@0: её нужно смонтировать. Монтирование выполняется с помощью команды \textbf{mount}.
igor@0: 
igor@0: Если новая файловая система добавлена в файл \texttt{/etc/fstab},
igor@0: можно смонтировать её командой \textbf{mount} \texttt{-a}
igor@0: (смонтируются все файловые системы, которые должны монтироваться при загрузке, но сейчас не смонтированы).
igor@0: \begin{verbatim}
igor@0:    %# mount -a
igor@0: \end{verbatim}
igor@0: Можно смонтировать только нужный нам раздел (при условии, что он указан в \texttt{/etc/fstsb}).
igor@0: \begin{verbatim}
igor@0:    %# mount /raid
igor@0: \end{verbatim}
igor@0: Если раздел в \texttt{/etc/fstab} не указан, то при монтировании мы должны задавать как минимум два параметра:
igor@0: точка монтирования и монтируемое устройство:
igor@0: \begin{verbatim}
igor@0:    %# mount /dev/md0 /raid
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Проверка состояния RAID-массива}
igor@0: Информация о состоянии RAID-массива находится в файле \texttt{/proc/mdstat}.
igor@0: \begin{verbatim}
igor@0:     %# raidstart /dev/md0
igor@0:     %# cat /proc/mdstat
igor@0:     Personalities : [raid5]
igor@0:     read_ahead 1024 sectors
igor@0:     md0 : active raid5 hdg1[2] hde1[1] hdf2[0]
igor@0:         4120448 blocks level 5, 32k chunk, algorithm 3 [3/3] [UUU]
igor@0: 
igor@0:     unused devices: <none>
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsection{Дальнейшая работа с массивом}
igor@0: \subsubsection{Пометка диска как сбойного}
igor@0: Диск в массиве можно условно сделать сбойным, ключ \verb|--fail| (\texttt{-f}):
igor@0: \begin{verbatim}
igor@0:     %# mdadm /dev/md0 --fail /dev/hde1
igor@0:     %# mdadm /dev/md0 -f     /dev/hde1
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Удаление сбойного диска}
igor@0: Сбойный диск можно удалить с помощью ключа \verb|{--remove| (\texttt{-r}):
igor@0: \begin{verbatim}
igor@0:     %# mdadm /dev/md0 --remove /dev/hde1
igor@0:     %# mdadm /dev/md0 -r       /dev/hde1
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Добавление нового диска}
igor@0: Добавить новый диск в массив можно с помощью ключей \verb|--add| (\texttt{-a}) 
igor@0: и \verb|--re-add|:
igor@0: \begin{verbatim}
igor@0:     %# mdadm /dev/md0 --add /dev/hde1
igor@0:     %# mdadm /dev/md0 -a    /dev/hde1
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Сборка существующего массива}
igor@0: Собрать существующий массив можно с помощью \textbf{mdadm} \texttt{--assemble}.
igor@0: Как дополнительный аргумент указывается,
igor@0: нужно ли выполнять сканирование устройств, и если нет, то
igor@0: какие устройства нужно собирать.
igor@0: \begin{verbatim}
igor@0:     %# mdadm --assemble /dev/md0 /dev/hde1 /dev/hdf2 /dev/hdg1
igor@0:     %# mdadm --assemble --scan
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Расширение массива}
igor@0: Расширить массив можно с помощью ключа \texttt{--grow} (\texttt{-G}).
igor@0: Сначала добавляется диск, а потом массив расширяется:
igor@0: \begin{verbatim}
igor@0:     %# mdadm /dev/md0 --add /dev/hdh2
igor@0: \end{verbatim}
igor@0: 
igor@0: Проверяем, что диск (раздел) добавился:
igor@0: 
igor@0: \begin{verbatim}
igor@0:     %# mdadm --detail /dev/hdh2
igor@0:     %# cat /proc/mdstat
igor@0: \end{verbatim}
igor@0: 
igor@0: Если раздел действительно добавился, 
igor@0: мы можем расширить массив:
igor@0: 
igor@0: \begin{verbatim}
igor@0:     %# mdadm -G /dev/md0 --raid-devices=4
igor@0: \end{verbatim}
igor@0: 
igor@0: Убедитесь, что массив расширился:
igor@0: 
igor@0: \begin{verbatim}
igor@0:     %# cat /proc/mdstat
igor@0: \end{verbatim}
igor@0: 
igor@0: Нужно обновить обновить конфигурационный файл с учётом сделанных
igor@0: изменений:
igor@0: 
igor@0: \begin{verbatim}
igor@0:     %# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
igor@0:     %# vi /etc/mdadm/mdadm.conf
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsection{Дополнительная информация}
igor@0: \begin{itemize}
igor@0: \item \htmladdnormallinkfoot{Программный RAID в Linux}{http://xgu.ru/wiki/raid} (рус.)
igor@0: \item \htmladdnormallinkfoot{man mdadm}{http://linux.die.net/man/8/mdadm} (англ.)
igor@0: \item \htmladdnormallinkfoot{man mdadm.conf}{http://linux.die.net/man/5/mdadm.conf} (англ.)
igor@0: \item \htmladdnormallinkfoot{Linux Software RAID}{http://www.linuxhomenetworking.com/wiki/index.php/Quick\_HOWTO\_:\_Ch26\_:\_Linux\_Software\_RAID} (англ.)
igor@0: \item \htmladdnormallinkfoot{HOWTO Gentoo Install on Software RAID}{http://gentoo-wiki.com/HOWTO\_Gentoo\_Install\_on\_Software\_RAID} (англ.)
igor@0: \item \htmladdnormallinkfoot{HOWTO Migrate To RAID}{http://gentoo-wiki.com/HOWTO\_Migrate\_To\_RAID} (англ.)
igor@0: \item \htmladdnormallinkfoot{Remote Conversion to Linux Software RAID-1 for Crazy Sysadmins HOWTO}{http://togami.com/~warren/guides/remoteraidcrazies/} (англ.)
igor@0: \item \htmladdnormallinkfoot{Migrating To RAID1 Mirror on Sarge}{http://www.debian-administration.org/articles/238} (англ.)
igor@0: \end{itemize}
igor@0: 
igor@0: Производительность программных RAID-массивов:
igor@0: \begin{itemize}
igor@0: \item Adventures With Linux RAID: \htmladdnormallinkfoot{Part 1}{http://opennfo.wordpress.com/2007/09/02/adventures-with-linux-raid-part-1/}, \htmladdnormallinkfoot{Part 2}{http://opennfo.wordpress.com/2007/09/08/adventures-with-linux-raid-part-2/} (англ.)
igor@0: \end{itemize}
igor@0: 




