nmcliでのdeviceとconnectionの紐付け

# deviceとconnection
nmcliでdeviceとconnectionの紐付けがよくわからなかったので調べたメモ。
ネットでは「deviceは物理インターフェースでconnectionは論理的な設定」的な記述があるが、connectionをup/downしたとき、deviceとどう関係しているかよくわからなかった。
`nmcli connection up [connection名]`コマンドはdevice名指定していないのに、なんで特定のdeviceと紐づくの？と不思議だった。

例えば、deviceとconnectionが紐づいていない状態を無理やり作ってみる。
以下ではdevice`eth2,eth3`と、connection`System eth2, System eth3`はそれぞれ切り離され、deviceとconnectionは紐づいていない。

deviceのeth2,eth3のCONNECTIONが設定されていない状態
```
[root@wb01 ~]# nmcli device status
DEVICE  TYPE      STATE                   CONNECTION  
eth0    ethernet  connected               System eth0 
eth1    ethernet  connected               System eth1 
lo      loopback  connected (externally)  lo          
eth2    ethernet  disconnected            --          
eth3    ethernet  disconnected            --          
```
connectionもSystem eth2, System eth3のDEVICEが設定されていない
```
[root@wb01 ~]# nmcli connection show 
NAME                UUID                                  TYPE      DEVICE 
System eth0         5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
System eth1         9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04  ethernet  eth1   
lo                  8f170e18-c5f8-4484-a147-1a58d2fe2d2f  loopback  lo     
System eth2         3a73717e-65ab-93e8-b518-24f5af32dc0d  ethernet  --     
System eth3         c5ca8081-6db2-4602-4b46-d771f4330a6d  ethernet  --   
```
このとき、`connection up`すると、device指定していないのになんで特定のdevice(今回はeth2)に紐づくのか？どうしてeth3に紐づかないのか謎だった。

### `System eth2`のconnectionをupすると・・・
```
[root@wb01 ~]# nmcli connection up System\ eth2
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/9)

### eth2のdeviceにSystem eth2が紐づいている
[root@wb01 ~]# nmcli device status 
DEVICE  TYPE      STATE                   CONNECTION  
eth0    ethernet  connected               System eth0 
eth1    ethernet  connected               System eth1 
eth2    ethernet  connected               System eth2 
lo      loopback  connected (externally)  lo          
eth3    ethernet  disconnected            --          
```
なんでeth3でなくeth2のdeviceに勝手に紐づくのか、とモヤモヤしていたが・・
 
# connectionの中に接続するdeviceが書いているだけだった
なんのことはない、単にconnectionの設定情報に接続するdevice情報が書かれていて、それに従って`connection up`すると設定情報の内容に従ってdeviceに紐づいているだけだった。

connection`System eth2`の設定情報
```
[root@wb01 ~]# nmcli connection show System\ eth2 
connection.id:                          System eth2
connection.uuid:                        3a73717e-65ab-93e8-b518-24f5af32dc0d
connection.stable-id:                   --
connection.type:                        802-3-ethernet
⭐どのdeviceと紐づくか書いてた！
connection.interface-name:              eth2 
connection.autoconnect:                 yes
...
```
で、この単純な事実からわかったこと。
- 論理的な接続情報であるconnectionを複数作成し、deviceと紐づを切り替えることでインタフェースの設定情報を変更できる
- connectionの接続先を変えれば、connectionは変更先のdeviceと紐づけることができる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/0ab31076-8040-715b-a62a-c422ced866f7.png)

`nmcli connection up/down コネクション名`でdeviceと紐づいたり解除されるのは、connectionがdevice情報を持っているので、そりゃーそうだわ・・と納得。

そうすると、以下のようなケースにも対応できそう。

### eth0のインターフェース情報を変える場合、元のconnectionをcloneして、cloneしたconnectionとeth0を紐づける
元のconnection情報はそのままに、コピー（clone）したconnectionを書き換えてdeviceと紐づけことで、eth0の情報を変更できる。失敗したら元のconnection情報に戻せばいい。

試しにeth2インタフェースの設定を変更したい場合、`nmcli connection modify System\ eth2　...`のやり方もあるが、cloneしたconnectionのほうをいじるやり方はこんな感じ。
```
### System eth2コネクションをクローン
[root@wb01 ~]# nmcli connection clone System\ eth2 clone_eth2
System eth2 (3a73717e-65ab-93e8-b518-24f5af32dc0d) cloned as clone_eth2 (ea971115-5c78-4c57-ab93-f9493fc20fd7).

### clone_eth2のクローンされたconnectionができた
[root@wb01 ~]# nmcli connection show 
NAME         UUID                                  TYPE      DEVICE 
System eth0  5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
System eth1  9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04  ethernet  eth1   
System eth2  3a73717e-65ab-93e8-b518-24f5af32dc0d  ethernet  eth2   
lo           0bbc47d5-9614-4588-857b-84f53cab8f5b  loopback  lo     
clone_eth2   ea971115-5c78-4c57-ab93-f9493fc20fd7  ethernet  --     
System eth3  c5ca8081-6db2-4602-4b46-d771f4330a6d  ethernet  --     
```
あとはクローンした`clone_eth2`のconnectionを修正する。
```
### 設定は一例
nmcli connection modify clone_eth2 autoconnect yes
nmcli connection modify clone_eth2 ipv4.method auto
・・・（修正したい分、好きなだけ）
```

変更したら、`eth2`のインタフェース(device)と修正後の`clone_eth2`を紐づける
```
### eth2デバイスはSystem eth2のコネクションと紐づいている
[root@wb01 ~]# nmcli connection show 
NAME         UUID                                  TYPE      DEVICE 
...
System eth2  3a73717e-65ab-93e8-b518-24f5af32dc0d  ethernet  eth2   
...(省略)

### なので、紐付けを外して・・
[root@wb01 ~]# nmcli connection down System\ eth2 

### 今度はclone_eth2と紐づける
[root@wb01 ~]# nmcli connection up clone_eth2 

### 新たなコネクション情報と紐づいた
[root@wb01 ~]# nmcli connection show 
NAME         UUID                                  TYPE      DEVICE 
...
clone_eth2   ea971115-5c78-4c57-ab93-f9493fc20fd7  ethernet  eth2   
...(省略)
```
このやり方だと元のconnection情報がバックアップとしてあるので、勇猛果敢に設定変更して、万が一失敗しても元のconnectionに戻すことができる。（インタフェース全滅してアクセス不可とならない前提で）

いままでnmcliがよくわからないまま使ってた・・・