Posts tagged system
Template
File: /etc/systemd/system/APP.service
1
2
3
4
5
6
7
8
9
10
11
12 |
[Unit]
Description=Run APP application
[Service]
Type=simple
ExecStart=/usr/bin/LANG APP_DIR/APP APP_ARGS
Restart=on-failure
User=root
WorkingDirectory=APP_DIR
[Install]
WantedBy=multi-user.target
|
Also, the application might need to reference a PID file, let systemD know abut it via PIDFile
.
Example
File: /etc/systemd/system/julia_dash_app.service
1
2
3
4
5
6
7
8
9
10
11
12 |
[Unit]
Description=Run Julia Dash application
[Service]
Type=simple
ExecStart=/usr/bin/julia /root/julia_dash_app/main.jl
Restart=on-failure
User=root
WorkingDirectory=/root/julia_dash_app
[Install]
WantedBy=multi-user.target
|
Intro
Backing up using this method takes a lot less space - ~60MB (without distfiles) and can be restored on almost any system (running portage) and tweaked afterwards for, say, CPU architecture. I've created a a short script with similar method in here.
What we need
- ebuild repositories are installed with git
- distfiles (those might be gone when we want to replicate)
Backup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
# System info
emerge --info > info.txt
# Portage tree
cp -Lr /etc/portage .
# Portage layout
tree -a -L 2 /etc/portage > layout.txt
# Packages in @world
cp /var/lib/portage/world .
# Installed sets
cp /var/lib/portage/world_sets .
# Installed packages (with versions)
qlist --installed --nocolor --umap > qlist-use.txt
qlist --installed --nocolor --verbose > qlist-ver.txt
# Distfiles
cp -rv "$(portageq envvar DISTDIR)" distfiles
# Ebuild database
cp -r /var/db/pkg pkgdb
|
Restoration
To faithfully restore the system perform those actions as root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
# Copy the portage tree to /etc
rm -dr /etc/portage
cp -r portage /etc/portage
# Checkout the gentoo repo to a commit specified in info.txt
cd "$(portageq get_repo_path / gentoo)"
git checkout # <commit ID>
# Copy distfiles
cp -r distfiles/* "$(portageq envvar DISTDIR)"/
# Fake-install @world and sets
cp world /var/lib/portage/world
cp world_sets /var/lib/portage/world_sets
# Emerge the exact packages from qlist-ver.txt
emerge --keep-going=y -1Oav $(sed 's/^/=/' qlist-ver.txt)
|
Init basic functions
Init should:
- be the first started process - PID 1
- continue running until the system is shut down
Why systemd is more than init
Full system management
systemd needs to run as PID 1 to parenthood other services and… other parts of itself (listed below).
sytemd absorbed
- cron -> timers
- seat tracker -> systemd-logind
- service manager -> systemd-systemctl
- udev -> systemd-udevd
- system logger -> systemd-journald
- network manager -> systemd-networkd
- bootloader -> systemd-boot
- hostname -> systemd-hostnamed
- chroot -> systemd-nspawn
- resolv.conf generator -> systemd-resolved
Additionally systemd is also
- QR code generator
- http server (cockpit)
- home manager -> systemd-homed
- tmp manager -> systemd-tmpfiles
Why it's bad
systemd growth to cover more and more of other services capabilities is dangerous. It can mean that if we find a exploit in one part of systemd it will be easy to compromise the whole system. Actually, there is a even bigger problem - most of the time a user would like to run a standalone service covering one of the uses already covered by systemd - like cronie or rsyslog.
But what about cgroups
Cgroups are nothing new, they are available in other service managers too. Check out cgroups in OpenRC.
Alternatives
OpenRC
Primarily used by Gentoo based systems. Was adopted to Devuan and Artix. Alpine Linux uses it probably because it started out as a Gentoo-based system. Is also available in Debian - though that will still use some systemd services, notably systemd-udevd.
Runit
Avalible in Void Linux - the recommended init for that system.
Pure System V init
Most popular use of this is found in old CentOS, Slackware, Antix and MX Linux.
S6
Check out Devuan if you want to dive into this topic.
systemd + Emacs
One could think that because systemd and Emacs cover a lot of things - systemd - system management and emacs - user utilities - a fusion of two would be very good and will lack so-called bloat. There is one "problem" however - Emacs can be used also as a init! And that doesn't necessarily mean a lot more code being added. So i guess Emacs + Linux (kernel) is the way to go ;P
Was systemd a inside job?
Probably not - Microsoft made their own init for Azure because… systemd was to big… systemd is a history of what happens when everybody wants to be like the rest - adoption of systemd.
Is systemd the new busybox?
This is an interesting concept. There is one bad thing however - you can compile bysybox with any of its utilities and it will work - you can't do that with systemd, you will have to modify and fork it - like eudev and elogind projects
OpenRC prejudice
Many people think of OpenRC as a old SysVinit. I encourage you to check it out and see that most stuff you probably do with systemd you can get from OpenRC (service manager) + cronie (cron/timers) + htop/pstree (full description of system as opposed to "systemctl status")
Basic OpenRC vs systemd commands
OpenRC systemd ————————— ————————— rc-status -a systemctl status rc-service SERVICE start systemctl start SERVICE rc-service SERVICE stop systemctl stop SERVICE rc-update add SERVICE systemctl enable SERVICE rc-update del SERVICE systemctl disable SERVICE
Sources
Honorable Mentions