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
にあった。
設定は、これ見るのが一番参考になる。
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が使えない(´・ω・`)
理由も解決方法も上の記事掲載されているのですが、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コマンドで頑張る方針を選びました(ヽ´ω`)