Ubuntuではパッケージのアップデートが存在するときに通知を出してくれますが、そのアップデートを適用するには管理者の操作が必要です。今回は、管理者の操作を待たずにパッケージをアップグレードするPolicyKitの設定方法とunattended-upgradeの設定方法を紹介します。
PolicyKitの設定
通常、Ubuntuでパッケージをアップグレードするにはアップデートマネージャ(update-manager)を使います(図1 ) 。セキュリティアップデートが存在する場合には即時、バグ修正のための推奨アップデートが存在する場合には7日に1度、アップデートマネージャの画面が表示されます[1] 。ここで「アップデートをインストール」ボタンをクリックするとパッケージをアップグレードできるのですが、Ubuntuのデフォルトではこの操作は"admin"グループに属しているシステムの管理者にのみ許可されています。
そのため、システムの管理者はほとんどログインせず、普段使用するユーザがデスクトップユーザとしての権限しか持っていない、といった筆者の実家のような特殊な環境の場合、システムのアップデートを適用するのが遅れてしまいます[2] 。
アップデートを実家側で適用してもらうには管理者としての権限を与えれば済むのですが(図2 ) 、同時にシステムを破壊してしまう可能性も生じるため、アップデートだけを許可する設定にはできないだろうか、と考えました。
図1 アップデートをインストールするアップデートマネージャ
[1] ちなみに推奨アップデートを表示する間隔の「7日」という値はgconfの"/apps/update-notifier/regular_auto_launch_interval"で定義されています。この値を"0"に設定すると、推奨アップデートの場合でも即時にアップデートマネージャを表示させられます。
図2 [システムの管理]-[ユーザとグループ]の「アカウントの種類」で管理者に設定できる
そこで、アップデートをインストールするための認証画面で「詳細」の部分に注目しました(図3 ) 。実はここで表示されるアクションごとに権限を設定できるため、管理者としての権限を与えなくても「特定のユーザやグループにパッケージのアップグレードのみを許可する」といったことができます。
図3 権限を必要とするアクションが表示された認証画面
例えば、"upgrade-only"グループに所属している管理者ではないユーザが、パッケージのアップグレードを実行できるようにするには次のように設定します。
まずは"upgrade-only"グループを作成し、ユーザ(USER_NAME部分)をそのグループに参加させます。
$ sudo addgroup --system upgrade-only
$ sudo adduser USER_NAME upgrade-only
グループへの参加を有効化するために該当ユーザを一旦ログアウトさせます。
また、次の内容で"/etc/polkit-1/localauthority/50-local.d/10-allow-upgrade.pkla"という設定ファイルを作成します。
# Configuration file for the PolicyKit Local Authority.
#
# See the pklocalauthority(8) man page for more information
# about configuring the Local Authority.
#
[Upgrade-only Group Permissions]
Identity=unix-group:upgrade-only
Action=org.debian.apt.upgrade-packages
ResultAny=no
ResultInactive=no
ResultActive=auth_self
ここでは、グループ内ユーザのアクティブセッションで、そのユーザのパスワードを使ってアップデートを適用できるようにしています。
ただし、この設定だけではパッケージのアップグレード時に、依存関係で新たにインストールが必要なパッケージがあるときに対応できません。そのため、"org.debian.apt.install-or-remove-packages"というアクションも追加しておくといいでしょう[3] 。
"org.debian.apt.upgrade-packages"と"org.debian.apt.install-or-remove-packages"の2つのアクションのみを許可するユーザやグループを設定すると、「 パッケージのアップグレードができ」 、「 リポジトリ内のパッケージがインストールでき」るものの、「 リポジトリを変更できず」 、「 debファイルからの直接インストールもできない」( 注4 )といった権限に設定できますが、ここで注意しなければならないのは「パッケージの削除ができてしまう」ことです。
パッケージの削除ができてしまうことは筆者の求める権限管理にはそぐわなかったので、筆者は最終的にはunattended-upgradeを選びました。
[3] 定義されているアクションの一覧は"pkaction"コマンドで取得できます。また、アクションの詳細を確認するには"$ pkaction --action-id org.debian.apt.install-or-remove-packages --verbose"のように実行します。
unattended-upgrade
unattended-upgradeは、ユーザの権限に関係なくシステムのcronジョブとして実行されます。また、「無人アップグレード」を意味する名前の通り、ユーザの操作を待つことなく実行できます。
unattended-upgradeを有効にするには、ソフトウェアセンターの[編集]-[ソフトウェア・ソース]、またはアップデートマネージャの[設定]ボタンから「ソフトウェア・ソース」(software-properties-gtk)を開きます。次に[アップデート]タブで「確認せずにセキュリティアップデートをインストールする」を選択します(図4 )。
図4 「ソフトウェアソース」で「確認せずにセキュリティアップデートをインストールする」を選択する
デスクトップ環境が入っていない場合は、"unattended-upgrades"パッケージがインストールされていることを確認してから、"/etc/apt/apt.conf.d/10periodic"ファイルを次のように書き換えます。
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "1";
ここまでの操作で、セキュリティアップデートが存在する場合には、ユーザの操作を必要とせずに自動でアップデートが適用されるようになります。
バグ修正のための推奨アップデートも自動で適用するには、"/etc/apt/apt.conf.d/50unattended-upgrades"の該当部分のコメントを解除して次のようにします。
// Automatically upgrade packages from these (origin, archive) pairs
Unattended-Upgrade::Allowed-Origins {
"${distro_id} ${distro_codename}-security";
"${distro_id} ${distro_codename}-updates";
// "${distro_id} ${distro_codename}-proposed";
// "${distro_id} ${distro_codename}-backports";
};
また、パートナーリポジトリからFlash PlayerやSkypeをインストールしている場合には次のように項目を追加してセキュリティアップデートが適用されるようにします[5] 。
// Automatically upgrade packages from these (origin, archive) pairs
Unattended-Upgrade::Allowed-Origins {
"${distro_id} ${distro_codename}-security";
"${distro_id} ${distro_codename}-updates";
// "${distro_id} ${distro_codename}-proposed";
// "${distro_id} ${distro_codename}-backports";
// For Partner Repository
"Canonical ${distro_codename}";
};
[5] パートナーリポジトリには、セキュリティアップデートとバグ修正のためのアップデートの区別はありません。また、設定を書くのに必要な項目名は"apt-cache policy"を実行した時の"o=Canonical,a=natty"の部分です。
通常はここまでの設定で網羅できますが、Ubuntu Japanese Teamのリポジトリからパッケージ(Adobe Reader日本語版など)をインストールしている場合は、さらに追加の設定が必要です。次のように設定します。
// Automatically upgrade packages from these (origin, archive) pairs
Unattended-Upgrade::Allowed-Origins {
"${distro_id} ${distro_codename}-security";
"${distro_id} ${distro_codename}-updates";
// "${distro_id} ${distro_codename}-proposed";
// "${distro_id} ${distro_codename}-backports";
// For Partner Repository
"Canonical ${distro_codename}";
// For Ubuntu Japanese Team Repository
"LP-PPA-japaneseteam ${distro_codename}";
"Ubuntu-ja ${distro_codename}-non-free";
};
設定後に、アップデートが存在している状態で次のコマンドを実行して、期待した動作をするか確認します。
$ sudo unattended-upgrade --dry-run --debug
なお、余談ですが、10.10以前のunattended-upgradeでは、アップグレード中の急な電源遮断など"dpkg --configure -a"が必要な事態になった場合、それ以降動作してくれませんでしたが、11.04では自動で修復作業を実行し継続的に動作するようになりました。
他にも、いくつかオプションが増え、全部で次のような項目が設定できるようになっています。
自動アップグレードの対象にするリポジトリ
アップグレードから除外するパッケージ
自動修復機能の有効/無効(デフォルトは有効)
アップグレードの分割
アップグレード/エラー通知先メールアドレス
メールの送信をエラー時のみに限定
apt-get autoremoveの自動実行
アップグレード後に再起動が必要な場合にすぐに再起動
パッケージのダウンロード速度の制限
項目の詳細は、"/etc/apt/apt.conf.d/50unattended-upgrades"ファイル内で説明されているので、自分のマシン、実家のマシンと、用途に合わせて設定してみてください。