Systemd mythbackend Configuration

From MythTV Official Wiki
Revision as of 14:58, 10 July 2012 by Newbury (talk | contribs) (Default configuration)

Jump to: navigation, search

Some newer Linux distributions replace the traditional LSB init script startup management process with a program called systemd, which does things differently; here are some notes on how to make MythTV play nicely with systemd. A cheatsheet from the traditional init scripts to systemd is available on the Fedora wiki pages.

Note that much of the example startup code that follows is based on the rpmfusion packaging of MythTV by Richard Shaw.

Default configuration

Save the configuration file below in /etc/systemd/system/mythbackend.service Changes to files in /lib/systemd/system will be over-written when updated.

Script.png /etc/systemd/system/mythbackend.service

# Do not edit this file, it will be replaced on update
# If you need to make modifications to this unit file first make a copy in # /etc/systemd/system

# This file is part of the packaging of MythTV #
# MythTV is free software; view for more information.
# It is sometimes necessary to wait for a capture device to finish (hot)plug
# initialization before the backend starts.  If this is necessary, 
# create a Wants and After entry for all the capture devices that
# one wishes to wait to be created before the backend starts using the systemd
# device name mangling names (/dev/some/thing turns 
# into dev-some-thing.device).  These normally should  be udev persistent 
# filename rules to avoid confusion.
# See the MythTV wiki for udev persistent filename # discussions found at:
# In order to insure that systemd will create a device unit for the 
# capture device, one must insure that udev will have the tag "systemd"
# (i.e. add TAG+="systemd" to the udev rule).
# The MythTV package ships with a default udev rule file located in: 
# /lib/udev/rules.d/99-mythbackend.rules

Description=MythTV backend service mysqld.service
# Uncomment the following line if you will be using the mythweb plugin on the 
# same system as mythbackend.

# Type=simple is recommended. If using Type=forking you will need to specify a 
# pidfile so systemd knows how to find the forked process PID, otherwise it 
# presumes that the process being started will be the remaining process.
# Specifying a pidfile with Type simple does not cause any problem and may help


# Default setting assumes a system wide install. Otherwise it should be set to 
# the folder containing the .mythtv subfolder containing the config.xml file 
# Such as
# or

# systemd changes execution from the calling user (possibly root) to this user
# if you have permissions problems or obscure errors try logging in as mythtv 
# See notes below

# Uncomment one of the following...
# Use sysloging rather than separate logging:
#ExecStart=/usr/bin/mythbackend --syslog local7 

# If Type=forking is set you must specify the --daemon and --pidfile options:
#ExecStart=/usr/bin/mythbackend --daemon --logpath /var/log/mythtv --loglevel crit --pidfile /run/ 

# Default setting for Type=simple.
ExecStart=/usr/bin/mythbackend --logpath /var/log/mythtv

# Whether systemd will continue over-watch and restart on any halt


Important.png Note: Starting with 0.25, there has been a change in the logging. You must adjust the ExecStart line above based on the active release and logging preference (in 0.25 and later.) See: Logging for details.

To enable the backend to start at the next boot, issue the command 'systemctl enable mythbackend.service'. To start the backend immediately, issue the command 'systemctl start mythbackend.service'.

If you specify a log file, all logging will be to that file. If you specify a logpath each program will write to distinctly named files: much better for debugging. Loglevel determines what is logged. Log messages at lower levels will be discarded: In descending order: emerg, alert, crit, err, warning, notice, info, debug. Defaults to info.

Important.png Note: The example runs the backend as user mythtv. You will need to insure that your files/directories/capture cards can be accessed by the mythtv user, or run the backend as root (not recommended). The following script snippet creates and sets the ownership and permissions for the logging folders.

# Sanity check on required folders
if [ ! -x /var/log/mythtv ]; then
# make logging folder
mkdir -p -m 755 /var/log/mythtv
chown -hR mythtv:mythtv /var/log/mythtv
# make pid folder
mkdir -p -m 755 /var/run/mythtv
chown -hR mythtv:mythtv /var/run/mythtv

If you have any problems with /var/run/mythtv not being created, try using /var/log/mythtv as the pidfile folder. Remember to check the ownership and permissions of any tuner sockets in /dev such as /dev/dvb or /dev/video. The mythtv user must be able to access them.

Delay starting the backend until tuners have initialized

Some tuners take a long time to initialize (typically, firmware loading) and may therefore not yet be available when the backend starts. Since the backend checks for the presence of tuners upon startup, tuner initialization needs to be completed before the backend is started.

This can be accomplished by adding additional Wants= and After= stanza to the unit file, but to have systemd create device units, you must first add a rule to the udev rules directory.

Script.png /etc/udev/rules.d/99-mythbackend

# Create systemd device units for capture devices
SUBSYSTEM=="video4linux", TAG+="systemd"
SUBSYSTEM=="dvb", TAG+="systemd"
SUBSYSTEM=="firewire", TAG+="systemd"

With the udev rule tag, systemd will create a device unit at startup that one can add to the [Unit] stanza in the startup. Note that one must use the systemd mangled names (generally /dev/some/thing is mangled into dev-some-thing.device). It is highly recommended that you use udev persistent names rather than base names such as /dev/video0.

Script.png device wait code for a typical v4l2 device


Script.png device wait code for a typical dvb device


From mythtv-users post from Richard Shaw

Systemd has a built-in timeout on device units so that startup will not wait forever for a failed device startup.

There are many options for how to run mythbackend with SystemD but one decision you

  • MUST*
  • MUST*
  • MUST*

make is if you're going to run:




If you use Type=simple (which is my recommendation) then you *CANNOT* use the "--daemon" option because SystemD is not expecting the daemon to fork!!!

If you use Type=forking then you *MUST* use the "--daemon" option as well as specify a PID file, "--pidfile" in ExecStart *AND* you must set the PIDFile= systemd option so it knows where to find the PID file.

Someone please fix the wiki!

Thanks Richard