Прежде чем приступать к инсталляции и настройке утилит и приложений, призванных поддерживать нашу простенькую горизонтальную файловую систему, договоримся о том, на каком аппаратном обеспечении мы её строим.
Прежде всего, мы работаем с дисками SATA II включёнными на максимальную скорость обмена данными. На многих SATA II дисках есть "джампер", ограничивающих скорость обмена данными для совместимость с протоколом SATA I, насколько я понимаю; естественно, нам ограничения ни к чему, нужно этот "джампер" убрать или переключить в положение, соответствующее максимальной производительности.
В настройках BIOS указываем использовать для интерфейсов SATA не режим эмуляции IDE, как это принято до сих пор у производителей большинства "бюджетных" материнских плат, а режим полноценной поддержки SATA - ACHI. Активация режима ACHI дает нам множество "плюшек", одна из которых - подключение и отключение устройства во время работы аппаратного обеспечения, "на ходу", так сказать; трудно недооценить эти преимущества для схемы, от которой требуется непрерывная работа в режиме 24/7/365.
Прежде чем приступать к дальнейшим работам с нашими дисковыми устройствами необходимо провести небольшую перепись с целью автоматизации.
Просмотрим вывод утилиты dmesg на предмет наличия в нем информации о дисковых устройствах, которые мы будем использовать в работе:
# dmesg | grep sd
Вывод для двух дисков:
sd 0:0:0:0: [sda] 1953523055 512-byte hardware sectors (1000204 MB)
....
sd 0:0:0:0: [sda] Attached SCSI disk
sd 1:0:0:0: [sdb] 1953525168 512-byte hardware sectors (1000205 MB)
....
sd 1:0:0:0: [sdb] Attached SCSI disk
....
sd 0:0:0:0: [sda] Attached SCSI disk
sd 1:0:0:0: [sdb] 1953525168 512-byte hardware sectors (1000205 MB)
....
sd 1:0:0:0: [sdb] Attached SCSI disk
Видим - обнаружены два дисковых устройства, им назначены имена "sda" и "sdb".
Мы условились применять диски SATA в режиме ACHI, что подразумевает возможность подключения и отключения устройств "на лету". Рассмотрим порядок проведения этих работ.
Перед физическим отключением дискового устройства SATA необходимо его освободить от обращений к нему каких бы то ни было приложений и отдать команду непосредственного удаления из системы:
# echo 1 > /sys/block/sdb/device/delete
Вывод команды dmesg покажет то, что содержимое кэша для указанного устройства записано на диск, устройство остановлено и удалено из системы.
....
sd 5:0:0:0: [sdb] Synchronizing SCSI cache
sd 5:0:0:0: [sdb] Stopping disk
ata6.00: disabled
....
sd 5:0:0:0: [sdb] Synchronizing SCSI cache
sd 5:0:0:0: [sdb] Stopping disk
ata6.00: disabled
....
В приведённом примере мы отключили дисковое устройство с именем "sdb", ссылка на которое находилась по адресу "/dev/sdb". Для всех блочных устройств в системе в директории "/sys/block/" есть соответствующие структуры, только вот отключение не для всех поддерживается.
Физическое отключение диска сопровождается соответствующими сообщениями:
....
ata6: hard resetting link
ata6: SATA link down
....
ata6: hard resetting link
ata6: SATA link down
....
Физическое подключение дискового устройства SATA может сопровождать автоматическим определением факта подключения. В Debian Lenny так все и происходит.
....
scsi 5:0:0:0: Direct-Access ATA ST31000528AS CC37 PQ: 0 ANSI: 5
sd 5:0:0:0: [sdf] 1953525168 512-byte hardware sectors (1000205 MB)
....
[93417.174030] sdb:
[93421.735114] sd 5:0:0:0: [sdb] Attached SCSI disk
....
scsi 5:0:0:0: Direct-Access ATA ST31000528AS CC37 PQ: 0 ANSI: 5
sd 5:0:0:0: [sdf] 1953525168 512-byte hardware sectors (1000205 MB)
....
[93417.174030] sdb:
[93421.735114] sd 5:0:0:0: [sdb] Attached SCSI disk
....
Если на подключение реакции системы не наблюдается - проще всего про сканировать все существующие каналы SCSI, через которые эмулируются подключения большей части дисковых устройств.
Применим простенький исполняемый скрипт, выполняющий эту задачу:
# mkdir -p /etc/custom/hdd/
# touch /etc/custom/hdd/scan-scsi-bus.sh
# chmod ugo+x /etc/custom/hdd/scan-scsi-bus.sh
# touch /etc/custom/hdd/scan-scsi-bus.sh
# chmod ugo+x /etc/custom/hdd/scan-scsi-bus.sh
#!/bin/sh
SCSI=/sys/class/scsi_host
test ! -d "$SCSI" && echo "Error: cannot find $SCSI directory." && exit 1
cd "$SCSI" || exit 1
for i in *; do
echo -n "Scanning $i ..."
echo "0 0 0" > $i/scan && echo " done."
done
echo "Finished."
exit 0
SCSI=/sys/class/scsi_host
test ! -d "$SCSI" && echo "Error: cannot find $SCSI directory." && exit 1
cd "$SCSI" || exit 1
for i in *; do
echo -n "Scanning $i ..."
echo "0 0 0" > $i/scan && echo " done."
done
echo "Finished."
exit 0
Вывод скрипта в консоль:
Scanning host0 ... done.
Scanning host1 ... done.
Scanning host2 ... done.
Scanning host3 ... done.
Scanning host4 ... done.
Scanning host5 ... done.
Scanning host1 ... done.
Scanning host2 ... done.
Scanning host3 ... done.
Scanning host4 ... done.
Scanning host5 ... done.
В результате сканирования будут обнаружены все устройства эмулируемые в система как SCSI, в их числе и SATA. На самом деле, для подобного рода операций есть соответствующее программное обеспечение (в Debian: scsiadd или sg3-utils), которое, возможно, сделает дело "правильнее"; но если мои нужды удовлетворил простенький скрипт, то - зачем?
Очевидный "человеко-понятный" способ однозначно идентифицировать дисковое устройство со стороны операционной системы - определить его серийный номер. Считаю оптимальным переписать серийные номера в процессе установки дисковых устройств в слоты системного блока с привязкой их к номеру слота. В самом системном блоке нужно подписать номера слотов, а в списке оборудования свести все полученные данные (все ведут такой список, не так ли?).
Теперь скрипты, ведущие учёт состояния устройств смогут нам указать на сбойное устройство с помощью его серийного номера. Узнать его достаточно элементарно, например, с помощью утилиты hdparm:
Устанавливаем утилиту, если её ещё нет в системе:
# aptitude install hdparm
Вывод расширенной информации о дисковом устройстве:
# hdparm -i /dev/sdf
Вывод серийного номера устройства:
# hdparm -i /dev/sdf | grep SerialNo | awk '{print $6}'
Ещё более подробную информацию о дисковых устройствах, включая и серийный номер, разумеется, можно получить опрашивая их с использованием технологии S.M.A.R.T.
Для дальнейшей настройки необходимо обеспечить единообразие набора синхронизируемых дисков по размеру. Разметим дисковые устройства с помощью fdisk или cfdisk. Все, что нам нужно, так это зачистка дисковых устройств от наличествующей информации, разделов и создания одного раздела типа primary размером во все дисковое пространство. Если физические дисковые устройства имеют различный объем, то размеры подгоняем с помощью выделения определённого объёма под разделы.
# cfdisk /dev/sda
# ls /dev | grep sd
# ls /dev | grep sd
....
sda
sda1
....
sda
sda1
....
В случае, если утилиты дисковой разметки отказываются работать по причине повреждения таблицы разделов, зачистим так же и таблицу. Пример для дискового устройства "/dev/sda":
# dd if=/dev/zero of=/dev/sda bs=1k count=1
# blockdev --rereadpt /dev/sda
# blockdev --rereadpt /dev/sda
В команде "dd" выше, в особо злостных случаях, когда на диске предварительно порезвились и по натыкали массу вариантов разметки (вложенные контейнеры, навороченные загрузчики, сжатые файловые системы и тому подобное), параметр "count" можно установить в "1000", чтобы перезаписать не один килобайт информации в начале дискового устройства, а мегабайт, например.
Переход к настройке мониторинга состояния аппаратного обеспечения файловой системы.