How can I execute command on startup (rc.local alternative) on Ubuntu 16.10

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.

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 ...).

Attribution
Source : Link , Question Author : Saurabh Sharma , Answer Author : Jan

Leave a Comment