#!/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 }