Today I re-installed my home Intel NUC to Ubuntu 16.04. And I have to re-install and re-setup my ResilioSync service. I have to change the default deamon user to my login user, so the daemon process can access my mounted external hard driver. I guess some people will have the same problem, so in this article I will share the step to do it.
(If you have not installed resilio sync in your ubuntu yet, here is the official steps to do it)
By default the resiliosync service is running under rslsync user and group, but my external NTFS driver is mounted as my login user, which makes the rslsync service failed to create files or folders in my mounted NTFS directory.
I checked the background daemon process, and found it was running under a separate user rslsync:
that’s why it can not access other folders. To solve this problem, one work around is to use
chown to change the user and group of the folder to
rslsync, but it is not good enough. Let’s try to do the right thing, which is run the rslsync daemon process under the same user as your login user.
Run daemon under login user
As you may know, the latest Ubuntu finally start to use systemd and the default service manager. Here our resilio service is also running under the control of systemd. We can see the unit file by this command:
As we can see, it explicitly specified the user and group to
rslsync, and even created directory and set the owner to this default
We just need to change the
Group options value to our username and group name. But before doing that, I found something better we can do. When I check the default
config.json file, I found there is an additional script in that same folder:
laputa@laputa-nuc-ubuntu:~$ ll /etc/resilio-sync/
drwxr-xr-x 1 root root 92 Dec 24 23:03 ./
drwxr-xr-x 1 root root 4222 Dec 24 12:05 ../
-rw-r--r-- 1 root root 172 Dec 24 23:03 config.json
-rwxrwxr-x 1 root root 496 Dec 22 23:20 init_user_config.sh*
-rw-r--r-- 1 root root 193 Dec 22 23:20 user_config.json
init_user_config.sh file, it’s executable, let’s see what’s inside the script:
its logic is very clear, this script helps us create a resilio config folder and config file for a normal user, which means if I run this script by my login user, I will have every config file under my home folder. Let’s do it and see what we will get:
It’s good. It creates a config file for our login user(as you can see, my login user name is
laputa) and fill in necessary values in the config file. Next step, we just need to change the systemd service file to make it work.
Fortunately, systemd provides a convenient way to override the service unit file and provide our own configurations. It’s called a drop-in snippet:
this command will create a file named /etc/systemd/system/resilio-sync.service.d/override.conf , and as the name says, it will override the original unit file in /lib/systemd/system/resilio-sync.service, a few things to mention:
- User & Group: just set to our normal login user name
- PIDFile: changed to the file in our new user config.json file, systemd will use this file to get the main PID
- ExecStartPre: set to empty so we can clear the settings in original unit file, because we are using our own home directory, we don’t need to create and set owners
- ExecStart: first set to empty to clear the settings in original unit file, this is same as above because systemd only allows one
ExecStartoption. Then we set the similar start command but specify to use our new user config file
After we save the file, we can see systemd pickup the override file:
Next we can reload the systemd config, and restart the resilio sync service:
$ sudo systemctl daemon-reload
$ sudo systemctl restart resilio-sync.service
$ ps aux | grep rslsync
laputa 2648 1.0 0.0 499472 12980 ? Ssl 05:21 0:00 /usr/bin/rslsync --config /home/laputa/.config/resilio-sync/config.json
laputa 2658 0.0 0.0 15208 988 pts/8 S+ 05:22 0:00 grep --color=auto rslsync
As we see, now resilio service is running under my login user, and using my new user config file. It will happily create any files and folders in my external disk.