diff options
author | jandob | 2016-01-21 15:29:05 +0100 |
---|---|---|
committer | jandob | 2016-01-21 15:29:05 +0100 |
commit | ad9d66426c3a00c81da5ab76ba6269948d6609d0 (patch) | |
tree | c22fe002d7f590fe957f6d3f12096733a8df0d90 | |
parent | debugging (diff) | |
download | systemd-init-ad9d66426c3a00c81da5ab76ba6269948d6609d0.tar.gz systemd-init-ad9d66426c3a00c81da5ab76ba6269948d6609d0.tar.xz systemd-init-ad9d66426c3a00c81da5ab76ba6269948d6609d0.zip |
add xmount; refactor
-rw-r--r-- | .gitmodules | 3 | ||||
m--------- | builder/dnbd3-rootfs/binaries/dnbd3 | 0 | ||||
m--------- | builder/dnbd3-rootfs/binaries/xmount | 0 | ||||
-rwxr-xr-x | builder/dnbd3-rootfs/hooks/prepare-root-partition.sh | 47 | ||||
-rwxr-xr-x | builder/dnbd3-rootfs/module-setup.sh | 33 | ||||
-rw-r--r-- | builder/dnbd3-rootfs/scripts/container-unpack-qemu.sh | 39 | ||||
-rw-r--r-- | builder/dnbd3-rootfs/scripts/container-unpack-xmount.sh | 25 | ||||
-rw-r--r-- | builder/dnbd3-rootfs/scripts/device-add-write-layer.sh | 28 |
8 files changed, 115 insertions, 60 deletions
diff --git a/.gitmodules b/.gitmodules index 29d77a7a..5f12976a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "dnbd3"] path = builder/dnbd3-rootfs/binaries/dnbd3 url = git://git.openslx.org/dnbd3.git +[submodule "builder/dnbd3-rootfs/binaries/xmount"] + path = builder/dnbd3-rootfs/binaries/xmount + url = git@github.com:eaas-framework/xmount.git diff --git a/builder/dnbd3-rootfs/binaries/dnbd3 b/builder/dnbd3-rootfs/binaries/dnbd3 -Subproject b47ba01818f2ea2ebd1cf1bf5e3e91e37c5f88d +Subproject d9c2a6cf943ca08f31f61a3fada940f77e3a03d diff --git a/builder/dnbd3-rootfs/binaries/xmount b/builder/dnbd3-rootfs/binaries/xmount new file mode 160000 +Subproject 015137556fce1e21273f198ae0b9158157f74f7 diff --git a/builder/dnbd3-rootfs/hooks/prepare-root-partition.sh b/builder/dnbd3-rootfs/hooks/prepare-root-partition.sh index e5881ca0..3af24960 100755 --- a/builder/dnbd3-rootfs/hooks/prepare-root-partition.sh +++ b/builder/dnbd3-rootfs/hooks/prepare-root-partition.sh @@ -37,33 +37,10 @@ if [[ $return_code != 0 ]]; then fi # endregion -# region detect read-only partition -read_only_device="$SLX_DNBD3_DEVICE" -if ! qemu-img info --output json "$read_only_device" | grep '"format": "raw"' +read_only_device="" +if ! qemu-img info --output json "$SLX_DNBD3_DEVICE" | grep '"format": "raw"' then - read_only_device='/dev/nbd0' - systemd-preserve-process-marker qemu-nbd --connect="$read_only_device" \ - "$SLX_DNBD3_DEVICE" --read-only --persistent --nocache - - # XXX better way to wait for the device to be made? - i=0 - while [ ! -b "$read_only_device" ]; do - [ $i -ge 20 ] && exit 1 - if [ $UDEVVERSION -ge 143 ]; then - udevadm settle --exit-if-exists="$read_only_device" - else - sleep 0.1 - fi - i=$(($i + 1)) - done - - # NBD doesn't emit uevents when it gets connected, so kick it - echo change > /sys/block/nbd0/uevent - udevadm settle - - # wait for partitions TODO make nicer - #touch $read_only_device - #udevadm settle + read_only_device="$(container-unpack-xmount $SLX_DNBD3_DEVICE)" else # workaround to detect partitions on raw disks # can be omited when the dnbd3 kernel module supports it (like the nbd @@ -74,7 +51,7 @@ else udevadm settle read_only_device="$loop_device" fi - +# region detect read-only partition for i in 0.5 1 2; do if read_only_partition=$(utils.find_block_device \ "$SLX_SYSTEM_PARTITION_IDENTIFIER" "$read_only_device"); then @@ -128,20 +105,12 @@ fi # endregion -# region combine devices with device mapper -partition_size="$(blockdev --getsz "$read_only_partition")" -writable_partition_name='root' logging.info "Using read-only device: $read_only_partition" logging.info "Using writable device $writable_device, persistency: $persistent" -chunksize='1' -modprobe dm_snapshot -dmsetup create "$writable_partition_name" --noudevsync --table \ - "0 $partition_size snapshot $read_only_partition $writable_device $persistent $chunksize" -dmsetup mknodes --noudevsync "$writable_partition_name" -# TODO remove -echo 'IgnoreOnIsolate=true' >> /usr/lib/systemd/system/sockets.target -# end TODO -# endregion + +# combine devices with device mapper +device-add-write-layer "root" "$read_only_partition" "$writable_device" "$persistent" + ) || exit $? exceptions.deactivate # region vim modline diff --git a/builder/dnbd3-rootfs/module-setup.sh b/builder/dnbd3-rootfs/module-setup.sh index b4355012..8b16e71a 100755 --- a/builder/dnbd3-rootfs/module-setup.sh +++ b/builder/dnbd3-rootfs/module-setup.sh @@ -44,9 +44,6 @@ check() { build_compile_systemd_preserve_process_marker \ "$moddir/binaries/systemd-preserve-process-marker/" fi - if [[ ! -f "$moddir/binaries/qemu/qemu-nbd" ]]; then - build_compile_qemu_nbd "$moddir/binaries/qemu/" - fi # NOTE: This are workarounds for: # - distributions where "systemd-udevd" doesn't lives in "/usr/lib" but in @@ -107,8 +104,10 @@ install() { inst "$moddir/binaries/dnbd3/build/dnbd3-client" /usr/bin/dnbd3-client inst "$moddir/binaries/systemd-preserve-process-marker/systemd-preserve-process-marker" \ /usr/bin/systemd-preserve-process-marker - # TODO: static linked qemu-nbd still needed? - inst "$moddir/binaries/qemu/qemu-nbd" /usr/bin/qemu-nbd + inst "$moddir/scripts/device-add-write-layer.sh" \ + /usr/bin/device-add-write-layer + inst "$moddir/scripts/container-unpack-xmount.sh" \ + /usr/bin/container-unpack-xmount # endregion @@ -118,25 +117,15 @@ install() { inst_hook cmdline 10 "$moddir/hooks/prepare-kernel-command-line-parameter.sh" inst_hook cmdline 90 "$moddir/hooks/set-dracut-environment-variables.sh" - # load nbd.ko, dnbd3.ko + # load dnbd3.ko inst_hook pre-udev 00 "$moddir/hooks/load-custom-kernel-modules.sh" if dracut_module_included "systemd-initrd"; then inst "$moddir/hooks/prepare-root-partition.sh" \ - /sbin/dnbd3root + /usr/bin/dnbd3root inst "$moddir/hooks/fetch-config.sh" \ - /sbin/fetch-config - - #region generator approach - ## TODO analyze qemu-nbd pivot-root bug! - #inst_script "$moddir/services/dnbd3-generator.sh" \ - #$systemdutildir/system-generators/dnbd3-generator - ## copy generator to new root to prevent stopping of the service after - ## switch_root - #inst_hook pre-pivot 95 "$moddir/hooks/copy-dnbd3-generator-into-newroot.sh" - #endregion - - #region service approach + /usr/bin/fetch-config + inst_simple "${moddir}/services/dnbd3root.service" \ "${systemdsystemunitdir}/dnbd3root.service" # don't kill at switch_root @@ -144,7 +133,6 @@ install() { ln_r "${systemdsystemunitdir}/dnbd3root.service" \ "${systemdsystemunitdir}/initrd-root-fs.target.wants/dnbd3root.service" inst_hook pre-pivot 95 "$moddir/hooks/copy-dnbd3-generator-into-newroot.sh" - #endregion else # get the openslx config from the servers configured in the kernel command # line (${SLX_SERVER}/${SLX_SERVER_BASE}/config) @@ -194,7 +182,10 @@ install() { mount fdisk mkfs.xfs env busybox ps agetty tree \ insmod blockdev partx dmsetup sed cut awk tr insmod \ blockdev partx dmsetup cat cut awk losetup dd mkfs.ext4 grep \ - basename dirname sort mktemp diff qemu-img genfstab mountpoint + basename dirname sort mktemp diff qemu-img genfstab mountpoint xmount + for file in "/usr/local/lib/xmount/*"; do + inst_simple $file + done # Production: # inst_multiple insmod blockdev partx dmsetup sed cat cut awk tr touch \ # losetup grep basename dirname mktemp diff sleep wget mount sort \ diff --git a/builder/dnbd3-rootfs/scripts/container-unpack-qemu.sh b/builder/dnbd3-rootfs/scripts/container-unpack-qemu.sh new file mode 100644 index 00000000..ea3f2620 --- /dev/null +++ b/builder/dnbd3-rootfs/scripts/container-unpack-qemu.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# region imports + +source "/usr/lib/rebash/core.sh" +core.import exceptions +exceptions.activate + +# endregion + +in_device="$1" +nbd_device="$2" # TODO detect first free nbd device + +systemd-preserve-process-marker qemu-nbd --connect="$nbd_device" \ + "$in_device" --read-only --persistent --nocache + +# TODO better way to wait for the device to be made? +i=0 +while [ ! -b "$nbd_device" ]; do + [ $i -ge 20 ] && exit 1 + if [ $UDEVVERSION -ge 143 ]; then + udevadm settle --exit-if-exists="$nbd_device" + else + sleep 0.1 + fi + i=$(($i + 1)) +done + +# NBD doesn't emit uevents when it gets connected, so kick it +# TODO get path from $nbd_device +echo change > /sys/block/nbd0/uevent +udevadm settle + +# region vim modline + +# vim: set tabstop=4 shiftwidth=4 expandtab: +# vim: foldmethod=marker foldmarker=region,endregion: + +# endregion diff --git a/builder/dnbd3-rootfs/scripts/container-unpack-xmount.sh b/builder/dnbd3-rootfs/scripts/container-unpack-xmount.sh new file mode 100644 index 00000000..a5658e25 --- /dev/null +++ b/builder/dnbd3-rootfs/scripts/container-unpack-xmount.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# region imports + +source "/usr/lib/rebash/core.sh" +core.import exceptions +exceptions.activate + +# endregion + +in_device="$1" + +mkdir /mnt +systemd-preserve-process-marker xmount --in qemu $in_device --out raw /mnt +loop_device="$(losetup -f)" +losetup "$loop_device" /mnt/*.dd --partscan +udevadm settle +echo "$loop_device" + +# region vim modline + +# vim: set tabstop=4 shiftwidth=4 expandtab: +# vim: foldmethod=marker foldmarker=region,endregion: + +# endregion diff --git a/builder/dnbd3-rootfs/scripts/device-add-write-layer.sh b/builder/dnbd3-rootfs/scripts/device-add-write-layer.sh new file mode 100644 index 00000000..67c14314 --- /dev/null +++ b/builder/dnbd3-rootfs/scripts/device-add-write-layer.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# region imports + +source "/usr/lib/rebash/core.sh" +core.import exceptions +exceptions.activate + +# endregion +combined_device_name="$1" +read_only_device="$2" +writable_device="$3" +persistent="$4" # P or N +chunksize='1' + +partition_size="$(blockdev --getsz "$read_only_device")" +writable_partition_name='root' +modprobe dm_snapshot +dmsetup create "$combined_device_name" --noudevsync --table \ + "0 $partition_size snapshot $read_only_device $writable_device $persistent $chunksize" +dmsetup mknodes --noudevsync "$combined_device_name" + +# region vim modline + +# vim: set tabstop=4 shiftwidth=4 expandtab: +# vim: foldmethod=marker foldmarker=region,endregion: + +# endregion |