31 авг. 2012 г.

Отказ от монтирования nfs прописанном в fstab'е

Внештатная ситуевина:  

Такая интересная чтуковина со мной приключилась. Одним словом вкратце если, сервер отказывался при старте монтировать nfs, прописанный в fstabe. На полупути до запуска вываливался с ошибкой и ожидал от ЛОКАЛЬНОГО пользователя действий.




Есть сервер (FreeBDS), на нем есть quagga, используется для анонсирования своих белых ИПов, и мне захотелось данные данного сервера бекапить на внешний источник.

В силу того что данных весьма много в виде мелких файлов то tar'ить их просто не имело никакого смысла, проще было использовать rsnapshot (практически надстройка над rsync'ком).

Хранилище под эти бэкапы смонтировано по nfs ... и всё бы хорошо было если онное, хранилище удаленное, было доступно бы по фейковой сети, но увы, не наш случай. Удаленное хранилище имеет белый ИП.

И вот вылезли грабли.

Когда сервак ребутится, он не подымается, почему? Квага еще не успел анонсировать сети и маршруты еще не выстроены, freebsd, не просто ругается и запускается далше ... она просто напросто на этом месте стопорится и не грузится дальше ... другими словами железяка лежит трупом.


Три решения:
- либо разбираться как настроить монтирование после удачного анонса кваги, более похож на unixway =)
- либо использовать rc.local с проверочными функциями маршрутов ...
- или, мой вариант,  монтировать в момент нужды =) в момент когда по крону будет запущен сценарий бекапа сервера.

Что получилось:

Вот сценарий запуска бекапа сервера:
#!/usr/local/bin/bash
PID="`basename $0`.pid"
MOUNT_PATH="/var/backups/storage"

if [ -e $PID ]; then
   ps -p `cat $PID` -o pid= -o start= -o command= | grep $0 > /dev/null
   if [ "$?" == 0 ]; then
       echo process has already started, pid `cat $PID`, the abolition of the current run >&2
       exit 1
   fi  
fi

echo $$ > $PID

if [ -z "`mount | grep '$MOUNT_PATH'`" ]; then 
    mount -t nfs -o rw,soft,intr,bg remote_host.net:/mass2/remote_storage  $MOUNT_PATH 
    if [ "$?" != 0 ]; then
        echo Eroor mount on remote_host.net. Backup is not running. >&2
        exit 1
    fi  
fi


/usr/local/bin/rsnapshot -c /usr/local/etc/rsnapshot.conf daily

umount /var/backups/storage

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

Отмонтируюсь только по той причине, что у меня еще один непонятный глюк ... хоть и монтируюсь с флагом soft ... то всё равно порой происходит подвисание процессов, которые по девтке килятся не хотят (kill -9) ... причем даже не обязательно в системе значатся как зомби. Пару раз уже такое ловил и именно тогда когда было смонтировано удаленное хранилище. Что более странно ... команда reboot просто повисала и никакого соответственно ребута не происходило ... сервер продолжал глюченно жить до хардребута, то бишь по кнопке.

всё ... выплакался =)

2 комментария:

  1. А про amd (не процессор, а автомонтировщик) автор слышал? Под линукс для аналогичных вещей есть automount. Но nfs поверх публичной сети - это что-то. Файрвола считай, что нет. Или его и так нет?

    ОтветитьУдалить
  2. Леш, слышал о нем, и даже пробовал играться когда то давным давно и забыл про него напрочь.
    Что касается фаервола, есть правила ipfw'шные на стороне nfs сервера ограничивающие доступ к нему, но что они из себя представляют знать не знаю так как сервер тот не в моей компетенции, мне просто дали место на нем для бекапинга.

    пошел вспоминать и играться с amd =) спасибо!

    ОтветитьУдалить