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: 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: 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: