From Fedora Project Wiki

Systemd migration and packaging

Systemd has excellent man pages for all the relevant migration options as well as Packaging:Systemd so see man:

systemd.special systemd.service systemd.socket systemd.target systemd.timer systemd.time systemd.unit


Sysv to systemd service migration

Setting up the migration environment for systemd services.

For sys V to systemd migration create a service.txt file with the following unmigrated ( 119 ) components in Fedora

amavisd-new
bdii
bitten
bluez
boa
ceph
cfengine
cherokee
clement
conmux
ctdb
cyphesis
dahdi-tools
dhcp_probe
dircproxy
diskimage-builder
dkim-milter
dpm-dsi
drbdlinks
drbd
ebtables
etckeeper
firehol
fts-server
globus-gatekeeper
globus-gridftp-server
globus-rls-server
globus-scheduler-event-generator
gmediaserver
gofer
greylistd
i8kutils
ibmasm
imagefactory
iodine
iprutils
koji
resource-agents
ltsp
lvm2
mimedefang
perl-mogilefs-server
mom
monotone
moodle
mysql-proxy
nagios
ncid
nessus-core
netbsd-iscsi
netcf
netdisco
netdump-server
nightview
noip
nordugrid-arc
nxtvepg
oidentd
openpts
openscada
openser
openslp
opentracker
orbited
ovirt-engine
pathfinder
pcp
Perlbal
pgbouncer
plague
pnp4nagios
popfile
powerman
psad
python-carbon
qpid-cpp
RabbIT
ratbox-services
redis
rinputd
ris-linux
root
roundup
rubygem-openshift-origin-node
sagator
ser
sigul
sip-redirect
sipwitch
sks
smstools
snake
spampd
spawn-fcgi
Spawning
spectrum
ssbd
sslogger
svxlink
tabled
tetrinetx
thebridge
tinyproxy
tmda
torque
ttywatch
ulogd
vblade
vhostmd
vmpsd
voms
Vuurmuur
xorg-x11-xfs
xrootd
xtide
yum-cron
yum-utils
zarafa

Then git clone the packages from Fedora

while read line;
 do           
   git clone git://pkgs.fedoraproject.org/$line;
done < services.txt

Create a separated branch to work on

while read line;
 do
   cd $line;
    git checkout -b systemd-timers;
   cd -
done < services.txt

Decide which component you are going to be migrating and add your name next to it on this list

Package name Bug Number Port Status Ready for Proven Packager Proven Packager Note
amavisd-new #N/A
Fail fail Nobody
No Nobody
amavisd-new-snmp #N/A
Fail fail Nobody
No Nobody
bdii #N/A
Inprogress inprogress Johannbg
No Nobody
bitten-slave #N/A
Fail fail Nobody
No Nobody
bluez-compat #N/A
Fail fail Nobody
No Nobody
boa #N/A
Fail fail Nobody
No Nobody
ceph #N/A
Fail fail Nobody
No Nobody
cfengine #N/A
Fail fail Nobody
No Nobody
cherokee #N/A
Fail fail Nobody
No Nobody
clement #N/A
Fail fail Nobody
No Nobody
cmirror #N/A
Fail fail Nobody
No Nobody
conmux #N/A
Fail fail Nobody
No Nobody
ctdb-tests #N/A
Fail fail Nobody
No Nobody
cyphesis #N/A
Fail fail Nobody
No Nobody
dahdi-tools #N/A
Fail fail Nobody
No Nobody
dhcp_probe #N/A
Fail fail Nobody
No Nobody
dircproxy #N/A
Fail fail Nobody
No Nobody
diskimage-builder #N/A
Fail fail Nobody
No Nobody
dkim-milter #N/A
Fail fail Nobody
No Nobody
dpm-dsi #N/A
Fail fail Nobody
No Nobody
drbdlinks #N/A
Fail fail Nobody
No Nobody
drbd-utils #N/A
Fail fail Nobody
No Nobody
ebtables #N/A
Fail fail Nobody
No Nobody
etckeeper #N/A
Fail fail Nobody
No Nobody
firehol #N/A
Fail fail Nobody
No Nobody
fts-server #N/A
Fail fail Nobody
No Nobody
globus-gatekeeper #N/A
Fail fail Nobody
No Nobody
globus-gridftp-server-progs #N/A
Fail fail Nobody
No Nobody
globus-rls-server #N/A
Fail fail Nobody
No Nobody
globus-scheduler-event-generator-progs #N/A
Fail fail Nobody
No Nobody
gmediaserver #N/A
Fail fail Nobody
No Nobody
gofer #N/A
Fail fail Nobody
No Nobody
greylistd #N/A
Fail fail Nobody
No Nobody
i8kutils #N/A
Fail fail Nobody
No Nobody
ibmasm #N/A
Fail fail Nobody
No Nobody
ifplugd #N/A
Fail fail Nobody
No Orphan
imagefactory #N/A
Fail fail Nobody
No Nobody
iodine-client #N/A
Fail fail Nobody
No Nobody
iodine-server #N/A
Fail fail Nobody
No Nobody
iprutils #N/A
Fail fail Nobody
No Nobody
koji-builder 995753
Fail fail Nobody
No Nobody
koji-utils 995753
Fail fail Nobody
No Nobody
koji-vm 995753
Fail fail Nobody
No Nobody
ldirectord #N/A
Fail fail Nobody
No Nobody
ltsp-server #N/A
Fail fail Nobody
No Nobody
lvm2-cluster #N/A
Fail fail Nobody
No Nobody
mimedefang #N/A
Fail fail Nobody
No Nobody
mogilefsd #N/A
Fail fail Nobody
No Nobody
mogstored #N/A
Fail fail Nobody
No Nobody
mom #N/A
Fail fail Nobody
No Nobody
monotone-server #N/A
Fail fail Nobody
No Nobody
moodle #N/A
Fail fail Nobody
No Nobody
mysql-mmm-agent #N/A
Fail fail Nobody
No Nobody ORPHAN
mysql-mmm-monitor #N/A
Fail fail Nobody
No Nobody ORPHAN
mysql-proxy #N/A
Fail fail Nobody
No Nobody
nagios #N/A
Fail fail Nobody
No Nobody
ncid #N/A
Fail fail Nobody
No Nobody
ncid-client #N/A
Fail fail Nobody
No Nobody
ncid-samba #N/A
Fail fail Nobody
No Nobody
ncid-speak #N/A
Fail fail Nobody
No Nobody
nessus-server #N/A
Fail fail Nobody
No Nobody
netbsd-iscsi #N/A
Fail fail Nobody
No Nobody
netcf-libs #N/A
Fail fail Nobody
No Nobody
netdisco #N/A
Fail fail Nobody
No Nobody
netdump-server #N/A
Fail fail Nobody
No Nobody
nightview-server #N/A
Fail fail Nobody
No Nobody
noip #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-acix-cache #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-acix-index #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-arex #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-aris #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-cache-service #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-datadelivery-service #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-egiis #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-gridftpd #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-hed #N/A
Fail fail Nobody
No Nobody
nordugrid-arc-ldap-infosys #N/A
Fail fail Nobody
No Nobody
nxtvepg #N/A
Fail fail Nobody
No Nobody
oidentd #N/A
Fail fail Nobody
No Nobody
openpts #N/A
Fail fail Nobody
No Nobody
openscada #N/A
Fail fail Nobody
No Nobody
openser #N/A
Fail fail Nobody
No Nobody
openslp-server #N/A
Fail fail Nobody
No Nobody
opentracker-ipv4 #N/A
Fail fail Nobody
No Nobody
opentracker-ipv6 #N/A
Fail fail Nobody
No Nobody
orbited #N/A
Fail fail Nobody
No Nobody
ovirt-engine-notification-service #N/A
Fail fail Nobody
No Nobody
pathfinderd #N/A
Fail fail Nobody
No Nobody
pcp #N/A
Fail fail Nobody
No Nobody
Perlbal #N/A
Fail fail Nobody
No Nobody
pgbouncer #N/A
Fail fail Nobody
No Nobody
plague #N/A
Fail fail Nobody
No Nobody
plague-builder #N/A
Fail fail Nobody
No Nobody
pnp4nagios #N/A
Fail fail Nobody
No Nobody
popfile #N/A
Fail fail Nobody
No Nobody
powerman #N/A
Fail fail Nobody
No Nobody
preload #N/A
Fail fail Nobody
No Nobody ORPHAN
psad #N/A
Fail fail Nobody
No Nobody
python-carbon #N/A
Fail fail Nobody
No Nobody
qpid-cpp-server-ha #N/A
Fail fail Nobody
No Nobody
RabbIT #N/A
Fail fail Nobody
No Nobody
ratbox-services #N/A
Fail fail Nobody
No Nobody
redis #N/A
Fail fail Nobody
No Nobody
rinputd #N/A
Fail fail Nobody
No Nobody
ris-linux #N/A
Fail fail Nobody
No Nobody
root-proofd #N/A
Fail fail Nobody
No Nobody
root-rootd #N/A
Fail fail Nobody
No Nobody
roundup #N/A
Fail fail Nobody
No Nobody
rubygem-openshift-origin-node #N/A
Fail fail Nobody
No Nobody
sagator-core #N/A
Fail fail Nobody
No Nobody
ser #N/A
Fail fail Nobody
No Nobody
sigul #N/A
Fail fail Nobody
No Nobody
sip-redirect #N/A
Fail fail Nobody
No Nobody
sipwitch #N/A
Fail fail Nobody
No Nobody
sks #N/A
Fail fail Nobody
No Nobody
smstools #N/A
Fail fail Nobody
No Nobody
snake-server #N/A
Fail fail Nobody
No Nobody
spampd #N/A
Fail fail Nobody
No Nobody
spawn-fcgi #N/A
Fail fail Nobody
No Nobody
Spawning #N/A
Fail fail Nobody
No Nobody
spectrum #N/A
Fail fail Nobody
No Nobody
ssbd #N/A
Fail fail Nobody
No Nobody
sslogger-slogd #N/A
Fail fail Nobody
No Nobody
svxlink-server #N/A
Fail fail Nobody
No Nobody
tabled #N/A
Fail fail Nobody
No Nobody
tetrinetx #N/A
Fail fail Nobody
No Nobody
thebridge #N/A
Fail fail Nobody
No Nobody
tinyproxy #N/A
Fail fail Nobody
No Nobody
tmda-ofmipd #N/A
Fail fail Nobody
No Nobody
torque-mom #N/A
Fail fail Nobody
No Nobody
torque-scheduler #N/A
Fail fail Nobody
No Nobody
torque-server #N/A
Fail fail Nobody
No Nobody
ttywatch #N/A
Fail fail Nobody
No Nobody
ulogd #N/A
Fail fail Nobody
No Nobody
vblade #N/A
Fail fail Nobody
No Nobody
vhostmd #N/A
Fail fail Nobody
No Nobody
vmpsd #N/A
Fail fail Nobody
No Nobody
voms-server #N/A
Fail fail Nobody
No Nobody
Vuurmuur-daemon #N/A
Fail fail Nobody
No Nobody
xorg-x11-xfs #N/A
Fail fail Nobody
No Nobody
xrootd #N/A
Fail fail Nobody
No Nobody
xtide #N/A
Fail fail Nobody
No Nobody
yum-cron #N/A
Fail fail Nobody
No Nobody
yum-updateonboot #N/A
Fail fail Nobody
No Nobody
zarafa-dagent #N/A
Fail fail Nobody
No Nobody
zarafa-gateway #N/A
Fail fail Nobody
No Nobody
zarafa-ical #N/A
Fail fail Nobody
No Nobody
zarafa-monitor #N/A
Fail fail Nobody
No Nobody
zarafa-search #N/A
Fail fail Nobody
No Nobody
zarafa-server #N/A
Fail fail Nobody
No Nobody
zarafa-spooler #N/A
Fail fail Nobody
No Nobody

Spec file changes

[...]
Source1: ackme.service
BuildRequires: systemd
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd

[...]

%install
mkdir -p %{buildroot}%{_unitdir}
%{__install} -p -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}

%post
%systemd_post ackme.service

%preun
%systemd_preun ackme.service

%postun
%systemd_postun_with_restart ackme.service

%files
%{_unitdir}/ackme.service

[...]
Note.png
Remember some services do not support being restarted (e.g. D-Bus and various storage daemons). If the service you are migrating should not be restarted upon upgrade, then use the following %post scriptlet instead of the one shown above:
%postun
%systemd_postun

Various unit samples

Since we have around 600 - 700 units already in the distribution it's best to look into /lib/systemd/system for existing samples for various type units rather then trying to list them all here.

Cron job to timer migration

When to migrate

If a package ships cron job as well as initscript or native systemd units it's applicable to migration to native systemd timer unit since it already depends on systemd.

Setting up the migration environment for systemd timers.

For timer migration create a timers.txt file with the following content.

amavisd-new
apt
arm4
atop
bcfg2
clement
cyrus-imapd
dbmail
denyhosts
dspam
exim
fetch-crl
freeipa
hylafax+
inn
leafnode
ltsp
mailman
mcelog
mdadm
mldonkey
newscache
nsd
opendnssec
openvas-scanner
ovirt-engine
ovirt-node
polipo
sagator
sipwitch
spamassassin
squidGuard
subscription-manager
sysstat
vdsm
vnstat
yum-cron

Then git clone the packages from Fedora

while read line           
 do           
   git clone git://pkgs.fedoraproject.org/$line;
done < timers.txt

Create a separated branch to work on

while read line           
 do
   cd $line;
    git checkout -b systemd-timers;
   cd -
done < timers.txt

Decide which component you are going to be migrating and add your name next to it on this list

Package name Bug Number Port Status Ready for Proven Packager Proven Packager Note
amavisd-new #N/A
Fail fail Nobody
No Nobody drop cron use tmpfile
apt #991684
Inprogress inprogress Johannbg
Yes Nobody
arm4 #991696
Inprogress inprogress Johannbg
Yes Nobody
atop #N/A
Fail fail Nobody
No Nobody Cron job restarts service could potentially be a feature
bcfg2 #N/A
Fail fail Nobody
No Nobody
clement #N/A
Fail fail Nobody
No Nobody
cyrus-imapd #N/A
Fail fail Nobody
No Nobody
dbmail #N/A
Fail fail Nobody
No Nobody
denyhosts #N/A
Fail fail Nobody
No Nobody
dspam #N/A
Fail fail Nobody
No Nobody
exim #N/A
Fail fail Nobody
No Nobody
fetch-crl #N/A
Fail fail Nobody
No Nobody
freeipa-server #N/A
Fail fail Nobody
No Nobody
hylafax+ #N/A
Fail fail Nobody
No Nobody
inn #N/A
Fail fail Nobody
No Nobody
leafnode #N/A
Fail fail Nobody
No Nobody
ltsp-server #N/A
Fail fail Nobody
No Nobody
mailman #N/A
Fail fail Nobody
No Nobody
mcelog #N/A
Fail fail Nobody
No Nobody
mdadm #N/A
Fail fail Nobody
No Nobody
mldonkey-server #N/A
Fail fail Nobody
No Nobody
newscache #N/A
Fail fail Nobody
No Nobody
nsd #N/A
Fail fail Nobody
No Nobody
opendnssec #N/A
Fail fail Nobody
No Nobody
openvas-scanner #N/A
Fail fail Nobody
No Nobody
ovirt-engine #N/A
Fail fail Nobody
No Nobody
ovirt-node #N/A
Fail fail Nobody
No Nobody
polipo #N/A
Fail fail Nobody
No Nobody
sagator-core #N/A
Fail fail Nobody
No Nobody
sipwitch #N/A
Fail fail Nobody
No Nobody
spamassassin #N/A
Fail fail Nobody
No Nobody
squidGuard #N/A
Fail fail Nobody
No Nobody
subscription-manager #N/A
Fail fail Nobody
No Nobody
sysstat #N/A
Fail fail Nobody
No Nobody
vdsm-reg #N/A
Fail fail Nobody
No Nobody
vnstat #N/A
Fail fail Nobody
No Nobody
yum-cron #N/A
Fail fail Nobody
No Nobody

Add the timer unit to git

git add ackme-job.service
git add ackme-job.timer

Commit the change and create a patch.

git commit -a -m "Migrating cron job to native systemd units"
git format-patch -s -n master..systemd-timers

Push the patch or file a bug in Fedora and add it to the Timer Migration Tracking Bug by setting 991679 as an blocker in that report.

Unit migration/Creation

Manual activation of timer units

systemctl enable ackme.timer 

Starting the timer unit

systemctl start ackme.timer

Enablement of timer units by default is handled by presets

Spec file changes

[...]
Source1: ackme.service
Source2: ackme.timer
BuildRequires: systemd
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd

[...]

%install
mkdir -p %{buildroot}%{_unitdir}
%{__install} -p -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}
%{__install} -p -D -m 644 %{SOURCE2} %{buildroot}%{_unitdir}

%post
%systemd_post

%preun
%systemd_preun 

%postun
%systemd_postun

%files
%{_unitdir}/ackme.service
%{_unitdir}/ackme.timer

[...]

Various Timer unit samples

Bound to another service

Note.png
Should always be used when shipped with service/daemon units

ackme.service:

[Unit]
Description=Ackme Sample Service
Documentation=man:ackmed(1)

[Service]
ExecStart=/usr/bin/ackmed

[Install]
WantedBy=multi-user.target

ackme-job.timer

[Unit]
Description=Ackme Sample Timer Trigger
Documentation=man:ackmed(1)
BindTo=ackme.service

[Timer]
OnCalendar=daily

[Install]
WantedBy=ackme.service

ackme-job.service

[Unit]
Description=Daily ackme Job
Documentation=man:ackmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/acme-job

After Boot Time Trigger

ackme-job.timer

[Unit]
Description=Ackme Sample Timer Trigger 5 Minutes After Boot
Documentation=man:ackmed(1)
BindTo=ackme.service

[Timer]
OnBootSec=5m

[Install]
WantedBy=timers.target

ackme-job.service

[Unit]
Description=Daily Sample Ackme Job
Documentation=man:ackmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/acme-job

After Boot + Hourly Time Trigger

ackme-job.timer

[Unit]
Description=Ackme Sample Timer Trigger 5 Minutes After Boot And Hourly After That
Documentation=man:ackmed(1)
BindTo=ackme.service

[Timer]
OnBootSec=5m
OnUnitActiveSec=1h

[Install]
WantedBy=timers.target

ackme-job.service

[Unit]
Description=Daily Sample Ackme Job
Documentation=man:ackmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/acme-job

Traditional Hourly

[Unit]
Description=Ackme Sample Timer Trigger
Documentation=man:ackmed(1)


[Timer]
OnCalendar=hourly

[Install]
WantedBy=timers.target

ackme-job.service

[Unit]
Description=Daily Ackme Sample Job
Documentation=man:ackmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/acme-job

Traditional Daily

[Unit]
Description=Ackme Sample Timer Unit
Documentation=man:ackmed(1)


[Timer]
OnCalendar=daily

[Install]
WantedBy=ackme.service

ackme-job.service

[Unit]
Description=Daily ackme time trigger
Documentation=man:ackmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/ackme-job

Traditional Weekly

[Unit]
Description=Ackme Sample Timer Unit
Documentation=man:ackmed(1)


[Timer]
OnCalendar=weekly

[Install]
WantedBy=timers.target

ackme-job.service

[Unit]
Description=Daily ackme time trigger
Documentation=man:ackmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/ackme-job

Traditional Monthly

[Unit]
Description=Ackme Sample Timer Trigger
Documentation=man:acmed(1)

[Timer]
OnCalendar=monthly

[Install]
WantedBy=timers.target

ackme-job.service

[Unit]
Description=Monthly Ackme Sample Job
Documentation=man:acmed(1)

[Service]
User=ackme
ExecStart=/usr/bin/ackme-job

Systemd hacking for fun

Idea Systemd Stick it 3000

Create a minimal installer based on Kay's Fedora minimal installer which downloads and installs a fully bootable text mode UEFI-only btrfs system, that supports using btrfs send/receive/sendshot.

UI design something similar to liveusb creator

Would need to support both yum and apt-get