Как выполнить команду при запуске (альтернатива rc.local) в Ubuntu 16.10?

Я устанавливаю квоту на моем сервере Linode под управлением Ubuntu 16.10, и я получаю следующую ошибку

Невозможно stat() подключенное устройство /dev/root: нет такого файла или каталога

Таким образом, чтобы исправить это, я достиг этой темы для исправления, которое делается путем добавления

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 но это не сработало для меня. Любое руководство будет оценено.

3 ответа

Решение

вступление

Я думаю, что вы не должны создавать новый сервис, как предложено в ссылке Джорджа. 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 ...).

Я видел это решение, которое предполагает использование systemd здесь:

  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

Чтобы добавить к ответу Яна, что, в отличие от обычного rc.localфайл, rc-local service выполняется не после запуска всех служб, а после выхода в сеть

В некоторых случаях вы можете запускать команды из rc.local потом. Например, я хотел, чтобы он был выполнен после lxd Начните.

В этом случае вы можете редактировать rc-local service зависимости при запуске, создавая выпадающий файл conf:/etc/systemd/system/rc-local.service.d/override.confс содержанием:

[Unit]
After=network.target lxd.service

Где вы можете добавить имя нужного устройства (как я добавил lxd.service)

Не забудь systemctl daemon-reload после этого.

Другие вопросы по тегам