Debian GNU/Linux 9でaptパッケージの自動更新
Debian GNU/Linux 9でaptパッケージの更新を自動的に行う方法には、unattended-upgradesを使う方法やcronというサービスを使う方法などがあるが、ここではまず最も簡単な方法の一つ、rc.localを使う手順を示す。
/etcディレクトリ内にrc.localという名のファイルを作ってその中に実行したいコマンドを並べれば、システムの起動後や再起動後に自動的にそれらを実行してくれるようになる。/etc/rc.localの内容は例えば次のように記述する。
#!/usr/bin/bash apt update apt upgrade -y apt clean exit 0
オプションの-yはyes/noの問いに対してすべてyesと応えることを示す。最後のexit 0
は一連のコマンドがエラーなく正常に終了したことを示す終了コード0を親プロセスに返すものらしいが、必ず要るわけではなさそうだ。詳しいことは「終了ステータス」や「終了コード」で検索するといい。
テキスト・エディタを使わずにechoコマンドを使う場合は次のようにすればいいと思う。
# echo "#!/usr/bin/bash\napt update;apt upgrade -y;apt clean" >> /etc/rc.local
最後に、/etc/rc.localに実行権限を与えれば完了。
# chmod u+x /etc/rc.local
ただしここで示したのは、aptパッケージ管理システムを使っているディストリビューションの場合。他のパッケージ管理システムではそれ向きのコマンドを記述する必要がある。
Linuxディストリビューションによっては/etc/rc.d/rc.localの場合もある。あるいは、このファイルがすでに存在している場合もある。その場合には上記のコマンドをそのファイルに追加してやればいいと思う。
cronを使う方法
cronを使う場合、cronがインストールされていなければインストールする。そのためにはスーパーユーザーの権限が必要になるのでここではsuというコマンドを使ってスーパーユーザーに成り代わっている。元のユーザーに戻るにはコマンドのexitを使う。
$ su # apt update;apt install cron
crontabというユーティリティを利用すると各ユーザー用のスケジューリング・ファイルを編集できる。このスケジューリング・ファイルに実行したいコマンドのスケジュールを記しておく。各ユーザー向けのスケジューリング・ファイルは/var/spool/cron/crontablsのディレクトリ内に各ユーザー名と同じファイル名で保存される
apt updateとapt upgradeの実行にはスーパーユーザーの権限が必要になるのでroot向けのスケジューリング・ファイルを編集する必要がある。そのためにはコマンドのsuを使ってroot(スーパーユーザー)に成り代わり、そして-eというオプションを付けてcrontabというコマンドを実行する。
$ su # crontab -e
そうするとroot用のスケジューリング・ファイルを編集する画面がターミナル上に起動する。そこに次の行を加える。行頭の#はその行がコメントであることを表している。
# aptによる更新を起動時と再起動時に実行 @reboot root apt update;apt upgrade -y
@rebootはシステムの起動時や再起動時に実行することを示し、その後の記述は実行したいコマンドを示す。これで完了。記述の順番も意味を持つので要注意。
Debian GNU/Linuxでは/etc/cron.d/に任意のファイル名(例えばapt-upgrade)でテキスト・ファイルを作ってそこに次の行を加える方法もある。crontabを利用する場合と違ってユーザー名(ここではroot)も一緒に記す必要があることに要注意。
@reboot root apt update;apt upgrade -y
echoコマンドを使って設定ファイルを作成する場合は次のようにすればいいと思う。
# echo "@reboot root apt update;apt upgrade -y" > /etc/cron.d/apt-upgrade
コンピューターを常時稼働させているサーバーの場合には起動時や再起動時を意味する@rebootではなく具体的な実行時間を設定するべきかもしれない。その方法を次に示す。
/etc/crontabに加えるスケジュールの書式は「分 時 毎月の日 月 曜日 実行するコマンド」のようにする。分は0から59まで、時は0から23まで、毎月の日は1から31まで、月は1から12まで、曜日は0から7までの数値で指定することができる。曜日では0と7がどちらも日曜日を指す。月と曜日は英単語の略字によっても記述できる。詳しくはman 5 crontabと入力してマニュアルを参照あれ。
スケジュールの書式には特殊文字を使うことができる。時に6,12,18と指定すると6時と12時と18時に実行する意味になる。時に5-7と指定すると5時と6時と7時に実行する意味になる。*(アスタリスク)を指定すると全ての値を指定したのと同じ意味、したがって「毎〜」という意味になる。
次にスケジューリングのいくつかの例を示す。
# 毎日午前0時0分にaptのupdateとupgradeを実行 0 0 * * * apt update;apt upgrade -y # 毎日0時0分と6時0分と12時0分と18時0分にaptのupdateとupgradeを実行 0 0,6,12,18 * * * apt update;apt upgrade -y # 毎週月曜日の午後12時30分にaptのautoremoveを実行 30 12 * * 1 apt autoremove # 毎週月曜日と水曜日と金曜日の正午にaptのautoremoveを実行 0 12 * * 1,3,5 apt autoremove
スケジューリング・ファイルを設定し終わったら、systemctlコマンドを使ってcronのシステム・サービに設定を再読込みさせる。
$ su # systemctl reload cron
念のためにcronのシステム・サービスを再起動する。
# systemctl restart cron
cronのシステム・サービスがアクティブかどうかを確認する。
# systemctl status cron ● cron.service - Regular background program processing daemon Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; pr> Active: active (running) since Tue ...(以下略)
enabledやactive (running)の文字が確認できるので稼働中だと分かる。
cronまたはanacronを使う別の方法として/etc/cron.dailyディレクトリ内に/etc/rc.localと同じ内容のシェル・スクリプトを作る手がある。echoコマンドを使ってそれを行うには次のようにする。
# echo "#!/usr/bin/bash\napt update;apt upgrade -y;apt clean;exit 0" > /etc/cron.daily/apt-upgrade.sh
そしてこのファイルに実行権限を与える。
# chmod u+x /etc/cron.daily/apt-upgrade.sh
unattended-upgradesを使う方法
最後の方法はDebian GNU/Linuxの公式サイトで説明されているもの。まずはunattended-upgradesというaptパッケージをインストールする。
$ su # apt update # apt install unattended-upgrades
インストールが無事に完了したら次のコマンドを実行する。
# dpkg-reconfigure -plow unattended-upgrades
すると、「自動的に安定版の更新をダウンロードしてインストールしますか?」と問うてくるので「はい」を選ぶ。/etc/apt/apt.conf.d/20auto-upgradesというファイルを開くと次の行が追加されているのが分かる。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";
シェルが「コマンドが見つかりません」と応答してくる場合、debconfというaptパッケージがインストールされていないか、/usr/sbinが環境変数のPATHにexportされていない可能性がある。debconfはunattended-upgradesパッケージをインストールすれば依存関係で一緒にインストールされているはず。環境変数PATHに/usr/sbinを追加するには、.bashrcなど、ログイン時に参照されるシェルの設定ファイルに次の行を加えればいい。
export PATH="$PATH:/usr/sbin"
ダウンロードされたファイルがキャッシュに貯まってゆくのを定期的に掃除する必要があるときは、先ほどの/etc/apt/apt.conf.d/20auto-upgradesというファイルに次のように3行めを加えておけばいい。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; APT::Periodic::AutocleanInterval "7";
これで7日ごとにapt cleanを自動的に実行してくれるはず。
apt autoremoveを自動的に実行させるには次のように4行めを加える。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; APT::Periodic::AutocleanInterval "7"; Unattended-Upgrade::Remove-Unused-Dependencies "true";
試しに実行してみる。
# unattended-upgrade -d Initial blacklist : Initial whitelist: 自動アップグレードスクリプトを開始します (省略)
コメント
コメントを投稿