LoginSignup
11

More than 1 year has passed since last update.

posted at

updated at

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

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

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

一連の操作
# 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 になりますので、また

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

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

rc-local というサービス

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

というわけで、

# 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が実行されます。

# 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のデバイス名をどう取得するかで悩んでしまったので、結局手書きです。

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

# 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忘れたとか? ファイル名を間違えているとか?

/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)
/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
の後追いです。ありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
11