суббота, 17 марта 2012 г.

autofs, nfs, etc

У меня есть HTPC, который по совместительству служит мне еще и NAS'ом. HTPC собран по принципу «тихого компьютера» и находится в центре комнаты прямо под телевизором. На HTPC установлены четыре жестких диска фирмы Western Digitals: три «зеленых» и один «черный» . Работая все разом, они создают невероятный шум, поэтому единовременно работает обычно только один диск. Операционная система расположена на флешке CompactFlash 8Gb, этот миниатюрный SSD не шумит и не греется. По сути, система может работать вообще без жестких дисков, они подключаются только когда нужны. Как это работает?

В конце нулевых у меня был постоянно работающий компьютер под управлением Slackware-11.0. Иногда хотелось посмотреть фильм, но коллекция фильмов находилась на 500Gb диске, гонять который круглосуточно я не видел смысла. Самым простым тогда казалось по необходимости подключать диск как usb-накопитель. Оставалось только решить проблему с авто-монтированием диска из консоли. Помог мне в этом AutoFS.

AutoFS появился в ядре Linux-2.4 как решение для монтирования сменных носителей: дискет, компакт-дисков, флешек, чтобы пользователю не приходилось для этого запрашивать права root и из консоли набирать команды. AutoFS работает на уровне ядра Linux и автоматически монтирует носитель при запросе, и так же размонтирует его при неиспользовании его заданное время. Настройка AutoFS проста:
имеющий права на исполнение /etc/rc.d/rc.autofs запускается автоматически при инициализации системы;
в файле /etc/auto.misc добавляем строки вида:
films           -fstype=auto                    :/dev/sda1
series -fstype=auto :/dev/sdb1
и так далее на каждый раздел, который желаете монтировать через autofs;
в файле /etc/auto.master в строке:
/misc   /etc/auto.misc —timeout=60
выставите таймаут в секундах, через которое время раздел будет размонтирован.

И это все. В корне появится директория misc, а разделы будут доступны по /misc/films, /misc/series и т. д. Есть один ньюанс. Когда по ftp вы зайдете в директорию misc, то увидите пустой каталог. Попасть в нужный диск можно, набрав команду перехода в нужную директорию, например, cd series, после чего нужный раздел примонтируется и выполнится переход.

А теперь, собственно, ради чего весь сыр-бор? На htpc или домашем nas может быть сколько угодно жестких дисков, но единовременно, как правило, нужен только один, тот, с которого воспроизводится фильм. Механические жесткие диски, даже «зеленые», шумят , а htpc должен быть максимально тихим. Размещая операционную систему на твердотельном диске, мы избавляемся от необходимости держать один диск с системным разделом постоянно включенным. Да и решение проблем с винтами при таком раскладе (разделяя диски с данными и операционной системой) гораздо проще, как показывает практика.
Командой:
hdparm -y /dev/sdX

мы пошлем диск в спящий режим. При этом механика останавливается, блины перестают крутиться, головки паркуются. Винт перестает греться и шуметь. Но его контроллер продолжает работать, и утилитой smartctl всегда можно узнать состояние винчестера, а командой:
hdparm -C /dev/sdb

мы можем узнать его статус: active или standby. По документации командой hdparm -S 12 /dev/sdX можно задать интервал автоматического отключения НЕИСПЛЬЗУЕМОГО диска. Чтобы диск не использовался, его желательно отмонтировать (тут и пригождается autofs), хотя принудительно параметром -y можно послать и используемый диск, но в таком случае в спящем режиме он пробудет не долго. Проблема в том, что ни на одном моем диске WD автоматическое засыпание не работает. В итоге я написал небольшой скрипт, который периодически опрашивает жесткий диск, и если он не используется более трех минут, то посылается в спящий режим:
#!/usr/bin/bash
let timeout=180
# имитируем бесконечный  цикл
while [ $timeout > 0 ]; do
    sleep $timeout
    # если диск уже спит, то ждем, пока он не проснется
    while  hdparm -C /dev/sdb|grep "standby" ; do sleep $timeout; done
    # если диск работает и используется каким-либо процессом, то ждем, пока он  
    # не освободится
    while  fuser -m /dev/sdb1 ; do sleep $timeout;  done
    # если диск освободился, по подождем для приличия, 
    # вдруг кому-то еще понадобится
    sleep $timeout
    # если диск так никому и не понадобился , то посылаем его в спящий  режим
    fuser -m /dev/sdb1  || hdparm -y /dev/sdb
done

В заключение немного о NFS. На сервере должны быть права на исполнение у
/etc/rc.d/rc.rpc
/etc/rc.d/rc.nfsd

а в конфигурационном файле /etc/exports должна быть строка вроде:
/mnt/hd blackstar(rw)

т. е. машине blackstar мы даем право монтировать директорию /mnt/hd в режиме записи.
На клиенте достаточно сделать исполняемым
/etc/rc.d/rc.pc

и в /etc/fstab записи
htpc:/mnt/hd  /mnt/tmp nfs noauto,users,rw 0 0

А вообще, лучше nfs директории подключать через autofs. Ну и, само-собой, работающий демон nfsd постоянно «держит наготове» используемый жесткий диск, мешая ему «поспать», когда тот не нужен, поэтому я на своем htpc nfs-демон включаю вручную, по необходимости. Для большинства вещей ftp вполне достаточно.

Комментариев нет:

Отправить комментарий