I recently bought a QNAP TS-451+ NAS for my house. This basically meant that all of my storage would be backed by NFS mounts. QNAP (currently) only supports NFSv3, so the UIDs and GIDs on any files have to match the UIDs and GIDs on all of my boxes for everything to work.
The "standard" first user (in my case, "codon") in Ubuntu has a UID of 1000 and a GID of 1000 (also called, uncreatively "codon"). I have this user set up on every box in my network, so this means that any "codon" user on any box can read and write to anything that any other "codon" user created.
However, I use transmission to download torrents. Transmission runs as the "debian-transmission" user, with a UID of 500 and a GID of 500. Because of this, "codon" had to use "sudo" to change the ownership of any downloaded files before moving them to their final destinations. In addition, my Plex server couldn't see the files (because the "plex" user was in the "codon" group with GID 1000).
Without jumping through a bunch of hoops, I figured that the simplest solution would be to run transmission as the "codon" user. This should have been the simplest way, but I ran into a bunch of problems and outdated guides. Here, I present to you how to run transmission as a user in Ubuntu 16.04.
Background: systemd
Ubuntu 16.04 uses systemd for its "init" system. Systemd is great, but it's a whole different game than the older SysV init or now-defunct Upstart init systems.
The magic of systemd is that you do not have to modify any system-owned files; this means that you will not get conflicts when you upgrade. Instead, you simply supplement an existing unit (a "unit" is what systemd operates on, not an "init script") by creating a new file in a particular location.
Step 1: run as a different user
Explanation
The systemd unit for transmission is called "transmission-daemon", and it is defined here:
/lib/systemd/system/transmission-daemon.serviceIn principle, you could simply modify that file to change the "User=debian-transmission" line, but that's not the systemd way. Instead, we're going to create a supplement file in "/etc/systemd/" that has a different "User=..." line. When systemd reads its configuration, it'll read the original "transmission-daemon.service" file, and then it'll apply the changes in our supplement file.
The appropriate place to put these supplement files is the following directory:
/etc/systemd/${service-path}.d/Here, ${service-path} refers to the path after "/lib/systemd". In transmission's case, this is "system/transmission-daemon.service".
What to do
Stop transmission (if it's already running).
sudo systemctl stop transmission-daemon;
Create the supplement file directory for transmission.
sudo mkdir -p /etc/systemd/system/transmission-daemon.service.d;
Create a new supplement file called "run-as-user.conf".
sudo vi /etc/systemd/system/transmission-daemon.service.d/run-as-user.conf
and put the following text in it.
[Service]Obviously, use your desired username and not "codon".
User=codon
Tell systemd to reload its units.
sudo systemctl daemon-reload;To confirm that the changes went through, ask systemd to print the configuration that it's using for transmission.
sudo systemctl cat transmission-daemon;You should see something like this:
# /lib/systemd/system/transmission-daemon.service
[Unit]
Description=Transmission BitTorrent Daemon
After=network.target
[Service]
User=debian-transmission
Type=notify
ExecStart=/usr/bin/transmission-daemon -f --log-error
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/transmission-daemon.service.d/run-as-user.confYou can see that our supplement file was appended to the end.
[Service]
User=codon
Step 2: get the configuration directory setup
Explanation
Transmission loads its configuration from the user's home directory, in particular:
~/.config/transmission-daemon/Since Ubuntu runs transmission as the "debian-transmission" user, the transmission configuration resides in that user's home directory, which happens to be:
/var/lib/transmission-daemonAnd here's where things get strange.
The normal place for system-wide configuration files is "/etc/", and transmission tries to pass itself off as a normal, system-wide daemon. To get around this, the main configuration file for transmission appears to be "/etc/transmission-daemon/settings.json", but it's actually:
/var/lib/transmission-daemon/.config/transmission-daemon/settings.jsonThe Ubuntu configuration just happens to symlink that file to "/etc/transmission-daemon/settings.json".
Now that we're going to be running our transmission as our user and not "debian-transmission", the configuration will be loaded from our user's home directory (in my case, "/home/codon"). Thus, the fake-me-out "/etc/transmission-daemon/settings.json" configuration file will not be used.
When transmission starts, if it doesn't have a configuration directory set up already, it will set one up on its own. So here, we want to start transmission briefly so that it configures this directory structure for us.
What to do
Start transmission and then stop transmission.
sudo systemctl start transmission-daemon;
sudo systemctl stop transmission-daemon;
You should now have the following directory in your user's home directory:
.config/transmission-daemon/
Step 3: change "settings.json" and start transmission
Explanation
Transmission will load its configuration from "~/.config/transmission-daemon/settings.json" when it starts, so just update that file with whatever your configuration is and then start transmission.
Note that transmission will overwrite that file when it stops, so make your changes while transmission is not running. If you make changes while transmission is running, then simply issue the "reload" command to it and it'll reload the configuration live.
sudo systemctl reload transmission-daemon;
What to do
Update "~/.config/transmission-daemon/settings.json" to suite your needs.
Then, start transmission:
sudo systemctl start transmission-daemon;
Make sure that everything's running okay:
sudo systemctl status transmission-daemon;
You should see something like this:
● transmission-daemon.service - Transmission BitTorrent Daemon
Loaded: loaded (/lib/systemd/system/transmission-daemon.service; disabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/transmission-daemon.service.d
└─run-as-user.conf
Active: active (running) since Sun 2017-01-08 19:28:27 EST; 1min ago
Main PID: 3271 (transmission-da)
Status: "Uploading 54.18 KBps, Downloading 0.17 KBps."
CGroup: /system.slice/transmission-daemon.service
└─3271 /usr/bin/transmission-daemon -f --log-error
Jan 08 19:28:27 transmission systemd[1]: Starting Transmission BitTorrent Daemon...
Jan 08 19:28:27 transmission systemd[1]: Started Transmission BitTorrent Daemon.
Impeccable instructions: clear, succint, nothing missing, it works and explains everything which is needed. Thanks a lot !
ReplyDeleteNot work for me =(
ReplyDeletein the step 3 i didnt find the file =(
Thanks for your work, you saved me hours of fruitless tinkering. Definitely the best walktrhough for this tweak.
ReplyDeleteThis was perfect, thank you for taking the time to explain that so well.
ReplyDeleteThis is absolutely gold! Thank you.
ReplyDeleteI have this error after configure with this guide
ReplyDeleteUDP Failed to set receive buffer: requested 4194304, got 425984 (tr-udp.c:84)