Блог Олега Сердюкова

Повторение старой проблемы c Open Directory, бекап базы OD и восстановление из неё

Понедельник начался хорошо. С переводом времени удалось выспаться, утром на работе выпить чашку кофе и ударно начать новый проект.

Отлучился на рабочую встречу. Через час пришёл, попытался разлочить Mac. Чёрный экран, на скринсейвере застыло время ухода, созерцание Spinning Beachball of Death. Зашёл с другого компьютера по SSH - SystemUIServer, Screenserver и ещё пара процессов в состоянии “Uninterruptible wait”. ‘shutdown -r now’. Mac mini Server сваливается в серый экран и 15 минут пытается перезагрузиться. Нужно работать, и я перезагружаю его по питанию.

Дальнейшее предсказуемо - “Network accounts are unavailable”:

Network accounts are unavailable

Мда. Очередной час будет потерян на оживление Open Directory после деструктивнейшей для системы операции написания кода в Sublime Text и его запуска в iTerm.

$ tail -f /var/log/slapd.log
slapd[510]: bdb(dc=ceiling-cat,dc=ctrld,dc=me): file id2entry.bdb has LSN 1/2423845, past end of log at 1/1796008
slapd[510]: bdb(dc=ceiling-cat,dc=ctrld,dc=me): Commonly caused by moving a database from one database environment
slapd[510]: bdb(dc=ceiling-cat,dc=ctrld,dc=me): to another without clearing the database LSNs, or by removing all of
slapd[510]: bdb(dc=ceiling-cat,dc=ctrld,dc=me): the log files from a database environment
slapd[510]: bdb(dc=ceiling-cat,dc=ctrld,dc=me): /var/db/openldap/openldap-data/id2entry.bdb: unexpected file type or format
slapd[510]: bdb_db_open: database "dc=ceiling-cat,dc=ctrld,dc=me": db_open(/var/db/openldap/openldap-data/id2entry.bdb) failed: Invalid argument (22).
slapd[510]: backend_startup_one (type=bdb, suffix="dc=ceiling-cat,dc=ctrld,dc=me"): bi_db_open failed! (22)
slapd[510]: bdb_db_close: database "dc=ceiling-cat,dc=ctrld,dc=me": alock_close failed
slapd[510]: slapd stopped.

Но теперь ситуация лучше - после прошлого сбоя я запустил ежедневный бекап Open Directory. Рецепт нашёл на serverfault.

Скрипт ~/bin/od_backup:

#!/bin/bash
dst="/Users/ctrld/server_backup"
pass="correcthorsebatterystaple"

#sudo slapconfig -backupdb /odbackups
#sudo slapconfig -restoredb /odbackups

date=$(date +%Y-%m-%d-%H%M)

sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/serveradmin command <<-EOC
    dirserv:backupArchiveParams:archivePassword = $pass
    dirserv:backupArchiveParams:archivePath = ${dst}/od_backup-${date}
    dirserv:command = backupArchive

EOC

Запуск в launchd (/Library/LaunchDaemons/me.ctrld.od_backup.plist):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>me.ctrld.od_backup</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/ctrld/bin/od_backup</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>06</integer>
            <key>Minute</key>
            <integer>24</integer>
        </dict>
    </dict>
</plist>

Активация:

$ launchctl load -w /Library/LaunchDaemons/me.ctrld.od_backup.plist

Скрипт успел поработать неделю. Если вы будете его задействовать, то не забудьте следить, делается ли бекап. Также учтите, что скрипт при запуске просто передаёт команды в serveradmin и сразу прекращается, но образ с бекапом появляется в заданном каталоге.

Лучшая практика бекапов - это восстановление. Я сделал это так:

$ sudo launchctl unload /System/Library/LaunchDaemons/org.openldap.slapd.plist
$ sudo slapconfig -restoredb /Users/ctrld/server_backup/od_backup-2012-10-29-0624.sparseimage

Программа запросила пароль, через короткое время база была восстановлена и OD был запущен.

Я удивился простоте. И сразу натолкнулся на подвох - SSL-сертификаты ушли в Валхаллу.

Благо я использую etckeeper (brew install etckeeper). Расписывать подробно не хочется. Я достал сертификат из git (можно и из Time Machine), потом перетащил в Cert Manager в Server.app. Запросился пароль к ключу, его я нашёл в Keychain в ключе “Mac OS X Server certificate management”.

Рестарт, сервер заработал. Мда…

Оц-тоц первертоц, бабушка здорова,
Оц-тоц первертоц, кушает компот,
Оц-тоц первертоц, и мечтает снова
Оц-тоц первертоц, пережить налёт.

Comments