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 スクリプトが使えない。