Difference between revisions of "Systemd"

From HackerNet
Jump to: navigation, search
(Created page with "Systemd är en ny service hanterare för linux. Den tar bland annat hand om upstarten och man märker ett stor skillnad mot tidigare. Den är redan default hanterare i flera s...")
Tag: visualeditor-switched
 
 
(18 intermediate revisions by 3 users not shown)
Line 1: Line 1:
Systemd är en ny service hanterare för linux. Den tar bland annat hand om upstarten och man märker ett stor skillnad mot tidigare. Den är redan default hanterare i flera stora linux distar förutom Debian och Ubuntu.
+
Systemd är ett init-system och en service-hanterare som är standard för de flesta linux-distar. Det grundläggande syftet med ett init-system är att initiera de komponenter som måste startas efter att Linuxkärnan har startat. Systemd är det första som startar efter att kernel har startat och får alltid Process ID 1. Init-systemet används också för att hantera tjänster och demoner för servern medan systemet är igång.  
  
{| class="wikitable sortable" style="margin-left: auto; margin-right: auto;"
+
Default sedan:<br/>
|+ Major Linux distributions that adopted systemd
+
Debian 8<br/>
|-
+
Ubuntu 15.04<br/>
! scope="col" | Linux distribution !! scope="col" | Date added to [[software repository]]{{Efn|Dates are for the [[general availability]] release.}} !! scope="col" | Enabled by default? !! scope="col" | Date released as default
+
Fedora 15<br/>
|-
+
RHEL 7<br/>
| [[Arch Linux]]
+
CentOS 7
| {{dts|January 2012}}<ref name="arch-git" />
+
 
| {{Yes}}
+
=Systemctl=
| {{dts|October 2012}}<ref name="arch-systemd" />
+
Systemctl är det centrala verktyget för att kontrollera init-systemet. Systemctl ersätter service och chkconfig.<br/>
|-
+
Grundfunktioner
| [[CoreOS]]
+
systemctl start sshd
| {{dts|July 2013}}
+
systemctl stop sshd
| {{Yes}}<ref name="coreos-systemd" />
+
systemctl reload sshd
| {{dts|October 2013}} (v94.0.0)<ref name="coreos-github" />
+
systemctl restart sshd
|-
+
Status
| [[Debian]]||{{dts|April 2012}}<ref name="debian-systemd" />
+
systemctl status sshd
| {{Pending|Planned for Debian 8 "Jessie"}}{{Efn|The Debian Technical Committee voted to make systemd the default system management daemon for Linux in the "jessie" release.<ref name="ctte-20140211" />}}
+
Autostarta en service
| not yet released
+
systemctl enable sshd
|-
+
systemctl disable sshd
| [[Fedora (operating system)|Fedora]]
+
Lista alla aktiva enheter
| {{dts|May 2011}} (v15)<ref name="Walker-Morgan" />
+
systemctl
| {{Yes}}
+
Lista alla enheter
| {{dts|May 2011}} (v15)
+
systemctl list-units --all
|-
+
OBS .service behöver inte skrivas ut, det läggs till efter tjänsten automatiskt<br/>
| [[Gentoo Linux]]{{Efn|systemd is supported in Gentoo as an alternative to OpenRC, the default init system<ref name="gentoo-wiki" /> for those who "want to use systemd instead, or are planning to use Gnome 3.8 and later (which requires systemd)"<ref name="gentoo-handbook" /> }}
+
Fler kommandon
| {{dts|2011}}<ref name="gentoo-bugzilla" /><ref name="gentoo-doc" /><ref name="gentoo-systemd" />
+
systemctl show sshd.service
| {{No}}{{Efn|As of 2014, Gentoo requires systemd when selecting the GNOME profile or installing GNOME 3.}} ||
+
systemctl list-dependencies sshd.service
|-
+
 
| [[Mageia]]
+
Titta på senaste uppstart grafiskt. Testa detta, seriöst det är coolt!
| {{dts|May 2012}} (v2.0)<ref name="mageia" />
+
systemd-analyze plot > plot.svg
| {{Yes}}
+
 
| {{dts|May 2012}} (v2.0)
+
== Lägga till egna services ==
|-
+
Under <code>/etc/systemd/system</code> kan man lägga till egna services som man vill hantera med systemd.
| [[openSUSE]]
+
 
| {{dts|March 2011}} (v11.4)<ref name="opensuse" />
+
En basic service fil ser ut så här.
| {{Yes}}
+
 
| {{dts|September 2012}} (v12.2)<ref name="AutoWR-1" />
+
[Unit]
|-
+
Description=Hello world
| [[Red Hat Enterprise Linux]]
+
After=network-online.target
| {{dts|June 2014}} (v7.0)<ref name="rhel" />|| {{Yes}}
+
Wants=network-online.target
| {{dts|June 2014}} (v7.0)
+
|-
+
[Service]
| [[SUSE Linux Enterprise Server]]
+
ExecStart=/usr/bin/echo "Hello world!"
| {{dts|2014}} (v12)
+
| {{Yes}}
+
[Install]
| {{dts|October 2014}} (v12)
+
WantedBy=multi-user.target
|-
+
 
| [[Tizen]]
+
Om servicen kräver att det finns nätverk före den startar kan man skriva '''After/Wants=network-online.target''' då kommer servicen att försöka starta efter serverns nätverk har gått upp och den har fått en routebar IP.
| {{dts|2012}}<ref name="tizen" />
+
 
| {{Yes}}
+
För att systemd ska köra servicen vid boot måste man köra enable.
| {{dts|2012}}
+
systemctl enable /etc/systemd/system/hello.service
|-
+
För att starta tjänsten skriv.
| [[Ubuntu (operating system)|Ubuntu]]{{Efn|Ubuntu's development documentation offers instructions on how to use systemd as an experimental option.<ref name="ubuntu-wiki" />}}
+
systemctl start hello.service
| {{dts|April 2013}} (v13.04)
+
 
| {{Pending|Planned}}<ref name="ubuntu-planned-systemd" />
+
==Övervaka en service==
| not yet released
+
Med systemd kan man övervaka en tjänst så att den startas automatiskt om den skulle krasha.
|}
+
systemctl edit sshd
 +
Skriv sedan in:
 +
[Service]
 +
Restart=always
 +
Spara sedan filen. Den kommer att sparas under '''/etc/systemd/system/sshd.service.d/overrides.conf'''
 +
 
 +
Vill du ha en delay innan systemd startas tjänsten igen så går det också med:
 +
RestartSec=30
 +
 
 +
Kör sedan en reload:
 +
systemctl daemon-reload
 +
 
 +
=Journald=
 +
Journald är en systemd-komponent som har hand om loggar från applikationer och kärna. Kommandot man använder är journalctl. Kör igenom dessa för att bilda dig en uppfattning av vad de gör och hur de fungerar.
 +
journalctl
 +
journalctl -k
 +
journalctl -u nginx.service
 +
journalctl -u nginx.service --since today
 +
journalctl _PID=8088
 +
journalctl --disk-usage
 +
 
 +
=Networkd=
 +
systemctl start systemd-networkd
 +
networkctl
 +
networkctl status
 +
 
 +
=Nspawn=
 +
Systemd-nspawn är en container manager som är inbyggd i systemd.<br/>
 +
''Debian''
 +
apt-get install -y dbus debootstrap bridge-utils
 +
debootstrap --arch=amd64 jessie /var/lib/machines/container1/
 +
systemd-nspawn -D /var/lib/machines/container1/ --machine first_container -b
 +
OBS med denna setup delas network namespace med värdhosten. Annars måste man skapa en brygga och koppla containern till den.
 +
systemd-nspawn -D /var/lib/machines/container1/ --machine second_container --network-bridge=my-bridge -b
 +
Kolla containers
 +
machinectl
 +
machinectl status first_container
 +
machinectl login first_container
 +
 
 +
=Template unit=
 +
En template unit går att identifera med hjälp av '''@''' som är efter base unit namnet och före unit type suffixen.
 +
openvpn-client@.service
 +
 
 +
För att använda sig av en template unit så lägger man in en instance identifier mellan '''@''' och punkten när man kallar på den med <code>systemctl start</code> eller annat kommando.
 +
openvpn-client@'''hackernet-vpn'''.service
 +
Med detta sättet så behöver man bara en unit fil istället för en fil per instans man försöker starta.
 +
 
 +
==Variabler==
 +
* <code>%n</code>: Ger hela unit namnet. '''Ex: openvpn-client@hackernet-vpn.service'''
 +
* <code>%N</code>: Samma som ovan fast all escape tecken kommer vara omvänd. '''Ex: openvpn-client@hackernet-vpn'''
 +
* <code>%p</code>: Ger unit namnet som är före '''@'''. '''Ex: openvpn-client'''
 +
* <code>%P</code>: Samma som ovan fast escape är omvänt. '''Ex: openvpn/client'''
 +
* <code>%i</code>: Ger det som är efter '''@''' och punkten. '''Ex: hackernet-vpn'''
 +
* <code>%I</code>: Samma som ovan fast escape är omvänt. '''Ex: hackernet/vpn'''
 +
* <code>%f</code>: Samma som ovan och den lägger på ett '''/''' före. '''Ex: /hackernet/vpn'''
 +
* <code>%u</code>: Vilken användare som är confad att köra uniten. '''Ex: root'''
 +
* <code>%U</code>: Samma som ovan fast visar <code>UID</code> istället. '''Ex: 0'''
 +
* <code>%h</code>: Visar vart användarens home folder finns. '''Ex: /root'''
 +
* <code>%H</code>: Visar hostnamnet på servern. '''Ex vpnserver'''
 +
* <code>%s</code>: Visar användarens shell. '''Ex: /bin/sh'''
 +
* <code>%v</code>: Visar vilken kernel release som körs. Samma svar som <code>uname -r</code>. '''Ex: 3.10.0-514.6.1.el7.x86_64'''
 +
* <code>%%</code>: Används för att skapa ett procent tecken.
 +
 
 +
==Exempel template unit==
 +
{{OpenVPN-Systemd}}
 +
[[Category:Tools]]

Latest revision as of 16:24, 22 November 2018

Systemd är ett init-system och en service-hanterare som är standard för de flesta linux-distar. Det grundläggande syftet med ett init-system är att initiera de komponenter som måste startas efter att Linuxkärnan har startat. Systemd är det första som startar efter att kernel har startat och får alltid Process ID 1. Init-systemet används också för att hantera tjänster och demoner för servern medan systemet är igång.

Default sedan:
Debian 8
Ubuntu 15.04
Fedora 15
RHEL 7
CentOS 7

Systemctl

Systemctl är det centrala verktyget för att kontrollera init-systemet. Systemctl ersätter service och chkconfig.
Grundfunktioner

systemctl start sshd
systemctl stop sshd
systemctl reload sshd
systemctl restart sshd

Status

systemctl status sshd

Autostarta en service

systemctl enable sshd
systemctl disable sshd

Lista alla aktiva enheter

systemctl 

Lista alla enheter

systemctl list-units --all

OBS .service behöver inte skrivas ut, det läggs till efter tjänsten automatiskt
Fler kommandon

systemctl show sshd.service
systemctl list-dependencies sshd.service

Titta på senaste uppstart grafiskt. Testa detta, seriöst det är coolt!

systemd-analyze plot > plot.svg

Lägga till egna services

Under /etc/systemd/system kan man lägga till egna services som man vill hantera med systemd.

En basic service fil ser ut så här.

[Unit]
Description=Hello world
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/bin/echo "Hello world!"

[Install]
WantedBy=multi-user.target

Om servicen kräver att det finns nätverk före den startar kan man skriva After/Wants=network-online.target då kommer servicen att försöka starta efter serverns nätverk har gått upp och den har fått en routebar IP.

För att systemd ska köra servicen vid boot måste man köra enable.

systemctl enable /etc/systemd/system/hello.service

För att starta tjänsten skriv.

systemctl start hello.service

Övervaka en service

Med systemd kan man övervaka en tjänst så att den startas automatiskt om den skulle krasha.

systemctl edit sshd

Skriv sedan in:

[Service]
Restart=always

Spara sedan filen. Den kommer att sparas under /etc/systemd/system/sshd.service.d/overrides.conf

Vill du ha en delay innan systemd startas tjänsten igen så går det också med:

RestartSec=30

Kör sedan en reload:

systemctl daemon-reload

Journald

Journald är en systemd-komponent som har hand om loggar från applikationer och kärna. Kommandot man använder är journalctl. Kör igenom dessa för att bilda dig en uppfattning av vad de gör och hur de fungerar.

journalctl
journalctl -k
journalctl -u nginx.service
journalctl -u nginx.service --since today
journalctl _PID=8088
journalctl --disk-usage

Networkd

systemctl start systemd-networkd
networkctl
networkctl status

Nspawn

Systemd-nspawn är en container manager som är inbyggd i systemd.
Debian

apt-get install -y dbus debootstrap bridge-utils
debootstrap --arch=amd64 jessie /var/lib/machines/container1/
systemd-nspawn -D /var/lib/machines/container1/ --machine first_container -b

OBS med denna setup delas network namespace med värdhosten. Annars måste man skapa en brygga och koppla containern till den.

systemd-nspawn -D /var/lib/machines/container1/ --machine second_container --network-bridge=my-bridge -b

Kolla containers

machinectl
machinectl status first_container
machinectl login first_container

Template unit

En template unit går att identifera med hjälp av @ som är efter base unit namnet och före unit type suffixen.

openvpn-client@.service

För att använda sig av en template unit så lägger man in en instance identifier mellan @ och punkten när man kallar på den med systemctl start eller annat kommando.

openvpn-client@hackernet-vpn.service

Med detta sättet så behöver man bara en unit fil istället för en fil per instans man försöker starta.

Variabler

  • %n: Ger hela unit namnet. Ex: openvpn-client@hackernet-vpn.service
  • %N: Samma som ovan fast all escape tecken kommer vara omvänd. Ex: openvpn-client@hackernet-vpn
  • %p: Ger unit namnet som är före @. Ex: openvpn-client
  • %P: Samma som ovan fast escape är omvänt. Ex: openvpn/client
  • %i: Ger det som är efter @ och punkten. Ex: hackernet-vpn
  • %I: Samma som ovan fast escape är omvänt. Ex: hackernet/vpn
  • %f: Samma som ovan och den lägger på ett / före. Ex: /hackernet/vpn
  • %u: Vilken användare som är confad att köra uniten. Ex: root
  • %U: Samma som ovan fast visar UID istället. Ex: 0
  • %h: Visar vart användarens home folder finns. Ex: /root
  • %H: Visar hostnamnet på servern. Ex vpnserver
  • %s: Visar användarens shell. Ex: /bin/sh
  • %v: Visar vilken kernel release som körs. Samma svar som uname -r. Ex: 3.10.0-514.6.1.el7.x86_64
  • %%: Används för att skapa ett procent tecken.

Exempel template unit

Denna OpenVPN template unit letar efter en .conf fil med det namnet du anger efter @ i mappen /etc/openvpn/client/.

Spara filen under /usr/lib/systemd/system och döp den till openvpn-client@.service.

[Unit]
Description=OpenVPN tunnel for %I
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn/client
ExecStart=/usr/sbin/openvpn --suppress-timestamps --nobind --config %i.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process

[Install]
WantedBy=multi-user.target

Har du 3st VPN filer som heter vpn-office.conf, vpn-branch.conf, vpn-home.conf så kan du starta alla med följande kommando.

systemctl start openvpn-client@vpn-office
systemctl start openvpn-client@vpn-branch
systemctl start openvpn-client@vpn-home

För att dom ska autostarta vid boot kan du använda:

systemctl enable openvpn-client@vpn-office
systemctl enable openvpn-client@vpn-branch
systemctl enable openvpn-client@vpn-home