Compare commits

...

43 Commits
v4.17 ... v4.20

Author SHA1 Message Date
Kroese
44d3e23545 feat: Update to QEMU 8.1
feat: Update to QEMU 8.1
2023-10-17 19:44:54 +02:00
Kroese
d340361320 fix: Skip gateway check in debug mode 2023-10-17 19:37:39 +02:00
Kroese
f8f8c16200 fix: Don't store agent version 2023-10-17 19:32:34 +02:00
Kroese
47fd7931eb style: Shutdown counter 2023-10-17 19:28:37 +02:00
Kroese
7ac9c242da fix: Remove agent check 2023-10-17 19:24:42 +02:00
Kroese
78d330055f fix: Remove agent check 2023-10-17 19:12:06 +02:00
Kroese
06cf0a4edc build: Update to QEMU 8.1 (Debian 13) 2023-10-17 19:05:22 +02:00
Kroese
e26c208cc7 feat: OpenGL module 2023-10-17 19:01:08 +02:00
Kroese
c2f4823d8b build: Dockerfile
build: Dockerfile
2023-10-17 01:40:00 +02:00
Kroese
ca01bf8cb9 build: Dockerfile 2023-10-17 01:39:44 +02:00
Kroese
a5b2b655dd build: Dockerfile
build: Dockerfile
2023-10-16 17:44:51 +02:00
Kroese
0f2f3b2ea8 build: Dockerfile 2023-10-16 17:44:36 +02:00
Kroese
0705c1c21b build: Dockerfile
build: Dockerfile
2023-10-16 16:51:55 +02:00
Kroese
e4de05ce88 build: Dockerfile 2023-10-16 16:51:23 +02:00
Kroese
a24b62ae67 docs: Readme
docs: Readme
2023-10-16 01:10:41 +02:00
Kroese
b5a9361b68 docs: Readme 2023-10-16 01:10:23 +02:00
Kroese
0e35e4a6d9 docs: Readme
docs: Readme
2023-10-16 00:41:53 +02:00
Kroese
208a6e6636 docs: Readme 2023-10-16 00:41:14 +02:00
Kroese
3fec9bf5ef docs: Readme
docs: Readme
2023-10-10 07:35:32 +02:00
Kroese
8d8efeb341 docs: Readme 2023-10-10 07:34:44 +02:00
Kroese
e9f27899a6 fix: Shutdown counter 2023-10-10 07:00:43 +02:00
Kroese
0c1c422758 feat: Mount block device
feat: Mount block device
2023-10-10 06:42:36 +02:00
Kroese
f56c523627 feat: Mount block device 2023-10-10 06:39:59 +02:00
Kroese
66879b5a6a feat: Mount block device 2023-10-10 06:29:03 +02:00
Kroese
b4eef6161b feat: Disk passthrough
feat: Disk passthrough
2023-10-10 05:32:22 +02:00
Kroese
cf38b1f237 fix: Intel GPU drivers 2023-10-10 05:29:50 +02:00
Kroese
2c09811365 feat: Disk passthrough 2023-10-10 05:26:37 +02:00
Kroese
761f5babfc docs: GPU passthrough
docs: GPU passthrough
2023-10-10 05:01:12 +02:00
Kroese
26be942a74 docs: GPU passthrough 2023-10-10 05:00:54 +02:00
Kroese
9c6aeca709 feat: Multiple disk support
feat: Multiple disk support
2023-10-09 19:47:05 +02:00
Kroese
81b0bba667 Shellcheck SC2153 2023-10-09 19:46:26 +02:00
Kroese
e2c00a2e44 docs: GPU passthrough support 2023-10-09 19:41:07 +02:00
Kroese
7bb33f26cd feat: GPU passthrough support 2023-10-09 19:34:49 +02:00
Kroese
63b2d703a4 build: Debian Bookworm 2023-10-09 19:30:57 +02:00
Kroese
a97dfbfdf2 feat: GPU passthrough support 2023-10-09 18:48:47 +02:00
Kroese
b255cb03e8 feat: GPU passthrough support 2023-10-09 18:45:39 +02:00
Kroese
7a79ff1d2d style: Indentations 2023-10-09 18:35:04 +02:00
Kroese
06fda133ed fix: Remove GPU drivers 2023-10-09 18:32:52 +02:00
Kroese
acedd1cdcf feat: Multiple disk support 2023-10-09 18:30:13 +02:00
Kroese
96083fddb3 build: Update to QEMU v8.1.1 (Debian 13) 2023-10-09 18:28:56 +02:00
Kroese
5d7604a205 feat: Multiple disk support 2023-10-09 14:10:31 +02:00
Kroese
24d44924fe docs: GPU support
docs: GPU support
2023-10-09 11:20:32 +02:00
Kroese
db840db76f docs: GPU support 2023-10-09 11:19:57 +02:00
10 changed files with 169 additions and 115 deletions

View File

@@ -11,4 +11,4 @@ jobs:
- name: Run ShellCheck - name: Run ShellCheck
uses: ludeeus/action-shellcheck@master uses: ludeeus/action-shellcheck@master
env: env:
SHELLCHECK_OPTS: -x -e SC2001 -e SC2002 -e SC2223 -e SC2034 -e SC2064 -e SC2317 -e SC2028 SHELLCHECK_OPTS: -x -e SC2001 -e SC2002 -e SC2223 -e SC2034 -e SC2064 -e SC2317 -e SC2028 -e SC2153

View File

@@ -7,13 +7,14 @@ FROM qemux/qemu-host as builder
# RUN go mod download # RUN go mod download
# RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /qemu-host.bin . # RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /qemu-host.bin .
FROM debian:bookworm-slim FROM debian:trixie-slim
ARG DEBCONF_NOWARNINGS="yes" ARG DEBCONF_NOWARNINGS="yes"
ARG DEBIAN_FRONTEND noninteractive ARG DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y upgrade && \ RUN apt-get update && apt-get -y upgrade && \
apt-get --no-install-recommends -y install \ apt-get --no-install-recommends -y install \
tini \
curl \ curl \
cpio \ cpio \
wget \ wget \
@@ -56,12 +57,15 @@ ARG BUILD_ARG=0
ARG VERSION_ARG="0.0" ARG VERSION_ARG="0.0"
ENV VERSION=$VERSION_ARG ENV VERSION=$VERSION_ARG
LABEL org.opencontainers.image.licenses="MIT"
LABEL org.opencontainers.image.title="Virtual DSM"
LABEL org.opencontainers.image.created=${DATE_ARG} LABEL org.opencontainers.image.created=${DATE_ARG}
LABEL org.opencontainers.image.revision=${BUILD_ARG} LABEL org.opencontainers.image.revision=${BUILD_ARG}
LABEL org.opencontainers.image.version=${VERSION_ARG} LABEL org.opencontainers.image.version=${VERSION_ARG}
LABEL org.opencontainers.image.source=https://github.com/kroese/virtual-dsm/ LABEL org.opencontainers.image.source="https://github.com/kroese/virtual-dsm/"
LABEL org.opencontainers.image.url=https://hub.docker.com/r/kroese/virtual-dsm/ LABEL org.opencontainers.image.url="https://hub.docker.com/r/kroese/virtual-dsm/"
LABEL org.opencontainers.image.description="Virtual DSM in a docker container"
HEALTHCHECK --interval=60s --retries=2 CMD /run/check.sh HEALTHCHECK --interval=60s --retries=2 CMD /run/check.sh
ENTRYPOINT ["/run/run.sh"] ENTRYPOINT ["/usr/bin/tini", "-s", "/run/run.sh"]

View File

@@ -16,7 +16,8 @@ Virtual DSM in a docker container.
- Multi-platform - Multi-platform
- KVM acceleration - KVM acceleration
- Graceful shutdown - GPU passthrough
- Graceful shutdowns
- Upgrades supported - Upgrades supported
## Usage ## Usage
@@ -172,7 +173,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
* ### How do I passthrough my GPU? * ### How do I passthrough my GPU?
To enable this feature, add the following lines to your compose file: To passthrough your GPU, add the following lines to your compose file:
```yaml ```yaml
environment: environment:
@@ -181,6 +182,8 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
- /dev/dri - /dev/dri
``` ```
This can be used to enable facial recognition in Synology Photos for example.
* ### What are the differences compared to the standard DSM? * ### What are the differences compared to the standard DSM?
There are only two minor differences: the Virtual Machine Manager package is not provided, and Surveillance Station doesn't include any free licenses. There are only two minor differences: the Virtual Machine Manager package is not provided, and Surveillance Station doesn't include any free licenses.

View File

@@ -136,13 +136,6 @@ if [[ SIZE -ne DATA_SIZE ]]; then
error "Virtual disk has the wrong size: ${SIZE}" && exit 89 error "Virtual disk has the wrong size: ${SIZE}" && exit 89
fi fi
AGENT="${STORAGE}/${BASE}.agent"
[ -f "$AGENT" ] && AGENT_VERSION=$(cat "${AGENT}") || AGENT_VERSION=1
if ((AGENT_VERSION < 5)); then
info "The installed VirtualDSM Agent v${AGENT_VERSION} is an outdated version, please upgrade it."
fi
DISK_OPTS="\ DISK_OPTS="\
-device virtio-scsi-pci,id=hw-synoboot,bus=pcie.0,addr=0xa \ -device virtio-scsi-pci,id=hw-synoboot,bus=pcie.0,addr=0xa \
-drive file=${BOOT},if=none,id=drive-synoboot,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \ -drive file=${BOOT},if=none,id=drive-synoboot,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
@@ -153,3 +146,46 @@ DISK_OPTS="\
-device virtio-scsi-pci,id=hw-userdata,bus=pcie.0,addr=0xc \ -device virtio-scsi-pci,id=hw-userdata,bus=pcie.0,addr=0xc \
-drive file=${DATA},if=none,id=drive-userdata,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \ -drive file=${DATA},if=none,id=drive-userdata,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
-device scsi-hd,bus=hw-userdata.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata,id=userdata0,rotation_rate=${DISK_ROTATION},bootindex=3" -device scsi-hd,bus=hw-userdata.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata,id=userdata0,rotation_rate=${DISK_ROTATION},bootindex=3"
EXTRA_DISK="/storage2/data.img"
if [ -f "${EXTRA_DISK}" ]; then
DISK_OPTS="${DISK_OPTS} \
-device virtio-scsi-pci,id=hw-userdata2,bus=pcie.0,addr=0xd \
-drive file=${EXTRA_DISK},if=none,id=drive-userdata2,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
-device scsi-hd,bus=hw-userdata2.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata2,id=userdata2,rotation_rate=${DISK_ROTATION},bootindex=4"
else
[ -d "$(dirname "${EXTRA_DISK}")" ] && error "Disk image ${EXTRA_DISK} does not exist! Please supply an empty file of at least 6 GB." && exit 53
fi
EXTRA_DISK="/storage3/data.img"
if [ -f "${EXTRA_DISK}" ]; then
DISK_OPTS="${DISK_OPTS} \
-device virtio-scsi-pci,id=hw-userdata3,bus=pcie.0,addr=0xe \
-drive file=${EXTRA_DISK},if=none,id=drive-userdata3,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
-device scsi-hd,bus=hw-userdata3.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata3,id=userdata3,rotation_rate=${DISK_ROTATION},bootindex=5"
else
[ -d "$(dirname "${EXTRA_DISK}")" ] && error "Disk image ${EXTRA_DISK} does not exist! Please supply an empty file of at least 6 GB." && exit 54
fi
: ${DEVICE:=''} # Docker variable to passthrough a block device, like /dev/vdc1.
if [ -n "${DEVICE}" ]; then
[ ! -b "${DEVICE}" ] && error "Device ${DEVICE} cannot be found! Please add it to the 'devices' section of your compose file." && exit 55
DISK_OPTS="${DISK_OPTS} \
-device virtio-scsi-pci,id=hw-userdata4,bus=pcie.0,addr=0xf \
-drive file=${DEVICE},if=none,id=drive-userdata4,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
-device scsi-hd,bus=hw-userdata4.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata4,id=userdata4,rotation_rate=${DISK_ROTATION},bootindex=6"
fi

42
run/gpu.sh Normal file
View File

@@ -0,0 +1,42 @@
#!/bin/bash
set -Eeuo pipefail
[ ! -d /dev/dri ] && mkdir -m 755 /dev/dri
if [ ! -c /dev/dri/card0 ]; then
mknod /dev/dri/card0 c 226 0
fi
if [ ! -c /dev/dri/renderD128 ]; then
mknod /dev/dri/renderD128 c 226 128
fi
chmod 666 /dev/dri/card0
chmod 666 /dev/dri/renderD128
DEF_OPTS="-nodefaults -boot strict=on -display egl-headless,rendernode=/dev/dri/renderD128"
DEF_OPTS="${DEF_OPTS} -device virtio-vga,id=video0,max_outputs=1,bus=pcie.0,addr=0x1"
if ! apt-mark showinstall | grep -q "xserver-xorg-video-intel"; then
info "Installing Intel GPU drivers..."
export DEBCONF_NOWARNINGS="yes"
export DEBIAN_FRONTEND="noninteractive"
apt-get -qq update
apt-get -qq --no-install-recommends -y install xserver-xorg-video-intel > /dev/null
fi
if ! apt-mark showinstall | grep -q "qemu-system-modules-opengl"; then
info "Installing OpenGL module..."
export DEBCONF_NOWARNINGS="yes"
export DEBIAN_FRONTEND="noninteractive"
apt-get -qq update
apt-get -qq --no-install-recommends -y install qemu-system-modules-opengl > /dev/null
fi

View File

@@ -134,27 +134,18 @@ if { tar tf "$PAT"; } >/dev/null 2>&1; then
else else
export DEBCONF_NOWARNINGS="yes"
export DEBIAN_FRONTEND="noninteractive"
if [ "$ARCH" != "amd64" ]; then if [ "$ARCH" != "amd64" ]; then
info "Install: Installing QEMU..." info "Install: Installing QEMU..."
apt-get -qq update && apt-get -qq -y upgrade export DEBCONF_NOWARNINGS="yes"
export DEBIAN_FRONTEND="noninteractive"
apt-get -qq update
apt-get -qq --no-install-recommends -y install qemu-user > /dev/null apt-get -qq --no-install-recommends -y install qemu-user > /dev/null
fi fi
if [[ "${GPU}" == [Yy1]* ]] && [[ "$ARCH" == "amd64" ]]; then
info "Install: Installing GPU drivers..."
apt-get -qq update && apt-get -qq -y upgrade
apt-get -qq --no-install-recommends -y install xserver-xorg-video-intel > /dev/null
fi
info "Install: Extracting downloaded image..." info "Install: Extracting downloaded image..."
export LD_LIBRARY_PATH="/run/extract" export LD_LIBRARY_PATH="/run/extract"
@@ -251,9 +242,6 @@ mkdir -p "$LOC"
cp /agent/service.sh "$LOC/agent.sh" cp /agent/service.sh "$LOC/agent.sh"
chmod 755 "$LOC/agent.sh" chmod 755 "$LOC/agent.sh"
# Store agent version
echo "7" > "$STORAGE"/"$BASE".agent
info "Install: Installing system partition..." info "Install: Installing system partition..."
LABEL="1.44.1-42218" LABEL="1.44.1-42218"

View File

@@ -234,8 +234,12 @@ fi
if [[ "${DHCP}" == [Yy1]* ]]; then if [[ "${DHCP}" == [Yy1]* ]]; then
if [[ "$GATEWAY" == "172."* ]]; then if [[ "$GATEWAY" == "172."* ]]; then
if [[ "${DEBUG}" == [Yy1]* ]]; then
info "Warning: Are you sure the container is on a macvlan network?"
else
error "You can only enable DHCP while the container is on a macvlan network!" && exit 86 error "You can only enable DHCP while the container is on a macvlan network!" && exit 86
fi fi
fi
# Configuration for DHCP IP # Configuration for DHCP IP
configureDHCP configureDHCP

View File

@@ -39,28 +39,14 @@ _graceful_shutdown() {
echo && error "Could not send shutdown command to the guest ($RESPONSE)" echo && error "Could not send shutdown command to the guest ($RESPONSE)"
# If we cannot shutdown the usual way, fallback to the NMI method # Send a NMI interrupt which will be detected by the agent script
AGENT="${STORAGE}/${BASE}.agent"
[ -f "$AGENT" ] && AGENT_VERSION=$(cat "${AGENT}") || AGENT_VERSION=1
if ((AGENT_VERSION > 1)); then
# Send a NMI interrupt which will be detected by the kernel
if ! echo 'nmi' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" > /dev/null ; then if ! echo 'nmi' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" > /dev/null ; then
AGENT_VERSION=0
fi
fi
if ((AGENT_VERSION < 2)); then
echo && info "Please update the VirtualDSM Agent to allow for gracefull shutdowns..."
kill -15 "$(cat "${_QEMU_PID}")" kill -15 "$(cat "${_QEMU_PID}")"
pkill -f qemu-system-x86_64 || true pkill -f qemu-system-x86_64 || true
fi fi
fi fi
while [ "$(cat ${_QEMU_SHUTDOWN_COUNTER})" -lt "${QEMU_POWERDOWN_TIMEOUT}" ]; do while [ "$(cat ${_QEMU_SHUTDOWN_COUNTER})" -lt "${QEMU_POWERDOWN_TIMEOUT}" ]; do
@@ -72,7 +58,8 @@ _graceful_shutdown() {
if echo 'info version'| nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 ; then if echo 'info version'| nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 ; then
sleep 1 sleep 1
#info "Shutting down, waiting... ($(cat ${_QEMU_SHUTDOWN_COUNTER})/${QEMU_POWERDOWN_TIMEOUT})" CNT="$(cat ${_QEMU_SHUTDOWN_COUNTER})/${QEMU_POWERDOWN_TIMEOUT}"
[[ "${DEBUG}" == [Yy1]* ]] && info "Shutting down, waiting... (${CNT})"
fi fi

View File

@@ -5,7 +5,7 @@ set -Eeuo pipefail
: ${URL:=''} # URL of the PAT file : ${URL:=''} # URL of the PAT file
: ${GPU:='N'} # Enable GPU passthrough : ${GPU:='N'} # Enable GPU passthrough
: ${DEBUG:='N'} # Enable debug mode : ${DEBUG:='N'} # Enable debugging mode
: ${ALLOCATE:='Y'} # Preallocate diskspace : ${ALLOCATE:='Y'} # Preallocate diskspace
: ${ARGUMENTS:=''} # Extra QEMU parameters : ${ARGUMENTS:=''} # Extra QEMU parameters
: ${CPU_CORES:='1'} # Amount of CPU cores : ${CPU_CORES:='1'} # Amount of CPU cores
@@ -42,17 +42,10 @@ if [[ ! -f "$STORAGE/$BASE.boot.img" ]] || [[ ! -f "$STORAGE/$BASE.system.img" ]
. /run/install.sh . /run/install.sh
fi fi
# Initialize disks . /run/disk.sh # Initialize disks
. /run/disk.sh . /run/network.sh # Initialize network
. /run/serial.sh # Initialize serialport
# Initialize network . /run/power.sh # Configure shutdown
. /run/network.sh
# Initialize serialport
. /run/serial.sh
# Configure shutdown
. /run/power.sh
KVM_ERR="" KVM_ERR=""
KVM_OPTS="" KVM_OPTS=""
@@ -82,10 +75,7 @@ EXTRA_OPTS="-device virtio-balloon-pci,id=balloon0,bus=pcie.0,addr=0x4"
EXTRA_OPTS="$EXTRA_OPTS -object rng-random,id=objrng0,filename=/dev/urandom" EXTRA_OPTS="$EXTRA_OPTS -object rng-random,id=objrng0,filename=/dev/urandom"
EXTRA_OPTS="$EXTRA_OPTS -device virtio-rng-pci,rng=objrng0,id=rng0,bus=pcie.0,addr=0x1c" EXTRA_OPTS="$EXTRA_OPTS -device virtio-rng-pci,rng=objrng0,id=rng0,bus=pcie.0,addr=0x1c"
if [[ "${GPU}" == [Yy1]* ]]; then [[ "${GPU}" == [Yy1]* ]] && [[ "$ARCH" == "amd64" ]] && . /run/gpu.sh
DEF_OPTS="-nodefaults -boot strict=on -display egl-headless,rendernode=/dev/dri/renderD128"
DEF_OPTS="${DEF_OPTS} -device virtio-vga,id=video0,max_outputs=1,bus=pcie.0,addr=0x1"
fi
ARGS="${DEF_OPTS} ${CPU_OPTS} ${RAM_OPTS} ${MAC_OPTS} ${MON_OPTS} ${SERIAL_OPTS} ${NET_OPTS} ${DISK_OPTS} ${EXTRA_OPTS} ${ARGUMENTS}" ARGS="${DEF_OPTS} ${CPU_OPTS} ${RAM_OPTS} ${MAC_OPTS} ${MON_OPTS} ${SERIAL_OPTS} ${NET_OPTS} ${DISK_OPTS} ${EXTRA_OPTS} ${ARGUMENTS}"
ARGS=$(echo "$ARGS" | sed 's/\t/ /g' | tr -s ' ') ARGS=$(echo "$ARGS" | sed 's/\t/ /g' | tr -s ' ')