WSLが自動生成した /etc/resolv.conf に search オプションを追加する

投稿日:

WSL環境下のLinuxディストリビューションでは、WSL環境が自動的に /etc/resolv.conf を生成する。しかしこの自動設定には search などのオプションを別途指定することができない。

もちろん resolv.conf の自動生成を止めるという選択肢もあるが、できればWindowsの設定に合わせて適切なネームサーバを利用しつつ、望むオプションを追加したい。ということで自動生成を維持したまま search オプションを追加する方法について考える (*1) 。

Symptom

  • ホストが Windows 10 21H2
  • WSL上でLinuxを利用している
  • 基本的に/etc/resolv.confの内容はWSL側の自動生成に任せたい
  • しかし自動生成された resolv.conf に対して search (などの)オプションを追加したい

Resolution

といっても特別良い方法が思いついた訳ではなく、単純にログインシェルの .*profile/etc/resolv.conf へ設定を追記するようコマンドを追加しただけだ。 sudo 権限が必要になるが、WSL上のLinuxであれば問題はないだろう。

% sudo sh -c 'cat > /etc/resolv.search.conf' << EOS

# A below line has added by .zshrc
search example.automata.icu
EOS
# 私はzsh使いなので .zprofile にコマンドを追記する
% cat >> .zprofile << EOS

# Use custom search domains under WSL
if [ -f /etc/resolv.search.conf ]; then
        if ! egrep '^search ' /etc/resolv.conf 2>&1 > /dev/null; then
                sudo sh -c 'cat /etc/resolv.search.conf >> /etc/resolv.conf'
        fi
fi
EOS

WSLにより resolv.conf が再生成された場合は、再びこのコマンドが実行される必要がある。見たところ、それが起こるのはPCを再起動したときで、その際はおおよそ新規に端末を開くから、.*profile に追記するのがちょうどいい (*2) 。

Appendix

https://github.com/microsoft/WSL/issues/701 でこの問題が議論されているが、残念ながら今のところ改善はないようだ。

上記のIssueではいくつかのワークアラウンドが示されている。私の方法では単に既存の search オプションがない場合にのみ設定を追加するようにしたが、既存のオプションをsedで置き換える等のバリエーションもある。


(*1) 自動生成されるresolv.confでは、 nameserver に仮想ブリッジ上のゲートウェイアドレス (172.x.x.x/20) が設定されていた。恐らくここにDNS Forwarderが起動しているので、これを手動で指定すれば済むかと思ったが、この仮想ブリッジのネットワークアドレスは再起動ごとに自動生成されるらしく、上手くいかない。

(*2) WSL上のディストリの起動時に一度実行するだけで良さそうだが、WSL環境は独自の /init を利用するため、 systemd や rc スクリプトが使えない。