Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
2 changes: 2 additions & 0 deletions rdr/container_image/cnv/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
FROM scratch
ADD disk.qcow2 /disk/disk.qcow2
90 changes: 90 additions & 0 deletions rdr/container_image/cnv/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
set -euo pipefail

# ================= CONFIG =================
IMAGE="quay.io/ocsci/cirros-dd"
VERSION="0.6.3"
BASE_URL="https://download.cirros-cloud.net/${VERSION}"

# CirrOS-supported disk images
declare -A ARCH_MAP=(
[amd64]="cirros-0.6.3-x86_64-disk.img linux/amd64"
[arm64]="cirros-0.6.3-aarch64-disk.img linux/arm64"
[arm]="cirros-0.6.3-arm-disk.img linux/arm/v7"
[ppc64le]="cirros-0.6.3-ppc64le-disk.img linux/ppc64le"
)

# ================= CLEANUP =================
cleanup() {
sudo umount /mnt 2>/dev/null || true
sudo qemu-nbd --disconnect /dev/nbd0 2>/dev/null || true
}
trap cleanup EXIT

# ================= PREP =================
sudo modprobe nbd max_part=8

# ================= BUILD LOOP =================
for ARCH in "${!ARCH_MAP[@]}"; do
read -r DISK PLATFORM <<< "${ARCH_MAP[$ARCH]}"
OCI_ARCH="${PLATFORM#linux/}"

echo "▶ Building for ${ARCH} (${PLATFORM})"

# ---------- Download disk ----------
curl -fL -O "${BASE_URL}/${DISK}"

# ---------- Inject init script ----------
sudo qemu-nbd --connect=/dev/nbd0 "$DISK"
sleep 2
sudo mount /dev/nbd0p1 /mnt

sudo mkdir -p /mnt/usr/local/bin
sudo cp io_dd_verify.sh /mnt/usr/local/bin/io_dd_verify.sh
sudo chmod +x /mnt/usr/local/bin/io_dd_verify.sh

# Create rc.local (BusyBox init)
sudo mkdir -p /mnt/etc
sudo sh -c 'cat > /mnt/etc/rc.local <<EOF
#!/bin/sh
/usr/local/bin/io_dd_verify.sh &
EOF'
sudo chmod +x /mnt/etc/rc.local

sudo umount /mnt
sudo qemu-nbd --disconnect /dev/nbd0

# ---------- Build containerDisk image (Buildah) ----------
CTR=$(buildah from --arch "${OCI_ARCH}" scratch)
buildah copy "${CTR}" "${DISK}" /disk/disk.qcow2
buildah config \
--label org.opencontainers.image.title="CirrOS dd integrity VM" \
--label org.opencontainers.image.version="${VERSION}" \
--label org.opencontainers.image.arch="${ARCH}" \
"${CTR}"

buildah commit "${CTR}" "${IMAGE}:${VERSION}-${ARCH}"
buildah rm "${CTR}"

# ---------- Push per-arch image ----------
buildah push "${IMAGE}:${VERSION}-${ARCH}"

rm -f "${DISK}"
done

# ================= MANIFEST =================
echo "▶ Creating multi-arch manifest"

buildah manifest create "${IMAGE}:${VERSION}" || true

for ARCH in "${!ARCH_MAP[@]}"; do
buildah manifest add \
"${IMAGE}:${VERSION}" \
"docker://${IMAGE}:${VERSION}-${ARCH}"
done

buildah manifest push --all \
"${IMAGE}:${VERSION}" \
"docker://${IMAGE}:${VERSION}"

echo "✅ Multi-arch image published: ${IMAGE}:${VERSION}"
66 changes: 66 additions & 0 deletions rdr/container_image/cnv/io_dd_verify.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/bin/sh
#
# Continuous dd I/O with integrity verification across VM restarts
# Designed for CirrOS (BusyBox init)
#

MOUNT="/run_io"
HASHFILE="$MOUNT/checksums.md5"
LOGFILE="$MOUNT/script.log"

mkdir -p "$MOUNT"

log() {
ts=$(date '+%Y-%m-%dT%H:%M:%S%z')
printf "%s [INFO] %s\n" "$ts" "$*" | tee -a "$LOGFILE"
}

cleanup() {
log "Received termination signal, syncing and exiting"
sync
exit 0
}

trap cleanup SIGINT SIGTERM

hostname=$(hostname 2>/dev/null || echo unknown)

log "===== VM boot detected ====="
log "Hostname: $hostname"

if [ -f "$HASHFILE" ]; then
log "Verifying existing data"
if md5sum -c "$HASHFILE" >>"$LOGFILE" 2>&1; then
log "Integrity check PASSED"
else
log "Integrity check FAILED"
fi
else
log "No checksum file found, starting fresh"
fi

while true; do
file="$MOUNT/data_$(date +%s)_${hostname}"

log "Writing file: $file"

dd if=/dev/urandom of="$file" \
bs=4k \
count=$((RANDOM % 8 + 1)) \
oflag=direct \
>>"$LOGFILE" 2>&1

rc=$?
if [ "$rc" -ne 0 ]; then
log "dd failed (rc=$rc), removing partial file"
rm -f "$file"
sync
sleep 1
continue
fi

md5sum "$file" >>"$HASHFILE" 2>>"$LOGFILE"
sync

sleep $((RANDOM % 10 + 1))
done