Help us understand the problem. What is going on with this article?

大切なことはすべてUbuntuが教えてくれた 無人アップグレードを知りましょう

はじめに

本記事はUbuntuの無人アップグレードについて記載しています。

Ubuntuは無人アップグレードという機能がデフォルトで有効になっていて、自動的にOSのパッケージのアップデート及びアップグレードを行ないます。

システム管理者として注意しないといけないのは、無人アップグレードの機能を理解することです。

例えば、本番環境でシングル構成で運用しているサーバがあるとします。
無人アップグレードがデフォルトの状態でサービスの自動起動を設定していない場合は、サービスに支障が出るリスクがあります。

過去の事例ですが、サービスがダウンしていていたので原因を調査しました。
uptimeコマンドを実行すると起動時間が短いことから、サーバ再起動が行われたと判断し、シスログより以下のログを確認しました。

Feb 20 09:14:48 <ホスト名> systemd[1]: Stopped Unattended Upgrades Shutdown.

上記ログの約3〜4分後にOS再起動が行われましたが、その後サービスの自動起動が設定されていなかったため、サービスのダウンタイムを引き起こしました。

本記事では無人アップグレードを考慮し、サービスの自動起動の設定方法についても解説します。

無人アップグレード

無人アップグレードを停止することは根本的な問題解決になりません。
無人アップグレードの仕組みは以下になります。(本記事のUbuntuのバージョンは18.04)

/etc/apt/apt.conf.d/20auto-upgrades

/etc/apt/apt.conf.d/20auto-upgradesのファイルを参照するとデフォルトでは以下の設定値になっています。

  • /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Update-Package-Listsが1の場合は、自動でパッケージのリストを更新します。Unattended-Upgradeが1の場合は、自動でパッケージのアップグレードが行われます。

値を0にすることで無効にできます。

また、パッケージのアップデートに関するログは、/var/log/apt/history.logファイルから履歴を確認できます。

/etc/apt/apt.conf.d/50unattended-upgrades

自動アップグレードが有効な状態でスケジュールに従って、OSの再起動を行いたい場合は、/etc/apt/apt.conf.d/50unattended-upgradesのファイルでスケジュールを設定できます。以下はアップグレードがあった場合に、23:00に再起動を行う例です。

  • /etc/apt/apt.conf.d/50unattended-upgrades
// Automatically reboot *WITHOUT CONFIRMATION*
//  if the file /var/run/reboot-required is found after the upgrade 
Unattended-Upgrade::Automatic-Reboot "true";

// If automatic reboot is enabled and needed, reboot at the specific
// time instead of immediately
//  Default: "now"
Unattended-Upgrade::Automatic-Reboot-Time "23:00";

Automatic-Rebootのデフォルトはfalseで、Automatic-Reboot-Timeはコメントアウトされています。設定を有効にする場合は、Automatic-Reboottrueにし、Automatic-Reboot-Timeに任意の時刻を設定します。

自動起動設定

サービスの自動起動の方法はいくつか方法があります。
大きく分けるとOS機能のsystemctlで設定するか、MWのパッケージなどを利用することができます。

例としてnodeアプリケーションの場合、PM2というデーモンプロセスマネージャなどがあります。本記事ではsystemctlで一度だけ実行するサービスの設定方法について解説します。

systemctで設定する場合は起動スクリプトを作成し、/etc/systemd/system配下に以下のファイルを配備します。

  • node.service
[Unit]
Description = Node.js
After=local-fs.target
ConditionPathExists=/root

[Service]
ExecStart=/root/node_start.sh
Restart=no
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

次に以下のコマンドを実行し、systemctlに登録します。

# systemctl daemon-reload

おわりに

CoreOSにも同じ様な機能があります。
以下のサービスを停止することで、OSの自動起動を防ぐことができます。

# systemctl status update-engine

参考

Brutus
DevOpsとAIの二刀流を目指す凡人。Python、RaspberryPi、Linux、Docker、k8s、セキュリティ、Oracle Cloud、Terraform、Ansible等について発信しています。登壇、執筆等あれば、Twitterよりメッセージお願いします。
https://brutus.ml/
gauss
株式会社GAUSSは、AIソフトウェアを組み込んだサーバの提供、AIサービス構築のコンサルティング、AIのエンジニア育成をセットにしてサービス提供を展開するスタートアップ企業です。
https://gauss-ai.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした