動機:WOLを有効にし続けたかった
例えば Wake-on-LAN (WOL) が電源を切ると無効になってしまい、うまく働かないときは、 ethtool
をroot
で実行して有効にしてやる必要があります。(当方では 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.local
を root
で書いて実行ビットを立てておくと、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忘れたとか? ファイル名を間違えているとか?
(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)
(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
の後追いです。ありがとうございました。
コメント@tmoriki
0 @taraijpn
0
ubuntu20.04のrc.localおよびrc.shutdown事情がわからず、さまよっていました。
有用な情報をありがとうございます。
どうも /etc/rc.local, /etc/rc.shutdownともに mod=0755では動かず、mod=0700にするのが必須っぽかったです。
こういう仕様ってどこかにありましたか?
rc-local については、
とあるのでマニュアルを参照すると、
となっていたり、
/usr/lib/systemd/system/rc-local.service
でも実際という書きぶりがあるので、実行ビットは必須に見えますが、ここから『他のユーザーに実行ビットが立っているときは動かないようにする』という条件を見いだすのは困難ですね。何かしら別のサービスが止めているのか、systemd の暗黙の了解なのか、エラーログを参照されるとよいのではないかと思います。
rc.shutdown
については、標準インストール直後にこれを監視しているサービスを見つけられませんでした。などとしても何も表示されなかったので、ちょっと分かりません。何か追加でインストールなり設定なりされているのではないかと思います。