среда, 7 января 2009 г.

Bacula, постскриптум.

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

И так, что мы имеем? Машина упала. Перегружаемся. Не поднимается. Грузимся с CD. Чекаем файловые. В моем случае выяснилось, что все они живы, кроме рут овой. Почему - это уже вопрос другой и с ним мы будем разбираться позже, да и заметки эти не об этом. ;) В общем чекаем (fsck -y), что бы оно все попра вило. Поправить мы поправили, но у нас полным полно всякого Г. в lost+found, а так же отсутствуют нужные файлы в /bin, /sbin и /etc. В общем трындец по лный. К сожалению я делал бакап только /home, /etc, mysql и списка установленных пакетов (для экономии места). Таким образом восстановление, в случае п адения системы сводится к установке системы заново, доустановке нехватающих пакетов из сохраненного списка, а так же восстановление /home. Немного доль ше, чем если бы было забакаплено все, но чем-то надо жертвовать. ;) Но так как у нас, в данном случае погиб только root, можно немного схалтурить и не переставлять систему. :) Короче поехали!

Сначала грузимся с CD, это понятно. Монтируем старый рут куда-нибудь:

mkdir /mnt/ROOT
mount /dev/sdaX /mnt/ROOT

Теперь зальем (с того же CD например) утраченное и необходимое:

cd /bin && find . -type f | cpio -pdu /mnt/ROOT/bin
cd /sbin && find . -type f | cpio -pdu /mnt/ROOT/sbin

Почему для cpio задан "-u"? Потому что в моем случае, например, оказалось, что /bin/sh есть, только вот он внутри не нужный нам ELF, а кусок лога. :( Т ак что приходится переписывать все. ОК, теперь есть надежда, что что-то у нас да заработает. ;)

mount /dev/sdaX /mnt/ROOT/usr #монтируем usr
mount /dev/sdaX /mnt/ROOT/var # так же поступаем с var и прочими
mount /dev/sdbX /mnt/ROOT/data # а это у нас второй веник, там где бакапы леж али
mount -t proc none /mnt/ROOT/proc

ну и наконец пойдем внутрь:

chroot /mnt/ROOT

Так, если ошибок не получили, как я первый раз (тогда я и узнал, что вместо /bin/sh имеем кусок конфига), то значит мы в системе и можно заняться восст ановлением. bextract живет в /usr/sbin, поэтому надеемся что восстановление пройдет нормально. Но есть одно "но": если бы у нас была лента, то все было бы просто

mkdir /etc.new
bextract -b /data/backup/bacula/<наш bsr файл> <наша ленточка> /etc.new/

но мы сохраняли на винт + плюс я потерял все конфиги bacula, а этой утилите нужен bacula-sd.conf. Поначалу я тупа дал путь к файлам с бакапа. Не тут то было... Пришлось читать ман. ;) Оказалось нужен конфиг сторадж демона с конфигуренным сторадж девайсом. Восстанавливаем его руками в минимальном виде:

mkdir /etc/bacula
cat > /etc/bacula/bacula-sd.conf

в cat пихаем следующее:

Storage {
Name = local-sd
SDPort = 9103
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
SDAddress = 127.0.0.1
}
Director {
Name = local-dir
Password = "тут не важно что ;)"
}
Device {
# а вот это самое главное
Name = FileStorage
Media Type = File
Archive Device = /data/backup/bacula/ # это где у нас бакапы лежат
Random Access = Yes;
Label media = yes
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
Drive Index = 0;
Autoselect = yes;
}
Messages {
Name = Standard
director = local-dir = all
}

И так, конфиг у нас есть, можно восстанавливаться:

bextract -v -b /data/backup/bacula/<наш bsr файл> FileStorage /etc.new/

И ждем распаковки нашего etc. :) Развернул я его в отдельную папку, что бы потом глянуть что было запоганено, но это прямого отношения к данной теме не имеет. ;)

mv /etc /etc.old && mv /etc.new /etc

Собственно все. :) Или почти все... Надо бы до конца восстановить все поврежденное в root. Решить эту проблему можно по разному. Я поступил следующим о бразом (может будет интересно любителям "однострочников

Так как ни dpkg, ни всякие apt-утилиты ошибок не выдавали, я сделал вывод, что с их базами было все ОК. Тогда делаем так:

find / -mount -type f | xargs -i dpkg -S {} | cut -d ':' -f 1 | sort | uniq | xargs -i sudo sh -c "aptitude -y reinsta ll {}"

И ждем, пока переставятся пакеты, файлы от которых лежать в руте. :) Процесс этот не быстрый, так что можно идти курить. ;) После этого выходим из chro ot,
Удачи всем!