1 AUTHOR: Chris Wagner <wagnerlia-lists at yahoo.com>
5 LICENSE: GNU Free Documentation License Version 1.2
7 SYNOPSIS: How to install Systemd, an alternative system and service
12 I wanted to better understand the inner workings of systemd. Just having
13 finished a LFS install on a test server, I thought LFS 7.2 might be a
14 good basis for this. My goal was to eventually replace SysVinit
15 completely with systemd. I fully expected lots of things to break, but
16 was pleasantly surprised, that getting systemd to work was not all that
17 hard. I started out with a guide from Lemon Lime which he posted on this
18 list a year ago. Because LFS 7.2 is using a customized non-standard
19 installation of Systemd/Udevd, additional steps were required. Systemd
20 has matured quite a bit since last year and more distributions are using
21 it, among them Arch Linux. Having lots of unit files available from
22 other distributions, makes the switch a lot easier.
24 I have everything working on my test server with a Plone CMS installed
25 and find the built-in monitoring and logging capabilities of systemd
26 quite remarkable. Bootup and shutdown times are considerably faster than
27 with SysVinit. The following guide was put together as I documented the
28 steps I took, and is intended help others to get started with systemd. I
29 have put it in a similar format as instructions in the BLFS book to make
32 I hope you'll find this guide helpful and would welcome your comments
37 see Package Information below
41 This hint requires that you have sufficient knowledge of LinuxFromScratch
42 and be familiar with adding software from BLFS. Software versions used
43 are from LFS 7.2 and BLFS 2012-09-14 or above.
45 HINT: How to install Systemd-193 on LFS
46 =======================================
48 Introduction to systemd
49 -----------------------
51 systemd is a system and service manager for Linux, compatible with SysV
52 and LSB init scripts. systemd provides aggressive parallelization
53 capabilities, uses socket and D-Bus activation for starting services,
54 offers on-demand starting of daemons, keeps track of processes using
55 Linux control groups, supports snapshotting and restoring of the system
56 state, maintains mount and automount points and implements an elaborate
57 transactional dependency-based service control logic. It can work as a
58 drop-in replacement for sysvinit.
60 I was able to have it build and work properly using an LFS-7.2 platform.
62 ### Package Information
65 `http://www.freedesktop.org/software/systemd/systemd-193.tar.xz`
67 * Download MD5 sum: `732a9de2b1d2a15cab639c987ff9e90e`
69 #### Required (versions from BLFS 2012-09-14)
71 libcap2-2.22, D-Bus-1.6.4, Gperf-3.0.4, USB Utils-006, PCI Utils-3.1.10,
72 GLib-2.32.4, (D-Bus will have to be re-installed after installing
78 systemd can be installed alongside SysVinit and will start any init
79 scripts which do not have systemd equivalent unit files yet. It can also
80 be installed to fully replace SysVinit. In this guide systemd will first
81 be installed alongside SysVinit, then it can be tested, while optionally
82 booting into SysVinit or systemd. When satisfied that everything works
83 well in systemd, SysVinit can be completely replaced by systemd, and the
84 init scripts can be removed.
86 The required dependencies above will need a number of their own
87 dependencies to be fulfilled and can be installed in the
90 {(attr-2.4.46), libcap2-2.22 },
91 {(Expat-2.1.0 or libxml2-2.8.0), D-Bus-1.6.4},
92 {(XML-Parser-2.41), Intltool-0.50.2}, Gperf-3.0.4,
93 {(libusb-1.0.9), USB Utils-006}, PCI Utils-3.1.10,
94 {(pkg-config-0.27, libffi-3.0.11, PCRE-8.31,
95 Python-2.7.3),GLib-2.32.4}
97 We need a Linux kernel with devtmpfs and cgroups activated while autofs4
98 and ipv6 is recommended. systemd will work using the default options on
99 a 3.5.2 kernel with just the following two options added:
100 `CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y`
102 In `make menuconfig` these options can be found here:
105 Generic Driver Options --->
106 [*] Maintain a devtmpfs filesystem to mount at /dev
107 [*] Automount devtmpfs at /dev, after the kernel
110 In LFS chapter six Udev-188, a subset of systemd was installed using a
111 LFS specific makefile. I found, that the complete systemd-188 cannot be
112 easily installed over it, as this introduces various problems. Thus
113 Udev-188 must be uninstalled first, which will also allow us to use a
114 newer version of systemd than was used in LFS 7.2.
116 As the root user stop udevd first
118 udevadm control --exit
120 and then remove most files from Udev-188, while keeping the LFS specific
123 rm -v /lib/udev/rules.d/*
124 rm -v /lib/{libudev.so.1,libudev.so.1.0.2}
125 rm -v /usr/lib/pkgconfig/{libudev.pc,udev.pc}
126 rm -v /usr/share/man/man7/udev.7*
127 rm -v /usr/share/man/man8/{udevadm.8*,udevd.8*}
128 rm -v /sbin/udevadm /usr/include/libudev.h /usr/lib/libudev.so
129 rm -v /lib/udev/{accelerometer,ata_id,cdrom_id,collect}
130 rm -v /lib/udev/{mtd_probe,scsi_id,udevd,v4l_id}
132 This will leave the following 7 files in place:
134 /lib/udev: init-net-rules.sh rule_generator.functions
135 write_cd_rules write_net_rules
137 /usr/share/doc/udev/lfs: 55-lfs.txt README
139 /etc/udev/rules.d: 55-lfs.rules
141 Installation of systemd
142 -----------------------
144 `systemd-tmpfiles` requires a 'lock' group, thus as the root user,
149 Install systemd by running the following commands (you may wish to
150 review the output from ./configure --help first and add any desired
151 parameters to the configure command shown below):
153 ./configure --with-distro=other \
154 --libexecdir=/usr/lib \
155 --localstatedir=/var \
159 When running tests before installing sytemd, 4 out of 14 tests will
160 fail. If run after systemd is installed, they should complete without
161 errors. The tests also require an existing /usr/lib/udev directory. If
162 you would like to run the unit tests, issue the following commands:
164 mkdir -pv /usr/lib/udev/rules.d
167 Now, as the root user:
170 # remove static libraries
171 rm -v /usr/lib/{libgudev-*.la,libsystemd-daemon.la}
172 rm -v /usr/lib/{libsystemd-id128.la,libsystemd-journal.la}
173 rm -v /usr/lib/{libsystemd-login.la,libudev.la}
175 ln -sfv /usr/lib/systemd/systemd /bin/systemd
176 mkdir -pv /var/log/journal
178 Move the rule `73-seat-late.rules`, which causes an error. There are
179 probably other rules we do not need, which could be moved out. (With the
180 LFS version of Udev, only a subset of rules were installed.)
182 mkdir -pv /usr/lib/udev/rules-unused/
183 mv -v /usr/lib/udev/rules.d/73-seat-late.rules \
184 /usr/lib/udev/rules-unused/
186 Setup /etc/machine-id, if it does not exist:
188 systemd-machine-id-setup
190 As the path to udevadm is hardcoded in some places, link to it:
192 ln -sv /usr/bin/udevadm /sbin/udevadm
194 Create other links, because udevd is no longer called udevd, but LFS
195 init.d/udev expects it here:
197 ln -sv /usr/lib/systemd/systemd-udevd /lib/udev/udevd
198 ln -sv /usr/share/man/man8/systemd-udevd.8 \
199 /usr/share/man/man8/udevd.8
204 `--libexecdir=/usr/lib`: Note, that D-Bus ./configure may not find
205 systemd, when the systemd install paths are changed to be similar to the
206 paths used by Udev-188.
208 `--with-distro=other`: some major distributions have adapted systemd to
209 their distribution. Others will work just fine with the default
217 /etc/systemd/*, /etc/dbus-1/system.d/*, /etc/hostname,
218 /etc/vconsole.conf, /etc/locale.conf, /etc/modules-load.d/*.conf,
219 /etc/sysctl.d/*.conf, /etc/tmpfiles.d/*.conf, /etc/binfmt.d/*.conf,
220 /etc/os-release, /etc/machine-id, /etc/machine-info
222 ### Configuration Information
224 Most of the config files do not need to be modified, as the defaults
227 Create /etc/hostname by running the following command as the root user
230 /etc/sysconfig/network | sed 's/^HOSTNAME=//' >/etc/hostname
232 Adapt and create a locale file, by performing the following commands as
235 cat > /etc/locale.conf << "EOF"
240 We do not need to create /etc/timezone any more. In the release notes to
241 systemd-190: "timedated will no longer write or process /etc/timezone.
242 As we do not support late mounted /usr anymore /etc/localtime always
243 being a symlink is now safe, and hence the information in /etc/timezone
244 is not necessary anymore."
246 ### Unit files for services
248 As the root user create some unit files to start important services.
249 Unit files of the appropriate name will mask the init scripts. Therefore
250 systemd will use the unit file in preference over the init script, if
253 This unit file creates the /run/var directory to avoid errors from LSB
256 cat > /etc/systemd/system/lsb-prep.service << "EOF"
258 Description=Network Connectivity
259 Wants=local-fs.target
264 ExecStart=/bin/mkdir -p /run/var
267 WantedBy=multi-user.target
270 Create sysklogd service unit files:
272 cat > /etc/systemd/system/syslogd.service << "EOF"
274 Description=System Logging Service
275 Requires=syslog.target
279 ExecStart=/sbin/syslogd -p /run/systemd/journal/syslog -n -m 0
280 Sockets=syslog.socket
284 WantedBy=multi-user.target
288 cat > /etc/systemd/system/sysklogd.service << "EOF"
290 Description=System Kernel Logging Service
291 Requisite=syslog.service
292 BindTo=syslog.service
294 RefuseManualStart=true
298 StandardOutput=syslog+console
299 StandardError=syslog+console
300 ExecStart=/sbin/klogd -c 6 -x
303 WantedBy=multi-user.target
306 To enable the network, create a simple unit file for a static network
307 which uses the settings in /etc/sysconfig/ifconfig.eth0. Alternatively
308 enable the dhcpcd at eth0.service. One could also create a unit file which
309 will call the network/ifup scripts, that provide more functionality with
312 Note, that this unit file requires the BROADCAST ip addr to be set in
315 cat > /etc/systemd/system/network.service << "EOF"
317 Description=Network Connectivity
319 Before=network.target
324 EnvironmentFile=/etc/sysconfig/ifconfig.eth0
325 ExecStart=/sbin/ip link set dev ${IFACE} up
326 ExecStart=/sbin/ip addr add ${IP}/${PREFIX} \
327 broadcast ${BROADCAST} dev ${IFACE}
328 ExecStart=/sbin/ip route add default via ${GATEWAY}
329 ExecStop=/sbin/ip addr flush dev ${IFACE}
330 ExecStop=/sbin/ip link set dev ${IFACE} down
333 WantedBy=multi-user.target
336 Create the following links, which will enable essential services before
337 rebooting into systemd:
339 ln -sv /etc/systemd/system/lsb-prep.service \
340 /etc/systemd/system/multi-user.target.wants/lsb-prep.service
341 ln -sv /etc/systemd/system/syslogd.service \
342 /etc/systemd/system/syslog.service
343 ln -sv /etc/systemd/system/syslogd.service \
344 /etc/systemd/system/multi-user.target.wants/syslogd.service
345 ln -sv /etc/systemd/system/sysklogd.service \
346 /etc/systemd/system/multi-user.target.wants/sysklogd.service
347 ln -sv /etc/systemd/system/network.service \
348 /etc/systemd/system/multi-user.target.wants/network.service
350 Add a systemd entry to grub, check the `root=` entry to match your disk:
352 echo "menuentry \"Linux from Scratch (systemd)\" {" >> \
355 " linux /boot/vmlinuz root=/dev/sda1 ro init=/bin/systemd" \
356 >> /boot/grub/grub.cfg
357 echo "}" >> /boot/grub/grub.cfg
359 Remember to rebuild and reinstall D-Bus-1.6.4, before rebooting into
362 After booting with systemd, look at the systemd journal log from the
367 Optionally Replace SysVinit
368 ---------------------------
370 The lfs-bootscripts scripts provide a lot of rich functionality to LFS.
371 Care should be taken, that all required features are covered by unit
372 files or by systemd itself, before removing them.
374 ### Uninstall SysVinit
376 After systemd is running well, SysVinit can be removed . Check, that no
377 more LSB scripts are used by systemd using the following command:
381 Remove the files belonging to SysVinit:
383 rm -v /usr/bin/{last,lastb,mesg,utmpdump}
384 rm -v /usr/include/initreq.h /etc/inittab /bin/pidof
385 rm -v /usr/share/man/man1/{last.1*,lastb.1*,mesg.1*,utmpdump.1*}
386 rm -v /usr/share/man/man5/{initscript.5*,inittab.5*}
387 rm -v /usr/share/man/man8/{bootlogd.8*,fstab-decode.8*}
388 rm -v /usr/share/man/man8/{fstab-decode.8*,init.8*}
389 rm -v /usr/share/man/man8/{killall5.8*,pidof.8*,sulogin.8*}
390 rm -v /sbin/{bootlogd,fstab-decode,halt,init,killall5,poweroff}
391 rm -v /sbin/{reboot,runlevel,shutdown,sulogin,telinit}
393 Replace sysvinit commands with links to systemd:
395 ln -sv /usr/lib/systemd/systemd /sbin/init
396 for tool in runlevel reboot shutdown poweroff halt telinit; do
397 ln -svf '/usr/bin/systemctl' "/sbin/$tool"
400 #### Uninstall LFS-Bootscripts
402 Now we can also move out the lfs-bootscripts and those services
403 installed with other programs:
405 mkdir -pv /etc/rc.bak
406 tar -czpvf "/etc/rc.bak/rc.d-backup.tar.gz" /etc/rc.d
408 rm -v /etc/rc.d/init.d/*
409 for rcX in rc0 rc1 rc2 rc3 rc4 rc5 rc6 rcS; do
410 rm -v /etc/rc.d/$rcX.d/*
413 The files in /etc/sysconfig, which were installed by lfs-bootscripts
414 might still come in handy to refer to or to utilize their settings from
415 within unit files. We could also keep ipup/ifdown for networking and the
416 lsb functions in /lib/services.
420 The version of Util-linux used in LFS 7.2 contains support for systems
421 without the /etc/mtab file, which use asymlink to `/proc/mounts`
424 Making `mtab` a symlink to `/proc/mounts` is advised by systemd,
425 otherwise there is a reminder during boot: `/etc/mtab is not a symlink
426 or not pointing to /proc/self/mounts. This is not supported anymore.
427 Please make sure to replace this file by a symlink to avoid incorrect
428 or misleading mount output.`
430 Removing /etc/mtab earlier would cause an error in /init.d/mountfs when
431 booting LFS via sysvinit. Now that we are not using the init scripts any
432 more, we can make this change:
434 ln -svf /proc/mounts /etc/mtab
440 **Installed Programs:** systemctl, journalctl, udevadm,
443 **Installed Libraries:** libudev.so, libgudev-1.0.so,
444 libsystemd-daemon.so, libsystemd-id128.so, libsystemd-journal.so,
447 **Installed Directories:** /etc/systemd/, /usr/include/systemd/,
448 /usr/lib/udev/, /usr/lib/systemd/
450 ### Short Descriptions
452 * _systemctl_ may be used to control the state of the systemd system and
455 * _journalctl_ may be used to query the contents of the systemd journal
456 as written by systemd-journald.service
458 ### Further information:
460 [ Official Website ]( http://www.freedesktop.org/wiki/Software/systemd )
462 [ Arch Linux Wiki ]( https://wiki.archlinux.org/index.php/Systemd )
464 ### ACKNOWLEDGEMENTS:
466 * Lemon Lime <lemonlime51 at gmail.com> who posted a similar guide
467 on lfs-dev in Aug. 2011
469 * Matthew Burgess <matthew at linuxfromscratch.org> and Bruce Dubbs
470 <bruce.dubbs at gmail.com> for encouraging me to publish this as