BASH Programming - Введение

         

Запуск демонов


Есть два демона SMB /usr/sbin/smbd и /usr/sbin/nmbd. В большинстве дистрибутивов Linux, они запускаются, останавливаются и перезапускаются через стартовый скрипт, расположенный в /etc/rc.d/init.d/smb, на который созданы символьные ссылки с соответствующих уровней запуска.

Если вы не будете использовать стандартные стартовые скрипты, то Вы можете запустить демоны Samba из inetd или как автономные процессы. Samba будет отвечать чуть быстрее когда она запущена как автономный процесс, чем в случае когда она запускается из inetd.

В некоторых случаях вы должны проверить наличие в файле /etc/services примерно таких строк:

netbios-ns 137/tcp nbns netbios-ns 137/udp nbns netbios-dgm 138/tcp nbdgm netbios-dgm 138/udp nbdgm netbios-ssn 139/tcp nbssn

Убедитесь, что все они не закомментированы. В зависимости от вашего дистрибутива, вам может даже нужно будет добавить их в этот файл. Samba не сможет привязаться к соответствующим портам пока этих строк не будет в файле /etc/services.

Для запуска демонов из inetd, поместите следующие строки в конфигурационный файл inetd, /etc/inetd.conf:

# SAMBA NetBIOS services (for PC file and print sharing) netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd

Затем перезапустите демон inetd выполнив команду:

kill -HUP 1 `cat /var/run/inetd.pid`

Для запуска демонов из системных стартовых скриптов, поместите следующий скрипт в файл /etc/rc.d/init.d/smb (для большинства дистрибутивов) и создайте на него символические ссылки с именами указанными в комментариях:

#!/bin/sh

# # /etc/rc.d/init.d/smb - запускает и останавливает сервисы SMB # # Следующие файлы должны быть символическими ссылками на этот файл: # symlinks: # /etc/rc.d/rc1.d/K35smb (Убивает сервисы SMB при выключении # /etc/rc.d/rc3.d/S91smb (Запускает сервисы SMB в многопользовательском режиме) # /etc/rc.d/rc6.d/K35smb (Убивает сервисы SMB при перезагрузке) #

# Source function library. . /etc/rc.d/init.d/functions

# Source networking configuration. . /etc/sysconfig/network

# Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0

# See how we were called. case "$1" in start) echo -n "Starting SMB services: " daemon smbd -D daemon nmbd -D echo touch /var/lock/subsys/smb ;; stop) echo -n "Shutting down SMB services: " killproc smbd killproc nmbd rm -f /var/lock/subsys/smb echo "" ;; *) echo "Usage: smb {start|stop}" exit 1 esac

Если при старте Samba вы получаете сообщение в котором говорится, что демон не может подключится к порту 139, то вероятно у вас уже есть запущенные процессы Samba, которые не были завершены. Посмотрите список процессов (используя команду 'ps auxww | grep mbd') для того, чтобы определить есть ли еще запущенные сервисы Samba.



Использование Samba между маршрутизируемыми сетями


Andrew Tridgell заявил, что просмотр машин с SMB через маршрутизаторы является проблематичной задачей. Вот его предложения для исправления:

-------------------------------------------------------------- Для просмотра пересекающихся подсетей (например маршрутизируемых) вы должны сделать следующее. Существуют другие способы, но они более сложные и склонны к появлению ошибок:

1) все компьютеры, которые вы хотите видеть должны использовать один сервер WINS (это могут делать Samba или NT)

2) основной броузер для каждой сети должен быть либо NT, либо Samba. (Win9X неправильно распространяет межсетевую информацию)

3) Вы должны использовать одно имя рабочей группы во всех подсетях. Это не обязательно, но это может быть простым способом достижения успеха. Если вы не можете достичь этого. то вы должны организовать распространение информации между подсетями. (Это не распространение через WINS). Информация распространяется двумя способами: i) каждый основной броузер извещает анонсы рабочих групп от других основных броузеров в своем широковещательном домене ii) каждый не-Win9X основной броузер связывается с глобальным DMB для рабочей группы (обычно это контролер домена или машина с Samba, отмеченная как мастер домена) и периодически обменивается полной информацией. --------------------------------------------------------------

Также, Rakesh Bharania указал, что маршрутизатор Cisco может быть настроен для передачи данных SMB способом, который позволит просмотр серверов. Он предлагает настроить интерфейс маршрутизатора, который обслуживает SMB-машины с помощью следующей команды:

ip helper-address x.x.x.x

где x.x.x.x это IP-адрес SMB-сервера.





David Wood, , перевод Alex Ott ott@phtd.tpu.edu.ru


v1.3, 20 апреля 2000

Это SMB HOWTO. Этот документ описывает использование в Linux, с помощью Samba, протокола Server Message Block (SMB), который иногда также называется протоколом Session Message Block (SMB), протоколом NetBIOS или протоколом LanManager.

Примечание переводчика: Шлите мне любые комментарии и замечания, даже небольшие.



Дополнительная информация


Этот документ делает попытку объяснить как настроить основные файловые и принтерные SMB-сервисы на Linux-машине. Samba является очень сложным и законченным пакетом. Незачем пытаться дублировать здесь всю документацию на Samba.

Для дополнительной информации смотрите следующие документы:

Документация на Samba, доступная как часть дистрибутива Samba. Дистрибутив доступен по адресу:

The Linux Printing HOWTO.

The Print2Win Mini-HOWTO.

Стандарт протокола для сервиса NetBIOS при использовании транспорта TCP/UDP.

RFC 1001

RFC 1001 - Концепции и методы. RFC 1002

RFC 1002 - Подробные спецификации



Доступ к принтеру Linux для Windows-машин


Для организации доступа к Linux-принтеру с Windows машин, вам необходимо убедиться, что принтер работает под Linux. Если вы можете печатать под Linux, то организация доступа к принтеру будет очень проста.

Заметьте, что для того, чтобы печатать пользователи Windows должны быть зарегистрированы на сервере Linux/Samba. Windows 95/98 будет пытаться аутентифицироваться на сервер печати с тем именем и паролем, который использовался для входа на машину с Windows Это значит, что если вы нажали на 'Cancel (Отмена)' при входе в Windows, то вы не сможете печатать, или подключаться к SMB сервисам! Windows NT позволяет явно задавать имя и пароль при подключении к принтеру.

Смотрите Printing HOWTO для дополнительной информации о настройке печати.

Добавьте настройку принтера в ваш файл smb.conf:

[global] printing = bsd printcap name = /etc/printcap load printers = yes log file = /var/log/samba-log.%m lock directory = /var/lock/samba

[printers] comment = All Printers security = server path = /var/spool/lpd/lp browseable = no printable = yes public = yes writable = no create mode = 0700

[ljet] security = server path = /var/spool/lpd/lp printer name = lp writable = yes public = yes printable = yes print command = lpr -r -h -P %p %s

Убедитесь, что путь к принтеру (в этом случае для [ljet]) соответствует буферной директории, указанной в файле /etc/printcap!

Строки:

printcap name = /etc/printcap load printers = yes

контролируют должны ли все принтера, перечисленные в /etc/printcap по умолчанию быть загружены. Если вы сделаете это, то нет причины для настройки каждого принтера в отдельности. Раздел [printers] указывает настройки для принтеров, которые вы хотите определить явно. Если используемая вами подсистема печати не работает этим образом (BSD), то вам необходимо настроить фальшивый файл printcap (или используйте 'print command', смотрите ниже). Для дополнительной информации о системе printcap смотрите Printing-HOWTO.

Полезным приемом для проверки сетевых соединений является изменение команды печати на:


print command = cp %S /tmp/print.%P.%S

Итоговый файл может быть проанализирован.

ЗАМЕЧАНИЕ: Существуют некоторые проблемы с доступом к принтерам на UNIX-машинах для машин с Windows NT используя Samba. Одна из проблем в том, что NT неправильно видит сетевой принтер. Для решения этой проблемы, смотрите замечание в файле docs/WinNT.txt дистрибутива Samba. Другая проблема связана с проблемой пароля. Смотрите комментарий в том же самом файле.

Oleg L. Machulskiy ( ) предложил более удобную для использования команду печати, чем в вышеприведенном примере:

print command = smb2ps %s | lpr -r -h -P %p

где 'smb2ps' является скриптом, который преобразует буферный файл, переданный из под Windows в обычно используемый файл Postscript. Он должен удалять первые три и последние две строки, потому что эти строки содержат некоторые коды PJL или PCL.

Такой подход нужен только если ваша машина с Windows печатает PCL, а не настоящий Postscript. Я обнаружил, что Windows 95/98/NT не имеют общего драйвера Postscript, но драйвер принтера "Digital turbo Printserver 20" может работать как хороший драйвер Postscript для большинства случаев. Я также слышал, что для этих же целей может работать драйвер "Apple LaserWriter II NTX".

Если вы создали буферный каталог для печати, вместо использования созданных при установке дистрибутива Linux, то будьте внимательны с правами доступа! Neil Fraser ( ) предложил права доступа к буферному каталогу (в нашем случае это, /var/spool/lpd/lpr) сделать равными 4755 (заметьте, что установлен suid-бит). Это работает в его конфигурации, если владельцем каталога является пользователь 'root', а группа равна 'lp'.

Jeff Stern ( ) написал, что он установил права доступа к каталогу равными 777, для того, чтобы обычные пользователи могли печатать, хотя он заметил, что он также добавил пользователей в группу 'lp'. Это решение пригодно для локальных системных администраторов; если безопасность печати является предметом споров, то не используйте данное решение. В домашних условиях, вы вероятно захотите, чтобы все могли печатать.

Dr. Michael Langner ( ) указал, что проблема прав доступа на запись на дерево директорий /var/spool/lpd/ может быть избегнута, использованием чего-то подобного "path=/tmp" и "print command = lpr -r -P%p %s".

Иногда возникает ошибка разбора Postscript при печати Postscript с машины под Windows, что вызывает печать лишних страниц в конце каждого задания. Последняя страница всегда будет содержать сообщение "%%[ Lastpage ]%%" в заголовке. Это кажется случается только на машинах с Windows 95 и 98 и это происходит из-за того, что Postscript является плохо-сформированным.

Одним из способов обработки этой ошибки --- использовать скрипт для удаления куска плохого Postscript из задания печати. Другим способом является нахождение лучшего драйвера Postscript для Windows. Вероятно лучший способ для нас это использовать LPRng вместо Postscript для печати на сервер Samba.

Erik Ratcliffe ( ), Caldera, сообщил, что использование LPRng означает, что любой драйвер принтера может быть использован с машин под Windows. На сервере Samba, они используют запись в /etc/printcap, которая выглядит примерно так:

raw:\ :rw:sh: :lp=/dev/lp1 :sd=/var/spool/lpd/raw :fx=flp

LPRng не требует :\ в конце каждой строки. Запись о принтере все равно необходимо сделать в файле /etc/smb.conf для физического принтера. Строка команды печати нужна для использования записи "raw" из файла /etc/printcap и данные должны посылаться в двоичной форме. Попробуйте вот такую командную строку:

print command = lpr -b -Praw %s

Вам также может понадобиться установить буферизацию печати на Windows95 для печати прямо на принтер, вместо использования буферизации на сервере.

Если вы при печати постоянно получаете лишние страницы в конце задания с клиентов с Windows, то попробуйте добавить директиву "sf" в файл /etc/printcap. Это запретит прогон страниц, разделяющих задание, но не будет влиять на прогон страниц внутри документов.


Доступ к принтеру Windows с машин работающих под Linux


Для доступа к принтеру на Windows машине, вы должны сделать следующее:

ВЫ должны иметь правильные записи в файле /etc/printcap и они должны соответствовать локальной структуре директорий (для буферной директории, и т.п.)

У вас должен быть скрипт /usr/bin/smbprint. Он поставляется вместе с исходными текстами Samba, но не со всеми двоичными дистрибутивами Samba. Его немного модифицированная копия обсуждается ниже.

Если вы хотите преобразовывать ASCII файлы в Postscript, вы должны иметь программу nenscript, или ее эквивалент. nenscript-- это конвертер Postscript, он обычно устанавливается в директорию /usr/bin.

Вы можете захотеть сделать печать через Samba более легкой, используя программы-надстройки. Простой скрипт на perl, который обрабатывает ASCII, Postscript или преобразованный Postscript приведен ниже.

Вы также можете использовать MagicFilter для того, чтобы выполнить, описанное выше. Подробности о настройке MagicFilter приводятся ниже. MagicFilter имеет преимущества, потому, что он знает как автоматически преобразовывать достаточно большое количество форматов файлов.

Запись в файле /etc/printcap, приведенном ниже, сделана для принтера HP 5MP на сервере Windows NT. Используются следующие поля файла /etc/printcap:

cm - комментарий lp - имя устройства, открываемого для вывода sd - директория спула принтера (на локальной машине) af - файл учета пользования принтером mx - максимальный размер файла (ноль -- без ограничений) if - имя входного фильтра (скрипта)

Для более детальной информации о печати смотрите Printing HOWTO

или справочные страницы по printcap.

# /etc/printcap # # //zimmerman/oreilly via smbprint # lp:\ :cm=HP 5MP Postscript OReilly on zimmerman:\ :lp=/dev/lp1:\ :sd=/var/spool/lpd/lp:\ :af=/var/spool/lpd/lp/acct:\ :mx#0:\ :if=/usr/bin/smbprint:

Убедитесь, что буферные директории и директория, используемая для учета пользования существуют и имеют право на запись. Убедитесь, что строка 'if' содержит правильный путь к скрипту smbprint (дан ниже) и убедитесь, что записи указывают на правильное устройство вывода (специальный файл /dev).

Далее идет сам скрипт smbprint. Он обычно находится в директории /usr/bin и написан Andrew Tridgell, человеком, который пакет создал Samba, насколько я знаю. Этот скрипт поставляется вместе с дистрибутивом исходного кода Samba, но отсутствует в некоторых бинарных дистрибутивах, так что я воссоздал его здесь.

Вы можете захотеть взглянуть на него более внимательно. Есть некоторые мелкие изменения, которые показали себя полезными.


#!/bin/sh -x

# Этот скрипт является входным фильтром для основанной на printcap # печати на unix-машинах. Он использует программу smbclient для # печати файла на указанный smb-сервер и сервис. # Например вы можете иметь запись в printcap подобную этой # # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint # # которая создает unix-принтер названный "smb", который будет # печатать с помощью этого скрипта. Вам необходимо создать директорию # спула /usr/spool/smb с соответствующими правами и владельцем

# Установите здесь сервер и сервис на который вы хотите печатать. В # этом примере я имею PC с WfWg PC, названную "lapland", которая # имеет экспортируемый принтер, называемый "printer" без пароля

# # Далее скрипт был изменен hamiltom@ecnz.co.nz (Michael Hamilton) # так что сервер, сервис и пароль могут быть считаны из файла # /usr/var/spool/lpd/PRINTNAME/.config # # Для того чтобы это работало запись в /etc/printcap должна # включать файл учета использования (af=...): # # cdcolour:\ # :cm=CD IBM Colorjet on 6th:\ # :sd=/var/spool/lpd/cdcolour:\ # :af=/var/spool/lpd/cdcolour/acct:\ # :if=/usr/local/etc/smbprint:\ # :mx=0:\ # :lp=/dev/null: # # Файл /usr/var/spool/lpd/PRINTNAME/.config должен содержать # server=PC_SERVER # service=PR_SHARENAME # password="password" # # Например, # server=PAULS_PC # service=CJET_371 # password=""

# # Debugging log file, change to /dev/null if you like. # logfile=/tmp/smb-print.log # logfile=/dev/null

# # The last parameter to the filter is the accounting file name. # spool_dir=/var/spool/lpd/lp config_file=$spool_dir/.config

# Should read the following variables set in the config file: # server # service # password # user eval `cat $config_file`

# # Some debugging help, change the >> to > if you want to same space. # echo "server $server, service $service" >> $logfile

( # NOTE You may wish to add the line `echo translate' if you want automatic # CR/LF translation when printing. echo translate echo "print -" cat ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile



Большинство дистрибутивов Linux поставляется с программой nenscript для преобразования ASCII документов в Postscript. Следующий скрипт на perl делает жизнь пользователя легче, обеспечивая простой интерфейс для печати используя smbprint.

Использование: print [-a|c|p] <filename>

-a печатает <filename> как ASCII -c печатает <filename> отформатированный как исходный код -p печатает <filename> как Postscript Если опции не заданы, программа попробует определить тип файла и печатать соответственно

Используя smbprint для печати ASCII файлов, скрипт следит за длинными строками. Если возможно, этот скрипт разрывает длинную строку на пробеле (вместо разрыва в середине слова).

Форматирование исходного кода выполняется с помощью программы nenscript. Она берет ASCII-файл и форматирует его в 2 колонки с заголовком (дата, имя файла и т.п.). Эта программа также нумерует строки. Используя этот скрипт как пример, могут быть добавлены другие типы форматирования.

Postscript-документы являются уже отформатированы, так что они печатаются сразу.

#!/usr/bin/perl

# Скрипт: print # Авторы: Brad Marshall, David Wood # Plugged In Communications # Дата: 960808 # # Используется для печати на сервис oreilly, который расположен на # сервере zimmerman # Назначение: Берет файлы разных типов как аргумент и обрабатывает # их соответственно для передачи на скрипт печать Samba. # # В настоящее время поддерживаются типы файлов: # # ASCII - Если длина строки длиннее чем $line_length символов, то # переносит строку на пробеле # Postscript - Берет без обработки # Code - Форматирует в Postscript (используя nenscript), чтобы # отображать правильно (альбомный формат, фонт и т.п.) #

# Установить максимальную длину строки ASCII текста $line_length = 76;

# Установить путь к скрипту печати Samba $print_prog = "/usr/bin/smbprint";

# Установить путь и имя nenscript (конвертера ASCII-->Postscript) $nenscript = "/usr/bin/nenscript";

unless ( -f $print_prog ) { die "Can't find $print_prog!"; } unless ( -f $nenscript ) { die "Can't find $nenscript!"; }



&ParseCmdLine(@ARGV);

# DBG print "filetype is $filetype\n";

if ($filetype eq "ASCII") { &wrap($line_length); } elsif ($filetype eq "code") { &codeformat; } elsif ($filetype eq "ps") { &createarray; } else { print "Sorry..no known file type.\n"; exit 0; } # Pipe the array to smbprint open(PRINTER, "|$print_prog") die "Can't open $print_prog: $!\n"; foreach $line (@newlines) { print PRINTER $line; } # Send an extra linefeed in case a file has an incomplete last line. print PRINTER "\n"; close(PRINTER); print "Completed\n"; exit 0;

# --------------------------------------------------- # # Everything below here is a subroutine # # --------------------------------------------------- #

sub ParseCmdLine { # Parses the command line, finding out what file type the file is

# Gets $arg and $file to be the arguments (if the exists) # and the filename if ($#_ < 0) { &usage; } # DBG # foreach $element (@_) { # print "*$element* \n"; # }

$arg = shift(@_); if ($arg =~ /\-./) { $cmd = $arg; # DBG # print "\$cmd found.\n";

$file = shift(@_); } else { $file = $arg; }

# Defining the file type unless ($cmd) { # We have no arguments

if ($file =~ /\.ps$/) { $filetype = "ps"; } elsif ($file =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) { $filetype = "code"; } else { $filetype = "ASCII"; }

# Process $file for what type is it and return $filetype } else { # We have what type it is in $arg if ($cmd =~ /^-p$/) { $filetype = "ps"; } elsif ($cmd =~ /^-c$/) { $filetype = "code"; } elsif ($cmd =~ /^-a$/) { $filetype = "ASCII" } } }

sub usage { print " Использование: print [-a|c|p] <filename>

-a печатает <filename> как ASCII -c печатает <filename> отформатированный как исходный код -p печатает <filename> как Postscript Если опции не заданы, программа попробует определить тип файла и печатать соответственно\n "; exit(0); }



sub wrap { # Create an array of file lines, where each line is < the # number of characters specified, and wrapped only on whitespace

# Get the number of characters to limit the line to. $limit = pop(@_);

# DBG #print "Entering subroutine wrap\n"; #print "The line length limit is $limit\n";

# Read in the file, parse and put into an array. open(FILE, "<$file") die "Can't open $file: $!\n"; while(<FILE>) { $line = $_;

# DBG #print "The line is:\n$line\n";

# Wrap the line if it is over the limit. while ( length($line) > $limit ) {

# DBG #print "Wrapping...";

# Get the first $limit +1 characters. $part = substr($line,0,$limit +1);

# DBG #print "The partial line is:\n$part\n";

# Check to see if the last character is a space. $last_char = substr($part,-1, 1); if ( " " eq $last_char ) { # If it is, print the rest.

# DBG #print "The last character was a space\n";

substr($line,0,$limit + 1) = ""; substr($part,-1,1) = ""; push(@newlines,"$part\n"); } else { # If it is not, find the last space in the # sub-line and print up to there.

# DBG #print "The last character was not a space\n";

# Remove the character past $limit substr($part,-1,1) = ""; # Reverse the line to make it easy to find # the last space. $revpart = reverse($part); $index = index($revpart," "); if ( $index > 0 ) { substr($line,0,$limit-$index) = ""; push(@newlines,substr($part,0,$limit-$index) . "\n"); } else { # There was no space in the line, so # print it up to $limit. substr($line,0,$limit) = ""; push(@newlines,substr($part,0,$limit) . "\n"); } } } push(@newlines,$line); } close(FILE); }

sub codeformat { # Call subroutine wrap then filter through nenscript &wrap($line_length);

# Pipe the results through nenscript to create a Postscript # file that adheres to some decent format for printing # source code (landscape, Courier font, line numbers). # Print this to a temporary file first. $tmpfile = "/tmp/nenscript$$"; open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") die "Can't open nenscript: $!\n"; foreach $line (@newlines) { print FILE $line; } close(FILE);



# Read the temporary file back into an array so it can be # passed to the Samba print script. @newlines = (""); open(FILE, "<$tmpfile") die "Can't open $file: $!\n"; while(<FILE>) { push(@newlines,$_); } close(FILE); system("rm $tmpfile"); }

sub createarray { # Create the array for postscript open(FILE, "<$file") die "Can't open $file: $!\n"; while(<FILE>) { push(@newlines,$_); } close(FILE); }

Теперь о применении MagicFilter. Спасибо Alberto Menegazzi ( ) за его информацию.

Alberto сообщил: -------------------------------------------------------------- 1) Установите MagicFilter в /usr/bin/local с фильтрами для необходимых принтеров, но НЕ заполняйте записи в /etc/printcap, как предполагается в документации на MagicFilter.

2) Запишите в /etc/printcap примерно вот такую запись (Это сделано для моего принтера LaserJet 4L):

lp|ljet4l:\ :cm=HP LaserJet 4L:\ :lp=/dev/null:\ # or /dev/lp1 :sd=/var/spool/lpd/ljet4l:\ :af=/var/spool/lpd/ljet4l/acct:\ :sh:mx#0:\ :if=/usr/local/bin/main-filter:

Вы должны, объяснить, что устройство lp=/dev/... открывается для блокирования, так что для каждого удаленного принтера используется одно "виртуальное устройство".

Пример создания : touch /dev/ljet4l

3) Напишите фильтр /usr/local/bin/main-filter, с таким же образом предполагая использование ljet4l-filter вместо cat.

Вот так для меня.

#! /bin/sh logfile=/var/log/smb-print.log spool_dir=/var/spool/lpd/ljet4l ( echo "print -" /usr/local/bin/ljet4l-filter ) | /usr/bin/smbclient "\\\\SHIR\\HPLJ4" -N -P >> $logfile

P.S. : Это цитата из Print2Win mini-Howto о блокировании, а также о том, зачем создавать виртуальные принтера

---Начало здесь --------- Совет от Rick Bressler :

Хороший совет. Я использую нечто подобное. Вот один полезный совет, хотя он не является хорошей идеей:

:lp=/dev/null:\

lpr делает 'монопольное (exclusive)' открытие файла, который вы укажете в поле lp=. Он делает это для предотвращения попыток множества процессов печатать одновременно на одном и том же принтере.

Побочным эффектом этого, в вашем случае является то, что eng и colour не могут печатать одновременно, (обычно более или менее прозрачно, поскольку они вероятно печатают быстро и поскольку вы не замечаете, что они ставят задания в очередь), но любые другие процессы, которые пытаются записать в /dev/null не будут работать!

На однопользовательской системе, это вероятно не является большой проблемой. У меня имеется система с 50 принтерами. В этом случае это может быть проблемой.

Решение этой проблемы заключалось в создании устройства для каждого их принтеров. Например: touch /dev/eng.

Я модифицировал записи lp в файле printcap, приведенном выше, приняв во внимание пожелания Rick. Я сделал следующее:

#touch /dev/eng #touch /dev/colour

---Конец -----

--------------------------------------------------------------


Доступ к SMB-ресурсам из Linux


Машины с Linux (UNIX) могут также просматривать и монтировать SMB-ресурсы. Заметьте, что это может быть сделано когда сервером является либо машина с Windows, либо с сервером Samba!

Программа клиента SMB для UNIX-машин включена в дистрибутив Samba. Она обеспечивает ftp-подобный интерфейс командной строки. Вы можете использовать эту утилиту для переноса файлов между 'сервером' под управлением Windows и клиентом под Linux.

Большинство дистрибутивов Linux также включают полезный пакет smbfs, который позволяет монтировать и размонтировать SMB-ресурсы. Больше информации о smbfs можно получить дальше.

Для того, чтобы увидеть какие ресурсы доступны на данной машине, выполните команду:

/usr/bin/smbclient -L host

где 'host' это имя машины, которую вы хотите видеть. Эта команда вернет список имен 'сервисов' - т.е. имен дисков или принтеров к которым может быть получен доступ. До тех пор, пока SMB сервер не будет настроен без управления доступом, он будет запрашивать у вас пароль. Введите в ответ на запрос пароль для пользователя 'гость (guest)' или ваш персональный пароль на этой машине.

Например:

smbclient -L zimmerman

Вывод этой команды должен выглядеть примерно так:

Server time is Sat Aug 10 15:58:27 1996 Timezone is UTC+10.0 Password: Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]

Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]

Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin public Disk Public C$ Disk Default share IPC$ IPC Remote IPC OReilly Printer OReilly print$ Disk Printer Drivers

This machine has a browse list:

Server Comment --------- ------- HOPPER Samba 1.9.15p8 KERNIGAN Samba 1.9.15p8 LOVELACE Samba 1.9.15p8 RITCHIE Samba 1.9.15p8 ZIMMERMAN

Browse list показывает другие SMB сервера в сети с доступными ресурсами.

Для использования клиента, выполните следующую команду:

/usr/bin/smbclient service <password>

где 'service'-- имя машины и сервиса. Например, если вы пытаетесь обратиться к директории, которая доступна под именем 'public' на машине названной 'zimmerman', то имя сервиса должно звучать как \\zimmerman\public. Однако в следствии ограничений оболочки, вам необходимо спрятать обратный слэш, так что в итоге это командная строка выглядеть следующим образом:


/usr/bin/smbclient \\\\zimmerman\\public mypasswd

где 'mypasswd' -- символьная строка вашего пароля.

Вы получите приглашение smbclient:

Server time is Sat Aug 10 15:58:44 1996 Timezone is UTC+10.0 Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51] smb: \>

Напечатайте 'h' чтобы получить помощь об использовании smbclient:

smb: \> h ls dir lcd cd pwd get mget put mput rename more mask del rm mkdir md rmdir rd prompt recurse translate lowercase print printmode queue cancel stat quit q exit newer archive tar blocksize tarmode setmode help ? ! smb: \>

Если вы умеете использовать ftp, то вам не будут нужны справочные страницы о smbclient.

Хотя вы можете использовать smbclient для тестирования, вы скоро устанете использовать его в работе. Для работы вам скорее всего понадобится пакет smbfs. Smbfs поставляется с двумя простыми утилитами, smbmount и smbumount. Они работают подобно mount и umount для SMB-ресурсов.

Одно важное замечание: Чтобы использовать эти утилиты, у вас должна быть поддержка smbfs вкомпилированная в ядро!

Следующий пример показывает типичное использование smbmount для монтирования SMB-ресурса, названного "customers" с машины с именем "samba1":

[root@postel]# smbmount "\\\\samba1\\customers" -U rtg2t -c 'mount /customers -u 500 -g 100' Added interface ip=192.168.35.84 bcast=192.168.255.255 nmask=255.255.0.0 Got a positive name query response from 192.168.168.158 ( 192.168.168.158 ) Server time is Tue Oct 5 10:27:36 1999 Timezone is UTC-4.0 Password: Domain=[IPM] OS=[Unix] Server=[Samba 2.0.3] security=user

Запуск команды mount покажет вам, что ресурс смонтирован, точно также как и через экспорт NFS:

[root@postel]# mount /dev/hda2 on / type ext2 (rw) none on /proc type proc (rw) none on /dev/pts type devpts (rw,mode=622) //SAMBA1/CUSTOMERS on /customers type smbfs (0)

Пожалуйста прочитайте справочные страницы smbmount и smbumount для дополнительной информации о описанных выше операциях.


Лицензия


Copyright (c) 2000 David Wood.

Разрешается копировать, распространять и/или изменять данный текст, под действием правил описанных в GNU Free Documentation License, Версии 1.1 или дальнейших, опубликованных Free Software Foundation; без постоянных разделов, без текстов обложек. Копия лицензии доступна по адресу .



Организация доступа к дискам Linux для машин под Windows


Как показано выше в файле smb.conf, организация доступа к дискам Linux для пользователей Windows является довольно простым делом. Однако, с помощью Samba вы можете контролировать это в большой степени. Здесь мы приведем несколько примеров:

Чтобы организовать доступ для всех, создайте копию раздела [tmp], приведенного выше, добавив что-то подобное в smb.conf:

[public] comment = Public Stuff path = /home/public public = yes writable = yes printable = no

Вы сейчас будете иметь возможность запустить Samba и просмотреть доступные ресурсы с Windows PC. Однако, недавно Microsoft сделала жизнь немного более трудной для тех, кто использует Samba. Windows 98, Windows NT (service pack 3 или выше) и поздние версии Windows 95 теперь по умолчанию используют шифрованные пароли. А Samba по умолчанию использует нешифрованные пароли. Вы не сможете просматривать содержимое серверов когда либо клиент либо сервер используют шифрованные пароли, потому что соединение не может быть сделано без регистрации.

Если у вас есть несоответствие типов паролей между клиентом и сервером и когда вы пытаетесь подключится к ресурсу, то вы можете увидеть окно диалога в котором будет сказано примерно следующее: "You are not authorized to access that account from this machine".

Вы можете либо настроить Samba-сервер для использования шифрованных паролей, либо настроить машины с Windows, чтобы они использовали нешифрованные пароли.

Для того, чтобы заставить Windows работать с нешифрованными паролями SMB:

Windows 95/98 =============

Используя редактор registry (regedit), создайте ключ registry HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP Добавьте значение типа DWORD: Имя значения: EnablePlainTextPassword Данные: 0x01.

Windows NT ==========

Используя редактор registry (regedit), создайте ключ registry HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rdr\Parameters Добавьте значение типа DWORD: Имя значения: EnablePlainTextPassword Значение: 0x01

Windows 2000 ============


Using the registry editor (regedit), create the registry setting HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters Add a new DWORD value: Value Name: EnablePlainTextPassword Data: 0x01

После того, как вы сделали эти изменения, перезагрузите машину с Windows и попытайтесь подключить сетевой диск к серверу Samba. Это должно работать, поскольку сервер Samba использует пароли в нешифрованном виде.

Для того, чтобы настроить Samba для использования шифрованных паролей:

В раздел [global] файла /etc/smb.conf, добавьте следующие строки:

encrypt passwords = yes smb passwd file = /etc/smbpasswd

Мы вам настоятельно рекомендуем прочитать файлы ENCRYPTION.txt, Win95.txt и WinNT.txt в документации по Samba до того как вы будете делать это!

Если ваши и клиенты и сервер используют шифрованные пароли, то вы не сможете просмотреть списки доступных ресурсов до тех пор пока начальное соединение не будет сделано с правильными параметрами входа. Для того чтобы сделать первоначальное соединение, введите вручную имя ресурса в диалоговом окне Windows File Manager или Explorer, имя должно быть в форме '\\<hostname>\<sharename>'. Подключитесь к серверу и правильными для данного сервера именем и паролем.

Если вы подозреваете, что ваш сервис имен NetBIOS неправильно настроен (возможно потому, что вы получаете сообщение об ошибке 'host not found (машина не найдена)' при попытке подключения), то попытайтесь использовать IP-адрес сервера: '\\<host ip address>\<sharename>'.

Для того, чтобы имена отображались правильно, вы может понадобиться установить некоторые настройки в соответствующем разделе ресурса. Это работает с клиентами под управлением 95/98/NT, но может быть необходимо будет изменить эти настройки, если вы используете клиентов с Windows 3.X:

; Mangle case = yes seems to give the correct filenames ; for Win95/98/NT. mangle case = yes

; If samba is case sensitive when looking for files case sensitive = no

; Default case of files that are created default case = lower



; Preserve case for all filenames preserve case = yes

; Preserve case for dos (8.3) filenames short preserve case = no

Замечание: Значение после знака / это ссылка на сетевую маску. Для сети класса С этим значением будет "24". Для дополнительной информации о том как выполнять вычисления для подсетей, вы можете посмотреть информацию по адресу .

Конечно настройка Samba более полна, чем мы привели здесь, но это даст вам возможность начать работать. Если вы хотите сделать что-то более сложное, то я рекомендую вам сходить на сервер Samba, упомянутый выше.

Чтобы сделать эту директорию доступной для чтения всеми, но разрешить писать в нее только людям из группы staff, измените запись как показано в следующем примеру:

[public] comment = Public Stuff path = /home/public public = yes writable = yes printable = no write list = @staff

Для описания других приемов для изменения доступа к дискам, смотрите документацию на Samba и справочные страницы.


Основная настройка (/etc/smb.conf)


Настройка Samba в Linux (или других UNIX-машинах) контролируется единственным файлом, /etc/smb.conf. Этот файл определяет к каким системным ресурсам вы хотите дать доступ для внешнего мира и какие ограничения вы хотите дать на использование этих ресурсов.

Так как следующие разделы посвящены организации доступа к дискам и принтерам Linux для Windows-машин, то файл smb.conf, показанный в этом разделе является примером, исключительно в целях введения.

Не беспокойтесь сейчас о деталях. Следующие разделы введут основные концепции.

Каждый раздел файла начинается с заголовка раздела, такого как [global], [homes], [printers], и т.п..

Секция [global] определяет некоторые переменные, которые Samba будет использовать для определения доступа ко всем ресурсам.

Раздел [homes] позволяет удаленным пользователям иметь доступ к своим (и только своим) домашним директориям на локальной Linux-машине. Так что, если пользователи Windows попытаются подключиться к этому разделу со своих Windows-машин, то они будут подключены к своим персональным домашним директориям. Заметим, что для того чтобы сделать это, они должны быть зарегистрированы на Linux-машине.

Простой файл smb.conf, приведенный ниже, позволяет удаленным пользователям иметь доступ к их домашним директориям на локальной машине и писать во временную директорию. Для того, чтобы пользователи Windows могли увидеть эти ресурсы машина с Linux должна быть в локальной сети. Затем пользователи просто подключают сетевые диски с помощью Windows File Manager или Windows Explorer.

Заметим, что в следующих разделах будут даны дополнительные записи для этого файла, чтобы дать доступ к большему количеству ресурсов.

; /etc/smb.conf ; ; Убедитесь и перезапустите сервер после внесения изменений в этот ; файл, например: ; /etc/rc.d/init.d/smb stop ; /etc/rc.d/init.d/smb start

[global] ; Раскомментируйте эту строку, если вы хотите дать доступ пользователю "гость" ; guest account = nobody log file = /var/log/samba-log.%m lock directory = /var/lock/samba share modes = yes


[homes] comment = Home Directories browseable = no read only = no create mode = 0750

[tmp] comment = Temporary file space path = /tmp read only = no public = yes

Написав новый файл smb.conf, полезно проверить его правильность. Вы можете проверить правильность написания файла smb.conf, используя утилиту 'testparm' (справочная страница: testparm); если testparm сообщает об отсутствии проблем, то smbd правильно загрузит файл настроек.

Полезный трюк: Если ваш сервер Samba имеет больше одного ethernet интерфейса, то smbd может подключится к неправильному. Если это так, что вы можете явно заставит ее подключаться к нужному добавив строку в раздел [global] файла /etc/smb.conf:

interfaces = 192.168.1.1/24

здесь замените приведенный адрес на адрес вашего интерфейса ethernet. Значение "24" является правильным для сети класса C, но вам может понадобиться пересчитать это значение, если вы разделили ее на подсети. Это число относится к сетевой маске. Числа для других классов сетей приведены в IP-Masquerade mini-HOWTO.

Также существует GUI-утилита для настройки Samba: GtkSamba. Смотрите страницу по адресу .


Резервирование данных с машин с Windows на машину с Linux


Adam Neat ( ) предоставил следующий скрипт, который выполняет резервирование данных с машин с Windows machines на машину с Linux, используя утилиту smbclient. Adam сказал, что он использует этот скрипт для резервирования данных с машин с Windows 3.x и NT на диск DAT SCSI под Linux.

Adam не гордится стилем программирования, используемым в этом примере, но это работает. Как я хочу сказать: "Если это работает и это сделано тупо, то это не тупо".

Другой скрипт для сохранения данных с Windows, предоставлен Dan Tager ( ) и приводится ниже. Скрипт присланный Dan также может сохранять данные с машин с Unix через rsh, хотя он может легко быть изменен для использования ssh.

В этом скрипте строка 'agnea1' является именем пользователя на машине с Linux, на которую производится резервирование данных.

#!/bin/bash

clear echo Initialising ... checkdate=`date | awk '{print $1}'

if [ -f "~agnea1/backup-dir/backup-data" ]; then

echo "ERROR: No config file for today!" echo "FATAL!" exit 1 fi

if [ -d "~agnea1/backup-dir/temp" ]; then

echo "ERROR: No tempoary directory found!" echo echo "Attempting to create" cd ~agnea1 cd backup-dir mkdir temp echo "Directory Made - temp" fi

if [ "$1" = "" ]; then

echo "ERROR: enter in a machine name (ie: cdwriter)" exit 1 fi

if [ "$2" = "" ]; then

echo "ERROR: enter in a SMB (Lan Manager) Resource (ie: work)" exit 1 fi

if [ "$3" = "" ]; then

echo "ERROR: enter in an IP address for $1 (ie: 130.xxx.xxx.52)" exit 1 fi

############################################################################# # Main Section # #############################################################################

cd ~agnea1/backup-dir/temp rm -r ~agnea1/backup-dir/temp/* cd ~agnea1/backup-dir/

case "$checkdate" in Mon) echo "Backuping for Monday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete"


if [ -d "~agnea1/backup-dir/Monday" ]; then echo " Directory Monday Not found ... making" mkdir ~agnea1/backup-dir/Monday fi

echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf monday.tar * echo "done ..." rm ~agnea1/backup-dir/Monday/monday.tar mv monday.tar ~agnea1/backup-dir/Monday ;;

Tue) echo "Backuping for Tuesday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete"

if [ -d "~agnea1/backup-dir/Tuesday" ]; then echo "Directory Tuesday Not found ... making" mkdir ~agnea1/backup-dir/Tuesday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf tuesday.tar * echo "done ..." rm ~agnea1/backup-dir/Tuesday/tuesday.tar mv tuesday.tar ~agnea1/backup-dir/Tuesday ;;

Wed) echo "Backuping for Wednesday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete"

if [ -d "~agnea1/backup-dir/Wednesday" ]; then echo "Directory Wednesday Not found ... making" mkdir ~agnea1/backup-dir/Wednesday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf wednesday.tar * echo "done ..." rm ~agnea1/backup-dir/Wednesday/wednesday.tar mv wednesday.tar ~agnea1/backup-dir/Wednesday ;;

Thu) echo "Backuping for Thrusday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete"

if [ -d "~agnea1/backup-dir/Thursday" ]; then echo "Directory Thrusday Not found ... making" mkdir ~agnea1/backup-dir/Thursday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf thursday.tar * echo "done ..." rm ~agnea1/backup-dir/Thursday/thursday.tar mv thursday.tar ~agnea1/backup-dir/Thursday ;;

Fri) echo "Backuping for Friday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete"

if [ -d "~agnea1/backup-dir/Friday" ]; then echo "Directory Friday Not found ... making" mkdir ~agnea1/backup-dir/Friday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf friday.tar * echo "done ..." rm ~agnea1/backup-dir/Friday/friday.tar mv friday.tar ~agnea1/backup-dir/Friday ;;



*) echo " FATAL ERROR: Unknown variable passed for day" exit 1;;

esac ###########

Вот скрипт предоставленный Dan:

#!/bin/bash

BACKDIR=3D/backup WINCMD=3D/usr/sbin/smbclient

function CopyWinHost(){

# tars and gzips "windows shares" to a local directory using samba's # smbclient # argument 1 is the remote host window's host name # argument 2 is the share name to be backed up

echo $1,$2,$3 REMOTE=3D$1 SHARE=3D$2 DEST=3D$3

# create a tarred gzip file using samba to copy direct from a # windows pc # 12345 is a password. Needs some password even if not defined on # remote system $WINCMD \\\\$REMOTE\\$SHARE 12345 -Tc -|gzip > $DEST echo `date`": Done backing up "$REMOTE" to "$DEST echo }

function CopyUnixHost(){

# tars and gzips a directory using rsh # argument 1 is the name of the remote source host # argument 2 is the full path to the remote source directory # argument 3 is the name of the local tar-gzip file. day of week # plus .tgz will be appended to argument 3

REMOTE=3D$1 SRC=3D$2 DEST=3D$3

if rsh $REMOTE tar -cf - $SRC |gzip > $DEST; then echo `date`": Done backing up "$REMOTE":"$SRC" to "$DEST else echo `date`": Error backing up "$REMOTE":"$SRC" to "$DEST fi

}

# $1: win=3Dbackup windows machine, unix=3Dbackup unix machine case $1 in win) # $2=3D remote windows name, $3=3Dremote share name, # $4=3Dlocal destination directory CopyWinHost $2 $3 $4;; unix) # $2 =3D remote host, $3 =3D remote directory, # $4 =3D destination name CopyUnixHost $2 $3 $4;; esac


Установка


Сначала, для того чтобы использовать Samba ваша машина должна находится в одиночном ethernet-сегменте локальной сети, используя протокол TCP/IP. Samba не будет работать используя другие сетевые протоколы. Это в общем легко, поскольку Linux и Windows 95/98/NT поставляются с поддержкой TCP/IP. Однако если вы используете машины с Windows 3.X, то вам необходимо добавит поддержку TCP/IP. Один из самых распространенных вопросов, который я получаю---почему Samba "не работает", когда машины с Windows не используют TCP/IP.

Для того, чтобы установить TCP/IP на машине с Windows 95/98 , выберите Control Panel | Network, затем добавьте и настройте Microsoft TCP/IP. В Windows NT, выберите Control Panel | Network | Protocols.

Для того, чтобы получить исходные тексты последней версии Samba, свяжите с указанным URL и выберите ближайший к вам сервер-зеркало: .

В большинстве случаев ваш дистрибутив Linux поставляется с пакетом, который содержит свежую версию Samba.

Следующие два демона необходимы для работы пакета Samba. Они обычно устанавливаются в /usr/sbin и запускаются либо при загрузке из системных скриптов, либо из inetd. Примеры скриптов даны в разделе .

smbd (Демон SMB) nmbd (Обеспечивает поддержку сервера имен NetBIOS для клиентов)

Заметим, что сервис имен, предоставляемый демоном nmbd является отличным от сервиса имен, предоставляемого Domain Name Service (DNS). Сервис имен NetBIOS является сервисом имен в стиле Windows, используемым для SMB. Другими словами, имеющийся сервис имен DNS ничего не скажет о возможности Samba для нахождения имен машин.

Обычно следующие двоичные файлы Samba устанавливаются в директорию /usr/bin, хотя их расположение опционально.

smbclient (Клиент SMB для UNIX-машин) smbprint (скрипт для печати на принтер на SMB-машине) smbprint.sysv (такое как выше, но для машин с SVR4 UNIX) smbstatus (Перечисляет текущие SMB-соединения для локальной машины) smbrun ('glue' скрипт для запуска приложений на SMB-машине)

Двоичные файлы относящиеся к поддержке файловой системы smbfs обсуждаются далее в этом документе.

Дополнительно с этим документом включен скрипт, названный 'print', который служит как полезная надстройка над скриптом smbprint.

Пакет Samba очень прост в установке. Просто получите исходные тексты по адресу, указанному выше, и прочитайте файл README в дистрибутиве. Также в дистрибутиве есть файл называемый docs/INSTALL.txt, который дает простой набор пошаговых инструкций.

Последующая установка, поместит демоны в /usr/sbin и двоичные файлы в /usr/bin. Установите справочные страницы в /usr/local/man.

При установке пакета Samba, вы должны указать в Makefile расположение файла конфигурации, smb.conf. Обычно это /etc, но вы можете поместить его куда угодно. Для этих указаний, мы будем предполагать, что вы указали расположение файла конфигурации как /etc/smb.conf, расположение файла протокола как log file = /var/log/samba-log.%m и блокировочной директории как lock directory = /var/lock/samba.

Установите файл конфигурации smb.conf. Перейдите в директорию, где была скомпилирована Samba. Посмотрите в поддиректории examples/simple и прочитайте файл README. Скопируйте файл smb.conf найденный в этой директории в директорию /etc. БУДЬТЕ ОСТОРОЖНЫ! Если у вас дистрибутив Linux с уже установленной Samba, у вас уже может быть файл конфигурации Samba в /etc. Вероятно вы можете начать работать с каким-то из них.

Если вы не хотите устанавливать файл конфигурации в директорию /etc, то поместите его куда вы хотите, а затем поместите символическую ссылку на него в директорию /etc:

ln -s /path/to/smb.conf /etc/smb.conf



Это SMB HOWTO. Этот документ


Это SMB HOWTO. Этот документ описывает использование в Linux с помощью Samba протокола Server Message Block (SMB), который иногда также называется протоколом Session Message Block (SMB), протоколом NetBIOS или протоколом LanManager. Хотя этот документ и предназначен для Linux, но Samba может работать на большинстве Unix-подобных операционных систем.
Этот документ сопровождается David Wood ( ). Добавления, изменения или исправления могут быть посланы ему для включения в следующий выпуск.
Большое количество документации по Samba доступно на WWW-сервере Samba, который находится по адресу . Там ужасающее количество информации; пожалуйста посмотрите ее до того, как будете просить помощи! Вы также можете использовать группу новостей comp.protocols.smb.
Протокол SMB используется Microsoft Windows 3.11, NT и 95/98 для организации доступа к дискам и принтерам. Используя набор утилит Samba от Andrew Tridgell ( ), UNIX-машины (включая Linux) могут организовывать доступ к дискам и принтерам для Windows-машин. Утилиты smbfs написанные Paal-Kr. Engstad ( ) и Volker Lendecke ( ) дают возможность машинам с Unix монтировать SMB-ресурсы доступные на машинах с Windows или Samba.
Четыре основные вещи, которые можно делать с помощью Samba:
давать доступ к дискам Linux Windows-машинам.
получать доступ к SMB-ресурсам с машин под Linux.
давать доступ к принтерам Linux для Windows-машин.
получать доступ к принтерам Windows из Linux-систем.
Обо всем этом рассказывается в этом документе, плюс также еще некоторые детали.
Отказ от ответственности: Процедуры и программы либо работают для автора, либо было сообщено, что они работают для людей, которые разработали их. Различные конфигурации могут не работать с информацией данной здесь. Если вы столкнулись с такой ситуацией, вы можете послать сообщение автору документа с пожеланиями для его улучшения.
Заметим, что для доступа к SMB-ресурсам с машин с Windows 3.x, на них должен быть установлен стек TCP/IP и библиотеки Win32s. Оба этих компонента доступны с сервера фирмы Microsoft ( ). Как нам сообщили во время написания данного документа, для того чтобы скачать стэк TCP/IP-32 для Windows 3.x, Microsoft требует подписки на Microsoft Software Developers Network (MSDN). Поскольку это программное обеспечение используется свободно, то вы можете найти старые копии этого программного обеспечения у своих друзей.

Linas Vepstas, linas@linas.org Переводчик: Максим Дзюманенко max@april.kiev.ua


v0.54, 21 Ноября 1998г Дата перевода: 24 октября 2000г

RAID обозначает ''Redundant Array of Inexpensive Disks'', ''Массив недорогих дисков с избыточностью'' - это путь создания быстрых и надежных дисковых систем из отдельных дисков. RAID может противодействовать отказам дисков, а также увеличивать производительность по сравнению с одиночным диском. Этот документ - tutorial/HOWTO/FAQ для пользователей расширения MD ядра Linux, соответствующих утилит, и их применения. Расширение MD программно реализует RAID-0 (striping), RAID-1 (mirroring), RAID-4 и RAID-5. Это значит - с MD не требуется специального оборудования или дисковых контроллеров для получения многих преимуществ RAID.

Предисловие

Этот документ распространяется под GPL лицензией. Авторские права принадлежат Linas Vepstas ( ). Разрешается свободно использовать, копировать, распространять этот документ для любых целей, при условии указания имени автора/редактора и этой заметки во всех копиях и/или поддерживаемых документах и немодифицированных версиях этого документа. Этот документ распространяется в надежде, что он будет полезен, но БЕЗ ВСЯКОЙ ГАРАНТИИ, явной или неявной. Были предприняты все усилия для уверенности в правильности приведенной информации, автор /редактор / хранитель и переводчик НЕ НЕСУТ ОТВЕТСТВЕННОСТИ за любые ошибки, или повреждения, прямые или косвенные, причиненные в результате использования информации приведенной в этом документе.

Не смотря на то, что RAID разработан для увеличения надежности системы путем введения избыточности, он может создавать ложное чувство безопасности и уверенности, если используется неправильно. Эта ложная уверенность может привести к большой беде. В частности заметьте, что RAID разработан для защиты от *дисковых* отказов, а не отказов *питания* или ошибок *оператора*. Отказы питания, ошибки при разработке ядра, или ошибки оператора/администратора могут привести к невосстановимому повреждению данных! RAID *не* заменяет подобающего резервирования Вашей системы. Знайте что Вы делаете, тестируйте, будьте осведомлены и сознательны!

Домашняя страница перевода - . Обновленные версии, в первую очередь, появляются тут.



Модификация существующей инсталяции


В: Линейный MD расширяем? Могу я добавить новый раздел/диск, и увеличить размер существующей файловой системы?

О: Miguel de Icaza < > написал:

Я изменил код ext2fs для способности поддерживать много устройств вместо обычного предположения - одно устройство на файловую систему.

Итак, когда вы хотите расширить файловую систему, вы запускаете служебную программу, которая делает необходимые изменения на новом устройстве (вашем дополнительном разделе) и затем, Вы только говорите системе расширить файловую систему используя указанное устройство.

Вы можете расширить файловую систему новым устройством во время работы системы, без остановки (и когда есть свободное время, вы можете удалить удалить устройства из ext2 набора, снова без необходимости переходить в однопользовательский режим или любого подобного хака).

Вы можете получить патч для ядра 2.1.x с моей web страницы:

В: Могу я добавить диски в массив RAID-5?

О: Сейчас (сентябрь 1997) - нет, нельзя без стирания всех данных. Утилита преобразования, позволяющая это делать еще не существует. Проблема в том, что структура и размещение массива RAID-5 зависит от количества дисков в массиве.

Конечно, вы можете добавить диски заархивировав массив на ленте, удалив все данные, создав новый массив, и восстановив данные с ленты.

В: Что случится с моим RAID1/RAID0 набором, если я сдвину одно устройство с /dev/hdb на /dev/hdc?

Из-за глупых кабельно/корпусно/размерных дурацких решений, я создал мой RAID набор на одном IDE контроллере (/dev/hda

и /dev/hdb). Сейчас я усвоил несколько вещей, я хочу перейти от /dev/hdb к /dev/hdc.

Что должно случиться, если я просто сменю /etc/mdtab и /etc/raid1.conf файлы для отображения нового положенияe?

О: Для RAID-0/linear, нужно только осторожно указать диски в том-же порядке. Тикам образом, в выше приведенном примере, если оригинальная конфигурация

mdadd /dev/md0 /dev/hda /dev/hdb

то новая конфигурация *должна* быть

mdadd /dev/md0 /dev/hda /dev/hdc

Для RAID-1/4/5, ''RAID число'' диска хранится в суперблоке RAID, и следовательно порядок в котором диски указаны не важен.


RAID-0/linear не содержит суперблока из-за своего старого дизайна, и желания сохранить обратную совместимость со старым дизайном.

В: Могу я преобразовать двух-дисковое зеркало RAID-1 в трех-дисковый массив RAID-5?

О: Да. Michael из BizSystems нашел хитрый способ сделать это. Однако фактически, подобно всем манипуляциям с RAID массивами содержащими данные, это опасно и склонно к человеческим ошибкам. Перед началом сделайте резервную копию данных.

Я сделаю следующие допущения: --------------------------------------------- диски изначально: hda - hdc raid1 разделы hda3 - hdc3 имя массива /dev/md0

новые hda - hdc - hdd raid5 разделы hda3 - hdc3 - hdd3 имя массива: /dev/md1

Вы должны заменить соответствующие номера дисков и разделов для Вашей конфигурации системы. Это справедливо для всех примеров конфигурационных файлов. -------------------------------------------- СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ ПЕРЕД ТЕМ, КАК ЧТО-ЛИБО ДЕЛАТЬ 1) перекомпилируйте ядро для включения и raid1 и raid5 2) инсталируте новое ядро и проверьте наличие личных свойств raid 3) отключите избыточный раздел на массиве raid 1. Если это раздел смонтирован как root (как у меня), Вы должны быть осторожны.

Перегрузите компьютер без запуска raid устройств или загрузитесь с восстановительной системы ( там должны иметься raid утилиты )

запустите не избыточный raid1 mdadd -r -p1 /dev/md0 /dev/hda3

4) сконфигурируйте raid5 но с таким конфигурационным файлом, заметьте, что здест нет записи hda3, а hdc3 повторяется. Это необходимо, так как raid утилиты не хотят, чтобы Вы это делали. ------------------------------- # конфигурация raid-5 raiddev /dev/md1 raid-level 5 nr-raid-disks 3 chunk-size 32

# Алгоритм размещения паритета parity-algorithm left-symmetric

# Резервные диски для горячей реконструкции nr-spare-disks 0

device /dev/hdc3 raid-disk 0

device /dev/hdc3 raid-disk 1

device /dev/hdd3 raid-disk 2 --------------------------------------- mkraid /etc/raid5.conf 5) активируйте массив raid5 в не избыточном режиме

mdadd -r -p5 -c32k /dev/md1 /dev/hdc3 /dev/hdd3

6) создайте файловую систему на массиве

mke2fs -b {blocksize} /dev/md1

рекомендуемый размер блока 4096, в отличие от стандартных 1024. Это увеличит использование памяти для процедур kernel raid и сделает размер блока равным размеру страницы. Так как у меня много небольших файлов в моей системе, я использую компромиссное значение 2048.

7) смонтируйте где-то два устройства raid

mount -t ext2 /dev/md0 mnt0 mount -t ext2 /dev/md1 mnt1

8) переместите данные

cp -a mnt0 mnt1

9) проверьте идентичность данных 10) остановите оба массива 11) откорректируйте информацию в файле raid5.conf замените /dev/md1 на /dev/md0 замените первый диск для чтения /dev/hda3

12) обновите новый массив до полного избыточного состояния (ЭТО РАЗРУШИТ ОСТАВШУЮСЯ НА raid1 ИНФОРМАЦИЮ)

ckraid --fix /etc/raid5.conf


Поддерживаемая аппаратура и программы


В: У меня есть SCSI адаптер производителя XYZ (с несколькими каналами или без них), и диск(и) производителя(ей) PQR и LMN, будут ли они работать с md для создания linear/stripped/mirrored?

О: Да! Программный RAID будет работать с любым дисковым контроллером (IDE или SCSI) и любыми дисками. Не должны быть идентичны ни диски, ни контроллеры. Например, зеркало RAID может быть создано с одной половиной зеркала на SCSI диске, и другой половиной на IDE диске. Диски могут не быть одного размера. Нет ограничений на смешивание и соответствие дисков и контроллеров.

Это потому, что программный RAID работает с дисковыми разделами, не непосредственно с дисками. Одна рекомендация - для RAID уровней 1 и 5, разделы, используемые для одного набора, должны быть одного размера. Если для создания RAID 1 или 5 массивов используются неодинаковые разделы, то излишек пространства на более длинных разделах теряется (не используется).

В: У меня есть двухканальный BT-952, и на коробке написано, что он поддерживает аппаратно RAID 0, 1 и 0+1. У меня сделан RAID том из двух дисков, карта очевидно распознает их при запуске своей загрузочной процедуры BIOS. Я просмотрел исходный код драйвера, и не обнаружил ссылок на поддержку аппаратного RAID. Есть кто-либо, у кого это работает?

О: Mylex/BusLogic FlashPoint платы с RAIDPlus являются фактически программными RAID, а не аппаратными RAID. RAIDPlus поддерживается только Windows 95 и Windows NT, но не Netware или любой Unix платформой. Помимо загрузки и конфигурирования, в драйвере ОС, на самом деле, реализована поддержка RAID.

Даже если теоретически возможна поддержка Linux-ом RAIDPlus, реализация RAID-0/1/4/5 в ядре Linux намного более гибкая и должна быть большую производительность, так что мало причин поддерживать RAIDPlus непосредственно.

В: Я хочу запускать RAID с несколькими процессорами (SMP). RAID безопасен при SMP?

О: "Я думаю, да" - лучший имеющийся ответ на время написания этого (Апрель 98). Много пользователей сообщают, что они без проблем используют RAID с SMP приблизительно год. Однако, на Апрель 98 (circa kernel 2.1.9x), были замечены следующие проблемы:


Драйвер Adaptec AIC7xxx SCSI не безопасен при SMP (Общая заметка: Adaptec адаптеры имеют длинную, продолжительную и вобще ветвистую историю проблем. Даже если они выглядят более доступными, широко распространенными и дешевыми SCSI адаптерами, необходимо их избегать. Учитывая факторы потери времени, разочарования, и поврежденных данных, Adaptec окажется самой дорогостоящей ошибкой, которую Вы когда-либо делали. Вобщем, если у Вас проблемы с SMP на 2.1.88, попробуйте патч ftp://ftp.bero-online.ml.org/pub/linux/aic7xxx-5.0.7-linux21.tar.gz Я не уверен будет ли этот патч вставлен в более поздние ядра 2.1.x. Для дальнейшей информации, взгляните на почтовые архивы для Марта 1998 на http://www.linuxhq.com/lnxlists/linux-raid/lr_9803_01/ Как обычно, из-за быстро-меняющейся природы последних ядер 2.1.x серии, проблемы описанные в этом почтовом списке могут быть или могут не быть устранены в то время, как Вы читаете этот документ.)

насколько известно IO-APIC с RAID-0 на SMP падает в 2.1.90


Поиск неисправностей при установке


В: Какой текущий стабильный патч для RAID в серии ядер 2.0.x?

О: На 18 сентября 1997, это - "2.0.30 + pre-9 2.0.31 + Werner Fink's swapping patch + the alpha RAID patch". На Ноябрь 1997, это - 2.0.31 + ... !?

В: У меня не устанавливаются патчи RAID. Что не так?

О: Убедитесь, что /usr/include/linux символическая ссылка на /usr/src/linux/include/linux.

Убедитесь, что новые файлы raid5.c, и т.д. скопированы в свое правильное расположение. Иногда комманда patch не создает новые файлы. Попробуйте указать флаг -f для patch.

В: При компиляции raidtools 0.42, компиляция останавливается на include <pthread.h>, но его нет в моей системе. Как мне это исправить?

О: raidtools-0.42 требует linuxthreads-0.6 с:

Как альтернатива - glibc v2.0.

В: Я получаю сообщение: mdrun -a /dev/md0: Invalid argument

О: Используйте mkraid для инициализации RAID перед первым использованием.

mkraid стиранием разделов RAID гарантирует, что массив RAID изначально в согласованном состоянии. Дополнительно, mkraid создаст RAID суперблоки.

В: Я получил сообщение: mdrun -a /dev/md0: Invalid argument. Установки такие:

raid построен как модуль

была сделана обычная установочная последовательность ... mdcreate, mdadd, etc.

cat /proc/mdstat показывает

Personalities : read_ahead not set md0 : inactive sda1 sdb1 6313482 blocks md1 : inactive md2 : inactive md3 : inactive

mdrun -a выдает сообщение об ошибке /dev/md0: Invalid argument

О: Попробуйте lsmod (или, cat /proc/modules) чтобы увидеть, загружены ли raid модули. Если нет, Вы можете загрузить их явно командой modprobe raid1 или modprobe raid5. Либо, если Вы используете автозагрузчик, и ожидаете, что их загрузит kerneld, а он этого не делает - это, возможно, из-за того что загрузчику не хватает информации для загрузки модулей. Отредактируйте /etc/conf.modules и добавьте следующие строки:

alias md-personality-3 raid1 alias md-personality-4 raid5

В: При mdadd -a я получаю ошибку: /dev/md0: No such file or directory. И действительно, вроде-бы нигде нет никакого /dev/md0. И что мне теперь делать?


О: Пакет raid- tools должен создать устройства когда вы запускаете make install как root. Или Вы можете сделать следующее:

cd /dev ./MAKEDEV md

В: После создания raid массива на /dev/md0, Я пытаюсь монтировать и получаю следующую ошибку: mount: wrong fs type, bad option, bad superblock on /dev/md0, or too many mounted file systems. Что не так?

О: Вы должны создать файловую систему на /dev/md0

перед монтированием. Используйте mke2fs.

В: Truxton Fulton написал:

На моем Linux 2.0.30, при выполнении mkraid на RAID-1 устройстве, при очистке двух отдельных разделов, я получил на консоль сообщения об ошибках "Cannot allocate free page", и "Unable to handle kernel paging request at virtual address ..." ошибки в системном log-е. На этот момент, система стала совершенно не готова к использованию, но кажется восстановленной после этого. Работоспособность кажется восстановленной без прочих ошибок, и я успешно использую мой RAID-1. Однако ошибки смущают. Какие идеи?

О: Это хорошо известная ошибка в ядре 2.0.30. Она устранена в 2.0.31 ядре; или откатитесь к 2.0.29.

В: Я не могу mdrun устройство RAID-1, RAID-4 или RAID-5. Если я пробую mdrun на добавленном посредством mdadd устройстве, я получаю сообщение ''invalid raid superblock magic''.

О: Проверьте, запускали ли Вы mkraid часть установочной процедуры.

В: Когда я обращаюсь к /dev/md0, ядро выплевывает кучу ошибок, таких как md0: device not running, giving up !

и I/O error.... Я успешно добавил мои устройства в виртуальное устройство.

О: для использования, устройство должно быть запущено. Используйте mdrun -px /dev/md0 где x = l для линейного объединения, 0 для RAID-0 или 1 для RAID-1 и т.д.

В: Я создал линейное соединение из 2-х дисков. cat /proc/mdstat показывает общий размер устройства, но df показывает только размер первого физического устройства.

О: Вы должны сделать mkfs на новом md-устройстве перед первым использованием, чтобы файловая система заняла все устройство.

В: Я установил /etc/mdtab используя mdcreate, я сделал mdadd, mdrun и fsck на двух моих разделах /dev/mdX. Все выглядит нормально перед перезагрузкой. Как только я перегрузился, я получаю ошибки fsck на обоих разделах: fsck.ext2: Attempt to read block from filesystem resulted in short read while trying too open /dev/md0. Почему?! Как это исправить?!



О: В процессе загрузки, разделы RAID должны быть запущены перед проверкой fsck. Это должно быть сделано в одном из следующих скриптов. В одних дистрибутивах, fsck вызывается из /etc/rc.d/rc.S, в других - из /etc/rc.d/rc.sysinit. Добавьте в этот файл mdadd -ar *перед* запуском fsck -A. Еще лучше, чтобы запускался ckraid, если mdadd завершается с ошибкой. Как это сделать подробно обсуждается в вопросе 14 секции ''Восстановление Ошибок''.

В: Я получаю сообщение invalid raid superblock magic когда пытаюсь запустить массив, который состоит из разделов более 4Гб.

О: Эта ошибка сейчас исправлена. (Сентябрь 97) Убедитесь, что у Вас свежий драйвер raid.

В: Я получаю сообщение Warning: could not write 8 blocks in inode table starting at 2097175 когда пытаюсь запустить mke2fs на разделе более 2Гб.

О: Кажется это проблема mke2fs (Ноябрь 97). Временный выход - взять код mke2fs и добавить #undef HAVE_LLSEEK в e2fsprogs-1.10/lib/ext2fs/llseek.c прямо перед первым #ifdef HAVE_LLSEEK, затем пересобрать ядро.

В: ckraid сейчас не способен читать /etc/mdtab

О: Формат конфигурационного файла RAID0/linear используемый в /etc/mdtab устарел, однако он будет поддерживаться некоторое время. Сейчас обновленные конфигурационные фалы называются /etc/raid1.conf и т.д.

В: Модули (raid1.o) не загружаются автоматически; но они загружаться через modprobe перед mdrun. Как я могу это устранить?

О: Для автозагрузки модулей, мы можем добавить следующее в /etc/conf.modules:

alias md-personality-3 raid1 alias md-personality-4 raid5

В: Я добавил посредством mdadd 13 устройств, и теперь я пробую mdrun -p5 /dev/md0 и получаю сообщение: /dev/md0: Invalid argument

О: Конфигурация по умолчанию для программного RAID - 8 физических устройств. Отредактируйте linux/md.h изменив #define MAX_REAL 8 на большее число, и пересоберите ядро.

В: Я не могу заставить работать md с разделами на последнем SPARCstation 5. Я думаю, что это связано с disk-labels.

О: Sun disk-labels сидят в первом килобайте раздела. Для RAID-1, Sun disk-label не играют роли, так как ext2fs будет проскакивать метку на каждом зеркале. Для других raid уровней (0, линейного соединения и 4/5) это - проблема; (на Декабрь 97) они все еще не адресуются.


Понимание RAID


В: Что такое RAID? Почему я всегда его использую?

О: RAID - путь комбинирования нескольких дисков в одно целое для увеличения скорости и/или надежности. Существует несколько различных типов и реализаций RAID, каждый со своими преимуществами и недостатками. Например, помещая копию одинаковых данных на два диска (называется зеркализация дисков, или RAID уровня 1), скорость чтения может быть повышена поочередным считыванием с каждого диска зеркала. В среднем, каждый диск менее занят, т.к. он обрабатывает только половину операций чтения (для двух дисков), или 1/3 (для трех дисков), и т.д. В дополнение, зеркало может повышать надежность: если один диск выходит из строя, другой диск содержит копию данных. Различные пути комбинирования дисков в один, обозначаются уровнями RAID, могут обеспечить большую эффективность хранения, чем просто зеркализация, или могут изменить производительность по задержкам (времени доступа), или производительность пропускной способности (скорости передачи), для чтения или записи, в то же время поддерживается избыточность - это полезно для противодействия отказам.

Хотя RAID может защитить от отказа, он не защищает от ошибок оператора и администратора (человека), или потерь вызванных ошибками программ (возможно и ошибками собственно программной реализации RAID). Сеть изобилует трагическими историями о системных администраторах, которые неправильно устанавливали RAID, и потеряли все свои данные. RAID - не заменяет необходимость частого, регулярного планового резервного копирования.

RAID может быть реализован аппаратно, в виде специальных дисковых контроллеров, или программно, как модуль ядра который связывает низкоуровневый драйвер диска, и файловую систему, которая находится на нем. Аппаратный RAID - всегда "дисковый контроллер", - это устройство к которому могут подсоединяться диски. Обычно он представляет собой плату, которая вставляется в слот ISA/EISA/PCI/S-Bus/MicroChannel. Однако, некоторые RAID контроллеры - в виде ящика, который соединяется кабелями с используемым дисковым контроллером, и дисками. Меньшие из них помещаются в дисковой стойке; большие могут быть встроены в дисковый шкаф со своими собственными стойками и источником питания. Последние аппаратные RAID используют с последними и быстрейшими процессорами, что обеспечивает обычно лучшую общую производительность, несмотря на значительную цену. Это потому, что большинство RAID контроллеров поставляются с встроенными процессорами на борту и кеш-памятью, которые могут значительно разгрузить суммарную обработку главного процессора, насколько позволяет скорость поступления данных в большой кеш контроллера. Старые аппаратные RAID могут работать как "тормоз" когда используются с новейшими процессорами: вчерашние модные встроенные процессоры и кеш могут быть бутылочным горлышком, и их производительность часто превосходится чисто-программными RAID и новыми, но простыми в других отношениях, дисковыми контроллерами. Аппаратные RAID могут иметь преимущество над чисто-программными RAID, если используют синхронизацию шпинделей дисков и знают позицию дисковых пластин относительно головок диска и желаемого дискового блока. Однако, большинство современных (дешевых) дисков не предоставляют эту информацию, во всяком случае, средства управления этим и т.о., большинство аппаратных RAID не имеет этих преимуществ. Аппаратные RAID различных производителей, версий и моделей обычно не совместимы: если RAID контроллер отказывает, он должен быть заменен на другой контроллер того-же самого типа. На момент написания (Июнь 1998), широкое разнообразие аппаратных контроллеров используется под Linux; однако, никакой из них, на текущий момент, не поставляется с утилитами конфигурации и управления, которые запускаются под Linux.

Software-RAID - набор модулей ядра, вместе с утилитами управления, которые реализуют чисто программный RAID, и не требуют необычной аппаратуры. Подсистема Linux RAID реализована в ядре, как уровень над низкоуровневыми драйверами дисков (для IDE, SCSI и Paraport устройств), и интерфейсом блочных устройств. Файловая система, будь то ext2fs, DOS-FAT, или другая, работает поверх блочного интерфейса. Программный RAID, по своей программной природе, склонен быть более гибким, чем аппаратная реализация. Обратная сторона этого - требуется больше процессорного времени, по сравнению с аппаратной реализацией. Конечно, цена не превзойденная. Кроме того программный RAID имеет одну важную отличительную особенность: он оперирует базируясь на разделах, где несколько отдельных дисковых разделов собираются вместе для создания разделов RAID. В этом отличие от большинства аппаратных решений RAID, которые объединяют вместе целые диски в массив. В аппаратных RAID, факт, что массив RAID - прозрачен для операционной системы, упрощает управление. В программном, гораздо больше конфигурационных опций и вариантов, что запутывает дело.

На момент написания (Июнь 1998), администрирование RAID под Linux далеко от простоты, и это лучше пробовать опытным системным администраторам. Теория функционирования сложна. Системные инструменты требуют модификации загрузочных скриптов. И восстановление дискового отказа непростая задача, и способствует ошибкам человека. RAID не для новичков, и полученный прирост в надежности и производительности, может запросто перевеситься излишней сложностью. Действительно, современные диски - невероятно надежны и современные процессоры и контроллеры вполне мощные. Вы можете более просто получить желаемую надежность и производительность купив диск высшего качества и/или быструю аппаратуру.


В: Что такое уровни RAID? Почему так много? Чем различаются?

О: Различные уровни RAID имеют различную производительность, избыточность, емкость, надежность и ценовые характеристики. Большинство, но не все, из уровней RAID предоставляют повышенную защиту от отказов диска. Из тех, которые предоставляют избыточность, RAID-1 и RAID-5 более популярны. RAID-1 предлагает лучшую производительность, в то же время RAID-5 применяется для более продуктивного использования имеющихся емкостей накопителей. Однако, настройка производительности - совсем иное дело, так как производительность зависит от множества различных факторов, от типа приложения, до размеров stripe-ов, блоков, и файлов. Более трудные аспекты настройки производительности откладываются до более поздних разделов этого HOWTO.

Далее описывается разница между уровнями RAID в контексте реализации программного RAID в Linux.

RAID-linear

простое объединение разделов для создания большого виртуального раздела. Это применяется если у Вас несколько маленьких дисков, и Вы хотите создать один большой раздел. Это объединение не предлагает избыточности, и фактически уменьшает общую надежность: если один из дисков выходит из строя, весь раздел выходит из строя.

RAID-1 так же называемый "зеркализацией"("mirroring"). Два (или более) раздела, все одинакового размера, каждый содержит точную копию всех данных, блок в блок. Зеркализация дает сильную защиту от отказов диска: если один диск отказывает, есть другой с точной копией данных. Зеркализация также может помочь увеличить производительность подсистемы ввода-вывода, так как запросы на чтение могут быть разделены между несколькими дисками. К несчастью, зеркализация также менее эффективна в смысле емкости: два зеркальных раздела могут вместить не больше данных, чем один раздел.

Striping - базовая концепция всех других уровней RAID. stripe - непрерывная последовательность дисковых блоков. stripe может быть размером с один дисковый блок, или может состоять из тысяч. Устройства RAID разделяют содержащие их разделы дисков на stripe-ы; различные уровни RAID различаются в том, как они организуют stripe-ы, и как данные размещаются на них. Взаимодействие между размером stripe-ов, типичными размерами файлов в системе, и их положением на диске - определяет общую производительность подсистемы RAID.



RAID-0 подобна RAID-linear, исключая то, что компоненты разделов делятся на strip-ы и затем чередуются. Подобно RAID-linear, результат - один большой виртуальный раздел. Так же как и в RAID-linear, это не предполагает избыточности, и тоже уменьшает общую надежность: отказ одного диска ударит по всему. RAID-0 часто претендует на увеличение производительности по сравнению RAID-linear. Однако, это может быть или не быть справедливо, в зависимости от характеристик файловой системы, типичного размера файла по сравнению с размером stripe, и типа рабочей нагрузки. Файловая система ext2fs

уже рассеивает файлы по разделу, стараясь минимально фрагментировать. Итак, на простейшем уровне, любой доступ может быть выполнен к одному из нескольких дисков, и таким образом, чередование stripe-ов по многим дискам предоставляет реальные преимущество. Однако, существует разница в производительности, она зависит от данных, рабочей загрузки, и размера stripe.

RAID-4 чередует stripe-ы подобно RAID-0, но требуется дополнительный раздел для размещения информации о четности. Четность используется для получения избыточности: если один из дисков отказывает, данные на оставшихся дисках могут быть использованы для воссоздания данных на отказавшем диске. Получаем N дисков с данными, и один диск с четностью, stripe четности вычисляется так - берется один stripe из каждого диска с данными, и XOR-ятся вместе. Итак, емкость (N+1)-дисков массива RAID-4 равна N, что намного лучше чем зеркализация (N+1) дисков, и почти так же хорошо, как RAID-0 на N. Заметьте, что для N=1, где один диск с данными, и один паритетный, RAID-4 эквивалентен зеркализации, при этом каждый из двух дисков копирует друг друга. Однако, RAID-4 НЕ дает производительности чтения зеркализации, и имеет пониженную производительность записи. По просту, это потому, что обновление паритета требует чтения старого паритета, перед тем, ка новый паритет может быть вычислен и записан. При большом количестве операций записи, паритетный диск может стать "бутылочным горлышком", т.к. каждая операция записи должна обращаться к паритетному диску.



RAID-5 освободжден от " бутылочного горлышка" при записи на RAID-4 размещением паритетных stripe вперемешку на каждом диске. Однако, производительность записи все еще не столь хороша, как при зеркализации, так как паритетный stripe все же должен быть считан и XOR-ен перед записью. Производительность чтения тоже не так хороша, как при зеркализации, так как, после этого, есть только одна копия данных, не две или более. Принципиальное преимущество RAID-5 над зеркализацией то, что он предоставляет избыточность и защиту от отказа одного диска, в то же время предоставляет намного больше емкости, когда используется с тремя или более дисками.

RAID-2 и RAID-3 редко используются, и в некоторой степени стали устаревшими для современных дисковых технологий. RAID-2 подобен RAID-4, но размещает ECC информацию вместо паритетной. С тех пор как все современные диски реализуют ECC в себе, это предоставляет маленькую дополнительную защиту. RAID-2 может дать большую целостность данных, если пропало питание в процессе записи; однако, резервные аккумуляторы и чистое завершение работы могут дать ту же выгоду. RAID-3 подобен RAID-4, исключая то, что он использует наименьший возможный размер stripe. Как результат, любая операция чтения будет включать в себя все диски, делая перекрытие запросов ввода-вывода трудным/невозможным. Для избежания задержек при ожидания вращения, RAID-3 требует синхронизации всех шпинделей дисков. Большинство современных дисков не имеют способности синхронизировать шпиндели, или, если и имеют, не имеют нужных соединителей, кабелей, и документации производителей. Ни RAID-2 ни RAID-3 не поддерживаются драйверами программного RAID в Linux.

Прочие уровни RAID определены различными исследователями и поставщиками. Многие из них представляют наложение одного типа raid поверх другого. Некоторые требуют специального оборудования, а другие защищены патентами. Нет единой схемы именования этих уровней. Иногда преимущества этих систем небольшие, или по крайне мере не проявляются пока система не слишком нагружена. Исключая размещение RAID-1 поверх RAID-0/linear, Программный RAID Linux не поддерживает никакие друге варианты.


Производительность, утилиты и общие ключевые вопросы


В: Я создал RAID-0 устройство на /dev/sda2 и /dev/sda3. Устройство намного медленнее, чем отдельный раздел. md - это куча мусора?

О: Для запуска устройства RAID-0 на полную скорость, у Вас должны разделы на разных дисках. Кроме того, помещая две половины зеркала на один диск Вы не получаете защиты от отказа диска.

В: Зачем использовать линейный RAID, если RAID-0 делает то же самое, но с лучшей производительностью?

О: Не очевидно, что RAID-0 даст большую производительность; фактически, в некоторых случаях, он может сделать хуже. Файловая система ext2fs распределяет фалы по всему разделу, и пытается хранить все блоки файла вместе, в основном в целях избежания фрагментации. Таким образом, ext2fs ведет себя "как если бы" stripe-ы были (переменного размера) размером с файл. Если есть несколько дисков соединяются в один линейный RAID, это приведет к статистическому распределению файлов на оба диска. Таким образом, по крайней мере для ext2fs, линейный RAID работает во многом подобно RAID-0 с большим размером stripe. Наоборот, RAID-0 с маленьким размером stripe при одновременном доступе к нескольким большим файлам может вызвать излишнюю дисковую активность, приводящую к снижению производительности.

Во многих случаях, RAID-0 может явно выигрывать. Например, представьте большой файл базы данных. Так как ext2fs пытается объединить вместе все блоки файла, велики шансы, что она заполнит только одно устройство при использовании линейного RAID, но будет разделять на много кусочков, при использовании RAID-0. Теперь представим несколько нитей (ядра) пытающихся получить произвольный доступ к базе данных. При линейном RAID, весь доступ пойдет на один диск, что не так эффективно, как параллельный доступ, создаваемый RAID-0.

В: Как RAID-0 обрабатывает ситуацию, где stripe-ы на различных разделах разного размера? stripe-ы распределяются однообразно?

О: Для понимания этого, давайте рассмотрим пример с тремя разделами; 50Мб, 90Мб и 125Мб.

Назовем D0 50Мб диск, D1 90Мб диск и D2 125Мб диск. Когда Вы запускаете устройство, драйвер вычисляет 'strip zones'. В этом случае, он найдет 3 зоны, определенные подобно этому:


Z0 : (D0/D1/D2) 3 x 50 = 150MB всего в этой зоне Z1 : (D1/D2) 2 x 40 = 80MB всего в этой зоне Z2 : (D2) 125-50-40 = 35MB всего в этой зоне.

Вы можете видеть, что общий размер зон - размер виртуального устройства, но, в зависимости от зоны, striping различается. Z2 особенно неэффективна,так как там только один диск.

Так как ext2fs и большинство других файловых систем Unix распределяют файлы по всему диску, У Вас 35/265 = 13% шансов, что заполнение закончится на Z2, и не получится никаких преимуществ RAID-0.

(DOS пытается заполнить диск от начала до конца, и таким образом, старые файлы должны храниться на Z0. Однако, эта стратегия приводит к резкой фрагментации файловой системы, это причина того, что никто кроме DOS так не делает.)

В: У меня есть жесткий диск производителя X и контроллер производителя Y и я предполагаю использовать md. Это даст значительное увеличение производительности? Производительность в самом деле заметна?

О: Ответ зависит от используемой Вами конфигурации.

Производительность Linux MD RAID-0 и линейного RAID:

Если система слишком загружена вводом-выводом, статистически, часть пойдет на один диск, а часть на другой. Таким образом, производительность увеличится по сравнению с одиночным диском. Фактическое увеличение сильно зависит от текущих данных, размера stripe, и других факторов. В системе с низким вводом-выводом, производительность эквивалентна производительности одного диска.

Производительность чтения Linux MD RAID-1 (зеркализация):

MD реализует балансировку чтения. То есть, код RAID-1 будет поочередно выбирать каждый из дисков (двух или более) зеркала, производя поочередное чтение с каждого диска. В случае небольшого ввода-вывода, это вовсе не изменит производительность: Вы будете ждать завершения чтения одного диска. Но, с двумя дисками и при высокой загрузке вводом-выводом, возможно получить практически удвоенную производительность, так как опреации чтения будут выполняться с каждого диска одновременно. Для N дисков в зеркале, это может увеличить производительность в N раз.



Производительность записи Linux MD RAID-1 (зеркализация):

Нужно ждать, пока запишутся данные на все диски зеркала. Это из-за того, что копия данных должна быть записана на каждый из дисков зеркала. Таким образом, производительность будет приблизительно эквивалентна производительности записи на один диск.

Производительность чтения Linux MD RAID-4/5:

Статистически, данный блок может быть на любом из дисков, и, таким образом, производительность чтения RAID-4/5 во многом подобна RAID-0. Она зависит от данных, размера stripe, и приложения. Она не будет так хороша, как производительность чтения в зеркальном массиве.

Производительность записи Linux MD RAID-4/5:

Она, в общем, должна быть предположительно меньше, чем у одного диска. Это из-за того, что на один диск должна быть записана информация о паритете, в то время как на другой - данные. Однако, в случае вычисления нового паритета, старый паритет и старые данные должны быть сначала считаны. Старые данные, новые данные и старый паритет должны быть объединены операцией XOR для определения новой информации о паритете: это требует циклов процессора и дополнительного доступа к дискам.

В: Какую конфигурацию RAID я должен использовать для оптимальной производительности?

О: Ваша цель максимальная пропускная способность, или минимальные время доступа? Нет простого ответа, так как на производительность влияет много факторов:



операционная система - будет один процесс/нить, выполнять доступ к диску или несколько?

приложение - выполняется доступ к данным последовательно или с произвольно?

файловая система - группируются файлы или рассредотачиваются ( ext2fs группирует блоки файлов, и рассредотачивает сами файлы)

драйвер диска - количество блоков упреждающего чтения (это настраиваемый параметр)

CEC аппаратура - один дисковый контроллер или несколько?

контроллер жесткого диска - может ли выполнять множество запросов или нет? Имеет ли кеш?

Жесткий дик - размер памяти кеш-буфера -- Достаточен ли будет для обработки размеров записей и желаемой частоты обращений?



физическая организация - количество блоков в цилиндре -- доступ к блокам на различных цилиндрах приведет к пере-позиционированию головки.

В: Какая оптимальная конфигурация RAID-5 для производительности?

О: Так как RAID-5 создает загрузку ввода-вывода, которая одинаково распределена на несколько устройств, лучшая производительность будет получена, когда RAID набор сбалансирован использованием идентичных дисков, идентичных контроллеров, и одинаковым (небольшим) числом дисков на каждом контроллере.

Однако заметьте, что использование идентичных компонент увеличивает возможность множества одновременных отказов, например из-за внезапного толчка или урона, перегрева, или скачка электричества во время грозы. Смешивание марок и моделей помогает минимизировать этот риск.

В: Какой оптимальный размер блока для массива RAID-4/5?

О: Если используется текущая (Ноябрь 1997) RAID-4/5 реализация, строго рекомендуется создавать файловую систему с mke2fs -b 4096 вместо 1024 байтов, по умолчанию.

Это потому, что текущая реализация RAID-5 резервирует одну 4Кб страницу памяти на дисковый блок; если размер блока диска будет 1Кб, тогда 75% памяти, которую резервирует RAID-5 для осуществления ввода-вывода, не используется. Если размер блока диска совпадает с размером страницы памяти, тогда драйвер (потенциально) может использовать всю страницу. Итак, для файловой системы с размером блока 4096 в отличие от системы с размером блока 1024, драйвер RAID будет потенциально ставить в очередь 4 раза производя ввод-вывод с драйверам нижнего уровня без расходования дополнительной памяти.

Заметка: пометки выше НЕ применимы драйверу программного RAID-0/1/линейного.

Заметка: высказывание о 4Кб странице памяти применимо к архитектуре Intel x86. Размер страницы на Alpha, Sparc, и других процессорах различается; я думаю на Alpha/Sparc он 8Кб (????). Скорректируйте соответственно указанное значение.

Заметьте: если на Вашей файловой системе много небольших файлов (файлов размером менее 10Кб), значительная чaсть дискового пространства может быть потеряна. Это из-за того, что файловая система распределяет дисковое пространство частями размером в блок. Выделение больших блоков маленьким файлам приводит к потерям дискового пространства: таким образом, Вы можете поставить небольшой размер блока, получить большую эффективность использования емкости, и не беспокоиться о "потерянной" памяти из-за несоответствия размера блока размеру страницы памяти.



Заметка: большинство ''типичных'' систем не содержат много маленьких файлов. То есть, хотя могут быть тысячи небольших файлов, это будет приводить к потере только от 10 до 100Мб, что, возможно, приемлимо, учитывая производительность, на много-гигабайтном диске.

Однако, для серверов новостей, может быть десятки и сотни тысяч небольших файлов. В этом случае, меньший размер блока, и таким образом сохраненная емкость, может быть более важной, чем более эффективный ввод-вывод.

Заметка: существует экспериментальная файловая система для Linux, которая пакует маленькие фалы и группы файлов в один блок. Она имеет большую производительность, если средний размер файла намного меньше размера блока.

Заметка: Будущие версии могут реализовать схемы, которые лишат смысла вышеприведенную дискуссию. Однако, это сложно реализовать, так как динамическое распределение на ходу может привести к мертвым-блокировкам (dead-locks); текущая реализация выполняет статическое предварительное выделение.

В: Как размер куска (размер stripe) влияют на производительность моего RAID-0, RAID-4 или RAID-5 устройства?

О: Размер куска - количество смежных данных на виртуальном устройстве, которы смежные и на физическом устройстве. В этом HOWTO, "кусок" и "stripe" подразумевают одно и то же: что часто называется "stripe" в другой документации по RAID, в MD man страницах называется "кусок" ("chunk"). Stripe-ы или куски применимы только к RAID 0, 4 и 5, так как stripe-ы не используются в зеркализации (RAID-1) и простом соединении (линейный RAID). Размеры stripe влияют на задержку, пропускную способность, и конкуренцию между отдельными операциями (возможность одновременного обслуживания перекрывающихся запросов ввода-вывода).

Предполагая использование файловой системы ext2fs, и текущих правил ядра для упреждающего чтения, большие размеры stripe почти всегда лучше, чем маленькие размеры, и размеры stripe от почти четырех до полного цилиндра диска наилучшие. Чтобы понять это требование, рассмотрим эффективность больших stripe на маленьких файлах, и маленьких stripe на больших файлах. Размер stripe не влияет на производительность чтения на маленьких файлах: для массива из N дисков, файл имеет 1/N вероятность попасть целиком в один stripe на любой диск. Таким образом, и задержка и производительность чтения сравнима с чтением одного диска. Предположим, что маленькие файлы статистически хорошо распределяются по файловой системе, (и, на файловой системе ext2fs, они дожны), грубо в N раз более упорядочены, конкурентные чтения должны быть возможны без значительных коллизий между ними. Наоборот, если используются очень маленького размера stripe-ы, и последовательно читается большой файл, то чтение будет выдаваться всем дискам массива. Для чтения одного большого файла, задержка будет почти двойная, так как увеличивается вероятность нахождения блока в трех четвертях оборота диска или далее. Однако заметьте аргумент: пропускная способность может увеличиться почти в N раз для чтения одного большого файла, так как N дисков могут читать одновременно (то есть, если используется упреждающее чтение, то все диски остаются активными). Но есть другй контр-аргумент: если все диски уже заняты чтением файла, то попытки одновременного чтения второго или третьего файла приведут к значительной борьбе, разрушив производительность, так как алгоритмы управления диском будут двигать головками вдоль пластины. Таким образом, большие stripe-ы будут почти всегда приводить к большей производительности. Единственное исключение - случай, при использовании хорошего алгоритма упреждающего чтения, где один поток в одно время читает один большой файл, и он требует наивысшей возможной производительности. В этом случае желательны небольшие stripe-ы.



Заметьте, что этот HOWTO ранее рекомендовал небольшие размеры stripe-ов для спула новостей или других систем с множеством мелких файлов. Это плохой совет, и вот почему: спулы новостей содержат не только много маленьких файлов, но также и большие суммарные файлы, также как и большие каталоги. Если суммарный файл более одного stripe, его чтение задействует много дисков, замедляя все, так как каждый диск выполняют позиционирование. Подобным образом, текущая файловая система ext2fs просматривает каталоги в линейной, последовательной манере. Таким образом, чтобы найти данный файл или inode, в средней части будет прочитана половина каталога. Если этот каталог простирается на несколько stripe-ов (несколько дисков), чтение каталога (такое как при команде ls) будет очень медленным. Спасибо Steven A. Reisman < > за эту поправку. Steve также добавил следующее:

Я обнаружил, что использование 256k stripe дает намного лучшую производительность. Я подозреваю, что оптимальный размер должен быть размером с цилиндр диска (или, может быть размером с кеш диска). Однако, современные диски содержат зоны с различным количеством секторов (и размер кеша варьируется в зависимости от модели диска). Невозможно гарантировать, что stripe-ы не будут пересекать границу цилиндра.

Утилиты позволяют задавать размер в Кбайтах. Вы можете указать его величиной с размер страницы Вашего CPU (4Кб на x86).

В: Каков правильный stride при создании файловой системы ext2fs на разделе RAID? Под stride я подразумеваю -R флаг в команде mke2fs:

mke2fs -b 4096 -R stride=nnn ...

Кокое должно быть значение nnn?

О: Флаг -R stride используется, чтобы указать файловой системе размер RAID stripe-ов. Так как только RAID-0,4 и 5 использует stripe-ы, а RAID-1 (зеркализация) и линейный RAID не используют, этот флаг применим только к RAID-0,4,5.

Знание размера stripe-а позволяет mke2fs

выделять блок и битовый поля inode так, что они не все хранятся на одном физическом устройстве. Неизвестный помощник написал:



Прошлой весной я заметил, что один диск из пары всегда больше занят вводом-выводом, и отследил - это из-за этих блоков мета-данных. Ted добавил опцию -R stride=, в мой вариант ответа и предложение обходного варианта.

Для файловой системы с блоком 4Кб, с размером stripe в 256Кб, нужно использовать -R stride=64.

Если Вы не доверяете флагу -R, Вы можете получить подобный эффект другим путем. Steven A. Reisman < > написал:

Другое соображение - файловая система используемая на устройстве RAID-0. Файловая система выделяет ext2 8192 блоков в группу. У каждой группы есть свой набор inode-ов. Если есть 2, 4 или 8 дисков, эти inode скапливаются на первом диске. Я распределили inode-ы по всем дискам, указав mke2fs выделять только 7932 блоков на группу.

Некоторые страницы mke2fs не описывают флаг [-g blocks-per-group]

используемый при этой операции.

В: Где в загрузочных скриптах я могу вставить команду md, так, чтобы все автоматически стартовало в процессе загрузки?

О: Rod Wilkens < > написал:

Вот что я сделал: вставил ``mdadd -ar'' в ``/etc/rc.d/rc.sysinit'' прямо после загрузки модулей, и перед проверкой дисков ``fsck''. Таким образом, Вы можете вставить устройство ``/dev/md?'' в ``/etc/fstab''. Затем вставить ``mdstop -a'' прямо после де-монтирования всех дисков ``umount -a'', в файле ``/etc/rc.d/init.d/halt''.

Для raid-5, Вы должны посмотреть на код возврата mdadd, и если он ошибочен, сделать

ckraid --fix /etc/raid5.conf

для восстановления любых повреждений.

В: Меня интересует возможно ли установить striping для более, чем 2 устройств в md0? Это для сервера новостей, и у меня есть 9 дисков... Нужно ли говорить, что мне нужно больше, чем два. Это возможно?

О: Да. (описать как это сделать)

В: Когда программный RAID превосходит аппаратный RAID?

О: Обычно, аппаратный RAID считается производительнее программного RAID, так как аппаратные контроллеры, часто содержат большой кеш, и могут лучше выполнять планирование параллельных операций записи. Однако, интегрированный программный RAID может (и дает) определенное преимущество при реализации в операционной системе.



Например, ... мммм. Мы обходим молчанием темное описание кеширования реконструированных блоков в буферный кеш ...

На дуальных PPro SMP системах, мне рассказывали, что производительность программного RAID превышала производительность плат аппаратного RAID известных производителей с кратностью от 2 до 5 раз.

Программный RAID также очень интересная опция для избыточных серверных систем высокой готовности. В такой конфигурации, два CPU подсоединены к одному набору SCSI дисков. Если один север рушится или отказывается отвечать, то другой сервер может mdadd, mdrun и mount массив программного RAID, и продолжить работу. Этот режим работы не всегда возможен с многими аппаратными RAID контроллерами, из-за состояний конфигурации которое аппаратные контроллеры могут поддерживать.

В: Если я обновляю версию моих raidtools, приведет ли это к проблемам манипулирования старых raid массивами? Коротко, должен ли я пересоздать мои массивы RAID при обновлении raid утилит?

О: Нет, по крайней мере до смены старшего номера версии. MD версия x.y.z состоит из трех подверсий:

x: старший номер версии. y: младший номер версии. z: номер уровня патча.

Версия x1.y1.z1 драйвера RAID поддерживает RAID массив с версией x2.y2.z2 в случае (x1 == x2) и (y1 >= y2).

Различные номера патчей (z) для тех же (x.y) версий разработаны по большей мере совместимыми.

Младший номер версии увеличивается всякий раз, когда код RAID массива изменяется таким образом, что он несовместим с старыми версиями драйвера. Новые версии драйвера должны поддерживать совместимость с старыми RAID массивами.

Старший номер версии увеличивается, если более не имеет смысла поддерживать старые RAID массивы в новом коде ядра.

Для RAID-1, не правдоподобно, чтобы ни дисковый уровень ни структура суперблока изменились в ближайшее время. Скорее всего любые оптимизации и новые свойства (реконструкция, многопоточные утилиты, горячая замена, и т.п.) не отразятся на физическом размещении.

В: Комманда mdstop /dev/md0 говорит, что устройство занято.



О: Есть процесс, который держит открытым файл на /dev/md0, или /dev/md0 все еще смонтирован. Завершите процесс или umount /dev/md0.

В: Существуют утилиты измерения производительности?

О: Существует новая утилита, называемая iotrace в каталоге linux/iotrace. Она читает /proc/io-trace и анализирует/строит графики из его вывода. Если Вы чувствуете, что блочная производительность Вашей системы слишком низкая, просто посмотрите на вывод iotrace.

В: Я читал исходники RAID, и видел, что там определено значение SPEED_LIMIT равное 1024Кб/сек. Что это значит? Это ограничивает производительность?

О: SPEED_LIMIT используется для ограничения скорости реконструкции RAID при автоматической реконструкции. По существу, автоматическая реконструкция позволяет Вам e2fsck и mount сразу после неправильного завершения, без предварительного запуска ckraid. Автоматическая реконструкция также используется после замены отказавшего диска.

Для избежания подавления системы при реконструкции, нить реконструкции контролирует скорость реконструкции и уменьшает ее, если она слишком высока. Предел 1Мб/сек был выбран как разумная норма, которая позволяет реконструкции завершаться умеренно быстро, при создании только небольшой нагрузки на систему, не мешая другим процессам.

В: Как насчет ''синхронизации шпинделей''или ''дисковой синхронизации''?

О: Синхронизация шпинделей используется для поддержания вращения нескольких дисков с одинаковой скоростью, так что пластины дисков всегда точно выровнены. Это используется некоторыми аппаратными контроллерами для лучшей организации записи на диски. Однако, в программном RAID, эта информация не используется, и синхронизация шпинделей может даже снизить производительность.

В: Как я могу установить пространства для подкачки используя raid 0? Должна ли быть striped подкачка на 4+ дисках быть быстрой?

О: Leonard N. Zubkoff отвечает: Да она действительно быстра, но Вам не нужно использовать MD для получения striped подкачки. Ядро автоматически разделяет подкачку по нескольким пространствам подкачки с одинаковым приоритетом. Например, следующие записи из /etc/fstab разделяют подкачку по пяти дискам в три группы:



/dev/sdg1 swap swap pri=3 /dev/sdk1 swap swap pri=3 /dev/sdd1 swap swap pri=3 /dev/sdh1 swap swap pri=3 /dev/sdl1 swap swap pri=3 /dev/sdg2 swap swap pri=2 /dev/sdk2 swap swap pri=2 /dev/sdd2 swap swap pri=2 /dev/sdh2 swap swap pri=2 /dev/sdl2 swap swap pri=2 /dev/sdg3 swap swap pri=1 /dev/sdk3 swap swap pri=1 /dev/sdd3 swap swap pri=1 /dev/sdh3 swap swap pri=1 /dev/sdl3 swap swap pri=1

В: Я хочу получить максимальную производительность. Я должен использовать несколько контроллеров?

О: Во многих случаях, ответ - да. Используя несколько контроллеров для параллельного доступа к дискам увеличивает производительность. Однако, действительное приращение фактически зависит от вашей конфигурации. Например, как сообщили (Vaughan Pratt, Январь 98) что один 4.3Гб Cheetah подключенный к Adaptec 2940UW может дать до 14Мб/сек (без использования RAID). Установив два диска на один контроллер, и используя конфигурацию RAID-0 привело к увеличению производительности до 27 Мб/сек.

Заметьте,что 2940UW контроллер - "Ultra-Wide" SCSI контроллер, теоретически способный к пакетным передачам 40Мб/сек, так что указанные измерения не неожиданность. Однако, более медленный контроллер подключенный к двум быстрым дискам будет бутылочным горлышком. Также заметьте, что большинство внешних SCSI подключений (таких как секции с лотками горячей замены) не могут работать на 40Мб/сек, из-за проблем с кабелями и электрических шумов.

Если Вы разрабатываете систему с несколькими контроллерами, помните, что большинство дисков и контроллеров в среднем работает на 70-85% их максимальной скорости.

Также заметьте, что использование одного контроллера на диск может, по всей вероятности, уменьшить простой системы из-за отказа контроллера или кабеля (теоретически -- только в случае правильной обработки драйвером отказа контроллера. Не все драйвера SCSI представляются способными обрабатывать эту ситуацию без паники или иных блокировок).


Список пожеланий для MD и сопутствующего ПО


Bradley Ward Allen < > написал:

Идеи включают:

Параметры загрузки для указания ядру какие устройства - MD устройства (без ``mdadd'')

Сделать MD прозрачным для ``mount''/``umount'' без использования ``mdrun'' и ``mdstop''

Интегрировать ``ckraid'' в ядро, и запускать его при необходимости

(Итак в общем, все, что я могу предложить - избавиться от утилит и поместить их в ядро; так я это вижу, это - файловая система, а не игрушка.)

Работа с массивами, которые могут свободно пережить одновременный, или в разное время, отказ N дисков, где N - целое > 0 устанавливаемое администратором

Лучшая обработка застывания ядра, отключения питания, и других внезапных завершений

Не отключать целый диск, если только часть его отказала, если ошибки секторов занимают менее 50% доступа при 20 попытках различных обращений, то просто продолжаем игнорируя эти сектора этого отдельного диска.

Плохие сектора:

Механизм для сохранения плохих секторов в другом месте диска.

Если существует обобщенный механизм для маркировки деградировавших плохих блоков, которые вышестоящие уровни файловой системы могут распознать, использовать его. Программный он или нет.

Возможен альтернативный механизм извещения вышестоящего уровня, что размер диска более маленький, прямо выравнивая для вышестоящего уровня сдвигать части исключенных областей диска. Это может помочь с деградированными блоками.

Недостаток вышеуказанных идей, сохранять маленькое (устанавливаемое администратором) количество пространства для резервирования плохих блоков (равномерно распределенное по диску?), и использовать его (как можно более близко) вместо плохих блоков, при их появлении. Конечно, это не эффективно. Более того, ядро должно вести log каждый раз при нахождении RAID массивом плохого сектора и делать это с ``crit'' уровнем предупреждения, просто дать понять администратору, что его диск содержит пылинку в себе (или соприкосновение головки с пластиной).

Программно-переключаемые диски:

``запретить этот диск''

должно блокировать, пока ядро не завершит проверки наличия данных для сбрасывания на диск при завершении (таких как завершение XOR/ECC/других коррекций ошибок), затем освободить диск от использования (чтобы его можно было вынуть и т.п.); ``разрешить этот диск''

должно, при соответствии, mkraid новый диск и затем запустить его для использования для ECC или любых операций, расширяя RAID5 массив; ``изменить размер массива''

должно переопределять общее чило дисков и чило избыточных дисков, и результатом должно быть изменение размера массива; без потери данных, хорошо было бы сделать это должным образом, но я потратил много времени пытаясь описать, как это должно делаться; в любом случае, необходим режим, где массив будет блокироваться ( возможно, на несколько часов (ядро должно заносить что-то в log каждые десять секунд)); ``разрешение диска при сохранении данных''

это должно сохранить данные на диске как есть и перемещать их, как положено, на систему RAID5, так что ужасающее сохранение и восстановление не должно происходить каждый раз когда кто-то ``поднимает''систему RAID5 (вместо этого, может быть проще сохранять только один раздел вместо двух, он может поместится на первый как сжатый gzip-ом файл); ``пере-разрешение диска''

должно быть операторской подсказкой операционной системе попробовать ранее отказавший диск (это должен быть, как я думаю, просто вызов запрещения, а потом разрешения).

Прочие идеи не из сети:

finalrd аналог для initrd, для упрощения raid на корневой файловой системе.

режим только-чтение для raid, чтобы упростить вышесказанное

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

Добавить период "неактивности записи" (для избежания частого позиционирования головок на суперблок RAID при относительной занятости RAID тома).



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


В: Как лучше сконфигурировать программный 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. Делайте старательно, это не опасно.

наслаждайтесь!

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

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



В: Я хочу запустить 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 страницы, и т. д. с обычного пакета утилит.

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

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

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

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

Edward Welbon < > написал:

... все, что нужно - скрипт для управления установкой. Для монтирования 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.

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

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

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

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



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

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

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

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

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

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

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

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

О: Некоторые из алгоритмов 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 пространства ''теряется''.

В: Я хочу понять, существует-ли что-то типа 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

завершился с ошибкой.)

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

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

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

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

должен быть успешно создать raid массив, когда mdadd шаг выполняется - файловая система запущена в "деградированном" режиме, как если бы один из дисков отказал.


Вопросы ожидающие ответов


В: Если, по соображениям стоимости, я пробую зеркало состоящее из медленного диска и быстрого диска, достаточно ли S/W силен для балансировки чтения или это замедлит скорость до скорости медленного?

В: Для тестирования "чистой" производительности диска... Существует ли символьное устройство для прямого(raw) чтения/записи вместо /dev/sdaxx, которое мы можем использовать для оценки производительности на raid устройствах?? Существует ли GUI утилита для наблюдения дисковой производительности??



Восстановление ошибок


В: У меня установлен RAID-1 (зеркализация), и у меня пропало питание во время дисковой активности. Что мне теперь делать?

О: Избыточность уровней RAID предназначена для защиты от отказа диска, не от отказа питания.

Есть несколько путей восстановления в этой ситуации.

Метод (1): Использовать raid утилиты. Он может быть использован для синхронизации raid массивов. Он не устраняет повреждение файловой системы; после синхронизации raid массивов, файловая система все еще нуждается в исправлении с помощью fsck. Raid массивы могут быть проверены ckraid /etc/raid1.conf (для RAID-1, или, /etc/raid5.conf, и т.д..)

Запуск ckraid /etc/raid1.conf --fix выберет оин один диск из дисков массива (обычно первый), для использования его в качестве главной копии, и копирования его блоков на другие диски зеркала. Для обозначения диска, который должен быть использован как главный, вы можете использовать --force-source флаг: например, ckraid /etc/raid1.conf --fix --force-source /dev/hdc3. Комманда ckraid может быть безопасно запущена без опции --fix

для проверки неактивного RAID массива без внесения изменений. Если Вы удовлетворены предполагаемыми изменениями, примените опцию --fix .

Метод (2): Параноидальный, длительный по времени, не намного лучше, чем первый путь. Представим двух-дисковый массив RAID-1, состоящий из разделов /dev/hda3 и /dev/hdc3. Вы можете попробовать следующее:

fsck /dev/hda3

fsck /dev/hdc3

Решите, который из двух разделов содержит меньше ошибок, или где проще восстановление, или на котором находятся нужные Вам данные. Выберите один, только один, для вашей новой ``главной'' копии. Предположим Вы выбрали /dev/hdc3.

dd if=/dev/hdc3 of=/dev/hda3

mkraid raid1.conf -f --only-superblock

Вместо последних двух шагов, Вы можете запустить ckraid /etc/raid1.conf --fix --force-source /dev/hdc3, что будет быстрее.

Метод (3): Версия для ленивых людей. Если Вы не хотите ждать завершения долгой проверки fsck, просто пропустите первые три шага выше, и начинайте прямо с последних двух шагов. Только после завершения запустите fsck /dev/md0. Метод (3) на самом деле замаскированный метод (1).


В любом случае, вышеуказанные шаги только синхронизируют массив raid. Для файловых систем возможно все еще необходимо устранение ошибок: для этого, нужно запустить fsck на активном, но не смонтированном устройстве.

С трех-дисковым массивом RAID-1, есть много вариантов, таких как использование двух дисков для выбора ответа. Утилиты автоматизации этого пока (Сентябрь 97) не существуют.

В: Если у меня установлен RAID-4 или RAID-5 (паритетный), и пропало питание во врем активности диска. Что мне делать?

О: Избыточность уровней RAID предназначена для защиты от отказов дисков, а не от отказов питания.

Так как диски в массиве RAID-4 или RAID-5 не содержат файловой системы, которую fsck может читать, есть несколько опций восстановления. Вы не можете использовать fsck для предварительной проверки и/или восстановления; Вы должны использовать сначала ckraid.

Комманда ckraid может быть безопасно запущена без опции --fix

для проверки неактивного массива RAID без внесения любых изменений. Когда Вы удовлетворены предложенными изменениями, примените опцию --fix.

Если Вы хотите, Вы можете попробовать обозначить один из дисков как ''отказавший диск''. Делайте это с флагом --suggest-failed-disk-mask.

Только один бит должен быть установлен в флаге: RAID-5 не может восстанавливать два отказавших диска. mask - битовая маска: итак:

0x1 == первый диск 0x2 == второй диск 0x4 == третий диск 0x8 == четвертый диск, и т.д.

Или Вы можете выбрать модификацию секторов с паритетом, используя флаг --suggest-fix-parity flag. Это заново вычислит паритет из других секторов.

Флаг --suggest-failed-dsk-mask и --suggest-fix-parity

может быть безопасно использован для проверки. Никаких изменений не будет сделано, если не указан флаг --fix. Итак, Вы можете экспериментировать с различными возможными вариантами восстановления.

В: Мое RAID-1 устройство, /dev/md0 состоит из двух разделов жестких дисков: /dev/hda3 и /dev/hdc3. Недавно, диск с /dev/hdc3 отказал, был заменен на новый диск. Мой лучший друг, который не разбирается в RAID, сказал, что сейчас правильно сделать ''dd if=/dev/hda3 of=/dev/hdc3''. Я попробовал это, но все по прежнему не работает.



О: Вы должны отстранить Вашего друга от компьютера. К счастью, не произошло никаких серьезных повреждений. Вы можете все восстановить запустив:

mkraid raid1.conf -f --only-superblock

При запуске dd, были созданы две идентичные копии раздела. Это почти правильно, исключая то, что расширение ядра RAID-1 предполагает различие в суперблоке. Итак, когда Вы пробуете активировать RAID, программа обратит внимание на проблему, и деактивирует один из двух разделов. Пересоздав суперблок, вы должны получить полностью рабочую систему.

В: У моей версии mkraid нет флага --only-superblock. Что мне делать?

О: В новых утилитах убрали поддержку этого флага, заменив его флагом --force-resync. Как мне сообщили с последней версией утилит и программ работает такая последовательность:

umount /web (что было смонтировано на /dev/md0) raidstop /dev/md0 mkraid /dev/md0 --force-resync --really-force raidstart /dev/md0

После этого, cat /proc/mdstat должно доложить resync in progress, и далее можно mount /dev/md0 с этого места.

В: Мое устройство RAID-1, /dev/md0 состоит из двух разделов: /dev/hda3 and /dev/hdc3. Мой лучший друг(подруга?), который не разбирается в RAID, запустил без меня fsck на /dev/hda3, и сейчас RAID не работает. Что я должен делать?

О: Вы должны пересмотреть свое понятие - ``лучший друг''. В общем, fsck не должна запускаться на отдельных разделах массива RAID. Предположим ни один из разделов тяжело не поврежден, потерь данных нет, и RAID-1 устройство может быть восстановлено так:

делаем резервную копию файловой системы на /dev/hda3

dd if=/dev/hda3 of=/dev/hdc3

mkraid raid1.conf -f --only-superblock

Это должно вернуть ваше зеркало к работе.

В: Почему сказанное выше работает как восстанавливающая процедура?

О: Потому что каждый компонент раздела в RAID-1 зеркале является просто точной копией файловой системы. В крайнем случае, зеркализация может быть запрещена, и один из разделов может быть смонтирован и безопасно запущен как обычная, не-RAID файловая система. Если Вы готовы перезапуститься используя RAID-1, то демонтируйте раздел, и следуйте вышеприведенным инструкциям для восстановления зеркала. Заметьте, что вышеуказанное работает ТОЛЬКО для RAID-1, и ни для какого другого уровня.



Возможно, Вам удобнее изменить направление копирования: копировать с диска, который был нетронут на тот, который был. Просто будьте уверены, что после этого запускаете fsck на md.

В: Я смущен предыдущим вопросом, но еще не убежден. Безопасно ли запускать fsck /dev/md0 ?

О: Да, безопасно запускать fsck на устройствах md. Фактически, это единственное безопасное место запуска fsck.

В: Если диск медленно слабеет, будет очевидно который из них? Я беспокоюсь чтобы этого не случилось, и эта неразбериха не привела к каким-либо опасным решениям системного администратора.

О: Как только диск откажет, драйвер нижнего уровня вернет код ошибки драйверу RAID. RAID драйвер пометит этот диск в суперблоках RAID хороших дисков как ``плохой''(bad) (таким образом позже мы сможем узнать, которые из дисков хорошие, а которые нет), и продолжит работу RAID на оставшихся действующих зеркалах.

Это, конечно, предполагает, что диск и драйвер нижнего уровня в состоянии обнаружить ошибки чтения/записи и не будут, к примеру, молча искажать данные. Это справедливо для текущих дисков (схем обнаружения ошибок используемых в них), и основы работы RAID.

В: Как насчет горячей замены?

О: Работа далека от завершения ``горячей замены''. С этим свойством, можно добавить несколько ``резервных'' дисков в RAID набор (уровня 1 или 4/5), и как только диск отказал, он будет воссоздан на ходу на одном из резервных дисков, без необходимости остановки массива.

Однако, для использования этого свойства, резервные диски должны быть определены на момент загрузки или должны добавляться на ходу, что требует использования специального шкафа и соединителей, которые позволяют добавлять диск при включенном питании.

На Октябрь 97, доступна бета версия MD, которая позволяет:

RAID 1 и 5 восстановление на резервных дисках

RAID-5 восстановление паритета после неправильного завершения

добавление резервных дисков в уже работающий массив RAID 1 или 4/5

По умолчанию, автоматическая реконструкция сейчас (Декабрь 97) запрещена по умолчанию, в основном по причине предварительного характера этой работы. Она может быть включена изменением значения SUPPORT_RECONSTRUCTION в include/linux/md.h.



Если при создании в массиве сконфигурированы резервные диски и реконструкция в ядре включена, резервный диск уже будет содержать суперблок (записанный утилитой mkraid), и ядро будет реконструировать его содержимое автоматически (без необходимости шагов: вызов mdstop, замены диска, ckraid, mdrun).

Если Вы не запустили автоматическую реконструкцию, и не сконфигурировали диски с горячей заменой, рекомендуется процедура описанная Gadi Oxman < > :

Сейчас, как только один диск удален, набор RAID будет запущен в деградированном режиме. Для восстановления полноценного функционирования, Вы должны:

остановить массив (mdstop /dev/md0)

заменить отказавший диск

запустить ckraid raid.conf для реконструкции содержимого

запустить массив снова (mdadd, mdrun).

Теперь массив будет запущен со всеми дисками, и снова будет защищен от отказа одного диска.

На текущий момент, не возможно назначить один резервный диск нескольким массивам. Каждый массив требует своего собственного резервного диска.

В: Хочу звуковую сигнализацию ``один диск в зеркале неисправен'', так как администратору-новичку узнать это проблематично.

О: Ядро ведет протокол событий с ``KERN_ALERT'' приоритетом в syslog. Существует несколько программных пакетов, которые наблюдают за файлами syslog, и автоматически подают сигнал на PC динамик, звонят на пейджер, посылают почту, и т.д.

В: Как мне запустить RAID-5 в деградированном режиме (о одним отказавшим, и еще не замененным диском)?

О: Gadi Oxman < > пишет: Обычно, для запуска RAID-5 набора из n дисков вы должны:

mdadd /dev/md0 /dev/disk1 ... /dev/disk(n) mdrun -p5 /dev/md0

В случае, если один из дисков отказал, Вы все также должны mdadd их, как и при обычном запуске. (?? попробуйте использовать /dev/null вместо отказавшего диска ??? и посмотрите, что получится). После этого массив будет активен в деградированном режиме с (n - 1) диском. Если ``mdrun'' не удается, ядро фиксирует ошибку (например, несколько отказавших дисков, или неправильное завершение). Используйте ``dmesg'' для отображения сообщений об ошибках ядра от ``mdrun''. Если набор raid-5 поврежден исчезновением питания, в отличие от отказа диска, можно попробовать создать новый RAID суперблок:



mkraid -f --only-superblock raid5.conf

RAID массив не предоставляет защиту от отказа питания или краха ядра, и нельзя гарантировать корректное восстановление. Воссоздание суперблока приведет к игнорированию положения пометкой всех устройств, как ``OK'', как будто ничего не случилось.

В: Как работает RAID-5 при отказе диска?

О: Типичный рабочий сценарий следующий:

RAID-5 массив активен.

Одно устройство отказывает во время активности массива.

Микропрограмма диска и низкоуровневые драйвера Linux диска/контроллера обнаруживают отказ и сообщают код ошибки MD драйверу.

MD драйвер продолжает поддерживать безошибочную работу /dev/md0 устройства для верхних уровней ядра (с потерей производительности) используя оставшиеся рабочие диски.

Системный администратор может, как обычно, umount /dev/md0 и mdstop /dev/md0.

Если отказавшее устройство не заменено, системный администратор может запустить массив в деградированном режиме, запустив mdadd and mdrun.

В:

О:

В: Почему нет вопроса номер 13?

О: Если Вы заботитесь о RAID, Высокой надежности, и UPS, то, возможно, также хорошая мысль - быть суеверным. Это не повредит, не так ли?

В: Я только что заменил отказавший диск в массиве RAID-5. После пересоздания массива, fsck выдает очень много ошибок. Это нормально?

О: Нет. И, если Вы запускали fsck не в "режиме только для чтения; без обновлений", вполне возможно, что у Вас повреждены даные. К несчастью, часто встречающийся сценарий - случайное изменение порядка дисков в массиве RAID-5, после замены диска. Хотя суперблок RAID содержит правильный порядок, не все утилиты используют эту информацию. В частности, текущая версия ckraid

будет использовать информацию указанную в -f

флаге (обычно, файл /etc/raid5.conf) вместо данных из суперблока. Если указанный порядок неверный, то замененный диск будет реконструирован неправильно. Симптом этого - многочисленные ошибки выдаваемые fsck.

И, если вы удивлены, да, кое-кто потерял все свои данные из-за этой ошибки. Настоятельно рекомендуется сделать копию всех данных перед ре-конфигурированием RAID месива.

В: В QuickStart сказано, что mdstop только для того, чтобы убедиться, что диски синхронизированы. Это ДЕЙСТВИТЕЛЬНО необходимо? Не достачно де-монтирования файловой системы?

О: Команда mdstop /dev/md0 будет:

помечать диски как ''чистые''. Это позволит нам обнаружить неправильное завершение, например из-за отказа питания или краха ядра.

синхронизирует массив. Это менее важно после де-монтирования файловой системы, но важно если к /dev/md0 был доступ не через файловую систему (например посредством e2fsck).


и надежных дисковых подсистем из


В: Что такое RAID?
О: RAID означает "Redundant Array of Inexpensive Disks", - путь создания быстрых и надежных дисковых подсистем из отдельных дисков. В мире PC, "I" понимают как "Независимые"("Independent"), где маркетинговыми усилиями продолжают различать IDE и SCSI. В оригинальном понимании, "I" означает "Недорогие (Inexpensive) по сравнению мейнфреймом 3380 DASD, размером с холодильник". Хорошие дома выглядят дешевыми по сравнению с его монстрообразными устройствами, а бриллиантовые кольца - безделушками.
В: Что это за документ?
О: Этот документ - tutorial/HOWTO/FAQ для пользователей MD расширения ядра Linux, соответствующих утилит, и их применения. Расширение MD программно реализует RAID-0 (striping), RAID-1 (mirroring), RAID-4 и RAID-5. Это означает, что для MD не требуется специального оборудования или дисковых контроллеров для достижения многих преимуществ RAID.
Этот документ НЕ введение в RAID; вы должны искать его в другом месте.
В: Какие уровни RAID реализует ядро Linux?
О: Striping (RAID-0) и линейное соединение являются частью 2.x серии ядер. Его код - продукт производственного качества; он хорошо понятен и хорошо поддерживается. Он используется в некоторых очень больших USENET серверах новостей.
RAID-1, RAID-4 и RAID-5 - часть ядра 2.1.63 и выше. Для ранних 2.0.x и 2.1.x ядер, существуют патчи, которые реализуют эту функцию. Не считайте обязательным обновиться до ядра 2.1.63; обновление ядра - процесс трудный; *намного* проще пропатчить ранние ядра. Большинство пользователей RAID работают с 2.0.x ядрами, и там сфокусирована большая часть исторической разработки RAID. Текущие снимки - производственного качества; т.е. нет известных ошибок, но есть некоторые грубые места и не проверенные системные установки. Большое количество людей используют программный RAID в производственном окружении.
Горячее восстановление на RAID-1 было представлено недавно (Август 1997) и должно рассматриваться как альфа качества. Горячее восстановление RAID-5 должно быть альфа качества сейчас.


Предостережение о 2.1. x нестабильных ядрах: они менее стабильны во многих отношениях. Некоторые из новейших дисковых контроллеров (таких как Promise Ultra) поддерживаются только в 2.1.x ядрах. Однако, 2.1.x ядра часто меняются в части драйверов блочных устройств, в коде DMA и прерываний, в PCI, IDE и SCSI коде, и в драйверах дисковых контроллеров. Комбинация этих факторов в совокупности с дешевыми жесткими дисками и/или низкого качества кабелями могут привести к значительным неприятностям. Утилита ckraid как и fsck и mount создают значительную нагрузку на RAID подсистему. Это может привести к блокировке дисков при загрузке, где даже магическая alt-SysReq клавишная комбинация не сохранит день. Будьте осторожны с 2.1.x ядрами, и ожидайте проблем. Или вернитесь к 2.0.34 ядру.
В: Я использую старое ядро. Где я могу получить патчи?
О: Программный RAID-0 и линейный режим - присутствуют во всех версиях текущих ядер Linux. Патчи для программных RAID-1,4,5 имеются на . См. также квази-зеркало
для патчей, инструментов и других интересных вещей.
В: Есть ли другие Linux RAID ссылки?
О:
Общий обзор RAID: .
Общие опции Linux RAID: .
Последняя версия этого документа: .
Linux-RAID архив почтовой переписки: .
Домашняя страница Linux Software RAID: .
Инструменты Linux Software RAID: .
Как установить linear/stripped Software RAID: .
Bootable RAID mini-HOWTO: .
Root RAID HOWTO: .
Linux RAID-Geschichten: .
В: Кто ответственен за этот документ?
О: Linas Vepstas собрал это все вместе. Однако, большая часть информации, и некоторые фразы были предоставлены
Bradley Ward Allen < >
Luca Berra < >
Brian Candler < >
Bohumil Chalupa < >
Rob Hagopian < >
Anton Hristozov < >
Miguel de Icaza < >
Marco Meloni < >
Ingo Molnar < >
Alvin Oga < >
Gadi Oxman < >
Vaughan Pratt < >
Steven A. Reisman < >
Michael Robinton < >
Martin Schulze < >
Geoff Thompson < >
Edward Welbon < >
Rod Wilkens < >
Johan Wiltink < >
Leonard N. Zubkoff < >
Marc ZYNGIER < >
Copyrights
Copyright (C) 1994-96 Marc ZYNGIER
Copyright (C) 1997 Gadi Oxman, Ingo Molnar, Miguel de Icaza
Copyright (C) 1997, 1998 Linas Vepstas
По закону об авторском праве, дополнительные авторские права принадлежат помощникам, указанным выше.
Спасибо всем за приведенное здесь!

Высокая готовность RAID


В: RAID может помочь мне противостоять потерям данных. Но как я могу быть уверенным, что система работает, настолько долго, насколько возможно, и не склонна к поломкам? В идеале, я хочу, чтобы система работала 24 часа в день, 7 дней в неделю, 365 дней в году.

О: Высокая готовность дело трудное и дорогостоящее. Тяжело Вам пробовать сделать систему отказоустойчивой, тяжело и еще более дорого ее получить. Следующие подсказки, советы, идеи и не проверенные слухи могут помочь Вам в этом.

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

SCSI диски могут отказать так, что отказавший диск на SCSI цепочке может мешать работе любого устройства в цепочке. Режим отказа приводит к замыканию общего (разделяемого) контакта готовности устройства; так как этот контакт общий, не может быть выполнен никакой арбитраж, пока замыкание не устранено. Таким образом, два диска в одной цепочке SCSI не должны относиться к одному RAID массиву.

Подобные замечания применимы к контроллерам дисков. Не подгружайте каналы к одному контроллеру; используйте несколько контроллеров.

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

Для защиты от отказа контроллера или процессора, можно построить окружение SCSI диска с "двумя хвостами", т.е. подсоединенным к двум компьютерам. Один компьютер монтирует файловую систему в режиме чтение-запись, а другой монтирует ее в как только-чтение, и действует как горячий резерв. Когда горячий резерв, определяет, что главный компьютер отказал (с помощью watchdog), он выключает питание главного (для гарантии, что он в самом деле не работает), и затем выполняет fsck и перемонтируется в режиме чтение-запись. Если кто-либо запустит это, дайте мне знать.

Всегда используйте UPS, и выполняйте правильное завершение. Хотя неправильное завершение может не повредить диски, запуск ckraid даже на маленьких массивах мучительно медленный. Вы должны избегать запуска ckraid насколько это возможно. Или Вы можете покопаться в ядре и запустить отлаживаемый код горячей реконструкции ...

SCSI кабеля, как известно, очень темпераментные создания, и склонны создавать всяческие проблемы. Используйте кабеля наивысшего качества, из тех которые можно купить. Используйте так называемый bubble-wrap, чтобы убедиться, что ленточные кабеля не слишком близко расположены и не влияют друг на друга. Тщательно соблюдайте ограничения на длину.

Взгляните на SSI (Serial Storage Architecture). Хотя она несколько дорога, по слухам менее склонна к ошибочным режимам, чем SCSI.



Аппаратные решения


Эта секция имеет отношение к некоторым аппаратным особенностям запуска программного RAID.



Авто-детектирование


Авто-детектирование позволяет ядру автоматически распознавать устройства RAID при загрузке, сразу после завершения обычного детектирования разделов.

Для этого требуется несколько вещей:

Вам нужна поддержка авто-детектирования в ядре. Проверьте это.

Вы должны создать RAID устройства используя отдельный суперблок

Тип раздела устройств используемых в RAID должен быть установлен в 0xFD (запустите fdisk и установите тип в ``fd'')

ЗАМЕТКА: Удостоверьтесь, что Ваш RAID НЕ ЗАПУЩЕН перед сменой типа раздела. Используйте raidstop /dev/md0 для остановки устройства.

Если Вы сделаете 1, 2 и 3 как указано выше, авто-детектирование должно быть установлено. Попробуйте перезагрузиться. После загрузки системы, сделайте cat /proc/mdstat и это должно показать, что Ваш RAID запущен.

При загрузке, Вы должны увидеть сообщения подобные этим:

Oct 22 00:51:59 malthe kernel: SCSI device sdg: hdwr sector= 512 bytes. Sectors= 12657717 [6180 MB] [6.2 GB] Oct 22 00:51:59 malthe kernel: Partition check: Oct 22 00:51:59 malthe kernel: sda: sda1 sda2 sda3 sda4 Oct 22 00:51:59 malthe kernel: sdb: sdb1 sdb2 Oct 22 00:51:59 malthe kernel: sdc: sdc1 sdc2 Oct 22 00:51:59 malthe kernel: sdd: sdd1 sdd2 Oct 22 00:51:59 malthe kernel: sde: sde1 sde2 Oct 22 00:51:59 malthe kernel: sdf: sdf1 sdf2 Oct 22 00:51:59 malthe kernel: sdg: sdg1 sdg2 Oct 22 00:51:59 malthe kernel: autodetecting RAID arrays Oct 22 00:51:59 malthe kernel: (read) sdb1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind<sdb1,1>

Oct 22 00:51:59 malthe kernel: (read) sdc1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind<sdc1,2>

Oct 22 00:51:59 malthe kernel: (read) sdd1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind<sdd1,3>

Oct 22 00:51:59 malthe kernel: (read) sde1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind<sde1,4>

Oct 22 00:51:59 malthe kernel: (read) sdf1's sb offset: 6205376 Oct 22 00:51:59 malthe kernel: bind<sdf1,5>

Oct 22 00:51:59 malthe kernel: (read) sdg1's sb offset: 6205376 Oct 22 00:51:59 malthe kernel: bind<sdg1,6>


Oct 22 00:51: 59 malthe kernel: autorunning md0 Oct 22 00:51:59 malthe kernel: running: <sdg1><sdf1><sde1><sdd1><sdc1><sdb1>

Oct 22 00:51:59 malthe kernel: now! Oct 22 00:51:59 malthe kernel: md: md0: raid array is not clean -- starting background reconstruction

Это отрывок при авто-детектировании массива RAID-5, который не был чисто остановлен (например при крахе машины). Была автоматически инициирована реконструкция. Монтирование этого устройства вполне безопасно, так как реконструкция прозрачна и все данные целы ( только паритетная информация противоречива - но она не нужна, пока диск не откажет).

Автоматически стартующие устройства также автоматически останавливаются при выключении. Не беспокойтесь о init скриптах. Просто используйте устройства /dev/md как любые другие /dev/sd или /dev/hd устройства.

Да, это в самом деле очень просто.

Вы можете взглянуть в Ваш init-scripts для любых raidstart/raidstop комманд. Они часто есть в стандартных RedHat init скриптах. Они используются для RAID старого стиля, и не используются в RAID нового стиля с авто-детектированием. Посто удалите строки, и все будет очень просто.


Диски IDE с горячей заменой


Не делайте ! IDE совсем не работает с горячей заменой. Конечно, у вас может работать, если ваш IDE драйвер скомпилирован как модуль (возможно только в 2.2 серии ядер), и вы пере-загружаете его после замены диска. Но Вы можете запросто сжечь IDE контроллер, и Вы будете блокированы на значительно большее время, чем, если бы Вы заменили диск на выключенной машине.

Главная проблема, исключая выбросы электричества, которые могут разрушить вашу аппаратуру, - шина IDE должны быть пересканирована после замены дисков. Текущий IDE драйвер так не умеет. Если новый диск на 100% идентичен старому (геометрией и т.п.), он может

работать без пере-сканирования шины, но на самом деле, Вы ходите по краю обрыва.



Диски SCSI с горячей заменой


Обычная SCSI аппаратура не позволяет горячей замены. Однако, это может

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

Уровень SCSI должен пережить смерть диска, но пока не все драйвера SCSI могут так делать. Если Ваш SCSI драйвер падает при отказе диска, ваша система упадет с ним, и горячая замена реально не возможна.



Горячая замена


Некоторое время это была горячая тема списка рассылки linux-kernel. Хотя горячая замена дисков поддерживается в некоторой степени, она все еще нечто не очень простое.



Горячая замена с SCA


Со SCA, возможна горячая замена устройств. Однако, у меня нет аппаратуры на которой можно это попробовать, и я не слышал, чтобы кто-то пробовал, так что реально я не могу дать никаких рекомендаций, как это сделать.

Если Вы хотите поиграть с этим, Вы, в любом случае, должны знать о внутренностях SCSI и RAID. Таким образом я не собираюсь писать здесь что-либо, что я не проверил, вместо этого я могу дать несколько нитей к размышлению:

grep на предмет remove-single-device в linux/drivers/scsi/scsi.c

Взгляните на raidhotremove и raidhotadd

Не все SCSI драйвера поддерживают добавление и удаление устройств. В серии 2.2 ядер, по крайней мере Adaptec 2940 и Symbios NCR53c8xx драйвера, кажется, поддерживаю это, другие - не известно. Я буду благодарен, если кто-то даст сюда дополнительные факты ...



Имитация отказа диска


Если Вы хотите имитировать отказ диска - отсоедините устройство. Вы должны делать это при выключенном питании. Если Вы заинтересованы в тестировании выживут ли Ваши данные без одного диска, по сравнению с обычным количеством, нет иного выхода, как отключение. Завершите систему, отсоедините диск и загрузитесь снова.

Посмотрите в syslog, и загляните в /proc/mdstat, чтобы посмотреть как действует RAID. Сработало?

Запомните, что Вы должны запускать массив RAID-{1,4,5} для возможности пережить отказ диска. Линейный или RAID-0 откажут полностью при отсутствии диска.

Когда Вы подключили диск снова (при выключенном питании, конечно), Вы можете опять добавить ``новое'' устройство в RAID, командой raidhotadd.



Имитация повреждения данных


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

RAID не может и не должен защищать от повреждения данных на носителе. Следовательно, нет никакого смысла намеренно повреждать данные (используя dd например) на диске, чтобы посмотреть как RAID система это обработает. Наиболее вероятно (если Вы не повредите суперблок RAID), что RAID уровень никогда не догадается о повреждении, но файловая система на Вашем RAID устройстве будет повреждена.

Это путь вещей предполагаемых для работы. RAID не гарантирует целостности данных, он просто позволяет Вам сохранить данные при отказе диска (это, конечно, справедливо для RAID уровня 1 или выше).



Jakob Østergaard ( ) Переводчик: Максим Дзюманенко ( )


Версия 0.90.7 19 Января 2000 г. Дата перевода: 11 Октября 2000 г.

Этот HOWTO описывает, как использовать программный RAID под Linux. Он связан с определенной версией уровня программного RAID, а именно уровнем 0.90 RAID, сделанным Ingo Molnar и другими. Этот уровень RAID будет стандартным в Linux-2.4, и эта версия также используется в ядрах Linux-2.2, поставляемых некоторыми поставщиками. Поддержка RAID 0.90 доступна в виде патчей к Linux-2.0 и Linux-2.2, и, как многие считают, намного более стабильна, чем старый RAID код в тех же ядрах.



Конфигурирование IDE


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

Физическая стабильность: IDE устройства традиционно более низкого качества, чем SCSI устройства. Даже сейчас, гарантия на IDE устройства - типично один год, когда на SCSI часто три или пять. Однако неправильно будет сказать, что IDE диски по определению плохо сделаны, Вы должны осознавать, что IDE диски некоторых производителей могут отказывать более часто, чем подобные SCSI диски. Однако, другие производители используют одинаковые механические части для обоих, SCSI и IDE устройств. Это все сводится к одному: Все диски отказывают, рано или поздно, и вы должны быть готовы к этому.

Целостность данных: Раньше, в IDE не было способа гарантировать, что данные посланные по IDE шине будут данными, фактически записанными на диск. Это потому, что не хватало проверки четности, проверки контрольных сумм, и т.п. Со стандартом Ultra-DMA, IDE теперь могут делать проверку контрольных сумм данных, которые они получили, и таким образом стало очень неправдоподобно исказить данные.

Производительность: Я не собираюсь детально обсуждать здесь производительность IDE. Коротко, история такова:

IDE устройства быстрые (12 Мб/с и выше)

IDE создают большую нагрузку на CPU, чем SCSI (но кого это интересует?)

Используйте один IDE диск на IDE шине, slave диски портят производительность

Отказоустойчивость: ДрайверIDE обычно устойчив и переносит отказ IDE диска. RAID уровень пометит диск как отказавший, и если Вы работаете с RAID уровня 1 или выше, машина должна хорошо работать, до тех пор пока Вы ее не остановите на ремонт.

Очень важно, чтобы Вы использовали один IDE диск на IDE шине. Два диска не только разрушают производительность, но отказ диска - часто гарантирует отказ шины, и, таким образом, отказывают все устройства на этой шине. При отказоустойчивом RAID (RAID уровней 1,4,5), отказ одного может быть обработан, но отказ двух дисков (два диска на одной шине отказывают из-за отказа одного диска) приведут массив в неиспользуемое состояние. Также, при отказе master диска на шине, slave или IDE контроллер может быть сбит с толку. Одна шина - один диск, это правило.

Существуют дешевые PCI IDE контроллеры. Вы часто можете получить две или четыре шины за $80. Учитывая значительно более низкую цену IDE по сравнению со SCSI дисками, я бы сказал, что IDE дисковые массивы могут быть в самом деле хорошим решением, если оно реализуется относительно небольшим (возможно около 8) количеством дисков, которые можно подключить к типичной системе (если, конечно, у Вас достаточно PCI слотов для этих IDE контроллеров).

У IDE есть небольшая проблема с кабелями при применении в больших массивах. Даже если У вас достаточно PCI слотов, маловероятно, что Вы сможете поставить более 8 дисков в систему и запустить ее без искажений данных при передаче (из-за слишком длинных IDE кабелей).



Корневая файловая система на RAID


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



Линейный режим


Итак, у вас есть два или более раздела, не обязательно одного размера (но конечно могут быть), которые Вы хотите объединить вместе.

Установите /etc/raidtab файл для описания вашей конфигурации. Я устанавливаю raidtab для двух дисков в линейный режим, и файл выглядит так:

raiddev /dev/md0 raid-level linear nr-raid-disks 2 chunk-size 32 persistent-superblock 1 device /dev/sdb6 raid-disk 0 device /dev/sdc5 raid-disk 1

Резервные диски тут не поддерживаются. Если диск умрет, массив умрет вместе с ним. Не существует информации для помещения на резервный диск.

Вы, возможно удивлены тем, что мы указали здесь chunk-size (размер куска), при том, что линейный режим просто объединяет два диска в один большой без параллелизма. Да, Вы полностью правы, это - лишнее. Просто поставьте какой-то размер куска и не беспокойтесь об этом.

Итак, создадим массив. Запускаем команду

mkraid /dev/md0

Это должно инициализировать ваш массив, записать отдельные суперблоки, и запустить массив.

Загляните в /proc/mdstat. Вы должны заметить, что массив уже запущен.

Теперь, ВЫ можете создать файловую систему, просто как и на любом другом устройстве, смонтируйте ее, включите ее в Ваш fstab и тому подобное.



Ловушки


Никогда, НИКОГДА, никогда не пере-размечайте разделы дисков, которые являются частью рабочего RAID. Если Вы должны изменить таблицу разделов на диске, который - часть RAID, сначала остановите массив, затем пере-размечайте.

Поместить много дисков на одну шину очень просто. Обычная шина Fast-Wide SCSI может выдерживать до 10 Мб/с, что меньше, чем могут дать многие современные диски. Размещение шести таких дисков на одной шине, конечно, не даст ожидаемого прироста производительности.

Многие SCSI контроллеры дадут Вам наивысшую производительность, если SCSI шины почти маскимально забиты дисками на них. Вы не увидите увеличения производительности от использования двух 2940s с двумя старыми SCSI дисками, вместо простого подключения двух дисков к одному контролеру.

Если Вы забудете опцию persistent-superblock, Ваш массив может сразу не запуститься после остановки. Просто пере-создайте массив с установленной опцией в raidtab.

Если RAID-5 отказывается реконструироваться после удаления и повторного добавления диска, это может быть из-за порядка устройств в raidtab. Попытайтесь переместить первую ``device ...'' и ``raid-disk ...'' пару в низ описания массива в фале raidtab.

Большинство ``сообщений об ошибках'' , которые мы видим в linux-kernel, от людей, у которых как-то не работает правильный патч RAID с правильной версией raidtools. Если Вы используете 0.90 RAID, убедитесь, что используете raidtools для этой версии.



У вас есть резервный диск,


Этот метод предполагает, что У вас есть резервный диск, который не входит в конфигурируемый RAID, и на который Вы можете инсталлировать систему.

Сначала установите обычную систему на ваш дополнительный диск.

Запустите планируемое ядро, возьмите raid-патчи и утилиты и сделайте загрузку Вашей системы с новым RAID-способным ядром. Убедитесь, что поддержка RAID в ядре, и не загружается как модуль.

Итак, сейчас Вы должны сконфигурировать и создать планируемый к использованию RAID для корневой файловой системы. Эта стандартная процедура описана в этом документе.

Просто убедитесь, что все в порядке, попробуйте перезагрузить систему, чтобы посмотреть загрузится ли новый RAID. Должен загрузиться.

Поместите файловую систему на новый массив (используя mke2fs), и смонтируйте его в /mnt/newroot

Сейчас, скопируйте содержимое Вашей текущей корневой файловой системы (с резервного диска) на новую корневую файловую систему (массив). Есть много способов это сделать, один из них

cd / find . -xdev | cpio -pm /mnt/newroot

Вы должны модифицировать файл /mnt/newroot/etc/fstab для использования правильного устройства (корневого устройства /dev/md?) для корневой файловой системы.

Сейчас, размонтируйте текущуюt /boot файловую систему, и смонтируйте вместо нее загрузочное устройство указанное в /mnt/newroot/boot. Это требуется для LILO для успешного запуска на следующем шаге.

Обновите /mnt/newroot/etc/lilo.conf для указания на правильные устройства. Загрузочное устройство должно все еще быть обычным диском (не-RAID устройством), но root устройство должно указывать на Ваш новый RAID. Когда сделано, запустите

lilo -r /mnt/newroot

Этот запуск LILO дожен завершиться без ошибок.

Перезагрузите систему, и смотрите, чтобы все происходило как ожидается :)

Если Вы делаете это с IDE дисками, удостоверьтесь что установили в BIOS, что все диски ``auto-detect'' типа, таким образом BIOS позволит Вашей машине загружаться даже если диск отсутствует.



Этот метод требует, чтобы Вы использовали raidtools/патч, которые включают директиву failed-disk. Это должны быть утилиты/патч для всех ядер от 2.2.10 и выше.

Вы можете использовать этот метод только на RAID уровня 1 и выше. Идея состоит в использовании установки системы на диск специально отмеченный как отказавший в RAID, тогда скопировав систему на RAID, запущенный в деградированном режиме, и затем сделав доступным для RAID уже не нужный ``инсталляционный диск'', уничтожаете старую установку, но запускаете RAID в не деградированном режиме.

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

Теперь, возьмите ядро, патчи, утилиты и т.п. Вы уже заучили это. Сделайте Вашу систему загрузочной с Вашим новым ядром, который содержит необходимую поддержку RAID скопмилированой в ядре.

Сейчас, установите RAID с вашим текущим корневым устройством как отказавшим диском в фале raidtab. Не помещайте отказавший диск как первый диск в raidtab, это создаст проблемы с запуском. Создайте RAID, и поместите файловую систему на него.

Попробуйте перегрузиться и посмотреть, запустится ли RAID должным образом

Скопируйте системные файлы и ре-конфигурируйте систему для использования RAID в качестве корневого устройства, кaк описано в предыдущей секции.

Когда Ваша система успешно загрузиться с RAID, Вы можете модифицировать файл raidtab для включения предыдущего отказавшего диска как обычного raid-диска. Сейчас, raidhotadd диск ваш RAID.

Сейчас Вы должны получить систему, которая может загружаться с не деградированного RAID.


Общие установки


Вот что Вам нужно для любых уровней RAID:

Ядро. Предпочтительно стабильной серии 2.2.X, или последнее 2.0.X. (Если 2.4 уже вышло, в то время когда Вы это читаете, используйте его)

Патчи RAID. Это обычно патч для последних ядер. (Если Вы найдете 2.4 ядро, патчи уже в нем, и вы можете забыт о них)

RAID утилиты.

Терпение, пицца, и Ваш любимый кофейный напиток.

Все программы могут быть найдены на ftp://ftp.fi.kernel.org/pub/linux RAID утилиты и патчи в daemons/raid/alpha подкаталоге. Ядра - в kernel подкаталоге.

Пропатчите ядро, сконфигурируйте его для включения поддержки желаемого уровня RAID. Скомпилируйте его и установите.

Затем распакуйте, сконфигурируйте, скомпилируйте и установите утилиты RAID.

Так, все хорошо. Если Вы сейчас перезагрузитесь, Вы должны получить файл называемый /proc/mdstat. Запомните его, этот файл - Ваш друг. Сделав cat /proc/mdstat посмотрите его содержимое. Это должно Вам сказать, что у Вас зарегистрированы правильные свойства RAID (RAID режим), и устройства RAID уже активны.

Создайте разделы, которые хотите включить в RAID набор.

Сейчас, рассмотрим специфику режимов.



Опции mke2fs


Существует специальная опция форматирования RAID-4 ил -5 устройств с mke2fs. Опция -R stride=nn позволяет mke2fs лучше размещать различные ext2 специфичные структуры данных разумным способом на устройство RAID.

Если размер куска 32 Кб, это значит, что 32 Кб последовательных данных будут лежать на одном диске. Если Вы хотите создать ext2 файловую систему с размером блока в 4 Кб, Вы сделаете так, что будет восемь блоков файловой системы в одном куске. Мы можем указать эту информацию для утилиты mke2fs, при создании файловой системы:

mke2fs -b 4096 -R stride=8 /dev/md0

Производительность RAID-{4,5} строго зависит от этой опции. Я не уверен как опция stride будет воздействовать на другие уровни RAID. Если у кого-то есть эта информация, пожалуйста пошлите ее мне.

Размер блока ext2fs строго определяет производительность файловой системы. Вы всегда должны использовать размер блока 4Кб на любой файловой системе более чем нескольких сот мегабайт, если Вы не помещаете очень большое число маленьких файлов на нее.



Отдельный суперблок


Вернемся в ``Старые Добрые Времена'' (TM), raidtools читали Ваш read /etc/raidtab файл и затем инициализировали массив. Однако, это требовало наличия файловой системы та том, на чем был смонтирован /etc/raidtab. Это не подходило для загрузки с RAID.

Также, старый подход приводил к сложностям при монтировании файловой системы на RAID устройствах. Они не должны были, как обычно, вставляться в /etc/fstab файл, но должны были монтироваться из скриптов инициализации.

Отдельный суперблок решил эти проблемы. Когда массив инициализируется с опцией persistent-superblock в файле /etc/raidtab, в начале всех дисков массива записывается специальный суперблок. Это позволяет ядру читать конфигурацию устройств RAID прямо с затрагиваемых дисков, вместо чтения конфигурационного файла, который может не всегда доступен.

Однако Вы должны поддерживать целостность файла /etc/raidtab, так как Вам он может понадобиться позже при реконструкции массива.

Если вы хотите автоматического детектирования RAID устройств при загрузке - отдельный суперблок обязателен. Это описано в секции Автоматическое детектирование.



Отречение


Обязательное отречение:

Хотя RAID кажется мне стабильным, и стабильным для многих других людей, у Вас он может не сработать. Если Вы потеряете все ваши данные, вашу работу, или это ударит по Вам - это не моя вина, и не вина разработчиков. Знайте, что вы используете программный RAID и эту информацию на свой риск! Никто не гарантирует, что либо программа, либо эта информация, сколько-нибудь корректна, либо пригодна вобще для использования. Сархивируйте все Ваши данные перед этими экспериментами. Лучше предостеречься, чем сожалеть.

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



Почему RAID ?


Есть много преимуществ в использовании RAID. Некоторые из них: возможность комбинировать несколько физических дисков в один большой ``виртуальный'' диск, увеличение производительности и надежности.



Производительность


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

Бенчмарки производились программой bonnie, и всегда с файлами в два или более раза большими объема физической памяти (RAM) в машине.

В приведенных бенчмарках измерялась только пропускная способность записи и чтения одного большого файла. Это полезная информация, если интересует максимальная пропускная способность ввода/вывода для длинных блоков данных. Однако, эти цифры мало говорят нам о производительности, при использовании массива для спула новостей, web-сервера, и т.д. Всегда помните, эти цифры - результат запуска ``синтетического'' теста. Несколько реальных программ делают то же, что и bonnie, и хотя хорошо смотреть на эти цифры, они не являются основными индикаторами реальной производительности.

Сейчас, у меня есть результаты с моей собственной машины. Конфигурация такова:

Dual Pentium Pro 150 MHz

256 MB RAM (60 MHz EDO)

Три IBM UltraStar 9ES 4.5 GB, SCSI U2W

Adaptec 2940U2W

Один IBM UltraStar 9ES 4.5 GB, SCSI UW

Adaptec 2940 UW

Ядро 2.2.7 с RAID патчами

Три U2W диска повешены на U2W контроллер, и UW диск на UW контроллер.

Представляется невозможным передавать более 30 Мб/с по шинам SCSI на этой системе, используя RAID или нет. Как я думаю, это из-за слишком старой системы, скорости памяти и ограничений того, что можно послать через SCSI контроллеры.



У вас должно быть два


У вас должно быть два или более устройств, приблизительно одного размера, и Вы хотите объединить их емкость и также производительность путем параллельного доступа.

Установите файл /etc/raidtab для описания Вашей конфигурации. Пример raidtab выглядит таким образом:

raiddev /dev/md0 raid-level 0 nr-raid-disks 2 persistent-superblock 1 chunk-size 4 device /dev/sdb6 raid-disk 0 device /dev/sdc5 raid-disk 1

В линейном режиме, резервные дики не поддерживаются. RAID-0 не имеет избыточности, так что если диск умрет, массив умрет вместе с ним.

Еще раз, просто запустите

mkraid /dev/md0

для инициализации массива. Это должно инициализировать суперблок и запустить устройство. Загляните в /proc/mdstat чтобы посмотреть, что произошло. Вы должны увидеть, что Ваше устройство запущено.

/dev/md0 теперь готов к форматированию, монтированию, использованию и издевательствам.



Данные записываются ``почти'' в параллельном режиме на диски массива. Фактически, chunk-size байт записываются на каждый диск последовательно.

Если Вы указываете размер куска в 4 Кб, и пишете 16 Кб на массив из трех дисков, RAID система будет писать 4 Кб на диски 0, 1 и 2, параллельно, а оставшиеся 4 Кб на диск 0.

Размер куска в 32 KB - разумное начальное значение для большинства массивов. Но оптимальное занчение сильно зависит от количества в дисков, содержимого файловой системы на массиве, и многих других факторов. Поэкспериментируйте с этим, для получения производительности.



Чтение это - Последовательный блочный ввод, и Запись

это - Последовательный блочный вывод. Размер файла во всех тестах - 1Гб. Тести были проведены в однопользовательском режиме. Драйвер SCSI был сконфигурирован для не использования очереди помеченных комманд.

Размер куска Размер блока Чтение Кб/с Запись Кб/с
4k 1k 19712 18035
4k 4k 34048 27061
8k 1k 19301 18091
8k 4k 33920 27118
16k 1k 19330 18179
16k 2k 28161 23682
16k 4k 33990 27229
32k 1k 19251 18194
32k 4k 34071 26976

Отсюда видно, что размер куска в RAID не имеет значения. Однако, размер блока ext2fs должен быть как можно более большим, как 4KB (т.е. размер страницы) на IA-32.


RAID-0 с TCQ


Тут, драйвер SCSI был сконфигурирован для использования очереди помеченных комманд (TCQ), с глубиной очереди - 8. Все остальное как и в предыдущем случае.

Размер куска Размер блока Чтение Кб/с Запись Кб/с
32k 4k 33617 27215

Сдесь больше не производилось тестов. Как видно TCQ немного увеличивает производительность записи, но на самом деле здесь совсем не большая разница.



У вас есть два устройства


У вас есть два устройства приблизительно одного размера, и Вы хотите из зеркализировать. В конце концов, Вы можете использовать больше устройств, которые Вы можете держать как резервные диски, и которые автоматически станут частью зеркала, если одно из из активных устройств сломается.

Установите /etc/raidtab файл подобно этому:

raiddev /dev/md0 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 chunk-size 4 persistent-superblock 1 device /dev/sdb6 raid-disk 0 device /dev/sdc5 raid-disk 1

Если у Вас есть резервные диски, Вы можете добавить их в конец спецификации устройства

device /dev/sdd5 spare-disk 0

Не забудьте установить соответственно nr-spare-disks запись (количество резервных дисков).

Итак, мы все установили для запуска инициализации RAID. Зеркало должно быть сконструировано, содержимое ( сейчас это, однако, не важно, так как устройство все еще не форматировано) двух дисков должно быть синхронизировано.

Подаем команду

mkraid /dev/md0

для начала инициализации зеркала.

Проверьте /proc/mdstat файл. Он должен сказать вам, что устройство /dev/md0 было запущено, зеркало начало реконструироваться, а также оценочное время завершения реконструкции.

Реконструкция делается в периоды отсутствия ввода-вывода. Так что, ваша система должна быть еще достаточно отзывчива, хотя Ваш индикатор дисковой активности должен хорошо светиться.

Процесс реконструкции прозрачен, так что Вы можете, фактически, использовать зеркало несмотря на реконструкцию.

Попробуйте форматировать устройство, при запущенной реконструкции. Это должно работать. Также Вы можете смонтировать его и использовать в процессе реконструкции. Конечно, если неисправный диск разрушается при реконструкции, Вам не повезло.



Для записи, размер куска не влияет, так как все данные, в любом случае, должны быть записаны на все диски. Однако для чтения, размер куска указывает сколько данных читаются последовательно с участвующих дисков. Так как все диски массива содержат одинаковую информацию, чтение может быть сделано параллельно, подобным RAID-0 образом.


Я сам не тестировал эту


Заметьте! Я сам не тестировал эту конфигурацию. Конфигурация ниже - моя догадка, а не что-то, фактически запущенное мною.

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

Установите файл /etc/raidtab подобно этому:

raiddev /dev/md0 raid-level 4 nr-raid-disks 4 nr-spare-disks 0 persistent-superblock 1 chunk-size 32 device /dev/sdb1 raid-disk 0 device /dev/sdc1 raid-disk 1 device /dev/sdd1 raid-disk 2 device /dev/sde1 raid-disk 3

Если у Вас резервные диски, они должны быть вставлены аналогичным образом, следуя спецификациям raid-disk;

device /dev/sdf1 spare-disk 0

Как обычно, ваш массив может быть инициализирован командой

mkraid /dev/md0

Перед форматированием, Вы должны просмотреть секцию специальных опций mke2fs.



Когда сделана запись на массив RAID-4, также должна быть обновлена информация о паритете на паритетном диске. Размер куска - размер паритетных блоков. Если байт записывается на массив RAID-4, потом chunk-size байт считываются с N-1 дисков, вычисляется информация о паритете, и chunk-size байт записываются на паритетный диск.

Размер куска также влияет на производительность чтения также как и в RAID-0, так как считывания с RAID-4 делаются аналогично.


У Вас есть три или


У Вас есть три или более дисков приблизительно одного размера, Вы хотите скомбинировать их в большое устройство, но еще содержащее некоторую степень избыточности. В конце концов у Вас есть несколько дисков для использования как резервных, которые не будут частью массива до отказа другого устройства.

Если Вы используете N дисков, где S - размер наименьшего, размер всего массива будет (N-1)*S. Это ``не включает'' пространство используемое для информации о четности (избыточности). Итак, если любой диск отказывает, все данные остаются целыми. Но, если два диска отказывают, все данные потеряны.

Установите файл /etc/raidtab так:

raiddev /dev/md0 raid-level 5 nr-raid-disks 7 nr-spare-disks 0 persistent-superblock 1 parity-algorithm left-symmetric chunk-size 32 device /dev/sda3 raid-disk 0 device /dev/sdb1 raid-disk 1 device /dev/sdc1 raid-disk 2 device /dev/sdd1 raid-disk 3 device /dev/sde1 raid-disk 4 device /dev/sdf1 raid-disk 5 device /dev/sdg1 raid-disk 6

Если у Вас есть резервные диски, они должны быть вставлены подобным образом, следуя спецификациям raid-disk;

device /dev/sdh1 spare-disk 0

И так далее.

Размер куска в 32 KB хорошее начальное значение для многих общих применений файловой системы. Массив, на котором используется вышеуказанный raidtab, - устройство размером 7 раз по 6 GB = 36 GB (запомните (n-1)*s = (7-1)*6 = 36) Оно содержит файловую систему ext2 с размером блока 4 Кб. Если Ваша файловая система намного больше или Вы храните очнь большие фалы, Вы должны установить больший размер куска и размер блока файловой системы.

Итак, хватит разговоров. Вы установили raidtab, так что посмотрим, работает ли он. Подаем команду

mkraid /dev/md0

и смотрим, что получилось. Надеюсь Ваши диски заработали как сумасшедшие, так как начался процесс реконструкции Вашего массива. Загляните в /proc/mdstat чтобы посмотреть что происходит.

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

Перед форматированием массива, посмотрите секцию специальных опций mke2fs.

Итак, сейчас вы запустили свое RAID устройство, Вы можете всегда остановить его или снова запустить используя

raidstop /dev/md0

или

raidstart /dev/md0

команды.

Вместо помещения этого в init-файлы и многократных перезагрузок чтобы заставить это работать, читайте далее, и запустите авто-детектирование.



На RAID- 5 размер куска имеет такое же занчение как и в RAID-4.

Разумный размер куска для RAID-5 массива - 128 KB, но как обычно, Вы можете поэкспериментировать с ним.

Посмотрите далее секцию специальных опций mke2fs. Это влияет на производительность RAID-5.



Массив был сконфигурирован в режим RAID-5, и были сделаны подобные тесты.

Размер куска Размер блока Чтение Кб/с Запись Кб/с
8k 1k 11090 6874
8k 4k 13474 12229
32k 1k 11442 8291
32k 2k 16089 10926
32k 4k 18724 12627

Сейчас, и размер куска и размер блока действительно дают различие.


с различающимися этими размерами кусков,


RAID-10 это- ``зеркало stripes'', или, массив RAID-1 двух массивов RAID-0. Размер куска - размер кусков в обоих, и в RAID-1 и в двух RAID-0 массивах. Я не проводил тестов с различающимися этими размерами кусков, хотя это должна быть вполне правильная установка.

Размер куска Размер блока Чтение Кб/с Запись Кб/с
32k 1k 13753 11580
32k 4k 23432 22249

Больше тестов не производилось. Размер файла был 900Мб, так как четыре раздела заняли по 500 Мб, так что не осталось места для 1Гб файла в этой конфигурации (RAID-1 на двух 1000Мб массивах).


Размер кусков


Размер куска заслуживает обьяснения. Вы можете никогда не писать полностью параллельно на дисковый набор. Если у Вас два диска и Вы хотите записать байт, Вы должны, фактически, записать четыре бита на каждый диск, каждый второй бит должен пойти на диск 0 а другие на диск 1. Аппаратно это не поддерживается. Вместо этого, мы выбираем некоторый размер куска, который мы определяем как наименьшую ``атомарную'' порцию данных, которые могут быть записаны на диски. Запись 16 Кб с размером куска в 4 Кб, приведет к записи первого и третьего 4 Кбайтных кусочков на первый диск, а второго и четвертого на второй, в случае RAID-0 из двух дисков. Таким образом, для длинных записей, вы можете увидеть меньшие накладные расходы при довольно больших размерах кусков, в то время как массивы, которые в основном содержит небольшие файлы, имеют преимущество при небольших размерах куска.

Размеры куска должны быть указаны для всех уровней RAID, включая линейный режим. Однако, размер куска безразличен для линейного режима.

Для оптимальной производительности, Вы должны поэкспериментировать с этим значением, также как и с размером блока файловой системы, которую вы создаете в массиве.

Аргумент опции chunk-size в /etc/raidtab указывает размер кусочка в килобайтах. Так ``4'' означает ``4 Кб''.



Реконструкция


Если Вы читали другие части этого HOWTO, Вы должны уже хорошо представлять как вызывается реконструкция деградировавшего RAID. Я обобщаю:

Выключаем систему

Заменяем отказавший диск

Включаем систему снова.

Используем raidhotadd /dev/mdX /dev/sdX для добавления диска в массив

Пьем кофе, пока работает автоматическая реконструкция

И это так.

Итак, обычно это так, пока Вам не повезет и Ваш RAID станет нерабочим из-за отказа более одного диска. Это может фактически случиться, если у Вас несколько дисков на одной шине, и один диск захватит шину при отказе. Другие диски, в порядке, но будут недоступны для RAID уровня, так как шина блокирована, и они будут помечены как отказавшие. На RAID-5, где у Вас может быть резервный диск, потеря двух или более дисков может быть фатальной.

Следующая секция - объяснение, которое прислал мне Martin Bene, и описал возможность восстановления при жутком сценарии описанном выше. Это использует директиву failed-disk в Вашем /etc/raidtab, таким образом это будет работать с ядрами 2.2.10 и выше.



Резервные диски


Резервные диски - диски, которые не являются частью RAID тома, пока один из активных дисков откажет. Когда обнаруживается отказ диска, он маркируется как ``плохой'' и, если имеются резервные диски, немедлено начинается реконструкция.

Таким образом, резервные диски добавляют дополнительную безопасность, особенно к RAID-5 системам, где, возможно, тяжело достичь этого (физически). Это позволяет работать системе некоторое время, с отказавшим диском, так как вся избыточность полагается на наличие резервных дисков.

Вы не можете быть уверены, что Ваша система переживет отказ диска. Драйвер RAID уровня должен обрабатывать дисковые отказы очень хорошо, но SCSI драйвера могут не правильно обрабатывать ошибки, или IDE чипсет может заблокироваться, или может случиться много всякого другого.



Технические детали


Linux RAID может работать на большинстве устройств. Не имеет значения используете Вы IDE или SCSI диски, или и те и другие. Некоторые люди также более или менее успешно использовали Сетевое блочное Устройство (Network Block Device (NBD)).

Удостоверьтесь, что шины к дискам достаточно быстры. Вы не должны вешать 14 UW-SCSI дисков на одну UW шину, если каждое устройство может дать 10 Мб/с, а шина может только 40 Мб/с. Также, вы должны держать только одно устройство на IDE шине. Работа дисков master/slave ужасна по производительности. IDE очень плох при подключении более одного диска на шину. Конечно, все новые материнские платы содержат две IDE шины, так что Вы можете установить два диска в RAID без покупки дополнительных контроллеров.

Уровень RAID не имеет абсолютно ничего общего с уровнем файловой системы. Вы можете держать любую файловую систему на устройстве RAID, как и на любом другом блочном устройстве.



Термины


Слово ``RAID'' означает ``Программный Linux RAID''. Этот HOWTO не рассматривает аспекты аппаратных RAID.

При описании установки, полезно сверить число дисков и их размеры. Каждый раз буква N используется для указания количества активных дисков в массиве (не считая резервных дисков). Буква S, если не указано обратное, - размер наименьшего устройства в массиве. Буква P используется как производительность одного диска в массиве в Мб/с. Мы предполагаем, что диски одинаково быстрые, что может быть не всегда справедливо.

Заметьте, что слова ``устройство'' и ``диск'' означают одно и то же. Обычно устройства, используемые для построения RAID, являются разделами диска, не обязательно целыми дисками. Но объединение нескольких разделов на одном диске обычно бессмысленно, таким образом устройства и диски обозначают просто ``разделы на различных дисках''.



Тестирование


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

Коротко - Вы не можете, исключая, возможно, ``горячее'' выдергивание шнура из жесткого диска, отказ которого Вы хотите имитировать. Вы никогда знаете, что может случиться при отказе диска. Возможна электрическая блокировка шины к которой он подсоединен, что приведет к недоступности всех устройств на шине. Хотя я никогда о таком не слышал. Диск может также просто выдавать ошибки чтения/записи на уровне SCSI/IDE, что в свою очередь даст уровню RAID корректно обработать эту ситуацию. Это, к счастью, происходит чаще всего.




Этот HOWTO предполагает, что Вы используете последние 2.2.x или 2.0.x ядра с соответствующим raid0145 патчем и raidtools версии 0.90, или Вы используете последнее ядро серии 2.3 (версию > 2.3.46) или, со временем, 2.4. Оба патча и утилиты можно найти на , и в некоторых случаях на . Патч RAID, пакет raidtools и ядро должны, по мере возможности, соответствовать друг другу. Иногда необходимо использовать более старые ядра, если патчи raid не доступны для последнего ядра.



Уровни RAID


Здесь приводится короткое описание того, что поддерживается патчами Linux RAID. Часть из этой информации - чисто базовая информация о RAID, но я добавил несколько замечаний о особенностях реализации уровней в Linux. Если Вы знакомы с RAID, просто пропустите эту секцию. Позже, если возникнут проблемы, можете вернуться к ней :)

Текущие RAID патчи для Linux поддерживают следующие уровни:

Линейный режим

Два или более диска объединяются в одно устройство. Диски ``добавляются'' один к другому, таким образом, запись на устройство RAID будет заполнять сначала диск 0, затем диск 1 и так далее. Диски не обязательно должны быть одного размера. Фактически, размер здесь вообще не имеет значения :)

На этом уровне нет избыточности. Если один диск отказывает, Вы, скорее всего, потеряете все Ваши данные. Однако, Вы, возможно, сможете удачно восстановить часть данных, так как в файловой системе будет просто отсутствовать один большой последовательный кусок данных.

Производительность чтения и записи не увеличивается для одиночных операциях считывания/записи. Но если несколько пользователей используют устройство, Вам может повезти, и один один пользователь может фактически использовать первый диск, а другой пользователь обращаться к файлам на втором диске. Если это произойдет, вы получите прирост производительности.

RAID-0

Также называемый режим ``stripe''. Подобен линейному режиму, исключая то, что чтение и запись производятся параллельно с двух устройств. Устройства должны иметь приблизительно один размер. Так как весь доступ производится параллельно, устройства заполняются одинаково. Если одно устройство больше, чем другие, это дополнительное пространство все еще используется в RAID устройстве, но при записи в самом конце вашего RAID устройства, Вы получаете доступ только к этому одному диску, что, конечно, снижает производительность.

Как и в линейном режиме, на этом уровне нет никакой избыточности. В отличии от линейного режима, Вы не сможете восстановить никаких данных при отказе диска. Если Вы удаляете диск из RAID-0 набора, в RAID устройстве будет не просто отсутствовать последовательный кусок данных, оно будет заполнено маленькими дырочками по всему устройству. e2fsck будет не в состоянии восстановить большую данных на этом устройстве.


Производительность чтения и записи увеличится, так как чтение и запись будут выполняться параллельно на дисках. Обычно, это главная причина использования этого уровня RAID. Если шины к дискам достаточно быстрые, Вы сможете получить почти N*P Мб/сек.

RAID-1



Это первый режим, который реализует избыточность. RAID-1 может использоваться на двух или более дисках с нулем или более резервными дисками. Этот режим поддерживает точную копию информации одного диска на всех дисках. Конечно, диски должны быть одного размера. Если один из дисков больше другого, Ваш RAID будет размером с наименьший.

Если N-1 диск удален (или отказал), все данные все еще целы. Если имеются резервные диски, и если система (SCSI драйвера или IDE чипсет и т.п.) пережили отказ, после обнаружения отказа, начинается немедленная реконструкция зеркала на резервные диски.

Производительность записи немного хуже, чем у одного диска, так как на каждый диск массива должны быть посланы идентичные копии записанных данных. Производительность чтения обычно достаточно плохая из-за чрезмерного упрощения стратегии балансировки чтения в коде RAID. Однако, реализована более улучшеная стратегия балансировки чтения, которая может быть доступна для патчей RAID для Linux-2.2 (спросите в linux-kernel списке рассылки), и которая будет, по всей вероятности, в стандартной поддержке RAID в 2.4 ядре.

RAID-4



Этот уровень RAID не часто используется. Он может быть использован с тремя или более дисками. Вместо полной зеркализации информации, он сохраняет информацию о четности на отдельном диске, и записывает данные на другой диск подобным используемому в RAID-0 образом. Так как один диск зарезервирован для информации четности, размер массива будет (N-1)*S, где S - размер наименьшего устройства в массиве. Как и в RAID-1, диски должны быть либо одного размера, либо S, в формуле (N-1)*S, должно быть размером наименьшего диска в массиве.

Если один диск откажет, информация о четности может быть использована для восстановления всех данных. Если два диска откажет - все данные будут потеряны.



Причина нечастого использования этого уровня - информация о паритете хранится на одном диске. Эта информация должна быть обновлена каждый

раз когда ведется запись на один из других дисков. Таким образом, диск с паритетом становится бутылочным горлышком, если он не намного быстрее остальных дисков. Однако, если так случилось, что у Вас много медленных дисков и один очнь быстрый - этот уровень RAID может быть очень полезен.

RAID-5



Это, пожалуй, самый полезный режим RAID для тех, кто хочет соединить несколько физических дисков, и к тому же сохранить избыточность. RAID-5 может быть использован на трех или более дисках, с нулем или более резервных дисков. Размер результирующего RAID-5 устройства будет (N-1)*S, как и в RAID-4. Главное отличие между RAID -5 и -4 в том, что распределением информации о паритете по всем устройствам, избегается проблема бутылочного горлышка в RAID-4.

Если один из этих дисков отказывает, все данные все еще не повреждены, благодаря информации о паритете. Если имеются резервные диски, при отказе диска немедленно начинается реконструкция. Если отказывает два диска одновременно - все данные потеряны. RAID-5 может пережить отказ одного диска, но не двух или более.

Обычно увеличивается производительность как чтения, так и записи, но тяжело предсказать насколько.


Виртуальная память на RAID


Нет причин использовать RAID для увеличения производительности виртуальной памяти. Ядро само может распределять подкачку на несколько дисков, если Вы укажете одинаковый приоритет им в fstab файле.

Правильный fstab выглядит так:

/dev/sda2 swap swap defaults,pri=1 0 0 /dev/sdb2 swap swap defaults,pri=1 0 0 /dev/sdc2 swap swap defaults,pri=1 0 0 /dev/sdd2 swap swap defaults,pri=1 0 0 /dev/sde2 swap swap defaults,pri=1 0 0 /dev/sdf2 swap swap defaults,pri=1 0 0 /dev/sdg2 swap swap defaults,pri=1 0 0

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

Другая причина использовать RAID для подкачки - высокая готовность. Если Вы установили загрузку системы и т.д. с RAID-1 устройства, система должна пережить отказ диска. Но если система выполняет подкачку с уже отказавшего устройства, будьте уверены - она рухнет. Подкачка на RAID-1 устройстве решит эту проблему.

Было много дискуссий о стабильности подкачки на RAID устройстве. Дебаты продолжаются, так как это сильно зависит от других аспектов ядра. Что касается этого документа, кажется подкачка на RAID должна быть вполне стабильна, исключая время реконструкции массива (т.е. поле того, как вставлен новый диск в деградировавший массив). Когда выйдет 2.4 это решение будет одним из наиболее более быстрых, но тогда, Вы должны жестко протестировать систему, пока сами не будете удовлетворены стабильностью или решите, что Вы не будете использовать подкачку на RAID.

В можете установить подкачку в файл на файловой системе RAID устройства, или Вы можете установить RAID устройство как swap раздел, на Ваше усмотрение. Как обычно, RAID устройство - просто блочное устройство.



Восстановление при множественных отказах диска


Сценарий таков:

Контроллер умирает и отключает два диска одновременно,

Все диски на одной scsi шине могут быть недоступны, если отказывает диск,

Отсоединяется кабель...

Коротко: довольно часто у Вас временный отказ нескольких дисков одновременно; в последствии суперблоки RAID не синхронизированы и Вы уже не можете инициализировать Ваш RAID массив.

Остается одно: перезаписать суперблоки RAID подав mkraid --force

Чтобы это сделать, Вам нужно иметь свежий /etc/raidtab - если он НЕ ТОЧНО соответствует устройствам и исходному порядку дисков, это не сработает.

Посмотрите в sylog на результат попытки запуска массива, Вы увидите отсчет событий для каждого суперблока; обычно лучше оставить диск с наименьшим отсчетом события, т.е. с самым старым.

Если Вы делаете mkraid без failed-disk, нить восстановления немедленно выругается и начнет перестроение блоков паритета - не то, что Вам сейчас нужно.

С failed-disk, В можете точно указать какие диски Вы хотите активировать и, возможно, попробовать различные комбинации для лучшего результата. Подсказка, при этих экспериментах монтируете систему в режиме только для чтения... Это было успешно использовано, по крайней мере, двумя парнями, с которыми я контактировал.



Для описания старого уровня RAID,


Для описания старого уровня RAID, который стандартен для 2.0 и 2.2 ядер, смотрите великолепный HOWTO от Linas Vepstas ( ), доступный из Linux Documentation Project на .
Домашний сайт для этого HOWTO - , где изначально появляются обновленные версии. HOWTO написан Jakob Østergaard на основе большой переписки с Ingo Molnar , одним из разработчиков RAID, почтового списка рассылки linux-raid и другими людьми.
Домашняя страница перевода - . Обновленные версии, в первую очередь, появляются тут.
Причиной написания этого HOWTO, несмотря на существование Software-RAID-HOWTO, является то, что старый HOWTO описывает программный RAID старого стиля, в стандартных 2.0 и 2.2 ядрах. Этот HOWTO описывает использование RAID нового поколения, разработанного недавно. RAID нового поколения содержит много свойств, не представленных в старом RAID.
Если Вы хотите использовать новый RAID с 2.0 или 2.2 ядрами, Вы должны взять патч к вашему ядру, либо с , либо, с недавних пор, с . Стандартные ядра 2.2 не содержат прямой поддержки нового RAID, описываемого в этом HOWTO. Для этого необходимы эти патчи. Старый RAID код в 2.0 и 2.2 ядрах содержит ошибки и не реализует некоторых важных функций, реализованных в новом программном RAID.
На момент написания, поддержка нового RAID объединена с ядрами серии 2.3, и, таким образом, будет (вполне вероятно) представлена в ядре Linux 2.4, как только оно выйдет. Но пока, стабильные ядра должны быть пропатчены вручную.
Вы можете использовать -ac выпуски ядра, сделанные Alan Cox -ом, для поддержки RAID в 2.2. Часть из них содержат RAID нового стиля, и это должно избавить Вас от необходимости патчить ядро.
Если Вы хорошо знакомы с RAID, часть информации в этом HOWTO покажется банальной. Просто пропустите ее.

Выполнение загрузки ситемы с RAID


Чтобы ядро смогло смонтировать корневую файловую систему, вся поддержка для устройства, на котором расположена корневая файловая система, должна быть в ядре. Таким образом, в случае монтирования файловой системы на RAID устройстве, ядро должно содержать поддержку RAID.

Обычный способ удостовериться, что ядро может видеть RAID устройство - просто скомпилировать ядро с вкомпилированой поддержкой RAID. Убедитесь, что компилируете поддержку RAID в ядро, а не как модули. Ядро не может загружать модули (с корневой файловой системы) перед монтированием файловой системы.

Однако, с RedHat-6.0 поставляется с ядром, которое содержит поддержку RAID нового стиля в виде модулей, я здесь опишу как можно использовать стандартное ядро RedHat-6.0 и все еще загружать систему с RAID.



Загрузка с RAID


Существует несколько путей для установки системы, которая монтирует свою корневую файловую систему на устройство RAID. На текущий момент, только графический инсталлятор RedHat Linux 6.1 позволяет прямую установку на устройство RAID. Так что вполне вероятно Вам прийдется немного повозиться, если это Вам нужно, но это вполне возможно.

Последний официальный дистрибутив lilo (версия 21) не работает с устройствами RAID, и, таким образом, ядро не может быть загружено с устройства RAID. Если Вы используете эту версию, Ваша файловая система /boot должна быть расположена на не-RAID устройстве. Чтобы быть уверенным, что Ваша система загрузится в любом случае, создайте подобные /boot разделы на всех дисках вашего RAID, таким образом BIOS всегда загрузит данные с первого попавшегося диска. Это требует, чтобы Вы не загружались с отказавшего диска.

Для redhat 6.1 стал доступен патч к lilo 21, который способен найти /boot на RAID-1. Заметьте, что это не работает для любого другого уровня, RAID-1 (mirroring) - единственный поддерживаемый уровень RAID. Этот патч (lilo.raid1) может быть найден в dist/redhat-6.1/SRPMS/SRPMS/lilo-0.21-10.src.rpm на любом зеркале redhat. Пропатченая версия LILO позволит boot=/dev/md0 в lilo.conf и сделает каждый диск зеркала загрузочным.

Другой путь быть уверенным, что Ваша система сможет всегда загрузится - создать загрузочную дискету после завершения всех установок. Если диск, на котором, расположена файловая система /boot умирает, Вы сможете всегда загрузиться с дискеты.



Загрузка с RAID в виде модуля


Для достижения этого, Вы должны указать LILO использовать RAM-диск. Используйте команду mkinitrd для создания ramdisk, содержащего все модули ядра необходимые для загрузки корневого раздела. Это можно сделать так:

mkinitrd --with=<module> <ramdisk name> <kernel>

Например:

mkinitrd --with=raid5 raid-ramdisk 2.2.5-22

Это должно гарантировать, что ядро найдет указанный RAID модуль при монтировании устройства во время загрузки.