mirror of
https://github.com/vdsm/virtual-dsm.git
synced 2025-11-07 02:23:42 +08:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@@ -12,7 +12,6 @@ on:
|
||||
- '.dockerignore'
|
||||
- '.github/**'
|
||||
- '.github/workflows/**'
|
||||
- 'Dockerfile'
|
||||
|
||||
jobs:
|
||||
shellcheck:
|
||||
|
||||
2
.github/workflows/check.yml
vendored
2
.github/workflows/check.yml
vendored
@@ -11,4 +11,4 @@ jobs:
|
||||
- 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
|
||||
|
||||
37
Dockerfile
37
Dockerfile
@@ -14,24 +14,25 @@ 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 \
|
||||
xz-utils \
|
||||
iptables \
|
||||
iproute2 \
|
||||
dnsmasq \
|
||||
net-tools \
|
||||
ca-certificates \
|
||||
netcat-openbsd \
|
||||
qemu-system-x86 \
|
||||
curl \
|
||||
cpio \
|
||||
tini \
|
||||
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/
|
||||
|
||||
@@ -43,7 +44,7 @@ VOLUME /storage
|
||||
|
||||
EXPOSE 22
|
||||
EXPOSE 80
|
||||
EXPOSE 139
|
||||
EXPOSE 139
|
||||
EXPOSE 445
|
||||
EXPOSE 5000
|
||||
|
||||
@@ -64,4 +65,4 @@ LABEL org.opencontainers.image.url=https://hub.docker.com/r/kroese/virtual-dsm/
|
||||
|
||||
HEALTHCHECK --interval=60s --retries=2 CMD /run/check.sh
|
||||
|
||||
ENTRYPOINT ["/run/run.sh"]
|
||||
ENTRYPOINT ["/usr/bin/tini", "-s", "/run/run.sh"]
|
||||
|
||||
14
readme.md
14
readme.md
@@ -16,9 +16,10 @@ Virtual DSM in a docker container.
|
||||
|
||||
- Multi-platform
|
||||
- KVM acceleration
|
||||
- GPU passthrough
|
||||
- Graceful shutdown
|
||||
- Upgrades supported
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
Via `docker-compose.yml`
|
||||
@@ -170,6 +171,17 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
||||
|
||||
With this method, you are able to switch between different versions while keeping your file data.
|
||||
|
||||
* ### How do I passthrough my GPU?
|
||||
|
||||
To enable this feature, add the following lines to your compose file:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
GPU: "Y"
|
||||
devices:
|
||||
- /dev/dri
|
||||
```
|
||||
|
||||
* ### 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.
|
||||
|
||||
43
run/disk.sh
43
run/disk.sh
@@ -153,3 +153,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
|
||||
|
||||
30
run/gpu.sh
Normal file
30
run/gpu.sh
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/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
|
||||
@@ -31,15 +31,9 @@ rm -f "$STORAGE"/"$BASE".agent
|
||||
rm -f "$STORAGE"/"$BASE".boot.img
|
||||
rm -f "$STORAGE"/"$BASE".system.img
|
||||
|
||||
TMP="/tmp/dsm"
|
||||
FS=$(stat -f -c %T "$STORAGE")
|
||||
|
||||
if [[ "$FS" == "ext"* ]]; then
|
||||
TMP="$STORAGE/tmp"
|
||||
else
|
||||
TMP="/tmp/dsm"
|
||||
fi
|
||||
|
||||
RDC="$STORAGE/dsm.rd"
|
||||
[[ "$FS" == "ext"* ]] && TMP="$STORAGE/tmp"
|
||||
rm -rf "$TMP" && mkdir -p "$TMP"
|
||||
|
||||
# Check free diskspace
|
||||
@@ -49,6 +43,8 @@ SPACE=$(df --output=avail -B 1 "$TMP" | tail -n 1)
|
||||
|
||||
[[ "${DEBUG}" == [Yy1]* ]] && set -x
|
||||
|
||||
RDC="$STORAGE/dsm.rd"
|
||||
|
||||
if [ ! -f "${RDC}" ]; then
|
||||
|
||||
info "Install: Downloading installer..."
|
||||
@@ -106,7 +102,7 @@ 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
|
||||
@@ -131,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
|
||||
@@ -209,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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
20
run/run.sh
20
run/run.sh
@@ -4,7 +4,8 @@ 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
|
||||
@@ -41,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=""
|
||||
@@ -81,6 +75,8 @@ 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"
|
||||
|
||||
[[ "${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 ' ')
|
||||
|
||||
|
||||
@@ -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