4
@taraijpn

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

4
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
この記事は以下の記事からリンクされています

コメント

ubuntu20.04のrc.localおよびrc.shutdown事情がわからず、さまよっていました。
有用な情報をありがとうございます。

どうも /etc/rc.local, /etc/rc.shutdownともに mod=0755では動かず、mod=0700にするのが必須っぽかったです。
こういう仕様ってどこかにありましたか?


ubuntu@ubuntu:/etc$ ls -l rc.local rc.shutdown
-rwx------ 1 root root 138 Dec  1 12:01 rc.local
-rwx------ 1 root root 134 Dec  1 12:02 rc.shutdown
0

rc-local については、

Docs: man:systemd-rc-local-generator(8)

とあるのでマニュアルを参照すると、

DESCRIPTION
       systemd-rc-local-generator is a generator that checks whether /etc/rc.local exists 
       and is executable, and if it is pulls the rc-local.service unit into the boot process. 

となっていたり、/usr/lib/systemd/system/rc-local.service でも実際

ConditionFileIsExecutable=/etc/rc.local

という書きぶりがあるので、実行ビットは必須に見えますが、ここから『他のユーザーに実行ビットが立っているときは動かないようにする』という条件を見いだすのは困難ですね。何かしら別のサービスが止めているのか、systemd の暗黙の了解なのか、エラーログを参照されるとよいのではないかと思います。

rc.shutdown については、標準インストール直後にこれを監視しているサービスを見つけられませんでした。

# grep -Ir rc.shutdown /usr/lib/systemd/

などとしても何も表示されなかったので、ちょっと分かりません。何か追加でインストールなり設定なりされているのではないかと思います。

0
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
エンジニアによるマネジメント - エンジニアだからこそ発信できるマネジメントの知識を発信しよう
~
競技プログラミング研究月間 - みんなでさらなる高みを目指そう
~