「Etckeeper」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(英語最新版に同期)
(他言語へのリンクを追加)
 
(2人の利用者による、間の9版が非表示)
1行目: 1行目:
[[Category:システム管理]]
+
[[Category:設定管理]]
 
[[en:Etckeeper]]
 
[[en:Etckeeper]]
  +
[[es:Etckeeper]]
Etckeeper は {{ic|/etc}} をバージョン管理します。
 
  +
{{Related articles start}}
  +
{{Related|Git}}
  +
{{Related|Cron}}
  +
{{Related articles end}}
  +
[https://etckeeper.branchable.com/ Etckeeper] は、リポジトリ内の {{ic|/etc/}} を追跡するためのツールのコレクションです ([[Git]]、[[Mercurial]]、[[Bazaar]]、または [[Darcs]] がサポートされています) [[pacman フック]]は、システムのアップグレード前に変更を自動的にコミットし、ファイルのアクセス許可が追跡されます。これはバージョン管理では通常サポートされていませんが、[[/etc/shadow]] などのファイルにとっては重要です。
   
 
== インストール ==
 
== インストール ==
  +
Etckeeper は[[公式リポジトリ]]の {{Pkg|etckeeper}} パッケージで[[pacman|インストール]]できます。
 
  +
{{Pkg|etckeeper}} パッケージを[[インストール]]してください。
   
 
== 設定 ==
 
== 設定 ==
メインの設定ファイルは {{ic|/etc/etckeeper/etckeeper.conf}} です。このファイルで使用する VCS などの設定ができます。
 
   
お好きな VCS (デフォルトは git) を設定したら、次を実行することで {{ic|/etc}} リポジトリを初期化できます:
+
使用するバージョン管理システム (デフォルトは [[git]]) などのオプションは {{ic|/etc/etckeeper/etckeeper.conf}} で設定できます
  +
# etckeeper init
 
  +
Etckeeper は {{ic|etckeeper.conf}} で {{ic|LOWLEVEL_PACKAGE_MANAGER}} あるいは {{ic|HIGHLEVEL_PACKAGE_MANAGER}} として [[pacman]] を使うことをサポートしています。
   
 
== 使用方法 ==
 
== 使用方法 ==
   
  +
設定後、{{ic|/etc}} パスのリポジトリを初期化する必要があります:
Etckeeper は {{ic|etckeeper.conf}} で {{ic|LOWLEVEL_PACKAGE_MANAGER}} として pacman の使用をサポートしています。pacman にはフック機能が存在しないため {{ic|HIGHLEVEL_PACKAGER_MANAGER}} として pacman を使うことは不可能です。そのため、手動で変更をコミットするか、以下のどれかの方法を使用する必要があります。
 
  +
# etckeeper init
   
  +
そして、最初のコミットを実行して変更を追跡します。これは etckeeper が自動的に動作できるようにするために必要な手順です。
=== Pacman フック ===
 
  +
# etckeeper commit "first commit"
{{Pkg|pacman}} 5.0.0 から、[[pacman]] にはフックのサポートが追加されています [https://projects.archlinux.org/pacman.git/tree/NEWS?h=v5.0.0]。トランザクションの前後に etckeeper を自動的に実行するには、以下の2つのフックファイルを作成してください。まずは hooks ディレクトリを作成する必要があります:
 
# mkdir -p /etc/pacman.d/hooks
 
   
  +
''etckeeper'' バージョン 1.18.3-1 では、パッケージのインストール、更新、および削除時に、インストール前およびインストール後の [[pacman フック]]が自動的に実行されます。[[#ラッパースクリプト]]で行う必要ありません。
{{hc|/etc/pacman.d/hooks/etckeeper-pre.hook|2=
 
[Trigger]
 
Operation = Install
 
Operation = Upgrade
 
Operation = Remove
 
Type = Package
 
Target = *
 
   
  +
{{ic|/etc}} パスへの他の変更を追跡するには、変更を手動でコミットするか (コマンドについては {{man|8|etckeeper}} のマニュアルページを参照)、または以下の一時的な解決策のいずれかを使用する必要があります:
[Action]
 
Description = Etckeeper Pre-install
 
Depends = etckeeper
 
When = PreTransaction
 
Exec = /usr/bin/etckeeper pre-install}}
 
   
  +
{{Warning|git checkout/rebase/merge/cherry-pick/... により、ファイルのアクセス許可が壊れ、たとえば SSH/sudo ログインが拒否される可能性があります。 }}
{{hc|/etc/pacman.d/hooks/etckeeper-post.hook|2=
 
  +
''git'' はファイルのパーミッションを直接保存できないため、''etckeeper'' によって処理され、チェックアウト後に ''etckeeper init'' を再度実行してパーミッションを復元する必要があります。
[Trigger]
 
  +
あるいは、[[systemd#systemd-tmpfiles - 一時ファイル]] を使用してアクセス許可を保存することもできます。
Operation = Install
 
Operation = Upgrade
 
Operation = Remove
 
Type = Package
 
Target = *
 
 
[Action]
 
Description = Etckeeper Post-install
 
Depends = etckeeper
 
When = PostTransaction
 
Exec = /usr/bin/etckeeper post-install}}
 
 
pacman のフックに関する詳細は {{ic|man alpm-hooks}} を参照。
 
   
 
=== systemd ===
 
=== systemd ===
   
パッケージにはサービスタイマーユニットが含まれています。{{ic|etckeeper.timer}} を[[systemd/タイマー#管理|有効化]]してください
+
パッケージにはサービスタイマーユニットが付属しています。{{ic|etckeeper.timer}} を[[systemd/タイマー#管理|有効化]]することで使えます
   
タイマーの詳は [[systemd/タイマー]]を、付属のユニットを編集する場合は [[systemd#ユニットファイルの編集]]をさい。
+
タイマーの使い方についてしくは [[systemd/タイマー]]を見てください。ユニットを編集したい場合は [[systemd#ユニットファイルの編集]]を参照しください。
   
 
=== Cron ===
 
=== Cron ===
   
配布されているソース {{ic|debian/cron.daily}} に cron スクリプトが存在します。このスクリプトを使用することで定期的に変更を自動コミットすることができます。毎日スクリプトを実行するには、cron をインストール・有効化してから、etckeeper をビルドした srcdir からスクリプトを {{ic|/etc/cron.daily}} にコピーして実行可能属性を付与してください (例: {{ic|chmod +x /path/to/script}})
+
配布されているソースには [https://git.joeyh.name/index.cgi/etckeeper.git/tree/debian/cron.daily cron スクリプト] 含まれています。スクリプトを使ことで定期的に自動コミットできます。
   
  +
例えば、1日毎に実行するには:
=== ラッパースクリプト ===
 
  +
# [[cron]] をインストール・有効化してください。
  +
# {{ic|/etc/cron.daily/''script_name''}} としてスクリプトを作成。
  +
# ''root'' でファイルに実行権限を付与 ({{ic|# chmod u+x /etc/cron.daily/''script_name''}})
   
  +
詳しくは [[cron#Cronie]] や [[cron]] を見てください。
以下のようなスクリプトを PATH が通っているどこかに配置して、実行可能属性を付与し、{{ic|pacman -Syu}} の代わりにスクリプトを実行することで、etckeeper が他のシステムで使っているような自動コミット機能をエミュレートすることができます。
 
   
  +
=== Incron ===
#!/bin/bash
 
  +
  +
{{Note|このセクションは incron バージョン 5.10 にのみ適用されます。}}
 
 
  +
{{ic|/etc/}} 内の '''すべて''' のファイル変更に対してコミットを自動的に作成するには、{{Pkg|incron}} を使用します。これは、{{man|7|inotify}} を介したネイティブファイルシステムシグナリングを利用します。
etckeeper pre-install
 
pacman -Syu
 
etckeeper post-install
 
   
  +
incron をインストールして etckeeper を初期化した後、incron スクリプトの実行を許可するユーザーに root を追加します:
もしくは {{ic|~/.bashrc}} に簡単なエイリアスを追加してください:
 
  +
# echo root | tee -a /etc/incron.allow
   
  +
次に、incrontab を次のように編集します:
alias pkg-update='sudo etckeeper pre-install && sudo pacman -Syu && sudo etckeeper post-install'
 
  +
# incrontab -e
   
  +
テキストを次のように追加します:
あるいは関数を使うことで pacman や pacman のラッパーに引数を指定することもできます:
 
  +
# /etc IN_MODIFY,IN_NO_LOOP /bin/etckeeper commit "[message]"
   
  +
''IN_NO_LOOP'' は、コミットが完了するのを待ってから次のコマンドを実行し、無限ループを防ぐフラグです。
Pacman () { sudo etckeeper pre-install && sudo pacman "$@" && sudo etckeeper post-install; }
 
   
  +
ここで、''[message]'' は、{{ic|"modified $#"}} のようなものになります。$# は、変更されたファイルの名前に展開される特別な incrontab ワイルドカードです。
関数を使うときは、通常通りに pacman にフラグを付けて実行しますが、大文字の "P" を使うようにします。例:
 
Pacman -Syu
 
Pacman -R foo
 
   
  +
Incron はサブディレクトリを監視できないことに注意してください。パス内のファイルのみが監視されます。サブディレクトリを監視する必要がある場合は、サブディレクトリに独自のエントリを与える必要があります。ただし、トップレベルのファイルが変更されたときにコミットすると、すべての変更がコミットされます。
{{Warning|Do not name your wrapper script "pacman" and rely on it appearing earlier in the PATH than {{ic|/usr/bin/pacman}}. One of the etckeeper pre-install hooks calls pacman without specifying its path, so your script will be invoked recursively without end.}}
 
   
  +
参照: [http://inotify.aiken.cz/?section=incron&page=doc&lang=en]、{{man|8|incrond}}
=== Incron ===
 
   
  +
=== リモートリポジトリに自動プッシュ ===
上記のスクリプトの代わりに、{{ic|/etc}} のファイルに変更が加えられたときに etckeeper を使って自動的に変更をコミットするように incron を設定することもできます。
 
   
  +
{{Warning|etckeeper のリポジトリを誰でもアクセスできるリモートリポジトリにプッシュしてしまうと、パスワードハッシュや秘密鍵などの機密情報が漏洩する可能性があります。気をつけて使ってください。}}
=== リモートリポジトリに自動的にプッシュ ===
 
  +
{{Warning|etckeeper のリポジトリを誰でもアクセスできるリモートリポジトリにプッシュすることで、パスワードハッシュや秘密鍵などの機密情報が漏洩する可能性があります。気をつけて使って下さい。}}
 
{{ic|/etc/.git}} のローカルバックアップを作ることを第一歩としてetckeeper ではさらにコミットするたびに Github などのリモートリポジトリに変更を自動的にプッシュすることできます。実行可能ファイル {{ic|/etc/etckeeper/commit.d/40github-push}} を作成:
+
{{ic|/etc/.git}} のローカルバックアップを作るだけでなく、コミットするたびに GitHub などのリモートリポジトリに変更を自動的にプッシュすることできます。
  +
  +
まず、{{ic|etc/.git}} を編集してリモートの GitHub リポジトリを追加:
  +
  +
# git remote add origin ''<nowiki>https://github.com/user/repo.git</nowiki>''
  +
  +
そして、フックを使用・設定してプッシュするようにしてください。
  +
  +
==== etckeeper に付属しているフックを使う ====
  +
  +
{{ic|/etc/etckeeper/etckeeper.conf}} の {{ic|PUSH_REMOTE}} オプションを編集して、etckeeper からプッシュしたいリモートリポジトリの名前を指定してください。例:
  +
  +
PUSH_REMOTE="''origin''"
  +
  +
スペースで区切ることで複数のリモートリポジトリを追加できます。
  +
  +
==== カスタムフックを使う ====
  +
  +
{{ic|/etc/etckeeper/commit.d/40github-push}} ファイルを作成 (実行権限を付与してください):
   
 
#!/bin/sh
 
#!/bin/sh
100行目: 106行目:
 
fi
 
fi
   
  +
=== ラッパースクリプト ===
{{ic|etc/.git}} に移動してリモートの Github リポジトリを追加:
 
  +
  +
頻繁に実行するコマンドの変更を追跡したい場合 (例: {{ic|''command''}})、シンプルなラッパースクリプトで自動化できます。例えば、以下のファイルを作成:
  +
  +
{{hc|/usr/local/bin/checketc.sh|2=
  +
#!/bin/bash
  +
  +
etckeeper pre-install
  +
''command''
  +
etckeeper post-install}}
  +
  +
作成したら実行可能権限を付与してください。また、bash のエイリアスや関数で Etckeeper のコマンドを呼び出すこともできます。詳しくは [[Bash#エイリアス]]を見てください。
  +
  +
{{Note|Etckeeper バージョン 1.18.3-1 以前では Pacman による変更を追跡するのに上記のラッパースクリプトが必要でした。現在 Pacman はフックによってコマンドを自動的に実行します。}}
  +
  +
=== Reflector ===
  +
  +
[[Reflector]] を呼び出すたびに変更を自動的にコミットするには、{{ic|reflector.service}} に次の内容の [[ドロップインファイル]] を作成して、{{ic|reflector.service}} を {{ic|etckeeper.service}} に依存させます:
   
  +
[Unit]
# git remote add origin https://github.com/user/repo.git
 
  +
Before=etckeeper.service
  +
Wants=etckeeper.service
   
  +
{{Note|[[#systemd]] で提供されるユニットを再利用するため、自動変更のコミットメッセージは "daily autocommit" となります。このメッセージを変更するには、新しいスクリプトと systemd サービスを作成します。}}
これで上記のラッパースクリプトやエイリアスを実行するたびに、自動的に Github リポジトリに変更がコミットされるようになります。
 

2024年2月11日 (日) 01:06時点における最新版

関連記事

Etckeeper は、リポジトリ内の /etc/ を追跡するためのツールのコレクションです (GitMercurialBazaar、または Darcs がサポートされています) pacman フックは、システムのアップグレード前に変更を自動的にコミットし、ファイルのアクセス許可が追跡されます。これはバージョン管理では通常サポートされていませんが、/etc/shadow などのファイルにとっては重要です。

インストール

etckeeper パッケージをインストールしてください。

設定

使用するバージョン管理システム (デフォルトは git) などのオプションは /etc/etckeeper/etckeeper.conf で設定できます。

Etckeeper は etckeeper.confLOWLEVEL_PACKAGE_MANAGER あるいは HIGHLEVEL_PACKAGE_MANAGER として pacman を使うことをサポートしています。

使用方法

設定後、/etc パスのリポジトリを初期化する必要があります:

# etckeeper init

そして、最初のコミットを実行して変更を追跡します。これは etckeeper が自動的に動作できるようにするために必要な手順です。

# etckeeper commit "first commit"

etckeeper バージョン 1.18.3-1 では、パッケージのインストール、更新、および削除時に、インストール前およびインストール後の pacman フックが自動的に実行されます。#ラッパースクリプトで行う必要ありません。

/etc パスへの他の変更を追跡するには、変更を手動でコミットするか (コマンドについては etckeeper(8) のマニュアルページを参照)、または以下の一時的な解決策のいずれかを使用する必要があります:

警告: git checkout/rebase/merge/cherry-pick/... により、ファイルのアクセス許可が壊れ、たとえば SSH/sudo ログインが拒否される可能性があります。

git はファイルのパーミッションを直接保存できないため、etckeeper によって処理され、チェックアウト後に etckeeper init を再度実行してパーミッションを復元する必要があります。 あるいは、systemd#systemd-tmpfiles - 一時ファイル を使用してアクセス許可を保存することもできます。

systemd

パッケージにはサービス・タイマーユニットが付属しています。etckeeper.timer有効化することで使えます。

タイマーの使い方について詳しくは systemd/タイマーを見てください。ユニットを編集したい場合は systemd#ユニットファイルの編集を参照してください。

Cron

配布されているソースには cron スクリプト が含まれています。スクリプトを使うことで定期的に自動コミットできます。

例えば、1日毎に実行するには:

  1. cron をインストール・有効化してください。
  2. /etc/cron.daily/script_name としてスクリプトを作成。
  3. root でファイルに実行権限を付与 (# chmod u+x /etc/cron.daily/script_name)

詳しくは cron#Croniecron を見てください。

Incron

ノート: このセクションは incron バージョン 5.10 にのみ適用されます。

/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)

リモートリポジトリに自動プッシュ

警告: etckeeper のリポジトリを誰でもアクセスできるリモートリポジトリにプッシュしてしまうと、パスワードハッシュや秘密鍵などの機密情報が漏洩する可能性があります。気をつけて使ってください。

/etc/.git のローカルバックアップを作るだけでなく、コミットするたびに GitHub などのリモートリポジトリに変更を自動的にプッシュすることもできます。

まず、etc/.git を編集してリモートの GitHub リポジトリを追加:

# git remote add origin https://github.com/user/repo.git

そして、フックを使用・設定してプッシュするようにしてください。

etckeeper に付属しているフックを使う

/etc/etckeeper/etckeeper.confPUSH_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#エイリアスを見てください。

ノート: Etckeeper バージョン 1.18.3-1 以前では Pacman による変更を追跡するのに上記のラッパースクリプトが必要でした。現在 Pacman はフックによってコマンドを自動的に実行します。

Reflector

Reflector を呼び出すたびに変更を自動的にコミットするには、reflector.service に次の内容の ドロップインファイル を作成して、reflector.serviceetckeeper.service に依存させます:

[Unit]
Before=etckeeper.service
Wants=etckeeper.service
ノート: #systemd で提供されるユニットを再利用するため、自動変更のコミットメッセージは "daily autocommit" となります。このメッセージを変更するには、新しいスクリプトと systemd サービスを作成します。