簡単に言うと、プロセスが初めて接続を使用しようとしたときに、接続が利用できないために失敗した場合、そのプロセスはネットワークを使用する能力を回復することはできません。そのプロセスを強制終了して再起動する必要があります。
'google.com' を 3 回解決しようとする Ruby スクリプトがあります。NetworkManager 経由でネットワークを無効にするか、物理的な WLAN スイッチをオフにしてスクリプトを起動し、一度失敗させてからネットワークを再度有効にすると、システムの残りの部分にネットワークがあっても、他の 2 つの解決も失敗します。
同様の Python スクリプトでも、ブラウザ Lynx でも同じ結果が示されます。ただし、Firefox ではありません。これらの動作はすべて、最新の Manjaro x64 XFCE を実行している VM と物理マシンの両方でテストされています。最新の Ubuntu x64 では、同じテストが正常に機能します。
なぜこのようなことが起こるのでしょうか? これはバグ、機能、または不具合でしょうか?
編集:
Manjaro では、 の内容は/etc/resolv.conf
resolvconf によって再生成されます。
- ネットワークが有効:
search lan; nameserver 192.168.1.1
- ネットワークが無効です: ファイルが空です
Ruby/Python/Lynx はresolv.conf
一度だけ読み取る必要があります。そのため、最初のリクエストでは空のファイルが見つかり、それ以降は名前を解決できなくなります。
Ubuntuでは、次のようになります/etc/resolv.conf
。
- ネットワークが有効:
nameserver 127.0.1.1; search lan
- ネットワークが無効です:
nameserver 127.0.1.1
そのため、Ruby/Python/Lynx が無効なネットワーク上でそれを読み取る場合、接続が回復したときに接続できるネームサーバーがまだあります。Manjaro の設定の問題は、接続がないとネームサーバーがないことです。Ubuntu は 127.0.1.1 に対して dnsmasq を実行しますが、Manjaro は実行しません。
答え1
私の見解では、解決策は 2 つあります。
- resolvconf.conf を編集します:
name_servers=192.168.1.1
または、最も一般的なネームサーバーを編集します。問題: すべてのネームサーバーが私のものと同じではありません。別のネットワークに接続すると、ネームサーバーがそこに存在しない可能性がある192.168.1.1
ため、プロセスは壊れたままになります。192.168.1.1
- NetworkManager で dnsmasq を設定して使用する数行追加することで
NetworkManager.conf
両方試してみましたが、どちらでも症状は回避できました。2 番目の方法の方がすっきりしていてセットアップも簡単ですが、それほど軽量ではありません。