penguin/monok8s

k8s image for Mono Gateway Dev Kit

alpine/utils.sh

raw ยท 2063 bytes

#!/bin/bash

ensure_loop_ready() {
    # The loop kernel module is host-side. This only works if the container
    # has permission and modprobe exists; otherwise the host must load it.
    if ! grep -qw loop /proc/modules 2>/dev/null; then
        modprobe loop 2>/dev/null || true
    fi

    # /dev/loop-control: char device 10:237
    if [ ! -e /dev/loop-control ]; then
        echo "Creating missing /dev/loop-control" >&2
        mknod /dev/loop-control c 10 237 || {
            echo "ERROR: cannot create /dev/loop-control" >&2
            echo "Run container with --privileged, or pass --device=/dev/loop-control and loop devices." >&2
            exit 1
        }
        chmod 600 /dev/loop-control || true
    fi

    if [ ! -c /dev/loop-control ]; then
        echo "ERROR: /dev/loop-control exists but is not a character device" >&2
        ls -l /dev/loop-control >&2 || true
        exit 1
    fi

    # Create a reasonable pool of loop block devices.
    # loopN block devices are major 7, minor N.
    for i in $(seq 0 31); do
        if [ ! -e "/dev/loop$i" ]; then
            echo "Creating missing /dev/loop$i" >&2
            mknod "/dev/loop$i" b 7 "$i" || {
                echo "ERROR: cannot create /dev/loop$i" >&2
                echo "Run container with --privileged, or pre-create/pass loop devices." >&2
                exit 1
            }
            chmod 660 "/dev/loop$i" || true
        fi

        if [ ! -b "/dev/loop$i" ]; then
            echo "ERROR: /dev/loop$i exists but is not a block device" >&2
            ls -l "/dev/loop$i" >&2 || true
            exit 1
        fi
    done

    # Smoke test: ask losetup for a free loop device.
    if ! losetup -f >/dev/null 2>&1; then
        echo "ERROR: losetup cannot find/use a loop device" >&2
        echo "Debug info:" >&2
        ls -l /dev/loop-control /dev/loop* >&2 || true
        grep -w loop /proc/modules >&2 || true
        echo >&2
        echo "Docker likely needs --privileged, or at minimum CAP_SYS_ADMIN plus loop devices." >&2
        exit 1
    fi
}