| | #!/usr/bin/env bash |
| | set -Eeuo pipefail |
| |
|
| | trap 'error "Status $? while: $BASH_COMMAND (line $LINENO/$BASH_LINENO)"' ERR |
| | [[ "${TRACE:-}" == [Yy1]* ]] && set -o functrace && trap 'echo "# $BASH_COMMAND" >&2' DEBUG |
| |
|
| | [ ! -f "/run/entry.sh" ] && error "Script must be run inside the container!" && exit 11 |
| |
|
| | |
| | |
| | |
| | |
| | NONROOT="N" |
| | if [ "$(id -u)" -ne "0" ]; then |
| | warn "Script is not running as root. Entering non-root degraded mode. Some features (KVM, TAP/VHOST) will be disabled." |
| | NONROOT="Y" |
| | |
| | KVM="N" |
| | NETWORK="N" |
| | else |
| | NONROOT="N" |
| | fi |
| |
|
| | |
| |
|
| | : "${KVM:="Y"}" |
| | : "${BOOT:=""}" |
| | : "${DEBUG:="N"}" |
| | : "${MACHINE:="q35"}" |
| | : "${ALLOCATE:=""}" |
| | : "${ARGUMENTS:=""}" |
| | : "${CPU_CORES:="2"}" |
| | : "${RAM_SIZE:="2G"}" |
| | : "${RAM_CHECK:="Y"}" |
| | : "${DISK_SIZE:="64G"}" |
| | : "${BOOT_MODE:=""}" |
| | : "${BOOT_INDEX:="9"}" |
| | : "${STORAGE:="/storage"}" |
| |
|
| | |
| |
|
| | PODMAN="N" |
| | ENGINE="Docker" |
| | PROCESS="${APP,,}" |
| | PROCESS="${PROCESS// /-}" |
| |
|
| | if [ -f "/run/.containerenv" ]; then |
| | PODMAN="Y" |
| | ENGINE="Podman" |
| | fi |
| |
|
| | echo "❯ Starting $APP for $ENGINE v$(</run/version)..." |
| | echo "❯ For support visit $SUPPORT" |
| |
|
| | INFO="/run/shm/msg.html" |
| | PAGE="/run/shm/index.html" |
| | TEMPLATE="/var/www/index.html" |
| | FOOTER1="$APP for $ENGINE v$(</run/version)" |
| | FOOTER2="<a href='$SUPPORT'>$SUPPORT</a>" |
| |
|
| | CPU=$(cpu) |
| | SYS=$(uname -r) |
| | HOST=$(hostname -s) |
| | KERNEL=$(echo "$SYS" | cut -b 1) |
| | MINOR=$(echo "$SYS" | cut -d '.' -f2) |
| | ARCH=$(dpkg --print-architecture) |
| | CORES=$(grep -c '^processor' /proc/cpuinfo) |
| |
|
| | if ! grep -qi "socket(s)" <<< "$(lscpu)"; then |
| | SOCKETS=1 |
| | else |
| | SOCKETS=$(lscpu | grep -m 1 -i 'socket(s)' | awk '{print $(2)}') |
| | fi |
| |
|
| | CPU_CORES="${CPU_CORES// /}" |
| | [[ "${CPU_CORES,,}" == "max" ]] && CPU_CORES="$CORES" |
| | [[ "${CPU_CORES,,}" == "half" ]] && CPU_CORES=$(( CORES / 2 )) |
| | [[ "${CPU_CORES,,}" == "0" ]] && CPU_CORES="1" |
| | [ -n "${CPU_CORES//[0-9 ]}" ] && error "Invalid amount of CPU_CORES: $CPU_CORES" && exit 15 |
| |
|
| | if [ "$CPU_CORES" -gt "$CORES" ]; then |
| | warn "The amount for CPU_CORES (${CPU_CORES}) exceeds the amount of logical cores available, so will be limited to ${CORES}." |
| | CPU_CORES="$CORES" |
| | fi |
| |
|
| | |
| |
|
| | if [ ! -d "/dev/shm" ]; then |
| | error "Directory /dev/shm not found!" && exit 14 |
| | else |
| | [ ! -d "/run/shm" ] && ln -s /dev/shm /run/shm |
| | fi |
| |
|
| | |
| |
|
| | if [[ "${STORAGE,,}" != "/storage" ]]; then |
| | mkdir -p "$STORAGE" |
| | fi |
| |
|
| | if [ ! -d "$STORAGE" ]; then |
| | error "Storage folder ($STORAGE) not found!" && exit 13 |
| | fi |
| |
|
| | if [ ! -w "$STORAGE" ]; then |
| | msg="Storage folder ($STORAGE) is not writeable!" |
| | msg+=" If SELinux is active, you need to add the \":Z\" flag to the bind mount." |
| | error "$msg" && exit 13 |
| | fi |
| |
|
| | |
| | RAM_SPARE=500000000 |
| | RAM_AVAIL=$(free -b | grep -m 1 Mem: | awk '{print $7}') |
| | RAM_TOTAL=$(free -b | grep -m 1 Mem: | awk '{print $2}') |
| |
|
| | RAM_SIZE="${RAM_SIZE// /}" |
| | [ -z "$RAM_SIZE" ] && error "RAM_SIZE not specified!" && exit 16 |
| |
|
| | if [[ "${RAM_SIZE,,}" != "max" && "${RAM_SIZE,,}" != "half" ]]; then |
| |
|
| | if [ -z "${RAM_SIZE//[0-9. ]}" ]; then |
| | [ "${RAM_SIZE%%.*}" -lt "130" ] && RAM_SIZE="${RAM_SIZE}G" || RAM_SIZE="${RAM_SIZE}M" |
| | fi |
| |
|
| | RAM_SIZE=$(echo "${RAM_SIZE^^}" | sed 's/MB/M/g;s/GB/G/g;s/TB/T/g') |
| | ! numfmt --from=iec "$RAM_SIZE" &>/dev/null && error "Invalid RAM_SIZE: $RAM_SIZE" && exit 16 |
| | RAM_WANTED=$(numfmt --from=iec "$RAM_SIZE") |
| | [ "$RAM_WANTED" -lt "136314880 " ] && error "RAM_SIZE is too low: $RAM_SIZE" && exit 16 |
| |
|
| | fi |
| |
|
| | |
| | SYS="${SYS/-generic/}" |
| | FS=$(stat -f -c %T "$STORAGE") |
| | FS="${FS/UNKNOWN //}" |
| | FS="${FS/ext2\/ext3/ext4}" |
| | FS=$(echo "$FS" | sed 's/[)(]//g') |
| | SPACE=$(df --output=avail -B 1 "$STORAGE" | tail -n 1) |
| | SPACE_GB=$(formatBytes "$SPACE" "down") |
| | AVAIL_MEM=$(formatBytes "$RAM_AVAIL" "down") |
| | TOTAL_MEM=$(formatBytes "$RAM_TOTAL" "up") |
| |
|
| | echo "❯ CPU: ${CPU} | RAM: ${AVAIL_MEM/ GB/}/$TOTAL_MEM | DISK: $SPACE_GB (${FS}) | KERNEL: ${SYS}..." |
| | echo |
| |
|
| | |
| |
|
| | if [[ "${FS,,}" == "ecryptfs" || "${FS,,}" == "tmpfs" ]]; then |
| | DISK_IO="threads" |
| | DISK_CACHE="writeback" |
| | fi |
| |
|
| | if [[ "${BOOT_MODE:-}" == "windows"* ]]; then |
| | if [[ "${FS,,}" == "btrfs" ]]; then |
| | warn "you are using the BTRFS filesystem for /storage, this might introduce issues with Windows Setup!" |
| | fi |
| | fi |
| |
|
| | |
| |
|
| | if [[ "${PLATFORM,,}" == "x64" ]]; then |
| | TARGET="amd64" |
| | else |
| | TARGET="arm64" |
| | fi |
| |
|
| | if [[ "$KVM" == [Nn]* ]]; then |
| | warn "KVM acceleration is disabled, this will cause the machine to run about 10 times slower!" |
| | else |
| | if [[ "${ARCH,,}" != "$TARGET" ]]; then |
| | KVM="N" |
| | warn "your CPU architecture is ${ARCH^^} and cannot provide KVM acceleration for ${PLATFORM^^} instructions, so the machine will run about 10 times slower." |
| | fi |
| | fi |
| |
|
| | if [[ "$KVM" != [Nn]* ]]; then |
| |
|
| | KVM_ERR="" |
| |
|
| | if [ ! -e /dev/kvm ]; then |
| | KVM_ERR="(/dev/kvm is missing)" |
| | else |
| | if ! sh -c 'echo -n > /dev/kvm' &> /dev/null; then |
| | KVM_ERR="(/dev/kvm is unwriteable)" |
| | else |
| | if [[ "${PLATFORM,,}" == "x64" ]]; then |
| | flags=$(sed -ne '/^flags/s/^.*: //p' /proc/cpuinfo) |
| | if ! grep -qw "vmx\|svm" <<< "$flags"; then |
| | KVM_ERR="(not enabled in BIOS)" |
| | fi |
| | fi |
| | fi |
| | fi |
| |
|
| | if [ -n "$KVM_ERR" ]; then |
| | |
| | |
| | warn "KVM acceleration is not available $KVM_ERR, falling back to software TCG (will be slower)." |
| | KVM="N" |
| | |
| | if [[ "$OSTYPE" =~ ^darwin ]]; then |
| | warn "you are using macOS which has no KVM support, so the machine will run about 10 times slower." |
| | else |
| | kernel=$(uname -a) |
| | case "${kernel,,}" in |
| | *"microsoft"* ) |
| | warn "If you want KVM on Docker Desktop, bind '/dev/kvm' as a volume in container settings." ;; |
| | *"synology"* ) |
| | warn "If you want KVM on Synology, enable VMM and bind '/dev/kvm' to the container." ;; |
| | *) |
| | warn "See the FAQ for possible causes, or set the environment variable KVM=N to force software acceleration." ;; |
| | esac |
| | fi |
| | fi |
| |
|
| | fi |
| |
|
| | return 0 |
| |
|