Compare commits

...

144 Commits
v4.02 ... 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
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
Kroese
38148641c0 feat: Install GPU drivers
feat: Install GPU drivers
2023-10-09 03:33:37 +02:00
Kroese
5941eae237 style: Empty line 2023-10-09 03:27:45 +02:00
Kroese
5fa117c4d8 fix: Remove platform dependant packages 2023-10-09 03:23:54 +02:00
Kroese
28fc911f00 feat: Install GPU drivers 2023-10-09 03:21:06 +02:00
Kroese
c8eb659c3c feat: Install GPU drivers 2023-10-09 03:14:41 +02:00
Kroese
16ce7c07cf fix: Install platform dependant packages 2023-10-09 02:50:59 +02:00
Kroese
f745e5e09d build: Dockerfile 2023-10-09 02:42:20 +02:00
Kroese
16b823f69b fix: add GPU drivers only on amd64
fix: add GPU drivers only on amd64
2023-10-09 02:27:46 +02:00
Kroese
d69cceba8d fix: add GPU drivers only on amd64 2023-10-09 02:24:52 +02:00
Kroese
c2cd9f52f4 feat: GPU passthrough support
feat: GPU passthrough support
2023-10-09 02:03:05 +02:00
Kroese
0d2a222af0 docs: GPU passthrough support 2023-10-09 02:00:03 +02:00
Kroese
868c7d1661 feat: GPU passthrough support 2023-10-09 01:54:25 +02:00
Kroese
b6ca62da34 feat: GPU passthrough support 2023-10-09 01:42:01 +02:00
Kroese
da4555925b Merge pull request #330 from amintong/master
dnat rule add dst restrictions
2023-10-08 15:08:25 +02:00
tong min
8c6f7e49ef network in NAT mode, processing packets only with the destination (dst) set to the container IP can prevent packets coming out of the QEMU virtual machine through eth0 from being incorrectly DNAT 2023-10-08 19:48:00 +08:00
Kroese
06829aac67 refactor: Filesystem detection
refactor: Filesystem detection
2023-10-07 12:09:11 +02:00
Kroese
e5b7ade0d0 refactor: Filesystem detection 2023-10-07 12:06:22 +02:00
Kroese
c1de32eff6 feat: Check filesystem during installation
feat: Check filesystem during installation
2023-10-05 16:53:56 +02:00
Kroese
c2dc0cd3b6 feat: Check filesystem during installation 2023-10-05 16:49:00 +02:00
Kroese
e2a4ab7515 feat: Check filesystem during installation 2023-10-05 16:45:12 +02:00
Kroese
d94a9d0966 fix: Extract files inside container
fix: Extract files inside container
2023-10-05 15:55:49 +02:00
Kroese
6d9c281add build: Use DockerHub mirror 2023-10-05 15:51:42 +02:00
Kroese
da51c1df1f fix: Extract files inside container 2023-10-05 15:47:17 +02:00
Kroese
97918abdb0 build: Remove btrfs-progs 2023-10-05 15:35:24 +02:00
Kroese
6a8093a3f4 fix: Do not format image as btrfs 2023-10-05 15:31:42 +02:00
Kroese
0bd0806ceb Merge pull request #321 from kroese/renovate/docker-setup-buildx-action-3.x
chore(deps): update docker/setup-buildx-action action to v3
2023-09-12 10:41:06 +02:00
Kroese
386c2ccc45 Merge pull request #320 from kroese/renovate/docker-login-action-3.x
chore(deps): update docker/login-action action to v3
2023-09-12 10:40:51 +02:00
renovate[bot]
ff6a3b8776 chore(deps): update docker/setup-buildx-action action to v3 2023-09-12 08:10:13 +00:00
renovate[bot]
f290fb7031 chore(deps): update docker/login-action action to v3 2023-09-12 08:10:09 +00:00
Kroese
b4e19ccc23 Update readme.md
Update readme.md
2023-09-05 03:45:48 +02:00
Kroese
e3c514f8dc Update readme.md 2023-09-05 03:45:32 +02:00
Kroese
101b509f81 Merge pull request #316 from kroese/renovate/actions-checkout-4.x
chore(deps): update actions/checkout action to v4
2023-09-04 16:07:12 +02:00
renovate[bot]
6a5301b3f2 chore(deps): update actions/checkout action to v4 2023-09-04 14:04:19 +00:00
Kroese
cad5e5d5c2 Readme
Readme
2023-07-27 01:41:09 +02:00
Kroese
024170d190 docs: Readme 2023-07-27 01:40:31 +02:00
Kroese
0ce14f6c2d fix: Disable pidwait
fix: Disable pidwait
2023-07-18 20:17:19 +02:00
Kroese
272e491281 fix: Disable pidwait 2023-07-18 20:16:47 +02:00
Kroese
0518e1100b Add ARGUMENTS variable
Add ARGUMENTS variable
2023-07-18 19:47:56 +02:00
Kroese
8aa797b557 feat: Add ARGUMENTS variable 2023-07-18 19:44:09 +02:00
Kroese
4356e5ebf9 Fix for issue https://github.com/kroese/virtual-dsm/issues/292
Fix for issue https://github.com/kroese/virtual-dsm/issues/292
2023-07-18 19:37:12 +02:00
Kroese
502c068d30 fix: Fix for issue https://github.com/kroese/virtual-dsm/issues/292 2023-07-18 19:35:56 +02:00
Kroese
d5e3ed8907 fix: Fix for issue https://github.com/kroese/virtual-dsm/issues/292 2023-07-18 19:34:49 +02:00
Kroese
f0e5a61e73 Delete network on shutdown
Delete network on shutdown
2023-07-04 18:56:18 +02:00
Kroese
b07577b60d style: Remove spaces 2023-07-04 18:46:16 +02:00
Kroese
4571fe9c4f feat: Close network on shutdown 2023-07-04 18:36:38 +02:00
Kroese
9f6fbc3f7c fix: Use pidwait only on recent kernels 2023-07-04 18:22:50 +02:00
Kroese
bbc033f032 feat: Close network on shutdown 2023-07-04 18:21:37 +02:00
Kroese
160e5a07be feat: Close network on shutdown 2023-07-04 18:20:03 +02:00
Kroese
0cca2a7079 fix: Wait for address 2023-07-04 12:52:49 +02:00
Kroese
64257d1a6f Fix issue #281 and #283
Fix issue #281 and #283
2023-07-03 12:02:33 +02:00
Kroese
d6dde093b2 docs: Resize info 2023-07-03 11:59:40 +02:00
Kroese
d1957f5eb7 fix: Fix issue #281 2023-07-03 11:38:11 +02:00
Kroese
f3f9a9f480 fix: Fix issue #281 2023-07-03 11:26:10 +02:00
Kroese
15d67203c9 fix: Fix issue #283 2023-07-03 11:11:47 +02:00
Kroese
c33c63114e Merge pull request #278 from lauwie007/master
Update to DSM 7.2 build 64570-1
2023-06-20 21:40:44 +02:00
lauwie007
80169e6b50 Update to DSM 7.2 build 64570-1
New dsm release (previous version returned  an error for me)
2023-06-20 21:36:08 +02:00
Kroese
61f733fe66 Line breaks
Line breaks
2023-06-09 09:58:31 +02:00
Kroese
03da1f38f4 fix: Line breaks 2023-06-09 09:57:55 +02:00
Kroese
8543ea5dad Update to DSM 7.2 build 64570
Update to DSM 7.2 build 64570
2023-06-09 09:48:21 +02:00
Kroese
36ebb950eb Update to DSM 7.2 build 64570 2023-06-09 09:47:44 +02:00
Kroese
76ad3ff502 Add host MAC address
Add host MAC address
2023-05-29 14:03:07 +02:00
Kroese
4673feb282 feat: Add host MAC address 2023-05-29 13:53:02 +02:00
Kroese
df6436bf6a Use dots as seperator
Use dots as seperator
2023-05-29 05:03:56 +02:00
Kroese
d904ebfc85 fix: Use dots as seperator 2023-05-29 04:54:21 +02:00
Kroese
b78342328f Add host model environment variable
Add host model environment variable
2023-05-29 02:57:42 +02:00
Kroese
36c89f0556 feat: Add host model 2023-05-29 02:56:47 +02:00
Kroese
1c62acd1a1 Add host MAC address as environment variable
Add host MAC address as environment variable
2023-05-29 02:22:55 +02:00
Kroese
0795fd1277 feat: Add host MAC address 2023-05-29 02:18:33 +02:00
Kroese
c509ef5ac4 feat: Add host MAC address 2023-05-29 02:10:10 +02:00
Kroese
46be2d583d fix: Decrease delay 2023-05-27 13:26:39 +02:00
Kroese
3441350087 fix: Don't redirect stdout 2023-05-27 07:13:43 +02:00
Kroese
d132b6afa9 Add device cgroup rules
Add device cgroup rules
2023-05-25 23:21:07 +02:00
Kroese
8d0efe7379 feat: Add device cgroup rules 2023-05-25 23:17:10 +02:00
Kroese
2ad9dcc24c Readme
Readme
2023-05-25 23:12:53 +02:00
Kroese
24ab417e9e docs: DHCP mode 2023-05-25 23:10:15 +02:00
Kroese
bc9d3ffc9b docs: DHCP mode 2023-05-25 23:08:20 +02:00
Kroese
4904109b9e Readme
Readme
2023-05-25 22:14:48 +02:00
Kroese
436eca45cc docs: DSM version 2023-05-25 22:09:21 +02:00
Kroese
daa91af2d5 docs: cgroup wildcard 2023-05-25 22:05:33 +02:00
Kroese
3416507ec5 Display QEMU version
Display QEMU version
2023-05-25 20:42:48 +02:00
Kroese
e9a5b50893 feat: Display QEMU version 2023-05-25 20:41:30 +02:00
Kroese
848dd9172d Default to DSM 7.0.1 on ARM systems
Default to DSM 7.0.1 on ARM systems
2023-05-25 14:48:31 +02:00
Kroese
585adabaee fix: Default to DSM 7.0.1 on ARM systems 2023-05-25 14:47:47 +02:00
15 changed files with 352 additions and 196 deletions

View File

@@ -12,7 +12,6 @@ on:
- '.dockerignore'
- '.github/**'
- '.github/workflows/**'
- 'Dockerfile'
jobs:
shellcheck:
@@ -28,10 +27,10 @@ jobs:
steps:
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
-
name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
-
@@ -45,6 +44,8 @@ jobs:
TAGS=()
TAGS=("${{ github.repository }}:latest")
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 }}:${VERSION}")
@@ -54,13 +55,13 @@ jobs:
echo "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
-
name: Login into Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Login to GitHub Container Registry
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -87,25 +88,6 @@ jobs:
name: Clear Docker credentials
run: |
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
uses: action-pack/github-release@v2
@@ -114,10 +96,6 @@ jobs:
with:
tag: "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
uses: action-pack/bump@v2

View File

@@ -7,8 +7,8 @@ jobs:
name: shellcheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@master
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

@@ -12,13 +12,13 @@ jobs:
dockerHubDescription:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
-
name: Docker Hub Description
uses: peter-evans/dockerhub-description@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: ${{ github.repository }}
repository: ${{ secrets.DOCKERHUB_REPO }}
short-description: ${{ github.event.repository.description }}
readme-filepath: ./readme.md

View File

@@ -1,4 +1,4 @@
FROM ghcr.io/qemu-tools/qemu-host as builder
FROM qemux/qemu-host as builder
# FROM golang as builder
# WORKDIR /
@@ -7,32 +7,32 @@ FROM ghcr.io/qemu-tools/qemu-host as builder
# RUN go mod download
# 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 DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y upgrade && \
apt-get --no-install-recommends -y install \
curl \
cpio \
wget \
fdisk \
unzip \
socat \
procps \
dnsmasq \
xz-utils \
iptables \
iproute2 \
net-tools \
btrfs-progs \
netcat-openbsd \
ca-certificates \
qemu-system-x86 \
tini \
curl \
cpio \
wget \
fdisk \
unzip \
socat \
procps \
xz-utils \
iptables \
iproute2 \
dnsmasq \
net-tools \
ca-certificates \
netcat-openbsd \
qemu-system-x86 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY run/*.sh /run/
COPY agent/*.sh /agent/
@@ -44,7 +44,7 @@ VOLUME /storage
EXPOSE 22
EXPOSE 80
EXPOSE 139
EXPOSE 139
EXPOSE 445
EXPOSE 5000
@@ -57,12 +57,15 @@ ARG BUILD_ARG=0
ARG VERSION_ARG="0.0"
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.revision=${BUILD_ARG}
LABEL org.opencontainers.image.version=${VERSION_ARG}
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.source="https://github.com/vdsm/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
ENTRYPOINT ["/run/run.sh"]
ENTRYPOINT ["/usr/bin/tini", "-s", "/run/run.sh"]

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -u
VERSION="7"
VERSION="8"
HEADER="VirtualDSM Agent"
# Functions
@@ -38,7 +38,7 @@ function downloadUpdate {
# 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=${remote_size//$'\r'}
@@ -100,6 +100,8 @@ function installPackages {
trap finish SIGINT SIGTERM
ts=$(date +%s%N)
echo ""
echo " Started $HEADER v$VERSION..."
checkNMI
@@ -124,7 +126,7 @@ else
fi
delay=5000
delay=500
elapsed=$((($(date +%s%N) - ts)/1000000))
if [[ delay -gt elapsed ]]; then
@@ -143,9 +145,11 @@ else
MSG="http://${IP}:5000"
fi
echo ""
info "--------------------------------------------------------"
info " You can now login to DSM at ${MSG}"
info "--------------------------------------------------------"
echo ""
# Wait for NMI interrupt as a shutdown signal

View File

@@ -28,7 +28,7 @@ start() {
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
error 'Failed to download agent script.' > /dev/ttyS0

View File

@@ -2,7 +2,7 @@ version: "3"
services:
dsm:
container_name: dsm
image: kroese/virtual-dsm:latest
image: vdsm/virtual-dsm:latest
environment:
CPU_CORES: "1"
DISK_SIZE: "16G"
@@ -10,6 +10,8 @@ services:
devices:
- /dev/kvm
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'
cap_add:
- NET_ADMIN
ports:

106
readme.md
View File

@@ -1,6 +1,6 @@
<h1 align="center">Virtual DSM for Docker<br />
<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 align="center">
@@ -16,9 +16,10 @@ Virtual DSM in a docker container.
- Multi-platform
- KVM acceleration
- Graceful shutdown
- GPU passthrough
- Graceful shutdowns
- Upgrades supported
## Usage
Via `docker-compose.yml`
@@ -26,28 +27,28 @@ Via `docker-compose.yml`
```yaml
version: "3"
services:
dsm:
container_name: dsm
image: kroese/virtual-dsm:latest
environment:
DISK_SIZE: "16G"
devices:
- /dev/kvm
- /dev/vhost-net
cap_add:
- NET_ADMIN
ports:
- 5000:5000
volumes:
- /opt/dsm:/storage
restart: on-failure
stop_grace_period: 1m
dsm:
container_name: dsm
image: vdsm/virtual-dsm:latest
environment:
DISK_SIZE: "16G"
devices:
- /dev/kvm
- /dev/vhost-net
cap_add:
- NET_ADMIN
ports:
- 5000:5000
volumes:
- /opt/dsm:/storage
restart: on-failure
stop_grace_period: 1m
```
Via `docker run`
```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
@@ -58,8 +59,10 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
environment:
DISK_SIZE: "256G"
DISK_SIZE: "256G"
```
This can also be used to resize the existing disk to a larger capacity without data loss.
* ### How do I change the location of the virtual disk?
@@ -67,7 +70,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
volumes:
- /home/user/data:/storage
- /home/user/data:/storage
```
Replace the example path `/home/user/data` with the desired storage folder.
@@ -78,7 +81,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
environment:
ALLOCATE: "N"
ALLOCATE: "N"
```
Keep in mind that this will not affect any of your existing disks, it only applies to newly created disks.
@@ -89,8 +92,8 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
environment:
CPU_CORES: "4"
RAM_SIZE: "2048M"
CPU_CORES: "4"
RAM_SIZE: "2048M"
```
* ### How do I verify if my system supports KVM?
@@ -124,16 +127,16 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
services:
dsm:
container_name: dsm
..<snip>..
networks:
vdsm:
ipv4_address: 192.168.0.100
dsm:
container_name: dsm
..<snip>..
networks:
vdsm:
ipv4_address: 192.168.0.100
networks:
vdsm:
external: true
vdsm:
external: true
```
An added benefit of this approach is that you won't have to perform any port mapping anymore since all ports will be exposed by default.
@@ -148,14 +151,14 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
environment:
DHCP: "Y"
DHCP: "Y"
devices:
- /dev/vhost-net
- /dev/vhost-net
device_cgroup_rules:
- 'c 511:* rwm'
- 'c *:* rwm'
```
Please note that the exact `cgroup` rule number may vary depending on your system, but the log output will indicate the correct number in the event of an error.
Please note that even if you don't need DHCP, it's still recommended to enable this feature as it prevents NAT issues and increases performance by using a `macvtap` interface.
* ### How do I install a specific version of vDSM?
@@ -163,11 +166,24 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
```yaml
environment:
URL: "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_VirtualDSM_42962.pat"
URL: "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
```
With this method, you are able to switch between different versions while keeping your file data.
* ### How do I passthrough my GPU?
To passthrough your GPU, add the following lines to your compose file:
```yaml
environment:
GPU: "Y"
devices:
- /dev/dri
```
This can be used to enable facial recognition in Synology Photos for example.
* ### 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.
@@ -176,17 +192,17 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
Yes, this project contains only open-source code and does not distribute any copyrighted material. Neither does it try to circumvent any copyright protection measures. So under all applicable laws, this project would be considered legal.
However, by installing Synology's Virtual DSM, you must accept their end-user license agreement, which does not permit installation on non-Synology hardware. So only run this project on an official Synology NAS via the Container Manager package, as any other use will be a violation of their terms and conditions.
However, by installing Synology's Virtual DSM, you must accept their end-user license agreement, which does not permit installation on non-Synology hardware. So only run this project on an official Synology NAS, as any other use will be a violation of their terms and conditions.
## Disclaimer
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/
[hub_url]: https://hub.docker.com/r/kroese/virtual-dsm
[tag_url]: https://hub.docker.com/r/kroese/virtual-dsm/tags
[build_url]: https://github.com/vdsm/virtual-dsm/
[hub_url]: https://hub.docker.com/r/vdsm/virtual-dsm
[tag_url]: https://hub.docker.com/r/vdsm/virtual-dsm/tags
[Build]: https://github.com/kroese/virtual-dsm/actions/workflows/build.yml/badge.svg
[Size]: https://img.shields.io/docker/image-size/kroese/virtual-dsm/latest?color=066da5&label=size
[Build]: https://github.com/vdsm/virtual-dsm/actions/workflows/build.yml/badge.svg
[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
[Version]: https://img.shields.io/docker/v/kroese/virtual-dsm?arch=amd64&sort=date&color=066da5
[Version]: https://img.shields.io/docker/v/vdsm/virtual-dsm/latest?arch=amd64&sort=semver&color=066da5

View File

@@ -39,13 +39,15 @@ if [ -f "${DATA}" ]; then
if [[ "${ALLOCATE}" == [Nn]* ]]; then
# Resize file by changing its length
truncate -s "${DATA_SIZE}" "${DATA}";
if ! truncate -s "${DATA_SIZE}" "${DATA}"; then
error "Could not resize the file for the virtual disk." && exit 85
fi
else
REQ=$((DATA_SIZE-OLD_SIZE))
# Check free diskspace
# Check free diskspace
SPACE=$(df --output=avail -B 1 "${STORAGE}" | tail -n 1)
if (( REQ > SPACE )); then
@@ -55,7 +57,9 @@ if [ -f "${DATA}" ]; then
# Resize file by allocating more space
if ! fallocate -l "${DATA_SIZE}" "${DATA}"; then
error "Could not allocate a file for the virtual disk." && exit 85
if ! truncate -s "${DATA_SIZE}" "${DATA}"; then
error "Could not resize the file for the virtual disk." && exit 85
fi
fi
if [[ "${ALLOCATE}" == [Zz]* ]]; then
@@ -84,7 +88,10 @@ if [ ! -f "${DATA}" ]; then
if [[ "${ALLOCATE}" == [Nn]* ]]; then
# Create an empty file
truncate -s "${DATA_SIZE}" "${DATA}"
if ! truncate -s "${DATA_SIZE}" "${DATA}"; then
rm -f "${DATA}"
error "Could not create a file for the virtual disk." && exit 87
fi
else
@@ -98,8 +105,10 @@ if [ ! -f "${DATA}" ]; then
# Create an empty file
if ! fallocate -l "${DATA_SIZE}" "${DATA}"; then
rm -f "${DATA}"
error "Could not allocate a file for the virtual disk." && exit 87
if ! truncate -s "${DATA_SIZE}" "${DATA}"; then
rm -f "${DATA}"
error "Could not create a file for the virtual disk." && exit 87
fi
fi
if [[ "${ALLOCATE}" == [Zz]* ]]; then
@@ -116,7 +125,7 @@ if [ ! -f "${DATA}" ]; then
fi
# Format as BTRFS filesystem
mkfs.btrfs -q -L data -d single -m dup "${DATA}" > /dev/null
# mkfs.btrfs -q -L data -d single -m dup "${DATA}" > /dev/null
fi
@@ -127,13 +136,6 @@ if [[ SIZE -ne DATA_SIZE ]]; then
error "Virtual disk has the wrong size: ${SIZE}" && exit 89
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="\
-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 \
@@ -144,3 +146,70 @@ DISK_OPTS="\
-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 \
-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.
: ${DEVICE2:=''}
: ${DEVICE3:=''}
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
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

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

@@ -9,9 +9,11 @@ DL="https://global.synologydownload.com/download/DSM"
if [ -z "$URL" ]; then
URL="$DL/release/7.2/64561/DSM_VirtualDSM_64561.pat"
#URL="$DL/release/7.1.1/42962-1/DSM_VirtualDSM_42962.pat"
#URL="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
if [ "$ARCH" == "amd64" ]; then
URL="$DL/release/7.2/64570-1/DSM_VirtualDSM_64570.pat"
else
URL="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
fi
fi
@@ -29,13 +31,20 @@ rm -f "$STORAGE"/"$BASE".agent
rm -f "$STORAGE"/"$BASE".boot.img
rm -f "$STORAGE"/"$BASE".system.img
TMP="$STORAGE/tmp"
RDC="$STORAGE/dsm.rd"
TMP="/tmp/dsm"
FS=$(stat -f -c %T "$STORAGE")
[[ "$FS" == "ext"* ]] && TMP="$STORAGE/tmp"
rm -rf "$TMP" && mkdir -p "$TMP"
# Check free diskspace
MIN_SPACE=5842450944
SPACE=$(df --output=avail -B 1 "$TMP" | tail -n 1)
(( MIN_SPACE > SPACE )) && error "Not enough free space for installation." && exit 95
[[ "${DEBUG}" == [Yy1]* ]] && set -x
RDC="$STORAGE/dsm.rd"
if [ ! -f "${RDC}" ]; then
info "Install: Downloading installer..."
@@ -93,15 +102,15 @@ if [ -f "${RDC}" ]; then
cp "$TMP/usr/lib/libc.so.6" /lib64/
cp "$TMP/usr/lib/libpthread.so.0" /lib64/
cp "$TMP/usr/lib/ld-linux-x86-64.so.2" /lib64/
fi
fi
mv /run/extract/scemd /run/extract/syno_extract_system_patch
chmod +x /run/extract/syno_extract_system_patch
rm -rf "$TMP" && mkdir -p "$TMP"
fi
rm -rf "$TMP" && mkdir -p "$TMP"
info "Install: Downloading $(basename "$URL")..."
PAT="/$BASE.pat"
@@ -118,27 +127,27 @@ if ((SIZE<250000000)); then
error "The specified PAT file is probably an update pack as it's too small." && exit 62
fi
info "Install: Extracting downloaded image..."
if { tar tf "$PAT"; } >/dev/null 2>&1; then
info "Install: Extracting downloaded image..."
tar xpf "$PAT" -C "$TMP/."
else
if [ "$ARCH" != "amd64" ]; then
info "Install: Installing QEMU..."
export DEBCONF_NOWARNINGS="yes"
export DEBIAN_FRONTEND="noninteractive"
apt-get -qq update
apt-get -qq -y upgrade
apt-get -qq --no-install-recommends -y install qemu-user > /dev/null
export DEBIAN_FRONTEND=""
fi
info "Install: Extracting downloaded image..."
export LD_LIBRARY_PATH="/run/extract"
if [ "$ARCH" == "amd64" ]; then
@@ -147,9 +156,10 @@ else
{ qemu-x86_64 /run/extract/syno_extract_system_patch "$PAT" "$TMP/."; rc=$?; } || :
fi
(( rc != 0 )) && error "Failed to extract PAT file, reason $rc" && exit 63
export LD_LIBRARY_PATH=""
(( rc != 0 )) && error "Failed to extract PAT file, reason $rc" && exit 63
fi
HDA="$TMP/hda1"
@@ -175,7 +185,9 @@ SPACE=$(df --output=avail -B 1 "$TMP" | tail -n 1)
(( SYSTEM_SIZE > SPACE )) && error "Not enough free space to create a 4 GB system disk." && exit 87
if ! fallocate -l "${SYSTEM_SIZE}" "${SYSTEM}"; then
rm -f "${SYSTEM}" && error "Could not allocate a file for the system disk." && exit 88
if ! truncate -s "${SYSTEM_SIZE}" "${SYSTEM}"; then
rm -f "${SYSTEM}" && error "Could not allocate a file for the system disk." && exit 88
fi
fi
if [[ "${ALLOCATE}" == [Zz]* ]]; then
@@ -192,14 +204,14 @@ SIZE=$(stat -c%s "${SYSTEM}")
PART="$TMP/partition.fdisk"
{ echo "label: dos"
echo "label-id: 0x6f9ee2e9"
echo "device: ${SYSTEM}"
echo "unit: sectors"
echo "sector-size: 512"
echo ""
echo "${SYSTEM}1 : start= 2048, size= 4980480, type=83"
echo "${SYSTEM}2 : start= 4982528, size= 4194304, type=82"
{ echo "label: dos"
echo "label-id: 0x6f9ee2e9"
echo "device: ${SYSTEM}"
echo "unit: sectors"
echo "sector-size: 512"
echo ""
echo "${SYSTEM}1 : start= 2048, size= 4980480, type=83"
echo "${SYSTEM}2 : start= 4982528, size= 4194304, type=82"
} > "$PART"
sfdisk -q "$SYSTEM" < "$PART"
@@ -230,9 +242,6 @@ mkdir -p "$LOC"
cp /agent/service.sh "$LOC/agent.sh"
chmod 755 "$LOC/agent.sh"
# Store agent version
echo "7" > "$STORAGE"/"$BASE".agent
info "Install: Installing system partition..."
LABEL="1.44.1-42218"
@@ -244,6 +253,11 @@ mke2fs -q -t ext4 -b 4096 -d "$MOUNT/" -L "$LABEL" -F -E "offset=$OFFSET" "$SYST
rm -rf "$MOUNT"
echo "$BASE" > "$STORAGE"/dsm.ver
# Check free diskspace
SPACE=$(df --output=avail -B 1 "$STORAGE" | tail -n 1)
(( MIN_SPACE > SPACE )) && error "Not enough free space in storage folder." && exit 94
mv -f "$PAT" "$STORAGE"/"$BASE".pat
mv -f "$BOOT" "$STORAGE"/"$BASE".boot.img
mv -f "$SYSTEM" "$STORAGE"/"$BASE".system.img

View File

@@ -31,7 +31,10 @@ configureDHCP() {
error "and that the NET_ADMIN capability has been added to the container config: --cap-add NET_ADMIN" && exit 16
fi
ip link set "${VM_NET_TAP}" up
while ! ip link set "${VM_NET_TAP}" up; do
info "Waiting for address to become available..."
sleep 2
done
TAP_NR=$(</sys/class/net/"${VM_NET_TAP}"/ifindex)
TAP_PATH="/dev/tap${TAP_NR}"
@@ -127,17 +130,28 @@ configureNAT () {
fi
ip address add ${VM_NET_IP%.*}.1/24 broadcast ${VM_NET_IP%.*}.255 dev dockerbridge
ip link set dockerbridge up
while ! ip link set dockerbridge up; do
info "Waiting for address to become available..."
sleep 2
done
# QEMU Works with taps, set tap to the bridge created
ip tuntap add dev "${VM_NET_TAP}" mode tap
ip link set "${VM_NET_TAP}" up promisc on
while ! ip link set "${VM_NET_TAP}" up promisc on; do
info "Waiting for tap to become available..."
sleep 2
done
ip link set dev "${VM_NET_TAP}" master dockerbridge
# Add internet connection to the VM
IP=$(ip address show dev "${VM_NET_DEV}" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
iptables -t nat -A POSTROUTING -o "${VM_NET_DEV}" -j MASQUERADE
iptables -t nat -A PREROUTING -i "${VM_NET_DEV}" -p tcp -j DNAT --to $VM_NET_IP
iptables -t nat -A PREROUTING -i "${VM_NET_DEV}" -p udp -j DNAT --to $VM_NET_IP
iptables -t nat -A PREROUTING -i "${VM_NET_DEV}" -d "${IP}" -p tcp -j DNAT --to $VM_NET_IP
iptables -t nat -A PREROUTING -i "${VM_NET_DEV}" -d "${IP}" -p udp -j DNAT --to $VM_NET_IP
if (( KERNEL > 4 )); then
# Hack for guest VMs complaining about "bad udp checksums in 5 packets"
@@ -165,6 +179,24 @@ configureNAT () {
return 0
}
closeNetwork () {
if [[ "${DHCP}" == [Yy1]* ]]; then
ip link set "${VM_NET_TAP}" down || true
ip link delete "${VM_NET_TAP}" || true
else
ip link set "${VM_NET_TAP}" down promisc off || true
ip link delete "${VM_NET_TAP}" || true
ip link set dockerbridge down || true
ip link delete dockerbridge || true
fi
}
# ######################################
# Configure Network
# ######################################
@@ -202,7 +234,11 @@ fi
if [[ "${DHCP}" == [Yy1]* ]]; then
if [[ "$GATEWAY" == "172."* ]]; then
error "You can only enable DHCP while the container is on a macvlan network!" && exit 86
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
fi
fi
# Configuration for DHCP IP

View File

@@ -39,28 +39,14 @@ _graceful_shutdown() {
echo && error "Could not send shutdown command to the guest ($RESPONSE)"
# If we cannot shutdown the usual way, fallback to the NMI method
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
AGENT_VERSION=0
fi
fi
if ((AGENT_VERSION < 2)); then
echo && info "Please update the VirtualDSM Agent to allow for gracefull shutdowns..."
# Send a NMI interrupt which will be detected by the agent script
if ! echo 'nmi' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" > /dev/null ; then
kill -15 "$(cat "${_QEMU_PID}")"
pkill -f qemu-system-x86_64 || true
fi
fi
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
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
@@ -81,6 +68,8 @@ _graceful_shutdown() {
echo && echo " Quitting..."
echo 'quit' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 || true
closeNetwork
return
}

View File

@@ -4,8 +4,10 @@ set -Eeuo pipefail
# Docker environment variables
: ${URL:=''} # URL of the PAT file
: ${DEBUG:='N'} # Enable debug mode
: ${GPU:='N'} # Enable GPU passthrough
: ${DEBUG:='N'} # Enable debugging mode
: ${ALLOCATE:='Y'} # Preallocate diskspace
: ${ARGUMENTS:=''} # Extra QEMU parameters
: ${CPU_CORES:='1'} # Amount of CPU cores
: ${DISK_SIZE:='16G'} # Initial data disk size
: ${RAM_SIZE:='512M'} # Maximum RAM amount
@@ -21,7 +23,9 @@ trap 'error "Status $? while: ${BASH_COMMAND} (line $LINENO/$BASH_LINENO)"' ERR
STORAGE="/storage"
KERNEL=$(uname -r | cut -b 1)
MINOR=$(uname -r | cut -d '.' -f2)
ARCH=$(dpkg --print-architecture)
VERS=$(qemu-system-x86_64 --version | head -n 1 | cut -d '(' -f 1)
[ ! -d "$STORAGE" ] && error "Storage folder (${STORAGE}) not found!" && exit 13
@@ -38,17 +42,10 @@ if [[ ! -f "$STORAGE/$BASE.boot.img" ]] || [[ ! -f "$STORAGE/$BASE.system.img" ]
. /run/install.sh
fi
# Initialize disks
. /run/disk.sh
# Initialize network
. /run/network.sh
# Initialize serialport
. /run/serial.sh
# Configure shutdown
. /run/power.sh
. /run/disk.sh # Initialize disks
. /run/network.sh # Initialize network
. /run/serial.sh # Initialize serialport
. /run/power.sh # Configure shutdown
KVM_ERR=""
KVM_OPTS=""
@@ -78,21 +75,23 @@ 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 -device virtio-rng-pci,rng=objrng0,id=rng0,bus=pcie.0,addr=0x1c"
ARGS="${DEF_OPTS} ${CPU_OPTS} ${RAM_OPTS} ${MAC_OPTS} ${MON_OPTS} ${SERIAL_OPTS} ${NET_OPTS} ${DISK_OPTS} ${EXTRA_OPTS}"
[[ "${GPU}" == [Yy1]* ]] && [[ "$ARCH" == "amd64" ]] && . /run/gpu.sh
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 ' ')
trap - ERR
set -m
(
[[ "${DEBUG}" == [Yy1]* ]] && set -x
[[ "${DEBUG}" == [Yy1]* ]] && info "$VERS" && set -x
qemu-system-x86_64 ${ARGS:+ $ARGS} & echo $! > "${_QEMU_PID}"
{ set +x; } 2>/dev/null
)
set +m
if (( KERNEL > 4 )); then
pidwait -F "${_QEMU_PID}" & wait $!
else
tail --pid "$(cat "${_QEMU_PID}")" --follow /dev/null & wait $!
fi
#if (( KERNEL > 5 )) || ( (( KERNEL == 5 )) && (( MINOR > 2 )) ); then
# pidwait -F "${_QEMU_PID}" & wait $!
#else
tail --pid "$(cat "${_QEMU_PID}")" --follow /dev/null & wait $!

View File

@@ -4,10 +4,12 @@ set -Eeuo pipefail
# Docker environment variables
: ${HOST_CPU:=''}
: ${HOST_MAC:=''}
: ${HOST_BUILD:=''}
: ${HOST_DEBUG:=''}
: ${HOST_SERIAL:=''}
: ${GUEST_SERIAL:=''}
: ${HOST_MODEL:=''}
: ${HOST_VERSION:=''}
: ${HOST_TIMESTAMP:=''}
@@ -26,10 +28,12 @@ else
fi
HOST_ARGS=()
HOST_ARGS+=("-cpu=${CPU_CORES}")
HOST_ARGS+=("-cpu_arch=${HOST_CPU}")
[ -n "$CPU_CORES" ] && HOST_ARGS+=("-cpu=${CPU_CORES}")
[ -n "$HOST_MAC" ] && HOST_ARGS+=("-mac=${HOST_MAC}")
[ -n "$HOST_BUILD" ] && HOST_ARGS+=("-build=${HOST_BUILD}")
[ -n "$HOST_MODEL" ] && HOST_ARGS+=("-model=${HOST_MODEL}")
[ -n "$HOST_SERIAL" ] && HOST_ARGS+=("-hostsn=${HOST_SERIAL}")
[ -n "$GUEST_SERIAL" ] && HOST_ARGS+=("-guestsn=${GUEST_SERIAL}")
[ -n "$HOST_VERSION" ] && HOST_ARGS+=("-version=${HOST_VERSION}")
@@ -41,15 +45,15 @@ if [[ "${HOST_DEBUG}" == [Yy1]* ]]; then
{ set +x; } 2>/dev/null
echo
else
./run/host.bin "${HOST_ARGS[@]}" > /dev/null 2>&1 &
./run/host.bin "${HOST_ARGS[@]}" 2> /dev/null &
fi
# Configure serial ports
SERIAL_OPTS="\
-serial mon:stdio \
-device virtio-serial-pci,id=virtio-serial0,bus=pcie.0,addr=0x3 \
-chardev pty,id=charserial0 \
-device isa-serial,chardev=charserial0,id=serial0 \
-chardev socket,id=charchannel0,host=127.0.0.1,port=12345,reconnect=10 \
-device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=vchannel"
-device virtio-serial-pci,id=virtio-serial0,bus=pcie.0,addr=0x3 \
-chardev pty,id=charserial0 \
-device isa-serial,chardev=charserial0,id=serial0 \
-chardev socket,id=charchannel0,host=127.0.0.1,port=12345,reconnect=10 \
-device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=vchannel"