summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjandob2016-01-21 15:29:05 +0100
committerjandob2016-01-21 15:29:05 +0100
commitad9d66426c3a00c81da5ab76ba6269948d6609d0 (patch)
treec22fe002d7f590fe957f6d3f12096733a8df0d90
parentdebugging (diff)
downloadsystemd-init-ad9d66426c3a00c81da5ab76ba6269948d6609d0.tar.gz
systemd-init-ad9d66426c3a00c81da5ab76ba6269948d6609d0.tar.xz
systemd-init-ad9d66426c3a00c81da5ab76ba6269948d6609d0.zip
add xmount; refactor
-rw-r--r--.gitmodules3
m---------builder/dnbd3-rootfs/binaries/dnbd30
m---------builder/dnbd3-rootfs/binaries/xmount0
-rwxr-xr-xbuilder/dnbd3-rootfs/hooks/prepare-root-partition.sh47
-rwxr-xr-xbuilder/dnbd3-rootfs/module-setup.sh33
-rw-r--r--builder/dnbd3-rootfs/scripts/container-unpack-qemu.sh39
-rw-r--r--builder/dnbd3-rootfs/scripts/container-unpack-xmount.sh25
-rw-r--r--builder/dnbd3-rootfs/scripts/device-add-write-layer.sh28
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