Ubuntu Server 24.04.1 LTSでWi-Fiが繋がらなかった話

# 結論
　systemd-networkdではなくNetworkManagerを使って解決しました。

　Ubuntu Serverではsystemd-networkdがデフォルトになっており、Desktop版ではNetworkManagerがデフォルトになっているようです。

　Desktop版ではWi-Fiが繋がっていたのに、Server版では繋がりませんでした。そこで、Desktop版と同様にNetworkManagerを利用してみたところWi-Fiモジュールが上手く動作してくれました。

# 以下、大いなる余談
　使っていなかったノートPCを活用しようと思い立ち、Linuxでも入れて自宅内のサーバとして使ってみることにした。

　使用するノートPCは2011年に東芝から発売されたR731/Bである。2016年頃にジャンク品として数千円で購入した気がする。~~（7,000円くらいで購入したジャンクのノートPCにBIOSロックが掛かっていて、仕方なく捨てた悲しい記憶の方が鮮明に残っている。秋葉原から自宅までゴミを運んでいたんだなぁ）~~

　以下、簡単なスペック。購入後に中古でRAMを増設して、SSDを新調していた。

|仕様|詳細|
|---|---|
|型式|R731/B|
|CPU|Core i5-2520M|
|RAM|8GB|
|SSD|120GB|
|NIC|Intel Centrino Advanced-N 6205|

 　ノートPCを久々に開いてみると、Ubuntu Desktopを入れていたようで22.04が起動した。そういえば、入れただけで何も活用していなかった。今回も、そうなるやもしれない。

　化石のようなノートPCなのと、サーバ用途ということからUbuntu Serverを入れてみることにした。一番の理由はただの興味本位だけど。

<details><summary>思い出話：Ubuntu君との出会い</summary>

　初めてUbuntuと出会った時期を思い出す。あれは、Windows Vistaが重くて使いようもなくなった時だった。当時使っていたノートPCの構成はCPUがCeleronの32bitで、RAMが2GB、SSDなんて物は無かったのでストレージは勿論HDD。

　今となっては原始時代かのような性能だ。そういえばPSP発売当初なんて、メモリースティックなんか32MBの物を使っていた。

　使っていく内に発熱するようになり、CPU温度が100℃に張り付いてファンがグルグル回るだけの悲しい怪物になってしまった。OSをUbuntuに入れ替えたところ、何とか普通に動くようになって感動した記憶がある。

　今思えば、Windowsもクリーンインストールすればまともに動作したのかもしれない。
</details>

## おいおい、Wi-Fiが繋がらないぞ

　さて、Ubuntu Serverをインストールしてみたはいいものの、Wi-Fiが繋がらないではないか。インターネットに繋げられなければ、ただの光る板とボタンの集合になってしまう。

　まずは`networkctl`を実行してネットワークデバイスの状態を確認。下記のようになり、インストール時にWi-Fiの設定をしたものの接続されていない。

```console
$ networkctl
IDX LINK    TYPE     OPERATIONAL SETUP
  1 lo      loopback carrier     unmanaged
  2 enp0x25 ether    off         unmanaged
  3 wlp4s0  wlan     no-carrier  configuring
```

　物理的にLANケーブルを差してみようにも持ってないし、どうしようかと思いながらネットを調べていると、**USBテザリングすればええじゃないか**、というコメントを発見。なるほど……で、Ubuntu ServerでUSBテザリングってどうやるんじゃ。

　という訳で、調べたことを下記にまとめました。

1. USBケーブルでスマホを接続してUSBテザリングをオンに変更
1. `networkctl`でUSBテザリングしているNICの名前を把握
1. 対象のNICに対してnetplanの設定を記述
1. `netplan apply`で設定を適用
1. `networkctl`で状態を確認

　USBテザリングをONにすると、`networkctl`の結果が下記のように変わる。

```console
$ networkctl
IDX LINK             TYPE     OPERATIONAL SETUP
  1 lo               loopback carrier     unmanaged
  2 enp0x25          ether    off         unmanaged
  3 wlp4s0           wlan     no-carrier  configuring
  4 enx7e7710db0f44  wlan     no-carrier  unmanaged
```

　新しく追加されたものがUSBテザリングで認識されたものである。しかし、unmanagedの状態なのでsystemd-networkdで管理されていないため、設定しなければならない。

　Ubuntuのネットワーク関係はnetplanというもので管理されているらしい。IPアドレスをDHCPで設定するなら99_config.yamlを作成して設定してね、とかなっているようだ。これに関しては下記が参考になった。

https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5

https://ubuntu.com/server/docs/configuring-networks

　なお設定ファイルのversionで2と記述するのはMAAS/curtinというツールでversion 1を使用しているかららしい。rendererにはnetworkdやNetworkManagerを設定する。また、IPv4のDHCPを有効にするのでdhcp4をtrueに設定。

 ```yaml:99_config.yaml
 network:
  version: 2
  renderer: networkd
  ethernets:
    enx7e7710db0f44:
      dhcp4: true
 ```

　`netplan apply`をして設定を適用するのだけど、下記のように「権限が広すぎるよ。Netplanの設定は他人からアクセスされないようにしてよね」、と怒られる。
 
 ```
 WARNING 11:15:10:211: Permissions for /etx/netplan/99_config.yaml are too open. Netplan configuration should NOT be accessible by others.
 ```

　確かに`ls -l`でファイルの属性を見ると権限部分が`-rw-r--r--`となっているので`sudo chmod 600 /etc/netplan/99_config.yaml`を実行して権限を変更して、再度`netplan apply`をして設定を適用する。

　すると、ネットワークデバイスの状態が下記のように変化する。

```console
$ networkctl
IDX LINK             TYPE     OPERATIONAL SETUP
  1 lo               loopback carrier     unmanaged
  2 enp0x25          ether    off         unmanaged
  3 wlp4s0           wlan     no-carrier  configuring
  4 enx7e7710db0f44  wlan     routable    configured
```

　こうして、何とかUSBテザリングでネットワークに繋げることができた。とりあえず`sudo apt upgrade -U`でもして最新化しておこう。

# 内蔵のWi-Fiモジュールで繋ぎたいよね

　余っているスマホがあって、それをずっとUSBテザリングして使うんで問題なければいいけれど、やっぱりノートPCに内蔵されているWi-Fiモジュールを利用したい。

　そこで、ふと思った。 **Desktop版ではWi-Fiが繋がっていたではないか**、と。ならばと、Desktop版をインストールして確認してみることに。（インストールする必要はなく、ライブ版で試せば十分だった）

　Desktop版での`networkctl`の実行結果は下記の通りで、systemd-networkdは動作していなかった。

```console:Ubuntu Desktop 24.04.1 LTS
$ networkctl
systemd-networkd is not running, output might be incomplete.
IDX LINK    TYPE     OPERATIONAL SETUP
  1 lo      loopback -           unmanaged
  2 enp0x25 ether    -           unmanaged
  3 wlp4s0  wlan     -           unmanaged
```

　本記事の冒頭でも書いたように、Ubuntu Serverではsystemd-networkdがデフォルトになっており、Desktop版ではNetworkManagerがデフォルトになっているようだ。

　という訳でNetworkManagerを`sudo apt install network-manager`でインストールしよう。installするとrestartを推奨する文言が出るので`reboot`するのだけど、その前にnetplanの設定をしておこう。（下記のipアドレスとかは適当）

 ```yaml:99_config.yaml
 network:
  version: 2
  renderer: NetworkManager
  wifis:
    wlp4s0:
      dhcp4: false
      access-points:
        Buffalo-D-Raemon:
          password: nobita
      addresses:
        - 192.168.0.2/24
      nameservers:
        addresses:
          - 192.168.0.1
        search: []
      routes:
        -to: default
        via: 192.168.0.1
 ```

　次にNICの管理をNetworkManagerに設定し、systemd-networkd関連のサービスを無効化して再起動後、`nmcli`でNICがNetworkManagerで管理されているか確認する。

```console
$ nmcli d set wlp4s0 managed yes
$ sudo systemctl stop systemd-networkd.socket
$ sudo systemctl stop systemd-networkd
$ sudo systemctl disable systemd-networkd
$ reboot
$ nmcli d
DEVICE  TYPE     STATE                  CONNECTION 
wlp4s0  ethernet connected              netplan-ens160 
lo      loopback connected (externally) lo
enp0s25 ethernet unavailable            --
```

　こうして、Wi-Fiでの通信に成功したのでした。

# 最後に

　こういったエラー解決というのは面白く、根気強くやって少しずつ解決していく過程が楽しいけど、疲れる。

　NetworkManagerだと動いて、systemd-networkdだと動かない理由は分かりませんでした。誰か御存知であれば教えてください。

# 参考
　`networkctl`に関して。OPERATIONALやSETUP欄の値の意味なども載っている。

https://www.freedesktop.org/software/systemd/man/latest/networkctl.html

　`ls -l`の結果の見方など。

https://atmarkit.itmedia.co.jp/ait/articles/1605/18/news015.html

　systemd-networkからNetworkManagerへ変更する方法など。

[Ubuntu Serverで保存先のネットワークを選択してもホスト名が表示されない – Actiphy.com](https://actiphyhelp.zendesk.com/hc/ja/articles/34292606477977-Ubuntu-Serverで保存先のネットワークを選択してもホスト名が表示されない)