web-dev-qa-db-ja.com

Ubuntu 16.10で起動時にコマンドを実行するにはどうすればよいですか(rc.local alternative)

Ubuntu 16.10を実行しているLinodeサーバーでクォータを設定していますが、次のエラーが表示されます

マウントされたデバイス/ dev/rootをstat()できません:そのようなファイルまたはディレクトリはありません

これを修正するために、 this thread に到達しました。

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

/etc/rc.localに。しかし、Ubuntu 16.10はrc.localを使用せず、代わりに systemd を使用します。 rc.localの代替手段は何ですか、起動時に上記のコマンドを実行するにはどうすればよいですか?

また、systemctl enable rc-local.serviceを使用してサービスを有効にしましたが、うまくいきませんでした。リードをいただければ幸いです。

43
Saurabh Sharma

イントロ

ジョージのリンクで提案されているように、新しいサービスを作成すべきではないと思います。 rc-local.serviceはsystemdに既に存在し、サービスファイルは、rc.localが存在し、実行可能であれば、multi-user.targetに自動的にプルされますを示します。したがって、systemd-rc-local-generatorによって別の方法で行われた何かを再作成または強制する必要はありません。

一つの解決策

簡単な回避策(それが標準的な方法かどうかわかりません):

ターミナルで:

printf '%s\n' '#!/bin/bash' 'exit 0' | Sudo tee -a /etc/rc.local
Sudo chmod +x /etc/rc.local
Sudo reboot

その後、rc.localがシステムの起動時に呼び出されます。必要なものを挿入します。

バックグラウンド

ターミナルで行う場合:

Sudo systemctl edit --full rc-local

ヘッドコメントには次のような行が含まれていることがわかります。

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

これは、このシステムに、実行可能な/etc/rc.localというファイルがある場合、multi-user.targetに自動的にプルされることを示しています。したがって、対応するファイル(Sudo touch...)を作成し、実行可能にする(Sudo chmod +x ...)だけです。

59
Jan

systemdhere の使用を含むこのソリューションが提案されているのを見ました。

  1. サービスを作成します。

    Sudo vi /etc/systemd/system/rc-local.service
    
  2. そこにコードを追加します。

    [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
    
  3. /etc/rc.localを作成して実行可能にし、その中にこのコードを追加します。

    Sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. サービスを有効にします。

    Sudo systemctl enable rc-local
    
  5. サービスを開始してステータスを確認します。

    Sudo systemctl start rc-local.service
    Sudo systemctl status rc-local.service
    
  6. すべてうまくいけば、code/etc/rc.localファイルに追加してから再起動できます。

注:Lubuntu 16.10。でテスト済み.

ソース:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

19
George Udosen

Jan's answer に追加するには、通常のrc.localfileとは異なり、rc-local serviceはすべてのサービスが開始された後ではなく、ネットワークがオンラインになった後に実行されます。

場合によっては、後でrc.localからコマンドを実行することもできます。たとえば、lxd startの後に実行するようにしました。

この場合、ドロップイン構成ファイルrc-local serviceを作成して、/etc/systemd/system/rc-local.service.d/override.conf起動依存関係を編集できます。

[Unit]
After=network.target lxd.service

必要なユニット名を追加できる場所(lxd.serviceを追加したように)

その後systemctl daemon-reloadを忘れないでください。

2
user2586441