Ubuntu20.04でやったapt updateがDNSが原因でエラーになる．

# はじめに

私がVagrantで遊んでいるときに直面したエラーでした．
Vagrantだけではなく，ubuntu20によくあるエラーらしいので，次に直面したとき用に残しておきます．

# 環境
- 母艦：Ubuntu18.04.5LTS
- Vagrant & Virtualbox 使用
- ubuntu20.04をインストール
- bridged network interfaces : br0

# 状況

`vagrant up`でVMを立ち上げたのち，
`vagrant ssh`で接続して，`apt update`でエラー

```
vagrant@ubuntu2004:~$ sudo apt update
Err:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease                   
  Temporary failure resolving 'jp.archive.ubuntu.com'
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease            
  Temporary failure resolving 'security.ubuntu.com'
Err:3 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease
  Temporary failure resolving 'jp.archive.ubuntu.com'
Err:4 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease
  Temporary failure resolving 'jp.archive.ubuntu.com'
Reading package lists... Done           
Building dependency tree       
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://jp.archive.ubuntu.com/ubuntu/dists/focal/InRelease  Temporary failure resolving 'jp.archive.ubuntu.com'
W: Failed to fetch http://jp.archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease  Temporary failure resolving 'jp.archive.ubuntu.com'
W: Failed to fetch http://jp.archive.ubuntu.com/ubuntu/dists/focal-backports/InRelease  Temporary failure resolving 'jp.archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease  Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
```


エラーを調べてみると，
どうやらDNSの名前変換がうまくいっていないらしい．
DNSがどうなってるか確認してみる．

```
$ cat /etc/resolv.conf 

nameserver 127.0.0.53
options edns0 trust-ad
```

と出力．
nameserver(DNS)が127.0.0.53って何？
これもまた調べてみると，
Ubuntuの方のバグで，シンボリックリンクの参照先が別のところになってしまっているらしい．
確認してみる．

```
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 12月 13 23:01 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
```

上記のように，本来は`/run/systemd/resolve/stub-resolv.conf`となるところが，
1個ディレクトリが上がったところから参照している．
これでは，原因のファイルである`/etc/resolv.conf`と`/run/systemd/resolve/stub-resolv.conf`の2つを修正しても直らない．
（修正後に`sudo systemctl restart systemd-resolved`で更新するため，
元通りになって`sudo apt update`が通らない．）

# 対処

そのため，DNSを編集して，シンボリックリンクを張り直せば動いてくれる．

`/etc/systemd/resolve.conf`を`nano`，`vi`で入って，自分のDNSのIPを追加してください．
（aptが通ってないので，`emacs`はまだ使えないです．）

```
$ sudo nano /etc/systemd/resolve.conf

#DNS=
　　↓
DNS=your_DNS_IP
```

編集をしたら，`/etc/resolv.conf`のシンボリックリンクを張り直します．

```
$ sudo unlink /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
```

最後に，DNSの設定を更新して終わりです．
参考記事では，`sudo reboot`をしていますが，`systemctl restart`で動作を確認しました．

```
$ sudo systemctl restart systemd-resolved
```

ちゃんとリンクが張られているか確認します．

```
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 12月 14 08:01 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
```

正常に戻りました．
あとは，`sudo apt update`を行なって，動作するか確認をしてください．

# Vagrantfileで一撃で直す

VM立ち上げにの時に直してくれるようにします．
3行目，`sed`のYour_DNS_IPを自分の環境に合わせたDNSのIPを指定すれば動くと思います．

```Vagrantfile
config.vm.provision "shell", inline: <<-SHELL
    sed -i -e 's/DNS=4.2.2.1 4.2.2.2 208.67.220.220/DNS=Your_DNS_IP/g' /etc/systemd/resolved.conf
    unlink /etc/resolv.conf
    ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
    systemctl restart systemd-resolved
SHELL
```

# さいごに
参考記事では，Ubuntu18.04のバグだったそうですが，20に上がっても同じようにあるんですね．
VMだけではなく，母艦でも同じようなバグがありそうなので，また直面した時に使えそうです．

誰かの助けになれば幸いです．

# 参考記事
https://askubuntu.com/questions/1040595/dns-at-systemds-127-0-0-53-is-ignoring-some-lookups