無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

WSL2(Ubuntu)でのNTP設定 と WSLでのSystemd利用の話

時間がずれていてapt updateできないんだが( ゚д゚)

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:        20.04
Codename:       focal

開発機用途で買ったLenovo T14、ようやく開発用に環境を整えようと思い、数週間ぶりにWSLを立ち上げたんですよ。

時間がずれていて、apt updateができない問題が発生するんですねぇ(´・ω・`)

調べてみた感じ、デフォでNTP設定がされていないようで少しずつずれていくそうです。地味にこまる。メインマシンの方は結構前にNTP設定した記憶ありますがもはや忘却の彼方。ひとまず最初から時間設定合わせていくことにします。

現状のハードウェアクロックを確認

ハード側の時間設定がどうなっているかを確認します。

sudo hwclock --show

ここでずれていたら別途対応が必要になったかもしれません。 今回は特にズレがなかったので、このままでOK。

ずれている時間を合わせる

date --set "指定時間" 設定によってはsudoが必要になります。

時間は分単位まで合っていれば特に問題はなかったのでざっくりと合わせます。

ntpはデフォで入っていない

みたいです。 ntpd --versionってしても、そんなコマンドねぇって怒られました(´・ω・`)

そのままntpdいれてもいいんですけど、今回はchronyを試すことにします(Redhat系だと最近はこっちらしい)

sudo apt install chrony
# chronyc -v
chronyc (chrony) version 3.5 (+READLINE +SECHASH +IPV6 -DEBUG)

これでOK。

ntpの設定を変更する

chronyの設定は/etc/chrony/chrony.confにあった。 設定は、これ見るのが一番参考になる。

access.redhat.com

chornyはデフォでslewモードで動くため、NTPサーバーの設定だけ変更しておくと良さそう。

日本のntpサーバーに向けさせる

初期値では、ntp.ubuntu.com、もしくはubuntu.pool.ntp.orgが設定されていますがレイテンシ影響などもあり精度がいまいちなので、日本時間に合わせるので国内サーバーを使いましょう。

CloudFlareは割といいらしい。セキュリティを重視しているらしい。 https://blog.cloudflare.com/jp/secure-time-jp/blog.cloudflare.com

これと、MFEEDあたりを使うと良さげかも。 www.mfeed.ad.jp

下記だけは、1時間あたりのアクセス数が一定を超える場合申請が必要らしい。使うときは少し気をつけたほうがいいかもしれない。 日本標準時(JST)グループ

もちろん、初回起動時の速度改善を期待するためにiburstオプションもいれておく

最終的にこうなった

pool time.cloudflare.com   iburst
pool ntp.jst.mfeed.ad.jp   iburst maxsources 3
pool ntp.ubuntu.com        iburst maxsources 4

あとはsudo service start chronyとすればOK。

サービスが立ち上がっていればchronyc trackingとすれば同期の状態を見ることが出できます。

サービスの常駐設定

WSL2の場合、systemctlが使えない(´・ω・`)

snowsystem.net

理由も解決方法も上の記事掲載されているのですが、systemctl使えないと自動起動ができないわけで、頑張ってservice startするスクリプトを用意しないといけない(´・ω・`)そんな面倒なことはしたくないわけですね。

上の記事の内容に従ってsystemctlを使えるようにしましょう。

install genie

GitHub - arkane-systems/genie: A quick way into a systemd "bottle" for WSL

sudo apt install daemonize

wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget https://packages.microsoft.com/config/ubuntu/20.04/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-3.1

curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh > script.sh
sudo bash script.sh
sudo apt install systemd-genie

インストールするとgenieコマンドが使えるようになるので、

genie -s

とすると、systemdをpid=1にした状態でシェルを立ち上がります。tmuxを使う場合、tmux立ち上げ前に実行しておけばセッション側でも状態が引き継がれていることを確認できました。

# ps aux | grep systemd
root           1  1.5  0.1 107904 13076 ?        Ss   17:51   0:00 systemd

あとは起動時に立ち上がるように設定してあげればOK。

注意点

systemctlが動くようにはなったが、もともとwsl側でpid=1で動かしていたinitプロセスが動かなくなります。 それによって windows側の環境変数が引き継がれなくなりパスが参照できなくなる現象を確認しています。よくWSL経由でWindowsコマンドを使う人(例えばvscodeを開く code など)はそのへん意識して対応すると良さそう。

ちなみに、自分はいろいろ困るケースがでてきてしまったので、X環境整えるまではgenie使わずserviceコマンドで頑張る方針を選びました(ヽ´ω`)

gdgd-shinoyu.hatenablog.com