「Etckeeper」の版間の差分
(→Cron) |
(他言語へのリンクを追加) |
||
(2人の利用者による、間の7版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[Category:設定管理]] |
[[en:Etckeeper]] |
[[en:Etckeeper]] |
||
+ | [[es:Etckeeper]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|Git}} |
{{Related|Git}} |
||
{{Related|Cron}} |
{{Related|Cron}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
+ | [https://etckeeper.branchable.com/ Etckeeper] は、リポジトリ内の {{ic|/etc/}} を追跡するためのツールのコレクションです ([[Git]]、[[Mercurial]]、[[Bazaar]]、または [[Darcs]] がサポートされています) [[pacman フック]]は、システムのアップグレード前に変更を自動的にコミットし、ファイルのアクセス許可が追跡されます。これはバージョン管理では通常サポートされていませんが、[[/etc/shadow]] などのファイルにとっては重要です。 |
||
− | [http://etckeeper.branchable.com/ Etckeeper] は {{ic|/etc}} をバージョン管理します。 |
||
== インストール == |
== インストール == |
||
+ | |||
{{Pkg|etckeeper}} パッケージを[[インストール]]してください。 |
{{Pkg|etckeeper}} パッケージを[[インストール]]してください。 |
||
18行目: | 20行目: | ||
== 使用方法 == |
== 使用方法 == |
||
− | 設定後、{{ic|/etc}} のリポジトリを初期化する必要があります: |
+ | 設定後、{{ic|/etc}} パスのリポジトリを初期化する必要があります: |
# etckeeper init |
# etckeeper init |
||
+ | そして、最初のコミットを実行して変更を追跡します。これは etckeeper が自動的に動作できるようにするために必要な手順です。 |
||
− | ''etckeeper'' バージョン 1.18.3-1 現在、パッケージのインストール・アップデート・削除時に pre-install と post-install の [[pacman#フック|pacman フック]]が自動的に実行されるようになっています。手動で[[#ラッパースクリプト|ラッパースクリプト]]を設定する必要はありません。 |
||
+ | # etckeeper commit "first commit" |
||
+ | ''etckeeper'' バージョン 1.18.3-1 では、パッケージのインストール、更新、および削除時に、インストール前およびインストール後の [[pacman フック]]が自動的に実行されます。[[#ラッパースクリプト]]で行う必要ありません。 |
||
− | {{ic|/etc}} への他の変更を記録したい場合、手動で変更をコミットするか (使用するコマンドは etckeeper(8) の man ページを見てください)、あるいは以下のように定期的に記録するようにしてください。 |
||
+ | |||
+ | {{ic|/etc}} パスへの他の変更を追跡するには、変更を手動でコミットするか (コマンドについては {{man|8|etckeeper}} のマニュアルページを参照)、または以下の一時的な解決策のいずれかを使用する必要があります: |
||
+ | |||
+ | {{Warning|git checkout/rebase/merge/cherry-pick/... により、ファイルのアクセス許可が壊れ、たとえば SSH/sudo ログインが拒否される可能性があります。 }} |
||
+ | ''git'' はファイルのパーミッションを直接保存できないため、''etckeeper'' によって処理され、チェックアウト後に ''etckeeper init'' を再度実行してパーミッションを復元する必要があります。 |
||
+ | あるいは、[[systemd#systemd-tmpfiles - 一時ファイル]] を使用してアクセス許可を保存することもできます。 |
||
=== systemd === |
=== systemd === |
||
33行目: | 42行目: | ||
=== Cron === |
=== Cron === |
||
− | 配布されているソースには [https:// |
+ | 配布されているソースには [https://git.joeyh.name/index.cgi/etckeeper.git/tree/debian/cron.daily cron スクリプト] が含まれています。スクリプトを使うことで定期的に自動コミットできます。 |
例えば、1日毎に実行するには: |
例えば、1日毎に実行するには: |
||
# [[cron]] をインストール・有効化してください。 |
# [[cron]] をインストール・有効化してください。 |
||
# {{ic|/etc/cron.daily/''script_name''}} としてスクリプトを作成。 |
# {{ic|/etc/cron.daily/''script_name''}} としてスクリプトを作成。 |
||
− | # ''root'' でファイルに実行権限を付与 ({{ic|# chmod u+x /etc/cron.daily/''script_name''}}) |
+ | # ''root'' でファイルに実行権限を付与 ({{ic|# chmod u+x /etc/cron.daily/''script_name''}}) |
詳しくは [[cron#Cronie]] や [[cron]] を見てください。 |
詳しくは [[cron#Cronie]] や [[cron]] を見てください。 |
||
44行目: | 53行目: | ||
=== Incron === |
=== Incron === |
||
+ | {{Note|このセクションは incron バージョン 5.10 にのみ適用されます。}} |
||
− | {{ic|/etc}} のファイルに変更が加えられたときに {{Pkg|incron}} を使って自動的に変更をコミットするように設定することもできます。{{man|7|inotify}} によるファイルシステム通知を利用します。 |
||
+ | |||
+ | {{ic|/etc/}} 内の '''すべて''' のファイル変更に対してコミットを自動的に作成するには、{{Pkg|incron}} を使用します。これは、{{man|7|inotify}} を介したネイティブファイルシステムシグナリングを利用します。 |
||
+ | incron をインストールして etckeeper を初期化した後、incron スクリプトの実行を許可するユーザーに root を追加します: |
||
− | 詳しくは [http://inotify.aiken.cz/?section=incron&page=doc&lang=en] や [https://linux.die.net/man/8/incrond] を見てください。 |
||
+ | # echo root | tee -a /etc/incron.allow |
||
+ | |||
+ | 次に、incrontab を次のように編集します: |
||
+ | # incrontab -e |
||
+ | |||
+ | テキストを次のように追加します: |
||
+ | # /etc IN_MODIFY,IN_NO_LOOP /bin/etckeeper commit "[message]" |
||
+ | |||
+ | ''IN_NO_LOOP'' は、コミットが完了するのを待ってから次のコマンドを実行し、無限ループを防ぐフラグです。 |
||
+ | |||
+ | ここで、''[message]'' は、{{ic|"modified $#"}} のようなものになります。$# は、変更されたファイルの名前に展開される特別な incrontab ワイルドカードです。 |
||
+ | |||
+ | Incron はサブディレクトリを監視できないことに注意してください。パス内のファイルのみが監視されます。サブディレクトリを監視する必要がある場合は、サブディレクトリに独自のエントリを与える必要があります。ただし、トップレベルのファイルが変更されたときにコミットすると、すべての変更がコミットされます。 |
||
+ | |||
+ | 参照: [http://inotify.aiken.cz/?section=incron&page=doc&lang=en]、{{man|8|incrond}} |
||
=== リモートリポジトリに自動プッシュ === |
=== リモートリポジトリに自動プッシュ === |
||
+ | |||
{{Warning|etckeeper のリポジトリを誰でもアクセスできるリモートリポジトリにプッシュしてしまうと、パスワードハッシュや秘密鍵などの機密情報が漏洩する可能性があります。気をつけて使ってください。}} |
{{Warning|etckeeper のリポジトリを誰でもアクセスできるリモートリポジトリにプッシュしてしまうと、パスワードハッシュや秘密鍵などの機密情報が漏洩する可能性があります。気をつけて使ってください。}} |
||
78行目: | 105行目: | ||
git push origin master |
git push origin master |
||
fi |
fi |
||
− | |||
− | ラッパースクリプトやエイリアスを実行するたびに、GitHub リポジトリに自動的に変更がコミットされます。 |
||
=== ラッパースクリプト === |
=== ラッパースクリプト === |
||
95行目: | 120行目: | ||
{{Note|Etckeeper バージョン 1.18.3-1 以前では Pacman による変更を追跡するのに上記のラッパースクリプトが必要でした。現在 Pacman はフックによってコマンドを自動的に実行します。}} |
{{Note|Etckeeper バージョン 1.18.3-1 以前では Pacman による変更を追跡するのに上記のラッパースクリプトが必要でした。現在 Pacman はフックによってコマンドを自動的に実行します。}} |
||
+ | |||
+ | === Reflector === |
||
+ | |||
+ | [[Reflector]] を呼び出すたびに変更を自動的にコミットするには、{{ic|reflector.service}} に次の内容の [[ドロップインファイル]] を作成して、{{ic|reflector.service}} を {{ic|etckeeper.service}} に依存させます: |
||
+ | |||
+ | [Unit] |
||
+ | Before=etckeeper.service |
||
+ | Wants=etckeeper.service |
||
+ | |||
+ | {{Note|[[#systemd]] で提供されるユニットを再利用するため、自動変更のコミットメッセージは "daily autocommit" となります。このメッセージを変更するには、新しいスクリプトと systemd サービスを作成します。}} |
2024年2月11日 (日) 01:06時点における最新版
Etckeeper は、リポジトリ内の /etc/
を追跡するためのツールのコレクションです (Git、Mercurial、Bazaar、または Darcs がサポートされています) pacman フックは、システムのアップグレード前に変更を自動的にコミットし、ファイルのアクセス許可が追跡されます。これはバージョン管理では通常サポートされていませんが、/etc/shadow などのファイルにとっては重要です。
目次
インストール
設定
使用するバージョン管理システム (デフォルトは git) などのオプションは /etc/etckeeper/etckeeper.conf
で設定できます。
Etckeeper は etckeeper.conf
で LOWLEVEL_PACKAGE_MANAGER
あるいは HIGHLEVEL_PACKAGE_MANAGER
として pacman を使うことをサポートしています。
使用方法
設定後、/etc
パスのリポジトリを初期化する必要があります:
# etckeeper init
そして、最初のコミットを実行して変更を追跡します。これは etckeeper が自動的に動作できるようにするために必要な手順です。
# etckeeper commit "first commit"
etckeeper バージョン 1.18.3-1 では、パッケージのインストール、更新、および削除時に、インストール前およびインストール後の pacman フックが自動的に実行されます。#ラッパースクリプトで行う必要ありません。
/etc
パスへの他の変更を追跡するには、変更を手動でコミットするか (コマンドについては etckeeper(8) のマニュアルページを参照)、または以下の一時的な解決策のいずれかを使用する必要があります:
git はファイルのパーミッションを直接保存できないため、etckeeper によって処理され、チェックアウト後に etckeeper init を再度実行してパーミッションを復元する必要があります。 あるいは、systemd#systemd-tmpfiles - 一時ファイル を使用してアクセス許可を保存することもできます。
systemd
パッケージにはサービス・タイマーユニットが付属しています。etckeeper.timer
を有効化することで使えます。
タイマーの使い方について詳しくは systemd/タイマーを見てください。ユニットを編集したい場合は systemd#ユニットファイルの編集を参照してください。
Cron
配布されているソースには cron スクリプト が含まれています。スクリプトを使うことで定期的に自動コミットできます。
例えば、1日毎に実行するには:
- cron をインストール・有効化してください。
/etc/cron.daily/script_name
としてスクリプトを作成。- root でファイルに実行権限を付与 (
# chmod u+x /etc/cron.daily/script_name
)
詳しくは cron#Cronie や cron を見てください。
Incron
/etc/
内の すべて のファイル変更に対してコミットを自動的に作成するには、incron を使用します。これは、inotify(7) を介したネイティブファイルシステムシグナリングを利用します。
incron をインストールして etckeeper を初期化した後、incron スクリプトの実行を許可するユーザーに root を追加します:
# echo root | tee -a /etc/incron.allow
次に、incrontab を次のように編集します:
# incrontab -e
テキストを次のように追加します:
# /etc IN_MODIFY,IN_NO_LOOP /bin/etckeeper commit "[message]"
IN_NO_LOOP は、コミットが完了するのを待ってから次のコマンドを実行し、無限ループを防ぐフラグです。
ここで、[message] は、"modified $#"
のようなものになります。$# は、変更されたファイルの名前に展開される特別な incrontab ワイルドカードです。
Incron はサブディレクトリを監視できないことに注意してください。パス内のファイルのみが監視されます。サブディレクトリを監視する必要がある場合は、サブディレクトリに独自のエントリを与える必要があります。ただし、トップレベルのファイルが変更されたときにコミットすると、すべての変更がコミットされます。
参照: [1]、incrond(8)
リモートリポジトリに自動プッシュ
/etc/.git
のローカルバックアップを作るだけでなく、コミットするたびに GitHub などのリモートリポジトリに変更を自動的にプッシュすることもできます。
まず、etc/.git
を編集してリモートの GitHub リポジトリを追加:
# git remote add origin https://github.com/user/repo.git
そして、フックを使用・設定してプッシュするようにしてください。
etckeeper に付属しているフックを使う
/etc/etckeeper/etckeeper.conf
の PUSH_REMOTE
オプションを編集して、etckeeper からプッシュしたいリモートリポジトリの名前を指定してください。例:
PUSH_REMOTE="origin"
スペースで区切ることで複数のリモートリポジトリを追加できます。
カスタムフックを使う
/etc/etckeeper/commit.d/40github-push
ファイルを作成 (実行権限を付与してください):
#!/bin/sh set -e if [ "$VCS" = git ] && [ -d .git ]; then cd /etc/ git push origin master fi
ラッパースクリプト
頻繁に実行するコマンドの変更を追跡したい場合 (例: command
)、シンプルなラッパースクリプトで自動化できます。例えば、以下のファイルを作成:
/usr/local/bin/checketc.sh
#!/bin/bash etckeeper pre-install command etckeeper post-install
作成したら実行可能権限を付与してください。また、bash のエイリアスや関数で Etckeeper のコマンドを呼び出すこともできます。詳しくは Bash#エイリアスを見てください。
Reflector
Reflector を呼び出すたびに変更を自動的にコミットするには、reflector.service
に次の内容の ドロップインファイル を作成して、reflector.service
を etckeeper.service
に依存させます:
[Unit] Before=etckeeper.service Wants=etckeeper.service