mirror of
https://github.com/vdsm/virtual-dsm.git
synced 2025-11-07 02:23:42 +08:00
Compare commits
85 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44d3e23545 | ||
|
|
d340361320 | ||
|
|
f8f8c16200 | ||
|
|
47fd7931eb | ||
|
|
7ac9c242da | ||
|
|
78d330055f | ||
|
|
06cf0a4edc | ||
|
|
e26c208cc7 | ||
|
|
c2f4823d8b | ||
|
|
ca01bf8cb9 | ||
|
|
a5b2b655dd | ||
|
|
0f2f3b2ea8 | ||
|
|
0705c1c21b | ||
|
|
e4de05ce88 | ||
|
|
a24b62ae67 | ||
|
|
b5a9361b68 | ||
|
|
0e35e4a6d9 | ||
|
|
208a6e6636 | ||
|
|
3fec9bf5ef | ||
|
|
8d8efeb341 | ||
|
|
e9f27899a6 | ||
|
|
0c1c422758 | ||
|
|
f56c523627 | ||
|
|
66879b5a6a | ||
|
|
b4eef6161b | ||
|
|
cf38b1f237 | ||
|
|
2c09811365 | ||
|
|
761f5babfc | ||
|
|
26be942a74 | ||
|
|
9c6aeca709 | ||
|
|
81b0bba667 | ||
|
|
e2c00a2e44 | ||
|
|
7bb33f26cd | ||
|
|
63b2d703a4 | ||
|
|
a97dfbfdf2 | ||
|
|
b255cb03e8 | ||
|
|
7a79ff1d2d | ||
|
|
06fda133ed | ||
|
|
acedd1cdcf | ||
|
|
96083fddb3 | ||
|
|
5d7604a205 | ||
|
|
24d44924fe | ||
|
|
db840db76f | ||
|
|
38148641c0 | ||
|
|
5941eae237 | ||
|
|
5fa117c4d8 | ||
|
|
28fc911f00 | ||
|
|
c8eb659c3c | ||
|
|
16ce7c07cf | ||
|
|
f745e5e09d | ||
|
|
16b823f69b | ||
|
|
d69cceba8d | ||
|
|
c2cd9f52f4 | ||
|
|
0d2a222af0 | ||
|
|
868c7d1661 | ||
|
|
b6ca62da34 | ||
|
|
da4555925b | ||
|
|
8c6f7e49ef | ||
|
|
06829aac67 | ||
|
|
e5b7ade0d0 | ||
|
|
c1de32eff6 | ||
|
|
c2dc0cd3b6 | ||
|
|
e2a4ab7515 | ||
|
|
d94a9d0966 | ||
|
|
6d9c281add | ||
|
|
da51c1df1f | ||
|
|
97918abdb0 | ||
|
|
6a8093a3f4 | ||
|
|
0bd0806ceb | ||
|
|
386c2ccc45 | ||
|
|
ff6a3b8776 | ||
|
|
f290fb7031 | ||
|
|
b4e19ccc23 | ||
|
|
e3c514f8dc | ||
|
|
101b509f81 | ||
|
|
6a5301b3f2 | ||
|
|
cad5e5d5c2 | ||
|
|
024170d190 | ||
|
|
0ce14f6c2d | ||
|
|
272e491281 | ||
|
|
0518e1100b | ||
|
|
8aa797b557 | ||
|
|
4356e5ebf9 | ||
|
|
502c068d30 | ||
|
|
d5e3ed8907 |
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
@@ -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
|
||||
-
|
||||
@@ -54,13 +53,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 }}
|
||||
|
||||
4
.github/workflows/check.yml
vendored
4
.github/workflows/check.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/hub.yml
vendored
2
.github/workflows/hub.yml
vendored
@@ -12,7 +12,7 @@ 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
|
||||
|
||||
45
Dockerfile
45
Dockerfile
@@ -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,29 +7,29 @@ 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/*
|
||||
|
||||
@@ -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/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
|
||||
|
||||
ENTRYPOINT ["/run/run.sh"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "-s", "/run/run.sh"]
|
||||
|
||||
86
readme.md
86
readme.md
@@ -16,7 +16,8 @@ Virtual DSM in a docker container.
|
||||
|
||||
- Multi-platform
|
||||
- KVM acceleration
|
||||
- Graceful shutdown
|
||||
- GPU passthrough
|
||||
- Graceful shutdowns
|
||||
- Upgrades supported
|
||||
|
||||
## Usage
|
||||
@@ -26,22 +27,22 @@ 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: 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
|
||||
```
|
||||
|
||||
Via `docker run`
|
||||
@@ -58,7 +59,7 @@ 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.
|
||||
@@ -69,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.
|
||||
@@ -80,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.
|
||||
@@ -91,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?
|
||||
@@ -126,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.
|
||||
@@ -150,11 +151,11 @@ 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 *:* rwm'
|
||||
- 'c *:* rwm'
|
||||
```
|
||||
|
||||
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.
|
||||
@@ -165,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.0.1/42218/DSM_VirtualDSM_42218.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.
|
||||
@@ -178,7 +192,7 @@ 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
|
||||
|
||||
@@ -191,4 +205,4 @@ Only run this container on Synology hardware, any other use is not permitted by
|
||||
[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
|
||||
[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/kroese/virtual-dsm/latest?arch=amd64&sort=semver&color=066da5
|
||||
|
||||
52
run/disk.sh
52
run/disk.sh
@@ -125,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
|
||||
|
||||
@@ -136,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 \
|
||||
@@ -153,3 +146,46 @@ 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.
|
||||
|
||||
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
42
run/gpu.sh
Normal 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
|
||||
@@ -31,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..."
|
||||
@@ -120,28 +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=""
|
||||
export DEBCONF_NOWARNINGS=""
|
||||
|
||||
fi
|
||||
|
||||
info "Install: Extracting downloaded image..."
|
||||
|
||||
export LD_LIBRARY_PATH="/run/extract"
|
||||
|
||||
if [ "$ARCH" == "amd64" ]; then
|
||||
@@ -198,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"
|
||||
@@ -236,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"
|
||||
@@ -250,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
|
||||
|
||||
@@ -147,9 +147,11 @@ configureNAT () {
|
||||
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"
|
||||
@@ -232,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
|
||||
|
||||
23
run/power.sh
23
run/power.sh
@@ -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
|
||||
|
||||
|
||||
33
run/run.sh
33
run/run.sh
@@ -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
|
||||
@@ -40,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=""
|
||||
@@ -80,7 +75,9 @@ 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
|
||||
@@ -93,8 +90,8 @@ set -m
|
||||
)
|
||||
set +m
|
||||
|
||||
if (( KERNEL > 5 )) || ( (( KERNEL == 5 )) && (( MINOR > 10 )) ); 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 $!
|
||||
|
||||
@@ -52,8 +52,8 @@ fi
|
||||
|
||||
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"
|
||||
|
||||
Reference in New Issue
Block a user