diff --git a/.coreos-installer.metadata b/.coreos-installer.metadata
new file mode 100644
index 0000000..2b51770
--- /dev/null
+++ b/.coreos-installer.metadata
@@ -0,0 +1,2 @@
+9ad623e572641316d7bdb51e11e136713b019bfa SOURCES/coreos-installer-0.9.1-vendor.tar.gz
+147efc72c044194209d686b78d62e3acbc761763 SOURCES/coreos-installer-0.9.1.crate
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9b1e12c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+SOURCES/coreos-installer-0.9.1-vendor.tar.gz
+SOURCES/coreos-installer-0.9.1.crate
diff --git a/SOURCES/coidracut.patch b/SOURCES/coidracut.patch
new file mode 100644
index 0000000..1399a79
--- /dev/null
+++ b/SOURCES/coidracut.patch
@@ -0,0 +1,114 @@
+diff --git a/dracut/50rdcore/module-setup.sh b/dracut/50rdcore/module-setup.sh
+index 27a2ac3..443b5cf 100755
+--- a/dracut/50rdcore/module-setup.sh
++++ b/dracut/50rdcore/module-setup.sh
+@@ -1,5 +1,47 @@
+ #!/bin/bash
+ 
++install_and_enable_unit() {
++    unit="$1"; shift
++    target="$1"; shift
++    inst_simple "$moddir/$unit" "$systemdsystemunitdir/$unit"
++    # note we `|| exit 1` here so we error out if e.g. the units are missing
++    # see https://github.com/coreos/fedora-coreos-config/issues/799
++    systemctl -q --root="$initdir" add-requires "$target" "$unit" || exit 1
++}
++
+ install() {
+     inst_simple "$moddir/rdcore" "/usr/bin/rdcore"
++
++    inst_simple "$moddir/coreos-installer" "/usr/bin/coreos-installer"
++
++    inst_simple "$moddir/coreos-installer-generator" \
++        "$systemdutildir/system-generators/coreos-installer-generator"
++
++    inst_script "$moddir/coreos-installer-service" \
++        "/usr/libexec/coreos-installer-service"
++
++    inst_script "$moddir/coreos-installer-disable-device-auto-activation" \
++        "/usr/libexec/coreos-installer-disable-device-auto-activation"
++
++    install_and_enable_unit "coreos-installer.service" \
++        "default.target" 
++
++    install_and_enable_unit "coreos-installer-reboot.service" \
++        "default.target" 
++
++#    install_and_enable_unit "coreos-installer-noreboot.service" \
++#        "basic.target" 
++#    inst_simple "$moddir/coreos-installer-reboot.service" \
++#        "$systemdsystemunitdir/coreos-installer-reboot.service"
++#    inst_simple "$moddir/coreos-installer-noreboot.service" \
++#        "$systemdsystemunitdir/coreos-installer-noreboot.service"
++#
++#    inst_simple "$moddir/coreos-installer.target" \
++#        "$systemdsystemunitdir/coreos-installer.target"
++#
++#    inst_simple "$moddir/coreos-installer-pre.target" \
++#        "$systemdsystemunitdir/coreos-installer-pre.target"
++#
++#    inst_simple "$moddir/coreos-installer-post.target" \
++#        "$systemdsystemunitdir/coreos-installer-post.target"
+ }
+diff --git a/systemd/coreos-installer-generator b/systemd/coreos-installer-generator
+index 804d045..b2bcaec 100755
+--- a/systemd/coreos-installer-generator
++++ b/systemd/coreos-installer-generator
+@@ -30,11 +30,11 @@ karg_bool() {
+ }
+ 
+ if [ -n "$(karg coreos.inst.install_dev)" ]; then
+-    ln -sf "/usr/lib/systemd/system/coreos-installer-post.target" \
+-        "${UNIT_DIR}/default.target"
++#    ln -sf "/usr/lib/systemd/system/coreos-installer-post.target" \
++#        "${UNIT_DIR}/basic.target"
+ 
+     # Create precondition for coreos-installer-reboot.service if requested
+     if ! karg_bool coreos.inst.skip_reboot; then
+-        touch /run/coreos-installer-reboot
++        > /run/coreos-installer-reboot
+     fi
+ fi
+diff --git a/systemd/coreos-installer-reboot.service b/systemd/coreos-installer-reboot.service
+index 18fdb4b..ad79614 100644
+--- a/systemd/coreos-installer-reboot.service
++++ b/systemd/coreos-installer-reboot.service
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=Reboot after CoreOS Installer
+-Requires=coreos-installer.target
+-After=coreos-installer.target
++#Requires=coreos-installer.target
++After=coreos-installer.service
+ OnFailure=emergency.target
+ OnFailureJobMode=replace-irreversibly
+ ConditionPathExists=/run/coreos-installer-reboot
+diff --git a/systemd/coreos-installer.service b/systemd/coreos-installer.service
+index 5e222f2..716b783 100644
+--- a/systemd/coreos-installer.service
++++ b/systemd/coreos-installer.service
+@@ -1,12 +1,20 @@
+ [Unit]
+ Description=CoreOS Installer
+-Before=coreos-installer.target
+-After=network-online.target
+-Wants=network-online.target
++#Before=coreos-installer.target
++#After=nm-run.service
++#After=network-online.target
++#Wants=network-online.target
+ # Until we retry HTTP requests let's wait here until
+ # systemd-resolved comes up if enabled.
+ # https://github.com/coreos/coreos-installer/issues/283
+-After=systemd-resolved.service
++#After=systemd-resolved.service
++
++After=basic.target
++# Network is enabled here
++After=nm-run.service
++# compat: remove when everyone is on dracut 053+
++After=dracut-initqueue.service
++
+ ConditionKernelCommandLine=coreos.inst.install_dev
+ OnFailure=emergency.target
+ OnFailureJobMode=replace-irreversibly
diff --git a/SOURCES/coidracut2.patch b/SOURCES/coidracut2.patch
new file mode 100644
index 0000000..e5e33c8
--- /dev/null
+++ b/SOURCES/coidracut2.patch
@@ -0,0 +1,27 @@
+diff --git a/dracut/50rdcore/module-setup.sh b/dracut/50rdcore/module-setup.sh
+index 443b5cf..c065851 100755
+--- a/dracut/50rdcore/module-setup.sh
++++ b/dracut/50rdcore/module-setup.sh
+@@ -10,6 +10,10 @@ install_and_enable_unit() {
+ }
+ 
+ install() {
++    inst_multiple gpg
++    inst_multiple gpg-agent
++    inst_multiple gpg-connect-agent
++
+     inst_simple "$moddir/rdcore" "/usr/bin/rdcore"
+ 
+     inst_simple "$moddir/coreos-installer" "/usr/bin/coreos-installer"
+diff --git a/scripts/coreos-installer-service b/scripts/coreos-installer-service
+index 347b5f5..239de3a 100755
+--- a/scripts/coreos-installer-service
++++ b/scripts/coreos-installer-service
+@@ -87,6 +87,7 @@ fi
+ 
+ # Other args that should just be copied over
+ copy_arg coreos.inst.image_url       --image-url
++copy_arg coreos.inst.image_file      --image-file
+ copy_arg coreos.inst.platform_id     --platform
+ copy_arg coreos.inst.stream          --stream
+ copy_arg coreos.inst.save_partlabel  --save-partlabel
diff --git a/SOURCES/coidracut3.patch b/SOURCES/coidracut3.patch
new file mode 100644
index 0000000..c03bd2f
--- /dev/null
+++ b/SOURCES/coidracut3.patch
@@ -0,0 +1,246 @@
+diff --git a/dracut/50rdcore/module-setup.sh b/dracut/50rdcore/module-setup.sh
+index c065851..2d689d9 100755
+--- a/dracut/50rdcore/module-setup.sh
++++ b/dracut/50rdcore/module-setup.sh
+@@ -14,6 +14,48 @@ install() {
+     inst_multiple gpg-agent
+     inst_multiple gpg-connect-agent
+ 
++     inst_multiple \
++        realpath \
++        basename   \
++        blkid      \
++        cat        \
++        dirname    \
++        findmnt    \
++        growpart   \
++        realpath   \
++        resize2fs  \
++        tail       \
++        tune2fs    \
++        touch      \
++        xfs_admin  \
++        xfs_growfs \
++        wc         \
++        lsblk      \
++        wipefs
++
++    inst_multiple \
++        awk       \
++        cat       \
++        dd        \
++        grep      \
++        mktemp    \
++        partx     \
++        rm        \
++        sed       \
++        sfdisk    \
++        sgdisk    \
++        find
++        
++    inst_multiple -o \
++        clevis-encrypt-sss \
++        clevis-encrypt-tang \
++        clevis-encrypt-tpm2 \
++        clevis-luks-bind \
++        clevis-luks-common-functions \
++        clevis-luks-unlock \
++        pwmake \
++        tpm2_create
++
+     inst_simple "$moddir/rdcore" "/usr/bin/rdcore"
+ 
+     inst_simple "$moddir/coreos-installer" "/usr/bin/coreos-installer"
+@@ -33,19 +75,8 @@ install() {
+     install_and_enable_unit "coreos-installer-reboot.service" \
+         "default.target" 
+ 
+-#    install_and_enable_unit "coreos-installer-noreboot.service" \
+-#        "basic.target" 
+-#    inst_simple "$moddir/coreos-installer-reboot.service" \
+-#        "$systemdsystemunitdir/coreos-installer-reboot.service"
+-#    inst_simple "$moddir/coreos-installer-noreboot.service" \
+-#        "$systemdsystemunitdir/coreos-installer-noreboot.service"
+-#
+-#    inst_simple "$moddir/coreos-installer.target" \
+-#        "$systemdsystemunitdir/coreos-installer.target"
+-#
+-#    inst_simple "$moddir/coreos-installer-pre.target" \
+-#        "$systemdsystemunitdir/coreos-installer-pre.target"
+-#
+-#    inst_simple "$moddir/coreos-installer-post.target" \
+-#        "$systemdsystemunitdir/coreos-installer-post.target"
++    install_and_enable_unit "growfs.service" \
++        "default.target"
++    inst_script "$moddir/growfs" \
++        /usr/sbin/growfs
+ }
+diff --git a/scripts/growfs b/scripts/growfs
+new file mode 100644
+index 0000000..45c495c
+--- /dev/null
++++ b/scripts/growfs
+@@ -0,0 +1,100 @@
++#!/bin/bash
++set -euo pipefail
++
++# This script grows the root
++
++sleep 5
++udevadm settle
++TYPE=$(lsblk --output FSTYPE /dev/disk/by-label/root | tail -n1)
++echo ${TYPE}
++dev=$(realpath /dev/disk/by-label/root)
++
++mount -t ${TYPE} /dev/disk/by-label/root /sysroot
++
++# We run after the rootfs is mounted at /sysroot
++path=/sysroot
++
++# The use of tail is to avoid errors from duplicate mounts;
++# this shouldn't happen for us but we're being conservative.
++src=$(findmnt -nvr -o SOURCE "$path" | tail -n1)
++
++partition=$(realpath /dev/disk/by-label/root)
++
++# Go through each blockdev in the hierarchy and verify we know how to grow them
++lsblk -no TYPE "${partition}" | while read dev; do
++    case "${dev}" in
++        part|crypt) ;;
++        *) echo "error: Unsupported blockdev type ${dev}" 1>&2; exit 1 ;;
++    esac
++done
++
++# Get the filesystem type before extending the partition.  This matters
++# because the partition, once extended, might include leftover superblocks
++# from the previous contents of the disk (notably ZFS), causing blkid to
++eval $(blkid -o export "${src}")
++
++ROOTFS_TYPE=${TYPE:-}
++case "${ROOTFS_TYPE}" in
++    xfs|ext4|btrfs) ;;
++    *) echo "error: Unsupported filesystem for ${path}: '${ROOTFS_TYPE}'" 1>&2; exit 1 ;;
++esac
++
++# Now, go through the hierarchy, growing everything. Note we go one device at a
++# time using --nodeps, because ordering is buggy in el8:
++# https://bugzilla.redhat.com/show_bug.cgi?id=1940607
++current_blkdev=${partition}
++while true; do
++    eval "$(lsblk --paths --nodeps --pairs -o NAME,TYPE,PKNAME "${current_blkdev}")"
++    MAJMIN=$(echo $(lsblk -dno MAJ:MIN "${NAME}"))
++    case "${TYPE}" in
++        part)
++            eval $(udevadm info --query property --export "${current_blkdev}" | grep ^DM_ || :)
++            if [ -n "${DM_MPATH:-}" ]; then
++                # Since growpart does not understand device mapper, we have to use sfdisk.
++                echo ", +" | sfdisk --no-reread --no-tell-kernel --force -N "${DM_PART}" "/dev/mapper/${DM_MPATH}"
++                udevadm settle # Wait for udev-triggered kpartx to update mappings
++            else
++                partnum=$(cat "/sys/dev/block/${MAJMIN}/partition")
++                # XXX: ideally this'd be idempotent and we wouldn't `|| :`
++                growpart "${PKNAME}" "${partnum}" || :
++            fi
++            ;;
++        crypt)
++            # XXX: yuck... we need to expose this sanely in clevis
++            (. /usr/bin/clevis-luks-common-functions
++             eval $(udevadm info --query=property --export "${NAME}")
++             # lsblk doesn't print PKNAME of crypt devices with --nodeps
++             PKNAME=/dev/$(ls "/sys/dev/block/${MAJMIN}/slaves")
++             clevis_luks_unlock_device "${PKNAME}" | cryptsetup resize -d- "${DM_NAME}"
++            )
++            ;;
++        # already checked
++        *) echo "unreachable" 1>&2; exit 1 ;;
++    esac
++    holders="/sys/dev/block/${MAJMIN}/holders"
++    [ -d "${holders}" ] || break
++    nholders="$(ls "${holders}" | wc -l)"
++    if [ "${nholders}" -eq 0 ]; then
++        break
++    elif [ "${nholders}" -gt 1 ]; then
++        # this shouldn't happen since we've checked the partition types already
++        echo "error: Unsupported block device with multiple children: ${NAME}" 1>&2
++        exit 1
++    fi
++    current_blkdev=/dev/$(ls "${holders}")
++done
++
++# Wipe any filesystem signatures from the extended partition that don't
++# correspond to the FS type we detected earlier.
++wipefs -af -t "no${ROOTFS_TYPE}" "${src}"
++
++# TODO: Add XFS to https://github.com/systemd/systemd/blob/master/src/partition/growfs.c
++# and use it instead.
++case "${ROOTFS_TYPE}" in
++    xfs) xfs_growfs "${path}" ;;
++    ext4) resize2fs "${src}" ;;
++    btrfs) btrfs filesystem resize max ${path} ;;
++esac
++
++# this is useful for tests
++touch /run/growfs.stamp
+\ No newline at end of file
+diff --git a/src/blockdev.rs b/src/blockdev.rs
+index f9701b9..2fdd6f0 100644
+--- a/src/blockdev.rs
++++ b/src/blockdev.rs
+@@ -970,7 +970,7 @@ pub fn udev_settle() -> Result<()> {
+     // udevd hasn't yet received updates from the kernel, settle will return
+     // immediately, and lsblk won't pick up partition labels.  Try to sleep
+     // our way out of this.
+-    sleep(Duration::from_millis(200));
++    sleep(Duration::from_millis(500));
+ 
+     runcmd!("udevadm", "settle")?;
+     Ok(())
+diff --git a/systemd/coreos-installer-reboot.service b/systemd/coreos-installer-reboot.service
+index ad79614..f9ba80e 100644
+--- a/systemd/coreos-installer-reboot.service
++++ b/systemd/coreos-installer-reboot.service
+@@ -1,6 +1,5 @@
+ [Unit]
+ Description=Reboot after CoreOS Installer
+-#Requires=coreos-installer.target
+ After=coreos-installer.service
+ OnFailure=emergency.target
+ OnFailureJobMode=replace-irreversibly
+diff --git a/systemd/coreos-installer.service b/systemd/coreos-installer.service
+index 716b783..e8199a9 100644
+--- a/systemd/coreos-installer.service
++++ b/systemd/coreos-installer.service
+@@ -1,13 +1,5 @@
+ [Unit]
+ Description=CoreOS Installer
+-#Before=coreos-installer.target
+-#After=nm-run.service
+-#After=network-online.target
+-#Wants=network-online.target
+-# Until we retry HTTP requests let's wait here until
+-# systemd-resolved comes up if enabled.
+-# https://github.com/coreos/coreos-installer/issues/283
+-#After=systemd-resolved.service
+ 
+ After=basic.target
+ # Network is enabled here
+diff --git a/systemd/growfs.service b/systemd/growfs.service
+new file mode 100644
+index 0000000..6d77aaa
+--- /dev/null
++++ b/systemd/growfs.service
+@@ -0,0 +1,13 @@
++[Unit]
++Description=Grow root filesystem
++DefaultDependencies=false
++
++After=coreos-installer.service
++Before=coreos-installer-reboot.service
++Requires=dev-disk-by\x2dlabel-root.device
++After=dev-disk-by\x2dlabel-root.device
++
++[Service]
++Type=oneshot
++ExecStart=/usr/sbin/growfs
++RemainAfterExit=yes
+\ No newline at end of file
diff --git a/SOURCES/coidracut4.patch b/SOURCES/coidracut4.patch
new file mode 100644
index 0000000..903b317
--- /dev/null
+++ b/SOURCES/coidracut4.patch
@@ -0,0 +1,80 @@
+diff --git a/systemd/coreos-installer-generator b/systemd/coreos-installer-generator
+index b2bcaec..2b85dc5 100755
+--- a/systemd/coreos-installer-generator
++++ b/systemd/coreos-installer-generator
+@@ -2,6 +2,8 @@
+ # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+ # ex: ts=8 sw=4 sts=4 et filetype=sh
+ 
++command -v getarg >/dev/null || . /usr/lib/dracut-lib.sh
++
+ set -e
+ 
+ # Generators don't have logging right now
+@@ -10,6 +12,14 @@ exec 1>/dev/kmsg; exec 2>&1
+ 
+ UNIT_DIR="${1:-/tmp}"
+ 
++add_requires() {
++    local name="$1"; shift
++    local target="$1"; shift
++    local requires_dir="${UNIT_DIR}/${target}.requires"
++    mkdir -p "${requires_dir}"
++    ln -sf "../${name}" "${requires_dir}/${name}"
++}
++
+ cmdline=( $(</proc/cmdline) )
+ karg() {
+     local name="$1" value="$2"
+@@ -38,3 +48,38 @@ if [ -n "$(karg coreos.inst.install_dev)" ]; then
+         > /run/coreos-installer-reboot
+     fi
+ fi
++
++add_requires run-media-iso.mount default.target
++
++isoroot=$(getarg edge.liveiso= ||:)
++
++mkdir -p /run/media/iso
++isosrc=dev/disk/by-label/${isoroot}
++isosrc_escaped=$(systemd-escape -p --suffix=device "${isosrc}")
++
++if [ -n "${isoroot}" ]; then
++cat >"${UNIT_DIR}/run-media-iso.mount" <<EOF
++# Automatically generated by live-generator
++[Unit]
++DefaultDependencies=false
++# HACK for https://github.com/coreos/fedora-coreos-config/issues/437
++Wants=systemd-udev-settle.service
++Wants=systemd-udevd.service
++After=systemd-udevd.service
++After=basic.target
++# Network is enabled here
++After=nm-run.service
++# compat: remove when everyone is on dracut 053+
++After=dracut-initqueue.service
++
++Before=coreos-installer.service
++After=${isosrc_escaped}
++Requires=${isosrc_escaped}
++ConditionKernelCommandLine=coreos.inst.image_file
++[Mount]
++What=/${isosrc}
++Where=/run/media/iso
++Options=ro
++Type=iso9660
++EOF
++fi
+\ No newline at end of file
+diff --git a/systemd/growfs.service b/systemd/growfs.service
+index 6d77aaa..fee934d 100644
+--- a/systemd/growfs.service
++++ b/systemd/growfs.service
+@@ -5,7 +5,6 @@ DefaultDependencies=false
+ After=coreos-installer.service
+ Before=coreos-installer-reboot.service
+ Requires=dev-disk-by\x2dlabel-root.device
+-After=dev-disk-by\x2dlabel-root.device
+ 
+ [Service]
+ Type=oneshot
diff --git a/SOURCES/coidracut5.patch b/SOURCES/coidracut5.patch
new file mode 100644
index 0000000..c25b6e1
--- /dev/null
+++ b/SOURCES/coidracut5.patch
@@ -0,0 +1,16 @@
+diff --git a/systemd/coreos-installer-generator b/systemd/coreos-installer-generator
+index 2b85dc5..75ab3c3 100755
+--- a/systemd/coreos-installer-generator
++++ b/systemd/coreos-installer-generator
+@@ -39,6 +39,11 @@ karg_bool() {
+     esac
+ }
+ 
++# if we're not running in dracut, skip
++if [ -z "$(karg edge.liveiso)" ]; then
++    exit 0
++fi
++
+ if [ -n "$(karg coreos.inst.install_dev)" ]; then
+ #    ln -sf "/usr/lib/systemd/system/coreos-installer-post.target" \
+ #        "${UNIT_DIR}/basic.target"
diff --git a/SOURCES/disable-lto-0.6.0.patch b/SOURCES/disable-lto-0.6.0.patch
new file mode 100644
index 0000000..b5b3f3a
--- /dev/null
+++ b/SOURCES/disable-lto-0.6.0.patch
@@ -0,0 +1,11 @@
+--- coreos-installer-0.6.0/Cargo.toml.orig	2020-09-02 17:43:05.348336989 -0400
++++ coreos-installer-0.6.0/Cargo.toml	2020-09-02 17:43:12.092348561 -0400
+@@ -26,8 +26,6 @@
+ pre-release-commit-message = "cargo: coreos-installer release {{version}}"
+ sign-commit = true
+ tag-message = "coreos-installer v{{version}}"
+-[profile.release]
+-lto = true
+ 
+ [lib]
+ name = "libcoreinst"
diff --git a/SOURCES/enable-rdcore.patch b/SOURCES/enable-rdcore.patch
new file mode 100644
index 0000000..2b5fa6e
--- /dev/null
+++ b/SOURCES/enable-rdcore.patch
@@ -0,0 +1,10 @@
+--- coreos-installer-0.9.1/Cargo.toml	2021-05-14T03:33:33+00:00
++++ coreos-installer-0.9.1/Cargo.toml	2021-05-17T14:08:34.787109+00:00
+@@ -120,6 +120,7 @@
+ version = "^1.0"
+ 
+ [features]
++default = ["rdcore"]
+ rdcore = []
+ [target."cfg(target_arch = \"s390x\")".dependencies.mbrman]
+ version = ">= 0.3, < 0.5"
diff --git a/SOURCES/force_persist_ip-0.9.1.patch b/SOURCES/force_persist_ip-0.9.1.patch
new file mode 100644
index 0000000..75f5c97
--- /dev/null
+++ b/SOURCES/force_persist_ip-0.9.1.patch
@@ -0,0 +1,26 @@
+From d3ecd9b240203b8e1eaa47bc62c2976a25ed3994 Mon Sep 17 00:00:00 2001
+From: Dusty Mabe <dusty@dustymabe.com>
+Date: Mon, 7 Jun 2021 18:53:29 -0400
+Subject: [PATCH] add coreos.force_persist_ip to list of persisted dracut args
+
+xref: https://github.com/coreos/fedora-coreos-config/pull/1045
+---
+ scripts/coreos-installer-service | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/scripts/coreos-installer-service b/scripts/coreos-installer-service
+index ff9ff5f..347b5f5 100755
+--- a/scripts/coreos-installer-service
++++ b/scripts/coreos-installer-service
+@@ -8,7 +8,7 @@ PERSIST_KERNEL_NET_PARAMS=("ipv6.disable" "net.ifnames" "net.naming-scheme")
+ # Dracut networking params to persist
+ # Everything other than rd.neednet.
+ # List from https://www.mankier.com/7/dracut.cmdline#Description-Network
+-PERSIST_DRACUT_NET_PARAMS=("ip" "ifname" "rd.route" "bootdev" "BOOTIF" "rd.bootif" "nameserver" "rd.peerdns" "biosdevname" "vlan" "bond" "team" "bridge" "rd.net.timeout.carrier" "coreos.no_persist_ip")
++PERSIST_DRACUT_NET_PARAMS=("ip" "ifname" "rd.route" "bootdev" "BOOTIF" "rd.bootif" "nameserver" "rd.peerdns" "biosdevname" "vlan" "bond" "team" "bridge" "rd.net.timeout.carrier" "coreos.no_persist_ip" "coreos.force_persist_ip")
+ 
+ # IBM S390X params to persist
+ PERSIST_S390X_PARAMS=("rd.dasd" "rd.zfcp" "rd.znet" "zfcp.allow_lun_scan" "cio_ignore")
+-- 
+2.31.1
+
diff --git a/SOURCES/s390x-support-virtio-dasd-0.9.1.patch b/SOURCES/s390x-support-virtio-dasd-0.9.1.patch
new file mode 100644
index 0000000..bae8ba3
--- /dev/null
+++ b/SOURCES/s390x-support-virtio-dasd-0.9.1.patch
@@ -0,0 +1,166 @@
+From c4fabc7c801491019263523df3c9078cca99bb6e Mon Sep 17 00:00:00 2001
+From: Nikita Dubrovskii <nikita@linux.ibm.com>
+Date: Wed, 2 Jun 2021 14:27:42 +0200
+Subject: [PATCH] s390: add support for virtio dasds
+
+This is a fix for https://bugzilla.redhat.com/show_bug.cgi?id=1960485
+
+Signed-off-by: Nikita Dubrovskii <nikita@linux.ibm.com>
+---
+ src/blockdev.rs   | 30 ++++++++++++++++++++++++++++--
+ src/cmdline.rs    |  2 +-
+ src/install.rs    |  6 +++---
+ src/s390x/dasd.rs | 15 +++++++++++----
+ 4 files changed, 43 insertions(+), 10 deletions(-)
+
+diff --git a/src/blockdev.rs b/src/blockdev.rs
+index 90c6bee..df8e10a 100644
+--- a/src/blockdev.rs
++++ b/src/blockdev.rs
+@@ -970,10 +970,36 @@ pub fn detect_formatted_sector_size(buf: &[u8]) -> Option<NonZeroU32> {
+ }
+ 
+ /// Checks if underlying device is IBM DASD disk
+-pub fn is_dasd(device: &str) -> Result<bool> {
++pub fn is_dasd(device: &str, fd: Option<&mut File>) -> Result<bool> {
+     let target =
+         canonicalize(device).with_context(|| format!("getting absolute path to {}", device))?;
+-    Ok(target.to_string_lossy().starts_with("/dev/dasd"))
++    if target.to_string_lossy().starts_with("/dev/dasd") {
++        return Ok(true);
++    }
++    let read_magic = |device: &str, disk: &mut File| -> Result<[u8; 4]> {
++        let offset = disk
++            .seek(SeekFrom::Current(0))
++            .with_context(|| format!("saving offset {}", device))?;
++        disk.seek(SeekFrom::Start(8194))
++            .with_context(|| format!("seeking {}", device))?;
++        let mut lbl = [0u8; 4];
++        disk.read_exact(&mut lbl)
++            .with_context(|| format!("reading label {}", device))?;
++        disk.seek(SeekFrom::Start(offset))
++            .with_context(|| format!("restoring offset {}", device))?;
++        Ok(lbl)
++    };
++    if target.to_string_lossy().starts_with("/dev/vd") {
++        let cdl_magic = [0xd3, 0xf1, 0xe5, 0xd6];
++        let lbl = if let Some(t) = fd {
++            read_magic(device, t)?
++        } else {
++            let mut disk = File::open(device).with_context(|| format!("opening {}", device))?;
++            read_magic(device, &mut disk)?
++        };
++        return Ok(cdl_magic == lbl);
++    }
++    Ok(false)
+ }
+ 
+ // create unsafe ioctl wrappers
+diff --git a/src/cmdline.rs b/src/cmdline.rs
+index db3d1d0..53b8179 100644
+--- a/src/cmdline.rs
++++ b/src/cmdline.rs
+@@ -853,7 +853,7 @@ fn parse_install(matches: &ArgMatches) -> Result<Config> {
+     // it changes to the recommended 4096
+     // https://bugzilla.redhat.com/show_bug.cgi?id=1905159
+     #[allow(clippy::match_bool, clippy::match_single_binding)]
+-    let sector_size = match is_dasd(&device)
++    let sector_size = match is_dasd(&device, None)
+         .with_context(|| format!("checking whether {} is an IBM DASD disk", device))?
+     {
+         #[cfg(target_arch = "s390x")]
+diff --git a/src/install.rs b/src/install.rs
+index baa3880..20d1f41 100644
+--- a/src/install.rs
++++ b/src/install.rs
+@@ -47,7 +47,7 @@ pub fn install(config: &InstallConfig) -> Result<()> {
+ 
+     #[cfg(target_arch = "s390x")]
+     {
+-        if is_dasd(&config.device)? {
++        if is_dasd(&config.device, None)? {
+             if !config.save_partitions.is_empty() {
+                 // The user requested partition saving, but SavedPartitions
+                 // doesn't understand DASD VTOCs and won't find any partitions
+@@ -156,7 +156,7 @@ fn write_disk(
+ 
+     // copy the image
+     #[allow(clippy::match_bool, clippy::match_single_binding)]
+-    let image_copy = match is_dasd(&config.device)? {
++    let image_copy = match is_dasd(&config.device, Some(dest))? {
+         #[cfg(target_arch = "s390x")]
+         true => s390x::image_copy_s390x,
+         _ => image_copy_default,
+@@ -527,7 +527,7 @@ fn reset_partition_table(
+ ) -> Result<()> {
+     eprintln!("Resetting partition table");
+ 
+-    if is_dasd(&config.device)? {
++    if is_dasd(&config.device, Some(dest))? {
+         // Don't write out a GPT, since the backup GPT may overwrite
+         // something we're not allowed to touch.  Just clear the first MiB
+         // of disk.
+diff --git a/src/s390x/dasd.rs b/src/s390x/dasd.rs
+index 7145071..b7dea78 100644
+--- a/src/s390x/dasd.rs
++++ b/src/s390x/dasd.rs
+@@ -35,13 +35,15 @@ pub(crate) struct Range {
+     pub length: u64,
+ }
+ 
+-/// There are 2 types of DASD devices:
++/// There are 3 types of DASD devices:
+ ///   - ECKD (Extended Count Key Data) - is regular DASD of type 3390
+ ///   - FBA (Fixed Block Access) - is used for emulated device that represents a real SCSI device
++///   - Virt - ECKD on LPAR/zKVM as virtio-device
+ /// Only ECKD disks require `dasdfmt, fdasd` linux tools to be configured.
+ enum DasdType {
+     Eckd,
+     Fba,
++    Virt,
+ }
+ 
+ fn get_dasd_type<P: AsRef<Path>>(device: P) -> Result<DasdType> {
+@@ -53,6 +55,9 @@ fn get_dasd_type<P: AsRef<Path>>(device: P) -> Result<DasdType> {
+         .with_context(|| format!("getting name of {}", device.display()))?
+         .to_string_lossy()
+         .to_string();
++    if device.starts_with("vd") {
++        return Ok(DasdType::Virt);
++    }
+     let devtype_path = format!("/sys/class/block/{}/device/devtype", device);
+     let devtype_str = std::fs::read_to_string(&devtype_path)
+         .with_context(|| format!("reading {}", devtype_path))?;
+@@ -66,7 +71,7 @@ fn get_dasd_type<P: AsRef<Path>>(device: P) -> Result<DasdType> {
+ pub fn prepare_dasd(dasd: &str) -> Result<()> {
+     match get_dasd_type(dasd)? {
+         DasdType::Eckd => eckd_prepare(dasd),
+-        DasdType::Fba => Ok(()),
++        DasdType::Fba | DasdType::Virt => Ok(()),
+     }
+ }
+ 
+@@ -75,7 +80,7 @@ pub fn prepare_dasd(dasd: &str) -> Result<()> {
+ pub fn dasd_try_get_sector_size(dasd: &str) -> Result<Option<NonZeroU32>> {
+     match get_dasd_type(dasd)? {
+         DasdType::Eckd => eckd_try_get_sector_size(dasd),
+-        DasdType::Fba => Ok(None),
++        DasdType::Fba | DasdType::Virt => Ok(None),
+     }
+ }
+ 
+@@ -87,8 +92,10 @@ pub fn image_copy_s390x(
+     _saved: Option<&SavedPartitions>,
+ ) -> Result<()> {
+     let ranges = match get_dasd_type(dest_path)? {
+-        DasdType::Eckd => eckd_make_partitions(&dest_path.to_string_lossy(), dest_file, first_mb)?,
+         DasdType::Fba => fba_make_partitions(&dest_path.to_string_lossy(), dest_file, first_mb)?,
++        DasdType::Eckd | DasdType::Virt => {
++            eckd_make_partitions(&dest_path.to_string_lossy(), dest_file, first_mb)?
++        }
+     };
+ 
+     // copy each partition
+-- 
+2.31.1
+
diff --git a/SPECS/coreos-installer.spec b/SPECS/coreos-installer.spec
new file mode 100644
index 0000000..efbd865
--- /dev/null
+++ b/SPECS/coreos-installer.spec
@@ -0,0 +1,223 @@
+# Generated by rust2rpm 13
+%define dracutlibdir %{_prefix}/lib/dracut
+%bcond_without check
+%global __cargo_skip_build 0
+# The library is for internal code reuse and is not a public API
+%global __cargo_is_lib 0
+
+%global crate coreos-installer
+
+Name:           %{crate}
+Version:        0.9.1
+Release:        17%{?dist}
+Summary:        Installer for Fedora CoreOS and RHEL CoreOS
+
+# Upstream license specification: Apache-2.0
+License:        ASL 2.0
+URL:            https://github.com/fedora-iot/coreos-installer
+Source:         https://crates.io/api/v1/crates/%{crate}/%{version}/download#/%{crate}-%{version}.crate
+Source1:        https://github.com/coreos/coreos-installer/releases/download/v%{version}/%{crate}-%{version}-vendor.tar.gz
+
+# The RHEL 8 rust-toolset macros don't let us enable features from the
+# %%cargo_* macros.  Enable rdcore directly in Cargo.toml.
+Patch0:         enable-rdcore.patch
+# LTO causes runtime crashes on s390x
+# https://github.com/coreos/coreos-installer/pull/360
+# https://github.com/coreos/coreos-installer/issues/372
+# https://bugzilla.redhat.com/show_bug.cgi?id=1863466
+Patch1:         disable-lto-0.6.0.patch
+# Add coreos.force_persist_ip karg forwarding
+# https://github.com/coreos/coreos-installer/pull/554
+Patch2:         force_persist_ip-0.9.1.patch
+# Support s390x DASDs in VMs via virtio
+# https://github.com/coreos/coreos-installer/pull/552
+Patch3:         s390x-support-virtio-dasd-0.9.1.patch
+Patch4:         coidracut.patch
+Patch5:         coidracut2.patch
+Patch6:         coidracut3.patch
+Patch7:         coidracut4.patch
+Patch8:         coidracut5.patch
+
+ExclusiveArch:  %{rust_arches}
+BuildRequires:  openssl-devel
+BuildRequires:  rust-toolset
+BuildRequires:  systemd
+
+Requires:       gnupg
+Requires:       kpartx
+Requires:       systemd-udev
+Requires:       util-linux
+%ifarch s390x
+# This should eventually be spelled "s390utils-core" but the binaries
+# haven't been broken out of s390utils-base yet
+Requires:       /usr/sbin/chreipl
+Requires:       /usr/sbin/dasdfmt
+Requires:       /usr/sbin/fdasd
+Requires:       /usr/sbin/lszdev
+Requires:       /usr/sbin/zipl
+%endif
+
+# Since `rust-coreos-installer` creates a `coreos-installer`
+# subpackage with a newer version number, which supersedes the
+# deprecated `coreos-installer` package (https://src.fedoraproject.org/rpms/coreos-installer),
+# an explicit `Obsoletes:` for `coreos-installer` is not necessary.
+
+# Obsolete dracut modules as they are not provided in this package.
+Obsoletes:      coreos-installer-dracut < 0.0.1
+
+%global _description %{expand:
+coreos-installer installs Fedora CoreOS or RHEL CoreOS to bare-metal
+machines (or, occasionally, to virtual machines).
+}
+%description %{_description}
+
+%files
+%license LICENSE
+%doc README.md
+%{_bindir}/coreos-installer
+
+%prep
+%autosetup -n %{crate}-%{version} -p1
+%cargo_prep -V 1
+# https://github.com/rust-lang-nursery/error-chain/pull/289
+find -name '*.rs' -executable -exec chmod a-x {} \;
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+# Install binaries, dracut modules, units, targets, generators for running via systemd
+install -D -m 0755 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore dracut/50rdcore/module-setup.sh
+install -D -m 0755 -t %{buildroot}%{_libexecdir} scripts/coreos-installer-service
+install -D -m 0755 -t %{buildroot}%{_libexecdir} scripts/coreos-installer-disable-device-auto-activation
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer-disable-device-auto-activation.service
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer.service
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer-reboot.service
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer-noreboot.service
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer-pre.target
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer.target
+install -D -m 0644 -t %{buildroot}%{_unitdir} systemd/coreos-installer-post.target
+install -D -m 0755 -t %{buildroot}%{_systemdgeneratordir} systemd/coreos-installer-generator
+mv %{buildroot}%{_bindir}/rdcore %{buildroot}%{dracutlibdir}/modules.d/50rdcore/
+cp -a %{buildroot}%{_bindir}/coreos-installer %{buildroot}%{dracutlibdir}/modules.d/50rdcore/
+install -D -m 0755 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore scripts/coreos-installer-service
+install -D -m 0755 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore scripts/growfs
+install -D -m 0755 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore scripts/coreos-installer-disable-device-auto-activation
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer-disable-device-auto-activation.service
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer.service
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/growfs.service
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer-reboot.service
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer-noreboot.service
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer-pre.target
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer.target
+install -D -m 0644 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer-post.target
+install -D -m 0755 -t %{buildroot}%{dracutlibdir}/modules.d/50rdcore systemd/coreos-installer-generator
+
+%package     -n %{crate}-bootinfra
+Summary:     %{crate} boot-time infrastructure for use on Fedora/RHEL CoreOS
+Requires:   %{crate} = %{version}-%{release}
+
+# Package was renamed from coreos-installer-systemd when rdcore was added
+Provides:    %{crate}-systemd = %{version}-%{release}
+Obsoletes:   %{crate}-systemd <= 0.3.0-2
+
+%description -n %{crate}-bootinfra
+This subpackage contains boot-time infrastructure for Fedora CoreOS and
+RHEL CoreOS.  It is not needed on other platforms.
+
+%files       -n %{crate}-bootinfra
+%{dracutlibdir}/modules.d/*
+%{_libexecdir}/*
+%{_unitdir}/*
+%{_systemdgeneratordir}/*
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Thu Jun 10 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.9.1-3
+- Support s390x DASDs in VMs via virtio
+
+* Tue Jun 08 2021 Dusty Mabe <dustymabe@redhat.com> - 0.9.1-2
+- Add coreos.force_persist_ip karg forwarding
+
+* Wed Apr 21 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.9.0-3
+- Improve error message for busy disk referenced via symlink
+- Fix failure on corrupt GPT
+
+* Fri Apr 9 2021 Sohan Kunkerkar <skunkerk@redhat.com> - 0.9.0-2
+- Use macro for dracut library path
+
+* Thu Apr 8 2021 Sohan Kunkerkar <skunkerk@redhat.com> - 0.9.0-1
+- New release
+
+* Fri Jan 15 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.8.0-3
+- Fix rdcore rootmap on RAID devices
+
+* Tue Jan 12 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.8.0-2
+- Disable LTO again to avoid crashes on s390x
+
+* Tue Jan 12 2021 Sohan Kunkerkar <skunkerk@redhat.com> - 0.8.0-1
+- New release
+
+* Mon Jan 04 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.7.2-2
+- Add Requires for programs invoked by coreos-installer
+- Require Rust >= 1.45, re-enable LTO
+
+* Thu Oct 22 2020 Sohan Kunkerkar <skunkerk@redhat.com> - 0.7.2-1
+- New release
+
+* Mon Sep 21 2020 Benjamin Gilbert <bgilbert@redhat.com> - 0.6.0-3
+- Fix MBR handling when partition saving is enabled
+- Fix base package Obsoletes being interpreted as part of package description
+
+* Wed Sep 02 2020 Benjamin Gilbert <bgilbert@redhat.com> - 0.6.0-2
+- Disable LTO on s390x to avoid runtime crashes
+- Drop legacy installer
+
+* Tue Aug 25 2020 Benjamin Gilbert <bgilbert@redhat.com> - 0.6.0-1
+- New release
+
+* Fri Jul 31 2020 Benjamin Gilbert <bgilbert@redhat.com> - 0.5.0-1
+- New release
+
+* Sat Jul 25 2020 Benjamin Gilbert <bgilbert@redhat.com> - 0.4.0-1
+- New release
+- Rename -systemd subpackage to -bootinfra
+- Add rdcore Dracut module to -bootinfra
+
+* Wed Jul 22 2020 Benjamin Gilbert <bgilbert@redhat.com> - 0.3.0-1
+- New release
+- Make coreos-installer-{service,generator} world-readable
+
+* Wed Jun 17 2020 Dusty Mabe <dusty@dustymabe.com> - 0.2.0-4.rhaos4.6
+- Include rhaos4.6 in the rpm release field
+
+* Thu May 28 2020 Colin Walters <walters@verbum.org> - 0.2.0-3
+- Backport osmet RHCOS+LUKS patches
+
+* Thu May 07 2020 Dusty Mabe <dusty@dustymabe.com> - 0.2.0-2
+- Fix bug in dracut hook in legacy installer; see
+  https://github.com/coreos/coreos-installer/pull/234
+
+* Mon Apr 27 2020 Colin Walters <walters@verbum.org> - 0.1.3-4
+- Merge in legacy installer; see
+  https://github.com/coreos/coreos-installer/pull/220
+
+* Mon Mar 23 2020 Colin Walters <walters@verbum.org> - 0.1.3-2
+- https://github.com/coreos/coreos-installer/releases/tag/v0.1.3
+
+* Wed Mar 04 2020 Colin Walters <walters@verbum.org> - 0.1.2-11
+- Backport no-signatures-available patch
+
+* Wed Feb 26 2020 Colin Walters <walters@verbum.org> - 0.1.2-10
+- Forked from Fedora
+- I forgot about the weird `rust-` package name prefixing when
+  asking RCM to make the dist-git repo, and rather than redo
+  that I decided to just go with it.
+- Stop depending on systemd-rpm-macros since it's not in RHEL8 apparently
+- Drop other things only applicable to Fedora Rust packaging like
+  dynamic buildrequires