Как я могу выполнить команду при запуске (альтернатива 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 но у меня это не сработало. Любая зацепка была бы признательна.

Вступление

Я думаю, вам не следует создавать новую службу, как это было предложено в ссылке Джорджем.То 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.localsudo chmod +x /etc/rc.localsudo 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 CompatibilityConditionPathExists=/etc/rc.local[Service]Type=forkingExecStart=/etc/rc.local startTimeoutSec=0StandardOutput=ttyRemainAfterExit=yesSysVStartPriority=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.servicesudo 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 после этого.

вы запустили его от имени root и перезапустили ли вы свою систему?

@Джордж да, я сделал и то, и другое

попробуй this

@Джордж, это работает не так хорошо

Только что видел этот хак, посмотрим, сработает ли он…

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

Пакет квот не должен искать /dev/root. Исправьте основную ошибку, и тогда вам не нужно будет создавать эту символическую ссылку. Он должен быть настроен на включение квот для всех файловых систем, перечисленных в /etc/fstab (предпочтительно по uuid) с опцией квотирования.

@psusi что я должен использовать вместо /dev/root? Я настраиваюсь с помощью этого https://www.howtoforge.com/tutorial/ubuntu-perfect-server-with-apache-php-myqsl-pureftpd-bind-postfix-doveot-and-ispconfig/2/#g0.0.16

@psusi Проблема, похоже, связана именно с linode https://licensecart.com/plugin/support_manager/knowledgebase/view/270/quotas-are-off-on-linode-xen-vps/5/

Упоминается ли в вашем файле /etc/fstab /dev/root? Этого не должно быть.