それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

NetworkManagerがunmanaged(管理なし)になった問題を解決した

network-manager で管理できない。

network-manager で unmanaged になって、ubuntu desktop (gnome) からネットワークが管理できなかった。

依存関係が多くて、問題がわかりにくい。

ubuntu は 1年前から、 netplan が導入されているので、ubuntu server は systemd-networkd で管理、 ubuntu desktop は NetworkManager で管理することになっている。

それでは、/etc/network/interfaces はどうなったのか?

network-manager のときは、 network-manager が /etc/network/inteface をparsing して管理デバイスを見つけた上で除外し、残ったデバイスを管理するようになっている。

ただし、この設定はキャッシュされるらしい。(マジだったら、コレはホントめんどくさいわ)

networkd のときは、 networkd の起動後に /etc/network/intefaces を取得して管理する。こっちも面倒くさい。

デスクトップubuntu では networkd はいらない

使ってもいいんだけど、依存関係が多くて面倒くさいので、除外して切り分ける

sudo systemctl stop systemd-networkd.service
sudo systemctl disable systemd-networkd.service
sudo systemctl mask systemd-networkd.service

netplan の設定をシンプルにする。

netplan は networkmanager を使う設定にして、シンプルにする。

takuya@:~$ cat /etc/netplan/01-netcfg.yaml 
network:
  version: 2
  renderer: NetworkManager

netplanの設定を再生成してあげる

sudo netplan generate

これで、余計なものは動かなくなる。

ただし、場合分けのために除外し過ぎくらい除外してる。なので、netplan apply すら動かない。

この辺は、正直言ってubuntu の問題だろうなぁ。 networkmanager を指定してるのに 一旦 networkd を経由しようとしている。

takuya@:~$ sudo netplan generate 
takuya@:~$ sudo netplan apply 
Failed to start systemd-networkd.service: Unit systemd-networkd.service is masked.
Traceback (most recent call last):
  File "/usr/sbin/netplan", line 23, in <module>
    netplan.main()
  File "/usr/share/netplan/netplan/cli/core.py", line 50, in main
    self.run_command()
  File "/usr/share/netplan/netplan/cli/utils.py", line 130, in run_command
    self.func()
  File "/usr/share/netplan/netplan/cli/commands/apply.py", line 44, in run
    self.run_command()
  File "/usr/share/netplan/netplan/cli/utils.py", line 130, in run_command
    self.func()
  File "/usr/share/netplan/netplan/cli/commands/apply.py", line 153, in command_apply
    utils.systemctl_networkd('start', sync=sync, extra_services=netplan_wpa)
  File "/usr/share/netplan/netplan/cli/utils.py", line 82, in systemctl_networkd
    subprocess.check_call(command)
  File "/usr/lib/python3.7/subprocess.py", line 363, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['systemctl', 'start', '--no-block', 'systemd-networkd.service']' returned non-zero exit status 1.

NetworkManager の設定は多ファイルに分割されている

NetworkManager の設定ファイルは、/etc/NetworkManager だけでなく、 /usr/lib/NetworkManager などにデフォルト設定あったりして、それらがマージされて /etc/NetworkManager で上書きするようになっている。

takuya@:~$ sudo NetworkManager  --print-config
# NetworkManager configuration:
 /etc/NetworkManager/NetworkManager.conf (lib: 10-dns-resolved.conf, no-mac-addr-change.conf)
(run: netplan.conf) 
(etc: 10-globally-managed-devices.conf, default-wifi-powersave-on.conf)


## 略

/etc/NetworkManager で設定ファイルを見てもすべてが記載されているわけでじゃないので、 --print-config で最終的な設定を確認するのがポイント

ifupdown を使わないようにする。

ifupdown は /etc/network/interfaceを管理するので、 ifupdown も切り分けのために一旦無効化する。

sudo apt uninstall ifupdown
sudo apt uninstall ifupdown2
sudo apt uninstall netscript-2.4 

NetworkManager.conf でunamanged デバイスをすべて上書きして無効化する。

設定方法は、いくつか考えられるのだけど、umamanged になる問題を解決するために、すべての設定をOFFにしたり消していく。

takuya@:~$ cat /etc/NetworkManager/NetworkManager.conf 
[main]
#plugins=ifupdown,keyfile
plugins=keyfile
dns=default

[keyfile]
unmanaged-devices=
#[ifupdown]
#managed=true

[device]
wifi.scan-rand-mac-address=yes

ちなみに、ifupdownのmanaged は ifup/ifdown で管理される /etc/network/intefacesを nmcli で管理するかどうか。

restart する

あれこれ、余計なものを排除した結果動くようになる、

takuya@:~$ sudo systemctl status network-manager.service 
● NetworkManager.service - Network Manager
   Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-10-21 17:20:33 JST; 10s ago
     Docs: man:NetworkManager(8)
 Main PID: 4474 (NetworkManager)
    Tasks: 4 (limit: 4915)
   Memory: 4.0M
   CGroup: /system.slice/NetworkManager.service
           └─4474 /usr/sbin/NetworkManager --no-daemon

10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9682] device (enp3s0): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'assume')
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9809] device (enp3s0): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'assume')
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9813] device (enp3s0): state change: secondaries -> activated (reason 'none', sys-iface-state: 'assume')
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9819] manager: NetworkManager state is now CONNECTED_LOCAL
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9832] manager: NetworkManager state is now CONNECTED_SITE
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9834] policy: set '有線接続 1' (enp3s0) as default for IPv4 routing and DNS
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9876] device (enp3s0): Activation: successful, device activated.
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9885] manager: NetworkManager state is now CONNECTED_GLOBAL
10月 21 17:20:33 j5005 NetworkManager[4474]: <info>  [1571646033.9892] manager: startup complete
10月 21 17:20:34 j5005 NetworkManager[4474]: <info>  [1571646034.0348] bluez5: NAP: added interface 00:09:DD:50:6C:BF

管理下に置かれる

takuya@:~$ nmcli d
DEVICE  TYPE      STATE     CONNECTION 
enp3s0  ethernet  接続済み  有線接続 1 
lo      loopback  管理無し  --         

unmanaged だったのが

f:id:takuya_1st:20191021172309p:plain

managed になる。

f:id:takuya_1st:20191021172202p:plain

なんでこんなにめんどくさいのか

過渡期とはいえ、systemd 関連の更新と整合性を保つために、あれこれ機能が追加されている。

あれこれ過渡期だからでしょうね。 nmcli や netplan を諦めて /etc/network/interfacesだけに戻すか、素直にnetworkd だけにしたほうが将来的に楽なのかなぁ。

今回驚いたのは ifup/down のコマンドを提供するパッケージが3つもあったことだった。ネットワーク周りはカオスですね。