UMGUM.COM 

Аппаратное обеспечение файловой системы ( Аппаратное обеспечение файловой системы. )

1 августа 2010  (обновлено 2 ноября 2014)

Эта публикация отнесена в архив. Она неактуальна.
Ресурс по следующей ссылке является преемником: Построение простейшей распределённой расширяемой сетевой горизонтальной файловой системы с использованием технологий MDADM, LVM, NFS и MHDDFS.

OS: Debian Linux.

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

Прежде всего, мы работаем с дисками 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

Видим - обнаружены два дисковых устройства, им назначены имена "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
....

В приведённом примере мы отключили дисковое устройство с именем "sdb", ссылка на которое находилась по адресу "/dev/sdb". Для всех блочных устройств в системе в директории "/sys/block/" есть соответствующие структуры, только вот отключение не для всех поддерживается.

Физическое отключение диска сопровождается соответствующими сообщениями:

....
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, через которые эмулируются подключения большей части дисковых устройств.

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

# mkdir -p /etc/custom/hdd/
# 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

Вывод скрипта в консоль:

Scanning host0 ... 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

....
sda
sda1
....

В случае, если утилиты дисковой разметки отказываются работать по причине повреждения таблицы разделов, зачистим так же и таблицу. Пример для дискового устройства "/dev/sda":

# dd if=/dev/zero of=/dev/sda bs=1k count=1
# blockdev --rereadpt /dev/sda

В команде "dd" выше, в особо злостных случаях, когда на диске предварительно порезвились и по натыкали массу вариантов разметки (вложенные контейнеры, навороченные загрузчики, сжатые файловые системы и тому подобное), параметр "count" можно установить в "1000", чтобы перезаписать не один килобайт информации в начале дискового устройства, а мегабайт, например.

Переход к настройке мониторинга состояния аппаратного обеспечения файловой системы.


Заметки и комментарии к публикации:


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