Debian勉強会でのwireguardの発表で wireguard-dkms のモジュールのリロードを手動で実行している話をしましたが、 ちゃんとシェルスクリプトにまとめ直しました。

動作確認環境

  • Debian 9 (stretch)
  • Debian 10 (buster)
  • Debian testing (bullseye)
  • Raspbian 10 (buster)
  • Ubuntu 18.04 LTS (bionic)
  • Ubuntu 20.04 LTS (focal)

概要

wireguard のカーネルモジュールが Linux 5.6 から Linux 本体に同梱されることになって、 wireguard-dkms の postinst での自動再読み込みがなくなり、 /run/reboot-required* による再起動要求に変わりました。

次のシェルスクリプトでは、なくなる前の再読み込み処理を実行して、 /run/reboot-required.pkgswireguard-dkms だけだったら、 再起動要求を削除する、ということをしています。

スクリプト本体

以下の内容のファイルを /usr/local/bin/wg-reload.sh としておいて実行属性をつけました。

https://salsa.debian.org/debian/wireguard-linux-compat/-/commit/af9f90b13118cd259227773c2a81ccfa25cf3e5d を元にしているので、ライセンスはスクリプト全体としても GPLv2 として扱ってください。

#!/bin/bash
# LICENSE: GPLv2
set -euo pipefail
echo "Loaded version: $(cat /sys/module/wireguard/version)"
echo "Installed version: $(modinfo -F version wireguard)"
if [[ $(cat /sys/module/wireguard/version) != $(modinfo -F version wireguard) ]]; then
    if [ -d /run/systemd/system ]; then
        systemctl daemon-reload || true
        units="$(systemctl list-units --state=active --plain --no-legend 'wg-quick@*.service' | awk '{print $1}')"
        if [ -n "$units" ]; then
            echo "Stopping currently active wg-quick@ unit instances..." >&2
            systemctl stop $units || true
        fi
    fi
    if [ -n "$(wg show interfaces)" ]; then
        echo "Warning: Wireguard interfaces currently configured, not reloading module" >&2
    else
        echo "Reloading wireguard module..." >&2
        if ! rmmod wireguard ; then
            echo "Warning: failed to unload wireguard module" >&2
        else
            modprobe wireguard
        fi
    fi
    if [ -d /run/systemd/system ]; then
        if [ -n "$units" ]; then
            echo "Starting previously active wg-quick@ unit instances..." >&2
            systemctl start $units || true
        fi
    fi
fi
if [[ -f /run/reboot-required.pkgs ]]; then
    if [[ wireguard-dkms = $(</run/reboot-required.pkgs) ]]; then
        rm -f /run/reboot-required*
    fi
fi

感想

手動で現在のバージョンチェックをして、リロードして更新されているのを確認して、 再起動要求が wireguard-dkms だけなら削除、としていたのが、1コマンドだけでできるようになって楽になりました。

手動で実行していたリロード対象は wg0 固定だったのですが、 ちゃんと postinst にあったように wg-quick@.service 全てを対象にできるようになったのもよかったです。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published