web-dev-qa-db-ja.com

systemdは/etc/rc.localを実行しませんか?

私はArchlinuxを使用していて、最近systemdを試し始めました。

しかし、systemdが/etc/rc.localスクリプトをロードしないことがわかりました。

Wikiページで述べたように、私はsystemctl enable rc-local.service、しかしこれは助けにはなりませんでした。

/etc/rc.localファイルの内容は次のとおりです。

echo -n 120 > /sys/devices/platform/i8042/serio1/speed
echo -n 250 > /sys/devices/platform/i8042/serio1/sensitivity
iptables --table nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

助言がありますか?

12
Felix Yan

Archはrc.localの実行に必要なサービスユニットファイルを含んでいない可能性があります。

次の内容のファイル/etc/systemd/system/rc-local.serviceを作成するだけです(Fedora systemdシステムからそのままコピーします)。

#このファイルはsystemdの一部です。
#
#systemdはフリーソフトウェアです。 GNU一般公衆利用許諾契約書
#によって公開されている一般公衆利用許諾契約書)の条件に基づいて、再頒布および/または変更することができます
#;バージョン2または、
#(オプションで)以降のバージョン。
 
 [Unit] 
 Description =/etc/rc.local互換性
 ConditionPathExists =/etc/rc.local 
 
 [Service] 
 Type = forking 
 ExecStart =/etc/rc.local start 
 TimeoutSec = 0 
 StandardOutput = tty 
 RemainAfterExit = yes 
 SysVStartPriority = 99

次に、systemctl enable rc-local.serviceをrootとして実行して有効にします。 systemctl start rc-local.serviceを実行して、今すぐテスト/実行することもできます。

16
Patches

Systemd 188-2を使用すると、systemdは[Install]セクションがないため、rc.localサービスを有効にできないことを報告します。以前のバージョンではそうだったかもしれませんが、Arch開発者が最近発表したsystemdがデフォルトになるので、システムを修正しています。

これを修正するには、/etc/systemd/system/rc-local.serviceにマルチユーザーターゲットのセクションを追加するだけです。

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

/etc/rc.localスクリプトを作成し、chmod +x /etc/rc.localで実行可能にします

28
Borromini

Pkgfile(私のシステム上)は言う:

$ pkgfile --search rc-local.service
community/initscripts-systemd

そのパッケージはあなたが望まないかもしれない他のものをインストールしますが、それを無効にすることができます。参照: https://wiki.archlinux.org/index.php/Systemd#The_initscripts-systemd_package

4
tck42

Rc.localを実行可能にすることを忘れないでください-そうでなければ互換性レイヤーはそれを実行しません!上記の例では、rc.localファイルを実行可能にするためにchmod a + xを実行します。次のように:

$ chmod a+X /etc/systemd/system/rc-local.service 

別の問題として考えられるのは、rc.localスクリプトの場所です。 systemdに互換性をまだ追加していない場合(組み込みである必要があり、すでに存在しているという以前の言及によると思われる)ファイルの場所を再確認する必要があるかもしれません...私のOSではrc-localを使用しています/etc/rc.d/rc.localにあるので、以下を実行しました。

$ Sudo chmod a+x /etc/rc.d/rc.local
$ Sudo systemctl restart rc-local.service
$ Sudo systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
      Loaded: loaded (/lib/systemd/system/rc-local.service; static)
      Active: active (exited) since Fri, 13 Apr 2012 14:42:39 -0600; 3s ago
     Process: 2285 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/rc-local.service
2
Rio1

2つの一般的な問題:

  1. /etc/rc.d/rc.localを実行可能にすることを忘れないでください。使用できます

    # chmod a+rx /etc/rc.d/rc.local
    

    実行可能にする。

  2. #!/bin/shの最初の行に/etc/rc.d/rc.local行を入れることを忘れないでください。以下に、状況を示します。

    #  head -1 /etc/rc.d/rc.local 
    #!/bin/sh
    # file /etc/rc.d/rc.local 
    /etc/rc.d/rc.local: POSIX Shell script, ASCII text executable
    

    同様の出力が得られない場合は、/etc/rc.d/rc.localを編集して、#!/bin/shだけを含む行を最上部に追加します。

1
D.W.

/etc/rc.localを実行可能ファイルとして持っている場合、systemd-rc-local-generator/rc-local.serviceによって起動プロセスに取り込まれます。

少なくとも/etc/rc.localが使用するデフォルトのパスですが、これはディストリビューションによって設定されます。それは主に下位互換性のためであり、異なるディストリビューションが異なるパスを使用していたためです。例えば。 Fedoraでは、パスは/etc/rc.d/rc.localです。次のようにパスを確認できます。

$ systemctl cat rc-local.service
# /usr/lib/systemd/system/rc-local.service
# ...

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

これはあまり知られていないようです。以前のバージョンのファイルを示す投稿がいくつかありますが、そのようなコメントはありません。

1
sourcejedi