---
# System prepended metadata

title: Lab 9 --- Systemd

---

# Lab 9 --- Systemd
**Student**: Albert Akmukhametov (a.akmukhametov@innopolis.university)

## Question 1
### Time spent in the kernel space before the user space was reached.
```bash
$ systemd-analyze
Startup finished in 5.504s (kernel) + 14.439s (userspace) = 19.944s
graphical.target reached after 14.380s in userspace
```
![](https://i.imgur.com/6VbxoEA.png)

~5.5 seconds in kernel space
~14.4 seconds in user space

### Show an SVG image that contains services that have been started, and how long it took for them to initialize.
```bash
$ systemd-analyze plot > plot.svg
```

Output file can be opened in any web-browser
Head:
![](https://i.imgur.com/BNDxCGs.png)

Tail:
![](https://i.imgur.com/Lxl2jkv.png)


## Question 2
> `man 7 systemd.special` contains descrition of all services

`graphical.target` --- target which indicates graphical UI may be started (may be - because this target presents on non-gui systems like Ubuntu Server as well)
```
kinjalik-remote% cat /lib/systemd/system/graphical.target

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
```

`multi-user.target` --- indicates that system enters run level 2 i.e. system is in usable state for multiple users

```
kinjalik-remote% cat /lib/systemd/system/multi-user.target

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
```

`basic.target` --- this target ensures that all necessary things (sockets, timers, mountpoints) are initialized and synchronized to proceed the boot process.

```
kinjalik-remote% cat /lib/systemd/system/basic.target

[Unit]
Description=Basic System
Documentation=man:systemd.special(7)
Requires=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sysinit.target sockets.target paths.target slices.target tmp.mount

# We support /var, /tmp, /var/tmp, being on NFS, but we don't pull in
# remote-fs.target by default, hence pull them in explicitly here. Note that we
# require /var and /var/tmp, but only add a Wants= type dependency on /tmp, as
# we support that unit being masked, and this should not be considered an error.
RequiresMountsFor=/var /var/tmp
Wants=tmp.mount
```

`sysinit.target` --- initialization of low-level components of kernel and synchronization before proceed the boot process

```
kinjalik-remote% cat /lib/systemd/system/sysinit.target

[Unit]
Description=System Initialization
Documentation=man:systemd.special(7)
Conflicts=emergency.service emergency.target
Wants=local-fs.target swap.target
After=local-fs.target swap.target emergency.service emergency.target
```

Last service, `sysinit.target`, is the first synchronization point for initialization. `Wants` means that both `local-fs` and `swap` targets will be called. However, their success is not truly necessary, for example if SWAP is disabled or fstab (used for `local-fs`) have incorrect entry but does not make boot process failed.

## Question 3
### Server script
Location: `/usr/bin/script.sh`
```bash
#!/bin/bash

while true;
  do dd if=/dev/zero of=/dev/null
done &

while true;
  UPTIME="$(uptime)"
  INODE_USAGE="$(df -i)"
  RAM="$(free -h)"
  MEMORY="$(df -h)"
  LOGS=$(cat /var/log/syslog | tail -n 15)
  
  OUTPUT="Uptime:\n$UPTIME\n\nInode Usage:\n$INODE_USAGE\n\nRAM Usage:\n$RAM\n\nDisk Usage:\n$MEMORY\n\n/var/log/syslog (last 15 lines):\n$LOGS"
  do echo -e "HTTP/1.1 200 OK\n\n$OUTPUT" \
  | nc -l -k -p 8080 -q 1;
done
```

### Service Unit
Location: `/lib/systemd/system/server.service`
```
[Unit]
Description=My custom web service to show system processes

[Service]
ExecStart=/usr/bin/script.sh
Restart=always
Slice=testslice.slice

[Install]
WantedBy=multi-user.target
```

### Slice
Location: `/etc/systemd/system/testslice.slice`
```
[Unit]
Description=Custom systemd slice for SNA lab 9 on systemd.
Before=slices.target

[Slice]
MemoryAccounting=true
CPUAccounting=true
MemoryMax=256M
CPUQuota=15%
```

### How to run
1. Place files in their corresponding files
2. `systemctl enable server.service` --- make service enabled i.e. it will be started as soon as possible at startup
3. `systemctl start server.service` --- actually start the service

![](https://i.imgur.com/TruZrme.png)

# Question 4
## Service
```
[Unit]
Description=Update apt
Wants=updater.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/apt update

[Install]
WantedBy=multi-user.target
```

## Timer
```
[Unit]
Description=Update apt

[Timer]
OnBootSec=5min
OnUnitActiveSec=1d

[Install]
WantedBy=timers.target
```

## Start this thing
```bash
systemctl enable updater.timer
systemctl start updater.timer
```

## SCreeshots
After startup:
![](https://i.imgur.com/EXCBIA9.png)
After 5 min after startup:
![](https://i.imgur.com/aKIpcMt.png)
