Ubuntu 20.04 LTS でも rc.local は使える

## 動機：WOLを有効にし続けたかった

例えば Wake-on-LAN (WOL) が電源を切ると無効になってしまい、うまく働かないときは、 `ethtool` を`root` で実行して有効にしてやる必要があります。(当方では ASUS PRIME B450M-A で起こっています。）

```terminal:一連の操作
# apt-get install ethtool
# ip addr
(略: WOLを受け付けるNICのデバイス名を探している)
2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
(略)
# /usr/sbin/ethtool enp7s0 | grep Wake
        Supports Wake-on: pumbg
        Wake-on: d
（disableになっている）
# /usr/sbin/ethtool -s enp7s0 wol g
# /usr/sbin/ethtool enp7s0 | grep Wake
        Supports Wake-on: pumbg
        Wake-on: g
（magic packetによるWOLが有効になっている）
```

この状態でPCをシャットダウンすればWOLは有効のまま電源が切れますが、次回起動時に disable になりますので、また 

```terminal
# /usr/sbin/ethtool -s enp7s0 wol g
``` 

を実行しなければいけません。

## rc-local というサービス

起動時に実行したいプログラムは、スクリプトを書いてサービスとして登録しましょうというのが systemd の流儀なわけですが、Ubuntu 20.04 LTS の場合 `/etc/rc.local` を `root` で書いて実行ビットを立てておくと、`rc-local` というサービスによって自動的に実行されるようになっています。

というわけで、

```terminal
# ls -la /etc/rc.local
-rwx------ 1 root root 44  8月 12 15:49 /etc/rc.local
# cat /etc/rc.local
#!/bin/sh
/usr/sbin/ethtool -s enp7s0 wol g
```

といった具合になるよう `root` で `/etc/rc.local` を書いて保存し、`chmod`で実行ビットを立てておけば、次回からは再起動するたびに`/etc/rc.local`が実行されます。

```terminal
# cat >> /etc/rc.local
#!/bin/sh
/usr/sbin/ethtool -s enp7s0 wol g
# chmod 700 /etc/rc.local
# ls -la /etc/rc.local
-rwx------ 1 root root 44  8月 12 19:19 /etc/rc.local
```

~~もちろん `>` を使う危険なやりかたは `/etc/rc.local` が存在しないと分かっているときに限ります。~~
上書き削除の危険を回避するために `>>` を使いました。もちろん普通はエディタで書き、編集後の内容もきちんと確認しましょう。
ansible で書きたいところですが、有効化するべきNICのデバイス名をどう取得するかで悩んでしまったので、結局手書きです。

また、再起動するたびと言わず、すぐ実行してしまいましょう。

```terminal
# ethtool enp7s0 | grep Wake
        Supports Wake-on: pumbg
        Wake-on: d
# systemctl restart rc-local
# ethtool enp7s0 | grep Wake
        Supports Wake-on: pumbg
        Wake-on: g
# systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: active (exited) since Wed 2020-08-12 19:27:52 JST; 2min 15s ago
       Docs: man:systemd-rc-local-generator(8)
    Process: 1775 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)

 8月 12 19:27:52 cliA2 systemd[1]: Starting /etc/rc.local Compatibility...
 8月 12 19:27:52 cliA2 systemd[1]: Started /etc/rc.local Compatibility.
```

rc-local サービスが動作したことが確認できます。

なお `/etc/rc.local` の有無で `rc-local` サービスがどのように動作するるか比較したのが下図です。`/etc/rc.local`を書いたのに実行されていない（書いていないのと同等のActiveになっている）場合は、何らかの事情でスクリプトが実行されていません。chmod忘れたとか？ ファイル名を間違えているとか？ 

```terminal:/etc/rc.localを書いていないとき
(PC起動後)
# systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: inactive (dead)
       Docs: man:systemd-rc-local-generator(8)
```

```terminal:/etc/rc.localを書いて実行可能にしたとき
(PC起動後)
# systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/lib/systemd/system/rc-local.service; enabled-runtime; vendor preset: enabled)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: active (exited) since Wed 2020-08-12 15:13:55 JST; 8min ago
       Docs: man:systemd-rc-local-generator(8)
    Process: 1059 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)

 8月 12 15:13:55 cliA1 systemd[1]: Starting /etc/rc.local Compatibility...
 8月 12 15:13:55 cliA1 systemd[1]: Started /etc/rc.local Compatibility.
```

## 参考

この記事は下記記事
https://qiita.com/tanyorg/items/401cbadd88fa3fe0b9d3
の後追いです。ありがとうございました。