Использование системы управления версиями для каталога /etc с помощью etckeeper и Bazaar на Squeeze Debian

Это руководство объясняет, как можно сохранить содержимое /etc  в системе контроля версий (VCS) с помощью etckeeper на Debian Squeeze. Etckeeper перехватывает действия  менеджера пакетов APT, так что всякий раз, когда вам нужно установить/удалить пакет с помощью APT, etckeeper запишет все изменения /etc  в VCS. Он также отслеживает изменения прав доступа, что важно для таких файлов, как /etc/shadow. Используя etckeeper, вы можете вернуться к предыдущей версии /etc если обновления ценных файлов конфигурации сохранены. Более того, etckeeper будет отслеживать не только изменения в /etc сделанные APT, он будет также делать ежедневно auto-commit, так что сделанные вручную изменения будут занесены в VCS, а также, в дополнение к этому, вы можете делать commit самостоятельно, в любое время вручную.

1 Предварительные замечания

Я буду использовать Bazaar (BZR) как VCS в этом учебнике, хотя и Git, Hg, и Darcs также поддерживаются. Вы можете прочитать про Bazaar в этом уроке: Использование Bazaar в Debian

2 Установка и настройка etckeeper

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" в данном случае).

3 Использование etckeeper

Теперь предположим, что нам нужно установить пакет, который изменит содержимое каталога /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:~#

4 Возврат изменений

Использование 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 [email protected]>
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 17:00:22 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 4
committer: root [email protected]>
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:59:03 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 3
committer: root [email protected]>
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:45:21 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 1
committer: root [email protected]>
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 [email protected]>
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 17:00:22 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 4
committer: root [email protected]>
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:59:03 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 3
committer: root [email protected]>
branch nick: server1.example.com /etc repository
timestamp: Tue 2011-07-12 16:45:21 +0200
message:
Changed /etc/hosts
------------------------------------------------------------
revno: 2
committer: root [email protected]>
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 [email protected]>
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