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


11

私は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

助言がありますか?

回答:


16

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

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

#このファイルはsystemdの一部です。
#
#systemdはフリーソフトウェアです。再配布および/または変更できます
#GNU General Public Licenseの条件に基づいて発行
#フリーソフトウェア財団; ライセンスのバージョン2、または
#(オプションで)それ以降のバージョン。

[単位]
Description = / etc / rc.localの互換性
ConditionPathExists = / etc / rc.local

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

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


この2つのファイルは既に存在し:/etc/systemd/system/multi-user.target.wants/rc-local.service/lib/systemd/system/rc-local.service
フェリックス・ヤン

2
おそらく無効になっています。実行してみてくださいsystemctl enable rc-local.service。引き続き問題が発生する場合は、の出力を投稿してくださいsystemctl status rc-local.service
パッチ

5
Installセクションのないユニットでは「enable」を発行できません。この例はおそらく機能しません。
lzap

1
一方、ファイル(できればリンク)multi-user.target.wantsがまさにそれを可能にします。
パベルシメルダ

28

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


1
これは、rc-local.service経由で有効化されたサービスではなかったsystemctl enableが、2011年以降はジェネレーターによって自動有効化されたサービスであるためです。 ただしunix.stackexchange.com / a / 471871/5132で説明されているように、Arch Linux は、最初にジェネレーターを提供するsystemdの後方互換性オプションをオンにしません。
JdeBP


2

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

4
systemd最初のコードスニペットに示すように、サービスファイルを実行可能にすることは無意味です。また、Arch Linuxでは、ファイルパスは/etc/rc.local- systemdサービスファイルの内容が正しくない可能性があります。
RavuAlHemio

1

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

/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
これは実際には真実ではありません。unix.stackexchange.com/a/471871/5132で説明されているように、Archは後方互換性メカニズムを使用せず、このジェネレーターもありません。
JdeBP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.