Ubuntu – How to execute command on startup (rc.local alternative) on Ubuntu 16.10

16.10systemd

I am setting up quota on my Linode server running Ubuntu 16.10, and I get the following error

Cannot stat() mounted device /dev/root: No such file or directory

So to fix this, I reached this thread for the fix which is done by adding

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

to the /etc/rc.local. But Ubuntu 16.10 doesn't uses rc.local anymore instead uses systemd. What is the alternative for rc.local, How can I run the above commands on startup?

Also I enabled the service using systemctl enable rc-local.service but it didn't work for me. Any lead would be appreciated.

Best Answer

  • Intro

    I think you should not create a new service as suggested in the link by George. The rc-local.service already exists in systemd and the service file suggests that the rc.local, if it exists and is executable, gets pulled automatically into multi-user.target. So no need to recreate or force something that is just done in another way by the systemd-rc-local-generator.

    One solution

    A quick solution (I don't know if that's the canonical way):

    In a terminal do:

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

    After that the rc.local will be called upon system startup. Insert what you like.

    Background

    If you do in a terminal:

    sudo systemctl edit --full rc-local
    

    You can see that the head comment contains lines such as:

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

    This indicates, that in this system, if there is a file called /etc/rc.local which is executable, then it will be pulled into multi-user.target automatically. So you just create the according file (sudo touch...) and make it executable (sudo chmod +x ...).

  • Related Question