Это руководство объясняет, как можно сохранить содержимое /etc в системе контроля версий (VCS) с помощью etckeeper на Debian Squeeze. Etckeeper перехватывает действия менеджера пакетов APT, так что всякий раз, когда вам нужно установить/удалить пакет с помощью APT, etckeeper запишет все изменения /etc в VCS. Он также отслеживает изменения прав доступа, что важно для таких файлов, как /etc/shadow. Используя etckeeper, вы можете вернуться к предыдущей версии /etc если обновления ценных файлов конфигурации сохранены. Более того, etckeeper будет отслеживать не только изменения в /etc сделанные APT, он будет также делать ежедневно auto-commit, так что сделанные вручную изменения будут занесены в VCS, а также, в дополнение к этому, вы можете делать commit самостоятельно, в любое время вручную.
Я буду использовать Bazaar (BZR) как VCS в этом учебнике, хотя и Git, Hg, и Darcs также поддерживаются. Вы можете прочитать про Bazaar в этом уроке: Использование Bazaar в Debian
etckeeper и Bazaar устанавливаются следующим образом:
apt-get install etckeeper bzr
Затем откройте /etc/etckeeper/etckeeper.conf ...
vi /etc/etckeeper/etckeeper.conf
... и раскомментировать строку VCS="bzr" (убедитесь, что все остальные строки VCS закомментированы):
# The VCS to use. #VCS="hg" #VCS="git" VCS="bzr" #VCS="darcs" # Options passed to git commit when run by etckeeper. GIT_COMMIT_OPTIONS="" # Options passed to hg commit when run by etckeeper. HG_COMMIT_OPTIONS="" # Options passed to bzr commit when run by etckeeper. BZR_COMMIT_OPTIONS="" # Options passed to darcs record when run by etckeeper. DARCS_COMMIT_OPTIONS="-a" # Uncomment to avoid etckeeper committing existing changes # to /etc automatically once per day. #AVOID_DAILY_AUTOCOMMITS=1 # Uncomment to avoid etckeeper committing existing changes to # /etc before installation. It will cancel the installation, # so you can commit the changes by hand. #AVOID_COMMIT_BEFORE_INSTALL=1 # The high-level package manager that's being used. # (apt, pacman-g2, yum etc) HIGHLEVEL_PACKAGE_MANAGER=apt # The low-level package manager that's being used. # (dpkg, rpm, pacman-g2, etc) LOWLEVEL_PACKAGE_MANAGER=dpkg |
Пожалуйста, оставьте все остальные строки в исходном состоянии. Раскомментировав строку AVOID_DAILY_AUTOCOMMITS=1 вы скажете etckeeper'у делать ежедневно авто коммит /etc и, строку AVOID_COMMIT_BEFORE_INSTALL=1 чтобы фиксировать текущее состояние перед установкой новых пакетов из APT.
Для инициализации etckeeper, просто запустите:
etckeeper init
Вы можете отменить это, запустив
etckeeper uninit
но это удалит информацию из VCS. Луше будет запустить etckeeper uninit, а затем изменить /etc/etckeeper/etckeeper.conf - например, потому, что вы хотите использовать другую систему контроля версий - и после этого запустить etckeeper init снова. Пожалуйста, имейте в виду, что вся информация VCS, будет потеряна при запуске etckeeper uninit!)
etckeeper сделает первый коммит автоматически при установке пакета с APT, который изменяет /etc каталог, но это также можно делать первый коммит вручную:
etckeeper commit "Initial commit"
Вы всегда можете сделать коммит вручную дав команду etckeeper commit, за которым следует сообщение в лог ("Initial commit" в данном случае).
Теперь предположим, что нам нужно установить пакет, который изменит содержимое каталога /etc (например, fail2ban):
apt-get install fail2ban
Если вы посмотрите на вывод, вы увидите, что делает etckeeper в начале и в конце установки:
[...]
added logrotate.d/fail2ban
added rc0.d/K01fail2ban
added rc1.d/K01fail2ban
added rc2.d/S18fail2ban
added rc3.d/S18fail2ban
added rc4.d/S18fail2ban
added rc5.d/S18fail2ban
added rc6.d/K01fail2ban
Committed revision 2.
root@server1:~#
Мы также можем сделать ручной коммит, например, после того как мы изменили файл вручную. Предположим, что мы изменили /etc/hosts. С помощью команды
bzr status /etc/
мы можем увидеть, какие файлы были изменены с момента последней фиксации:
root@server1:~# bzr status /etc/
modified:
hosts
root@server1:~#
Как было показано в конце части 2, мы можем сохранить изменения, используя etckeeper commit, например:
etckeeper commit "Changed /etc/hosts"
root@server1:~# etckeeper commit "Changed /etc/hosts"
Committing to: /etc/
modified hosts
Committed revision 3.
root@server1:~#
Использование Bazaar, поможет вернуться к предыдущей версии (ревизии) каталога /etc, например, если установка пакета перезаписала файл конфигурации, который был отредактирован вручную ранее.
Чтобы вернуться к предыдущей версии, мы должны знать его номер ревизии. Мы можем найти его дав команду bzr log с параметром "имя файла или каталога", например:
bzr log /etc/hosts
покажет все ревизии, в которых /etc/hosts участвует (revno 1, 3, 4, 5):
root@server1:~# bzr log /etc/hosts
------------------------------------------------------------
revno: 5
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 17:00:22 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 4
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:59:03 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 3
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:45:21 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 1
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:43:39 +0200
message:
saving uncommitted changes in /etc prior to apt run
root@server1:~#[email protected]>[email protected]>[email protected]>[email protected]>
bzr log /etc
покажет все изменения для каталога /etc:
root@server1:~# bzr log /etc
------------------------------------------------------------
revno: 5
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 17:00:22 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 4
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:59:03 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 3
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:45:21 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 2
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:43:50 +0200
message:
committing changes in /etc after apt run
Package changes:
+fail2ban 0.8.4-3
------------------------------------------------------------
revno: 1
committer: root
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:43:39 +0200
message:
saving uncommitted changes in /etc prior to apt run
root@server1:~#[email protected]>[email protected]>[email protected]>[email protected]>[email protected]>
Скажем, мы хотим вернуться к ревизии 3 каталога /etc/hosts. Мы можем сделать это следующим образом:
bzr revert --revision 3 /etc/hosts
Если вы хотите вернуть весь каталог /etc, например, для ревизии 2, это может быть достигнуто следующим образом:
bzr revert --revision 2 /etc