OSInside / kiwi

KIWI - Appliance Builder Next Generation
https://osinside.github.io/kiwi
GNU General Public License v3.0
302 stars 152 forks source link

Add loop-less disk builder (systemd-repart) #2445

Open schaefi opened 9 months ago

schaefi commented 9 months ago

Description

The current implementation for the disk builder makes use kernel interfaces, meaning the produced devices are created through loop devices as well as the produced file-systems gets mounted and more. Under certain conditions the dependency into the kernel could cause a problem e.g if the calling user has not enough permissions or the environment does not expose access to these interfaces. In this case it would be handy if kiwi could offer a disk builder which does not require kernel interfaces.

The systemd project offers a tool called systemd-repart which implements many parts of the build process without the need for the kernel interfaces. This leads to the idea to write a new builder class that utilizes systemd-repart to build the disk image. systemd-repart is also used in the mkosi image builder from which the idea originates. For reference see make_image():

kiwi needs to implement an interface to systemd-repart and its required input files

schaefi commented 9 months ago

on suse systemd-repart is provided with the systemd-experimental package

Conan-Kudo commented 8 months ago

On RH/Fedora, it's part of the systemd-udev package (yeah, I dunno why, but oh well?).

Conan-Kudo commented 2 months ago

This might become more important to resolve issues around running kiwi in container environments.

bnicolae86 commented 1 month ago

Ok, so that's why I cannot build the image in a container...


[ DEBUG   ]: 20:41:27 | EXEC: [sgdisk -n 3:0:0 -c 3:p.lxroot /dev/loop3]
[ DEBUG   ]: 20:41:29 | EXEC: [sgdisk -t 3:8300 /dev/loop3]
[ DEBUG   ]: 20:41:30 | EXEC: [partx --add /dev/loop3]
[ ERROR   ]: 20:41:30 | KiwiMappedDeviceError: Device /dev/loop3p1 does not exist
schaefi commented 1 month ago

yes this is a known problem in containers when no udev is running inside. You can fix this as follows

Make sure your container comes with a file named /etc/kiwi.yml inside of the file set:

mapper:
  - part_mapper: kpartx

rebuild the image. kiwi will now use kpartx which doesn't require udev to create the device nodes.

Your container still needs to be privileged though to allow creation of device nodes

bnicolae86 commented 1 month ago

yes this is a known problem in containers when no udev is running inside. You can fix this as follows

Make sure your container comes with a file named /etc/kiwi.yml inside of the file set:

mapper:
  - part_mapper: kpartx

rebuild the image. kiwi will now use kpartx which doesn't require udev to create the device nodes.

Your container still needs to be privileged though to allow creation of device nodes

thanks, I'll try it

bnicolae86 commented 1 month ago

yes this is a known problem in containers when no udev is running inside. You can fix this as follows Make sure your container comes with a file named /etc/kiwi.yml inside of the file set:

mapper:
  - part_mapper: kpartx

rebuild the image. kiwi will now use kpartx which doesn't require udev to create the device nodes. Your container still needs to be privileged though to allow creation of device nodes

thanks, I'll try it

@schaefi it worked but now I have another issue trying to use gitlab.com runners. it seems that they don't have support for BTRFS filesystems :(