Compare commits

...

39 Commits
v4.19 ... v4.22

Author SHA1 Message Date
Kroese
461b5598a9 feat: Passthrough multiple devices
feat: Passthrough multiple devices
2023-10-31 16:58:30 +01:00
Kroese
47ed2e8bac build: Changelog 2023-10-31 16:57:43 +01:00
Kroese
1c78e3c8b1 feat: Passthrough multiple devices 2023-10-31 16:53:44 +01:00
Kroese
9f17dfa949 Update Dockerhub description
Update Dockerhub description
2023-10-26 00:56:46 +02:00
Kroese
3de29b6c00 Update Dockerhub description 2023-10-26 00:56:02 +02:00
Kroese
037d52957a build: Push to mirror
build: Push to mirror
2023-10-19 16:03:16 +02:00
Kroese
c7ccc912b5 build: Push to mirror 2023-10-19 16:02:56 +02:00
Kroese
72cbf87986 docs: Update location
docs: Update location
2023-10-19 15:37:33 +02:00
Kroese
317024d327 fix: Update location 2023-10-19 15:33:12 +02:00
Kroese
121c487383 fix: Update location 2023-10-19 15:31:58 +02:00
Kroese
fd92b60218 docs: Update location 2023-10-19 15:31:23 +02:00
Kroese
771429c5d3 build: Push to mirror 2023-10-19 15:27:23 +02:00
Kroese
674b6e5bda build: Update mirror 2023-10-19 15:23:20 +02:00
Kroese
7c65e2740f docs: Update location
docs: Update location
2023-10-19 15:11:45 +02:00
Kroese
d462c6d7a2 fix: Update location 2023-10-19 15:09:37 +02:00
Kroese
d5637e8da0 fix: Update location 2023-10-19 15:08:40 +02:00
Kroese
1b75bd3c44 docs: Update location 2023-10-19 15:05:20 +02:00
Kroese
2551413040 docs: Update location 2023-10-19 15:03:10 +02:00
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
12 changed files with 109 additions and 106 deletions

View File

@@ -44,6 +44,8 @@ jobs:
TAGS=() TAGS=()
TAGS=("${{ github.repository }}:latest") TAGS=("${{ github.repository }}:latest")
TAGS+=("${{ github.repository }}:${VERSION}") TAGS+=("${{ github.repository }}:${VERSION}")
#TAGS+=("${{ secrets.DOCKERHUB_MIRROR }}:latest")
#TAGS+=("${{ secrets.DOCKERHUB_MIRROR }}:${VERSION}")
TAGS+=("ghcr.io/${{ github.repository }}:latest") TAGS+=("ghcr.io/${{ github.repository }}:latest")
TAGS+=("ghcr.io/${{ github.repository }}:${VERSION}") TAGS+=("ghcr.io/${{ github.repository }}:${VERSION}")
@@ -86,25 +88,6 @@ jobs:
name: Clear Docker credentials name: Clear Docker credentials
run: | run: |
rm -f ${HOME}/.docker/config.json rm -f ${HOME}/.docker/config.json
-
name: Get previous tag
id: previousTag
run: |
name=$(git --no-pager tag --sort=creatordate --merged ${{ github.ref_name }} | tail -1)
echo "previousTag: $name"
echo "previousTag=$name" >> $GITHUB_ENV
-
name: Generate changelog
id: changelog
uses: requarks/changelog-action@v1
with:
token: ${{ github.token }}
fromTag: ${{ github.ref_name }}
toTag: ${{ env.previousTag }}
writeToFile: false
reverseOrder: true
includeInvalidCommits: true
excludeTypes: "docs,build,chore"
- -
name: Create a release name: Create a release
uses: action-pack/github-release@v2 uses: action-pack/github-release@v2
@@ -113,10 +96,6 @@ jobs:
with: with:
tag: "v${{ steps.prepare.outputs.version }}" tag: "v${{ steps.prepare.outputs.version }}"
title: "v${{ steps.prepare.outputs.version }}" title: "v${{ steps.prepare.outputs.version }}"
body: |
${{ steps.changelog.outputs.changes }}
**Full Changelog**: https://github.com/${{ github.repository }}/compare//${{ env.previousTag }}...v${{ steps.prepare.outputs.version }}
- -
name: Increment version variable name: Increment version variable
uses: action-pack/bump@v2 uses: action-pack/bump@v2

View File

@@ -19,6 +19,6 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: ${{ github.repository }} repository: ${{ secrets.DOCKERHUB_REPO }}
short-description: ${{ github.event.repository.description }} short-description: ${{ github.event.repository.description }}
readme-filepath: ./readme.md readme-filepath: ./readme.md

View File

@@ -7,16 +7,16 @@ 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 \
tini \
wget \ wget \
fdisk \ fdisk \
unzip \ unzip \
@@ -57,11 +57,14 @@ 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/vdsm/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/vdsm/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

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -u set -u
VERSION="7" VERSION="8"
HEADER="VirtualDSM Agent" HEADER="VirtualDSM Agent"
# Functions # Functions
@@ -38,7 +38,7 @@ function downloadUpdate {
# Auto update the agent # Auto update the agent
URL="https://raw.githubusercontent.com/kroese/virtual-dsm/master/agent/agent.sh" URL="https://raw.githubusercontent.com/vdsm/virtual-dsm/master/agent/agent.sh"
remote_size=$(curl -sIk -m 4 "${URL}" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2) remote_size=$(curl -sIk -m 4 "${URL}" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2)
remote_size=${remote_size//$'\r'} remote_size=${remote_size//$'\r'}
@@ -100,6 +100,8 @@ function installPackages {
trap finish SIGINT SIGTERM trap finish SIGINT SIGTERM
ts=$(date +%s%N) ts=$(date +%s%N)
echo ""
echo " Started $HEADER v$VERSION..." echo " Started $HEADER v$VERSION..."
checkNMI checkNMI

View File

@@ -28,7 +28,7 @@ start() {
if [ ! -f "$SCRIPT" ]; then if [ ! -f "$SCRIPT" ]; then
URL="https://raw.githubusercontent.com/kroese/virtual-dsm/master/agent/agent.sh" URL="https://raw.githubusercontent.com/vdsm/virtual-dsm/master/agent/agent.sh"
if ! curl -sfk -m 10 -o "${SCRIPT}" "${URL}"; then if ! curl -sfk -m 10 -o "${SCRIPT}" "${URL}"; then
error 'Failed to download agent script.' > /dev/ttyS0 error 'Failed to download agent script.' > /dev/ttyS0

View File

@@ -2,7 +2,7 @@ version: "3"
services: services:
dsm: dsm:
container_name: dsm container_name: dsm
image: kroese/virtual-dsm:latest image: vdsm/virtual-dsm:latest
environment: environment:
CPU_CORES: "1" CPU_CORES: "1"
DISK_SIZE: "16G" DISK_SIZE: "16G"

View File

@@ -1,6 +1,6 @@
<h1 align="center">Virtual DSM for Docker<br /> <h1 align="center">Virtual DSM for Docker<br />
<div align="center"> <div align="center">
<img src="https://github.com/kroese/virtual-dsm/raw/master/.github/screen.jpg" title="Screenshot" style="max-width:100%;" width="432" /> <img src="https://github.com/vdsm/virtual-dsm/raw/master/.github/screen.jpg" title="Screenshot" style="max-width:100%;" width="432" />
</div> </div>
<div align="center"> <div align="center">
@@ -17,7 +17,7 @@ Virtual DSM in a docker container.
- Multi-platform - Multi-platform
- KVM acceleration - KVM acceleration
- GPU passthrough - GPU passthrough
- Graceful shutdown - Graceful shutdowns
- Upgrades supported - Upgrades supported
## Usage ## Usage
@@ -29,7 +29,7 @@ version: "3"
services: services:
dsm: dsm:
container_name: dsm container_name: dsm
image: kroese/virtual-dsm:latest image: vdsm/virtual-dsm:latest
environment: environment:
DISK_SIZE: "16G" DISK_SIZE: "16G"
devices: devices:
@@ -48,7 +48,7 @@ services:
Via `docker run` Via `docker run`
```bash ```bash
docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 60 kroese/virtual-dsm:latest docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 60 vdsm/virtual-dsm:latest
``` ```
## FAQ ## FAQ
@@ -173,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:
@@ -182,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.
@@ -196,11 +198,11 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
Only run this container on Synology hardware, any other use is not permitted by their EULA. The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Synology, Inc. Only run this container on Synology hardware, any other use is not permitted by their EULA. The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Synology, Inc.
[build_url]: https://github.com/kroese/virtual-dsm/ [build_url]: https://github.com/vdsm/virtual-dsm/
[hub_url]: https://hub.docker.com/r/kroese/virtual-dsm [hub_url]: https://hub.docker.com/r/vdsm/virtual-dsm
[tag_url]: https://hub.docker.com/r/kroese/virtual-dsm/tags [tag_url]: https://hub.docker.com/r/vdsm/virtual-dsm/tags
[Build]: https://github.com/kroese/virtual-dsm/actions/workflows/build.yml/badge.svg [Build]: https://github.com/vdsm/virtual-dsm/actions/workflows/build.yml/badge.svg
[Size]: https://img.shields.io/docker/image-size/kroese/virtual-dsm/latest?color=066da5&label=size [Size]: https://img.shields.io/docker/image-size/vdsm/virtual-dsm/latest?color=066da5&label=size
[Pulls]: https://img.shields.io/docker/pulls/kroese/virtual-dsm.svg?style=flat&label=pulls&logo=docker [Pulls]: https://img.shields.io/docker/pulls/kroese/virtual-dsm.svg?style=flat&label=pulls&logo=docker
[Version]: https://img.shields.io/docker/v/kroese/virtual-dsm/latest?arch=amd64&sort=semver&color=066da5 [Version]: https://img.shields.io/docker/v/vdsm/virtual-dsm/latest?arch=amd64&sort=semver&color=066da5

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 \
@@ -185,6 +178,8 @@ else
fi fi
: ${DEVICE:=''} # Docker variable to passthrough a block device, like /dev/vdc1. : ${DEVICE:=''} # Docker variable to passthrough a block device, like /dev/vdc1.
: ${DEVICE2:=''}
: ${DEVICE3:=''}
if [ -n "${DEVICE}" ]; then if [ -n "${DEVICE}" ]; then
@@ -196,3 +191,25 @@ if [ -n "${DEVICE}" ]; then
-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" -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 fi
if [ -n "${DEVICE2}" ]; then
[ ! -b "${DEVICE2}" ] && error "Device ${DEVICE2} cannot be found! Please add it to the 'devices' section of your compose file." && exit 56
DISK_OPTS="${DISK_OPTS} \
-device virtio-scsi-pci,id=hw-userdata5,bus=pcie.0,addr=0x5 \
-drive file=${DEVICE2},if=none,id=drive-userdata5,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
-device scsi-hd,bus=hw-userdata5.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata5,id=userdata5,rotation_rate=${DISK_ROTATION},bootindex=7"
fi
if [ -n "${DEVICE3}" ]; then
[ ! -b "${DEVICE3}" ] && error "Device ${DEVICE3} cannot be found! Please add it to the 'devices' section of your compose file." && exit 57
DISK_OPTS="${DISK_OPTS} \
-device virtio-scsi-pci,id=hw-userdata6,bus=pcie.0,addr=0x6 \
-drive file=${DEVICE3},if=none,id=drive-userdata6,format=raw,cache=${DISK_CACHE},aio=${DISK_IO},discard=${DISK_DISCARD},detect-zeroes=on \
-device scsi-hd,bus=hw-userdata6.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata6,id=userdata6,rotation_rate=${DISK_ROTATION},bootindex=8"
fi

View File

@@ -28,3 +28,15 @@ if ! apt-mark showinstall | grep -q "xserver-xorg-video-intel"; then
apt-get -qq --no-install-recommends -y install xserver-xorg-video-intel > /dev/null apt-get -qq --no-install-recommends -y install xserver-xorg-video-intel > /dev/null
fi 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

@@ -242,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