agama/live/README.md
Ladislav Slezák d382e4d6d5
Break a systemd service dependency cycle (#3665)
## Problem

- https://bugzilla.suse.com/show_bug.cgi?id=1268901
- When systemd detects a cycle in the service dependencies then it
deletes some services to break the cycle. But that services are missing
in the boot sequence and that can have nasty side effects.

```
Jun 24 15:03:54 localhost systemd[1]: NetworkManager-initrd.service: Found ordering cycle: ignition-enable-network.service/start after ignition-fetch-offline.service/start after basic.target/start after sysinit.target/start after cryptsetup.target/start after systemd-ask-password-console.path/start after plymouth-start.service/start after initrd-nmtui.service/start after network-online.target/start after network.target/start after NetworkManager-initrd.service/start - after ignition-enable-network.service
Jun 24 15:03:54 localhost systemd[1]: NetworkManager-initrd.service: Job cryptsetup.target/start deleted to break ordering cycle starting with NetworkManager-initrd.service/start
```

## Solution

- Remove the `Before=plymouth-start.service` dependency which was used
to start the interactive TUI tool before the splashscreen (otherwise it
would not be visible).
- Instead ordering the services quit plymouth before starting the TUI
tool.

## Notes

- As written in the comment, it should be enough to use the `plymouth
hide-splash` and `plymouth show-splash` pair in the pre/post scripts but
unfortunately then the `nmtui` ignores pressing the `Enter` key and
cannot be used. It is strange as the `dialog` tool used before running
`nmtui` works fine.
- As a workaround quit the splash screen completely. As this boot option
will be used rarely it is an acceptable solution.

## Testing

- Tested manually, no dependency cycle is reported and the `nmtui` tool
works fine.

---------

Co-authored-by: Martin Vidner <mvidner@suse.com>
2026-06-24 17:55:03 +02:00

244 lines
8.8 KiB
Markdown

# Live ISO
<!-- omit from toc -->
## Table of Content
- [Live ISO](#live-iso)
- [Table of Content](#table-of-content)
- [Layout](#layout)
- [Building the sources](#building-the-sources)
- [Building the ISO image](#building-the-iso-image)
- [Build options](#build-options)
- [Using another project](#using-another-project)
- [Using internal build service](#using-internal-build-service)
- [Using locally built RPM packages](#using-locally-built-rpm-packages)
- [Image definition](#image-definition)
- [KIWI files](#kiwi-files)
- [Image configuration](#image-configuration)
- [GRUB2 menu](#grub2-menu)
- [SSH server](#ssh-server)
- [Autologin](#autologin)
- [Firefox profile](#firefox-profile)
- [Dracut menu](#dracut-menu)
- [Avahi/mDNS](#avahimdns)
- [The Default Hostname](#the-default-hostname)
- [Service Advertisement](#service-advertisement)
- [Firmware cleanup](#firmware-cleanup)
---
## Layout
This directory contains a set of files that are used to build the Agama Live ISO image.
- [src](src) subdirectory contains all source files which are copied unmodified to the OBS project
- [root](root) subdirectory contains files which are added to the Live ISO root system (inside the
squashfs image)
- [config-cdroot](config-cdroot) subdirectory contains file which are copied to the uncompressed
root of the ISO image, the files can be accessed just by mounting the ISO file or the DVD medium
- [test](test) subdirectory contains tests to verify correctness of content. Can be run with `make check`
## Building the sources
To build the sources for OBS just run the
```shell
make
```
command. This will save the built source files into the `dist` subdirectory.
To start from scratch run
```shell
make clean
```
or just simply delete the `dist` subdirectory.
By default it builds the sources for openSUSE, if you want to build the sources for SLES run
```shell
make sles
```
It is recommended to run `make clean` before changing the target product to ensure there are no
leftovers from the previous product.
## Building the ISO image
To build the ISO locally run the
```shell
make build
```
command. The built ISO image is saved to the `/var/tmp/build-root` directory, see the end of the
build for output for the exact ISO file name.
For building an ISO image you need a lot of free space at the `/var` partition. Make sure there is
at least 25GiB free space otherwise the build will fail.
### Build options
By default this will build the openSUSE image. If you want to build another image then run
```shell
make build FLAVOR=<flavor>
```
See the [_multibuild](src/_multibuild) file for the list of available build flavors.
#### Using another project
By default it will use the
[systemsmanagement:Agama:Devel](https://build.opensuse.org/project/show/systemsmanagement:Agama:Devel)
OBS project. If you want to build using another project, like your fork, then delete the `dist`
directory and checkout the OBS project manually and run the build:
```shell
rm -rf dist
# replace <USER> with your OBS account name
make build OBS_PROJECT=home:<USER>:branches:systemsmanagement:Agama:Devel
```
#### Using internal build service
To build a SLE image using the internal OBS instance run
```shell
make build OBS_API=https://api.suse.de OBS_PROJECT=Devel:YaST:Agama:Head OBS_PACKAGE=agama-installer FLAVOR=SUSE_SLE_16.1 OBS_TARGET=images_SLES-16.1
```
#### Using locally built RPM packages
If you have a locally built RPM which you want to include in the ISO instead of the RPM from the
build service use the `-p` osc option with directory containing the RPMS. The workflow should look
like this:
```shell
# first create a place for storing the RPM packages, if the directory already
# exists make sure it does not contain any previous results
mkdir ~/rpms
# build the updated RPM package locally and save the result into the created directory
osc build -k ~/rpms
# then build the Live ISO using these packages
make build OSC_OPTS="-p ~/rpms"
```
## Image definition
The [KIWI](https://github.com/OSInside/kiwi) image builder is used by OBS to build the Live ISO. See
the [KIWI documentation](https://osinside.github.io/kiwi/index.html) for more details about the
build workflow and the `.kiwi` file format.
### KIWI files
The main Kiwi source files are located in the [src](src) subdirectory:
- [agama-installer-openSUSE.kiwi](src/agama-installer-openSUSE.kiwi) is the main KIWI file which drives the ISO image build.
- [config.sh](src/config.sh) is a KIWI hook script which is called and the end of the build process,
after all packages are installed but before compressing and building the image. The script runs in
the image chroot and is usually used to adjust the system configuration (enable/disable services,
patching configuration files or deleting not needed files).
- [_constraints](src/_constraints) file tells OBS to build the image on the hosts with enough
resources (enough free disk space).
- [_multibuild](src/_multibuild) defines the image flavors (KIWI profiles) which are available to
build
- [fix_bootconfig](src/fix_bootconfig) - a special KIWI hook script which sets the boot
configuration on S390 and PPC64 architectures.
## Image configuration
The Live ISO is configured to allow using some features and allow running Agama there.
### GRUB2 menu
grub.cfg, defining boot menu items of the Agama image, is generated by scripts stored in
[config-cdroot](https://github.com/openSUSE/agama/tree/master/live/config-cdroot).
Both x86_64 and aarch64 grub.cfg are basically copies of KIWI autogenerated grub.cfg.
The x86_64 grub.cfg contains UEFI fix for Booting from disk (Issue #1609).
### SSH server
The SSH connection for the root user is enabled in the
[10_root_login.conf](root/etc/ssh/sshd_config.d/10_root_login.conf) file.
### Autologin
Automatic root login and staring the graphical environment is configured in several files.
- [x11-autologin.service](src/etc/systemd/system/x11-autologin.service) uses `startx` to start an
x11 session.
- `startx` runs the Icewm window manager via [.xinitrc](root/root/.xinitrc) file.
- Icewm autostarts Firefox via [startup](root/root/.icewm/startup) file.
- Icewm uses the usual YaST2 installation [preferences.yast2](root/etc/icewm/preferences.yast2)
configuration file
### Firefox profile
The default Firefox configuration is defined in the [profile](root/root/.mozilla/firefox/profile)
file. It disables several features which do not make sense in Live ISO like remembering the used
passwords.
### Dracut menu
The [98dracut-menu](live/root/usr/lib/dracut/modules.d/98dracut-menu) directory implements a simple
menu system for dracut. To activate it during boot add `rd.cmdline=menu` to the boot prompt. This is
similar to `rd.cmdline=ask` which gives you a simple one-line prompt to add boot options.
The dracut-cmdline-menu can currently set the `root` and `proxy` options. The settings are copied
(using a dracut pre-pivot hook) to the live system in
[cmdline-menu.conf](root/etc/cmdline-menu.conf).
There is also the complete command line in the [cmdline-full.conf](root/etc/cmdline-full.conf)
file - maybe it can useful at least for debugging.
For more details see [dracut.bootup(7)](https://man.archlinux.org/man/dracut.bootup.7.en),
[dracut-pre-pivot.service(8)](https://man.archlinux.org/man/extra/dracut/dracut-pre-pivot.service.8.en).
To arrange the dracut config in KIWI you have to adjust the default dracut config of the live
system. This is done in [config.sh](src/config.sh). You can also fill in a default network location
if one is defined for a product (currently not).
### Avahi/mDNS
The mDNS service allows resolving host names in the local network without a DNS server. That is
implemented by the `avahi-daemon` service which enabled in the [config.sh](src/config.sh) file and
installed in the `avahi` RPM package.
The mDNS protocol resolves the hosts in the `.local` domain.
#### The Default Hostname
By default the Agama live ISO sets the `agama` host name which can be used as `agama.local` full
hostname in URL.
The default hostname is set by the [agama-hostname](root/etc/systemd/system/agama-hostname.service)
service.
If the hostname is set via the `hostname=` boot parameter then the `agama` host name is not used,
the boot option takes precedence.
#### Service Advertisement
The Avahi HTTPS service announcement is configured via the Avahi
[agama.service](root/etc/avahi/services/agama.service) file
That allows scanning all running Agama instances in the local network with command:
```shell
avahi-browse -t -r _agama._sub._https._tcp
```
### Firmware cleanup
The [fw_cleanup.rb](root/tmp/fw_cleanup.rb) script removes the unused firmware from the image. Many
firmware files are not needed, this makes the final ISO much smaller.
This script is started from [config.sh](src/config.sh) the script and after running it the script
deleted. (Not needed anymore in the system.)