mirror of
https://github.com/vdsm/virtual-dsm.git
synced 2025-11-07 02:23:42 +08:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b588f8c90d | ||
|
|
1f1007a0f1 | ||
|
|
2ec37e2802 | ||
|
|
3126b3847b | ||
|
|
41e0157e9d | ||
|
|
1d64410849 | ||
|
|
55034b0f40 | ||
|
|
acffcf3774 | ||
|
|
fba0eb527b | ||
|
|
d9fc2714a6 | ||
|
|
d1f1772d74 | ||
|
|
bf1d47e4f3 | ||
|
|
3da564dfd1 |
62
.github/ISSUE_TEMPLATE/1-issue.yml
vendored
Normal file
62
.github/ISSUE_TEMPLATE/1-issue.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
name: "\U0001F6A8 Technical issue"
|
||||
description: When you're experiencing problems using the container
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there no existing issue for this?
|
||||
description: Please search to see if no solution was already provided before.
|
||||
options:
|
||||
- label: I have searched the existing issues
|
||||
required: true
|
||||
- type: input
|
||||
id: cpu
|
||||
attributes:
|
||||
label: Machine specifications
|
||||
description: The processor and RAM amount in your machine.
|
||||
placeholder: e.g. Intel N5105 / 16 GB
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating system
|
||||
description: The distribution and kernel version (as shown by `uname -a`).
|
||||
placeholder: e.g. Ubuntu 24.04 / Kernel 6.8.0-22-generic
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: docker
|
||||
attributes:
|
||||
label: Docker version
|
||||
description: The version of the Docker engine (as shown by `docker -v`).
|
||||
placeholder: e.g. 26.0.1
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of your issue.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: compose
|
||||
attributes:
|
||||
label: Docker compose
|
||||
description: The compose file (or otherwise the `docker run` command used).
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: log
|
||||
attributes:
|
||||
label: Docker log
|
||||
description: The logfile of the container (as shown by `docker logs dsm`).
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: screenshot
|
||||
attributes:
|
||||
label: Screenshots (optional)
|
||||
description: Screenshots that might help to make the problem more clear.
|
||||
validations:
|
||||
required: false
|
||||
@@ -5,8 +5,8 @@ labels: ["enhancement"]
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing feature request for this?
|
||||
description: Please search to see if the feature request already exists.
|
||||
label: Is there no existing feature request for this?
|
||||
description: Please search to see if the feature was not already requested before.
|
||||
options:
|
||||
- label: I have searched the existing feature requests
|
||||
required: true
|
||||
@@ -1,14 +1,14 @@
|
||||
name: "\U0001F41E Bug Report"
|
||||
name: "\U0001F41E Bug report"
|
||||
description: Create a report to help us improve the container
|
||||
title: "[Bug]: "
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing issue for this?
|
||||
description: Please search to see if an issue already exists for the bug you encountered.
|
||||
label: Is there no existing bug report for this?
|
||||
description: Please search to see if the bug was not already reported before.
|
||||
options:
|
||||
- label: I have searched the existing issues
|
||||
- label: I have searched the existing bug reports
|
||||
required: true
|
||||
- type: input
|
||||
id: cpu
|
||||
@@ -22,7 +22,7 @@ body:
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating system
|
||||
description: The Linux distribution and kernel version as shown by `uname -a`.
|
||||
description: The distribution and kernel version (as shown by `uname -a`).
|
||||
placeholder: e.g. Ubuntu 24.04 / Kernel 6.8.0-22-generic
|
||||
validations:
|
||||
required: true
|
||||
@@ -30,35 +30,35 @@ body:
|
||||
id: docker
|
||||
attributes:
|
||||
label: Docker version
|
||||
description: The Docker version as shown by `docker -v`.
|
||||
placeholder: e.g. Docker version 26.0.1, build d260a54
|
||||
description: The version of the Docker engine (as shown by `docker -v`).
|
||||
placeholder: e.g. 26.0.1
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of the problem.
|
||||
description: Describe the expected behaviour, the actual behaviour, and the steps to reproduce.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: compose
|
||||
attributes:
|
||||
label: Docker compose
|
||||
description: The Docker compose file (or otherwise `run` command).
|
||||
description: The compose file (or otherwise the `docker run` command used).
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: log
|
||||
attributes:
|
||||
label: Docker log
|
||||
description: The Docker logfile of the container.
|
||||
description: The logfile of the container (as shown by `docker logs dsm`).
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: screenshot
|
||||
attributes:
|
||||
label: Screenshots (optional)
|
||||
description: Screenshots of the problem.
|
||||
description: Screenshots that might help to make the problem more clear.
|
||||
validations:
|
||||
required: false
|
||||
@@ -1,5 +1,5 @@
|
||||
name: "? Question"
|
||||
description: General questions about the container
|
||||
name: "\U00002753 General question"
|
||||
description: Questions about the container not related to an issue
|
||||
title: "[Question]: "
|
||||
labels: ["question"]
|
||||
body:
|
||||
@@ -13,7 +13,7 @@ body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is this a general question and not a technical issue?
|
||||
description: For technical issues you must use the [bug report](https://github.com/vdsm/virtual-dsm/issues/new?assignees=&labels=bug&projects=&template=BUG_REPORT.yml&title=%5BBug%5D%3A+) form instead. It contains all the right fields (system info, logfiles, etc.) we need in order to be able to help you.
|
||||
description: For questions related to issues you must use the [technical issue](https://github.com/vdsm/virtual-dsm/issues/new?assignees=&labels=&projects=&template=1-issue.yml) form instead. It contains all the right fields (system info, logfiles, etc.) we need in order to be able to help you.
|
||||
options:
|
||||
- label: I am sure my question is not about a technical issue.
|
||||
required: true
|
||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
blank_issues_enabled: false
|
||||
24
Dockerfile
24
Dockerfile
@@ -10,11 +10,13 @@ FROM qemux/qemu-host:2.04 as builder
|
||||
FROM debian:trixie-slim
|
||||
|
||||
ARG TARGETPLATFORM
|
||||
ARG DEBCONF_NOWARNINGS "yes"
|
||||
ARG DEBIAN_FRONTEND "noninteractive"
|
||||
ARG DEBCONF_NONINTERACTIVE_SEEN "true"
|
||||
ARG VERSION_ARG="0.0"
|
||||
ARG DEBCONF_NOWARNINGS="yes"
|
||||
ARG DEBIAN_FRONTEND="noninteractive"
|
||||
ARG DEBCONF_NONINTERACTIVE_SEEN="true"
|
||||
|
||||
RUN if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi && \
|
||||
RUN set -eu && extra="" && \
|
||||
if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi && \
|
||||
apt-get update && \
|
||||
apt-get --no-install-recommends -y install \
|
||||
jq \
|
||||
@@ -41,14 +43,13 @@ RUN if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi && \
|
||||
apt-get clean && \
|
||||
unlink /etc/nginx/sites-enabled/default && \
|
||||
sed -i 's/^worker_processes.*/worker_processes 1;/' /etc/nginx/nginx.conf && \
|
||||
echo "$VERSION_ARG" > /run/version && \
|
||||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
|
||||
COPY ./src /run/
|
||||
COPY ./web /var/www/
|
||||
COPY --from=builder /qemu-host.bin /run/host.bin
|
||||
|
||||
RUN chmod +x /run/*.sh && chmod +x /run/*.bin
|
||||
RUN mv /var/www/nginx.conf /etc/nginx/sites-enabled/web.conf
|
||||
COPY --chmod=755 ./src /run/
|
||||
COPY --chmod=755 ./web /var/www/
|
||||
COPY --chmod=755 --from=builder /qemu-host.bin /run/host.bin
|
||||
COPY --chmod=744 ./web/nginx.conf /etc/nginx/sites-enabled/web.conf
|
||||
|
||||
VOLUME /storage
|
||||
EXPOSE 22 139 445 5000
|
||||
@@ -57,9 +58,6 @@ ENV RAM_SIZE "1G"
|
||||
ENV DISK_SIZE "16G"
|
||||
ENV CPU_CORES "1"
|
||||
|
||||
ARG VERSION_ARG "0.0"
|
||||
RUN echo "$VERSION_ARG" > /run/version
|
||||
|
||||
HEALTHCHECK --interval=60s --start-period=45s --retries=2 CMD /run/check.sh
|
||||
|
||||
ENTRYPOINT ["/usr/bin/tini", "-s", "/run/entry.sh"]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
version: "3"
|
||||
services:
|
||||
dsm:
|
||||
container_name: dsm
|
||||
@@ -13,5 +12,4 @@ services:
|
||||
- 5000:5000
|
||||
volumes:
|
||||
- /var/dsm:/storage
|
||||
restart: on-failure
|
||||
stop_grace_period: 2m
|
||||
|
||||
58
kubernetes.yml
Normal file
58
kubernetes.yml
Normal file
@@ -0,0 +1,58 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: dsm-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 16Gi
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: dsm
|
||||
labels:
|
||||
name: dsm
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 120 # the Kubernetes default is 30 seconds and it may be not enough
|
||||
containers:
|
||||
- name: dsm
|
||||
image: vdsm/virtual-dsm
|
||||
ports:
|
||||
- containerPort: 5000
|
||||
protocol: TCP
|
||||
resources:
|
||||
limits:
|
||||
devices.kubevirt.io/kvm: 1
|
||||
securityContext:
|
||||
privileged: true
|
||||
env:
|
||||
- name: RAM_SIZE
|
||||
value: 1G
|
||||
- name: CPU_CORES
|
||||
value: "1"
|
||||
- name: DISK_SIZE
|
||||
value: "16G" # Kubernetes uses Gi, but DSM uses GB
|
||||
volumeMounts:
|
||||
- mountPath: /storage
|
||||
name: storage
|
||||
volumes:
|
||||
- name: storage
|
||||
persistentVolumeClaim:
|
||||
claimName: dsm-pvc
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: dsm
|
||||
spec:
|
||||
type: NodePort
|
||||
selector:
|
||||
name: dsm
|
||||
ports:
|
||||
- name: tcp-5000
|
||||
port: 5000
|
||||
targetPort: 5000
|
||||
nodePort: 31150
|
||||
19
readme.md
19
readme.md
@@ -24,7 +24,6 @@ Virtual DSM in a Docker container.
|
||||
Via Docker Compose:
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
services:
|
||||
dsm:
|
||||
container_name: dsm
|
||||
@@ -39,14 +38,19 @@ services:
|
||||
- 5000:5000
|
||||
volumes:
|
||||
- /var/dsm:/storage
|
||||
restart: on-failure
|
||||
stop_grace_period: 2m
|
||||
```
|
||||
|
||||
Via Docker CLI:
|
||||
|
||||
```bash
|
||||
docker run -it --rm --name dsm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 vdsm/virtual-dsm
|
||||
docker run -it --name dsm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 vdsm/virtual-dsm
|
||||
```
|
||||
|
||||
Via Kubernetes:
|
||||
|
||||
```shell
|
||||
kubectl apply -f kubernetes.yml
|
||||
```
|
||||
|
||||
## FAQ
|
||||
@@ -225,6 +229,15 @@ docker run -it --rm --name dsm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMI
|
||||
|
||||
With this method, it is even possible to switch between different versions while keeping all your file data intact.
|
||||
|
||||
If you don't have internet access, it's also possible to skip the download by setting URL to:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
URL: "DSM_VirtualDSM_42218.pat"
|
||||
```
|
||||
|
||||
after placing a file called `DSM_VirtualDSM_42218.pat` in your `/storage` folder.
|
||||
|
||||
* ### What are the differences compared to the standard DSM?
|
||||
|
||||
There are only two minor differences: the Virtual Machine Manager package is not available, and Surveillance Station will not include any free licenses.
|
||||
|
||||
@@ -527,6 +527,7 @@ DISK4_FILE="/storage4/data4"
|
||||
: "${DEVICE3:=""}"
|
||||
: "${DEVICE4:=""}"
|
||||
|
||||
[ -z "$DEVICE" ] && [ -b "/disk" ] && DEVICE="/disk"
|
||||
[ -z "$DEVICE" ] && [ -b "/disk1" ] && DEVICE="/disk1"
|
||||
[ -z "$DEVICE2" ] && [ -b "/disk2" ] && DEVICE2="/disk2"
|
||||
[ -z "$DEVICE3" ] && [ -b "/disk3" ] && DEVICE3="/disk3"
|
||||
|
||||
@@ -18,6 +18,13 @@ if [ -n "$URL" ]; then
|
||||
: "${BASE//+/ }"; printf -v BASE '%b' "${_//%/\\x}"
|
||||
BASE=$(echo "$BASE" | sed -e 's/[^A-Za-z0-9._-]/_/g')
|
||||
fi
|
||||
if [[ "${URL,,}" != "http"* ]]; then
|
||||
if [ -s "$STORAGE/$BASE.pat" ]; then
|
||||
URL="file://$STORAGE/$BASE.pat"
|
||||
else
|
||||
error "File $STORAGE/$BASE.pat does not exist!" && exit 65
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -s "$STORAGE/$BASE.boot.img" ]] && [[ -s "$STORAGE/$BASE.system.img" ]]; then
|
||||
@@ -109,27 +116,41 @@ fi
|
||||
# Download the required files from the Synology website
|
||||
|
||||
ROOT="Y"
|
||||
RD="$TMP/rd.gz"
|
||||
RDC="$STORAGE/dsm.rd"
|
||||
|
||||
if [ ! -s "$RDC" ] && [[ "$URL" == "file://"* ]] && [[ "${URL,,}" == *"_42218.pat" ]]; then
|
||||
|
||||
rm -f "$RD"
|
||||
rm -f "$RDC"
|
||||
|
||||
tar --extract --file="${URL:7}" --directory="$(dirname "$RD")"/. "$(basename "$RD")"
|
||||
cp "$RD" "$RDC"
|
||||
|
||||
fi
|
||||
|
||||
if [ ! -s "$RDC" ]; then
|
||||
|
||||
rm -f "$RD"
|
||||
rm -f "$RDC"
|
||||
|
||||
MSG="Downloading installer..."
|
||||
PRG="Downloading installer ([P])..."
|
||||
info "Install: $MSG" && html "$MSG"
|
||||
|
||||
RD="$TMP/rd.gz"
|
||||
SIZE=5394188
|
||||
POS="65627648-71021835"
|
||||
VERIFY="b4215a4b213ff5154db0488f92c87864"
|
||||
LOC="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
|
||||
[[ "${URL,,}" == *"_42218.pat" ]] && LOC="$URL"
|
||||
|
||||
rm -f "$RD"
|
||||
rm -f "$RDC"
|
||||
/run/progress.sh "$RD" "$SIZE" "$PRG" &
|
||||
{ curl -r "$POS" -sfk --connect-timeout 10 -S -o "$RD" "$LOC"; rc=$?; } || :
|
||||
|
||||
fKill "progress.sh"
|
||||
|
||||
(( rc == 4 )) && error "Failed to download $LOC , network failure!" && exit 60
|
||||
|
||||
if (( rc != 0 )); then
|
||||
if (( rc != 22 )) && (( rc != 56 )); then
|
||||
error "Failed to download $LOC, reason: $rc" && exit 60
|
||||
@@ -152,6 +173,7 @@ if [ ! -s "$RDC" ]; then
|
||||
{ wget "$LOC" -O "$PAT" -q --no-check-certificate --timeout=10 --show-progress "$PROGRESS"; rc=$?; } || :
|
||||
|
||||
fKill "progress.sh"
|
||||
(( rc == 4 )) && error "Failed to download $LOC , network failure!" && exit 60
|
||||
(( rc != 0 )) && error "Failed to download $LOC , reason: $rc" && exit 60
|
||||
|
||||
tar --extract --file="$PAT" --directory="$(dirname "$RD")"/. "$(basename "$RD")"
|
||||
@@ -211,20 +233,22 @@ html "$MSG"
|
||||
PAT="/$BASE.pat"
|
||||
rm -f "$PAT"
|
||||
|
||||
SIZE=0
|
||||
[[ "$URL" == *"DSM_VirtualDSM_69057.pat" ]] && SIZE=363837333
|
||||
|
||||
if [[ "$URL" == "file://"* ]]; then
|
||||
|
||||
cp "${URL:7}" "$PAT"
|
||||
|
||||
else
|
||||
|
||||
SIZE=0
|
||||
[[ "${URL,,}" == *"_69057.pat" ]] && SIZE=363837333
|
||||
[[ "${URL,,}" == *"_42218.pat" ]] && SIZE=379637760
|
||||
|
||||
/run/progress.sh "$PAT" "$SIZE" "$PRG" &
|
||||
|
||||
{ wget "$URL" -O "$PAT" -q --no-check-certificate --timeout=10 --show-progress "$PROGRESS"; rc=$?; } || :
|
||||
|
||||
fKill "progress.sh"
|
||||
(( rc == 4 )) && error "Failed to download $URL , network failure!" && exit 69
|
||||
(( rc != 0 )) && error "Failed to download $URL , reason: $rc" && exit 69
|
||||
|
||||
fi
|
||||
|
||||
@@ -9,7 +9,10 @@ set -Eeuo pipefail
|
||||
: "${CPU_MODEL:=""}"
|
||||
: "${DEF_MODEL:="qemu64"}"
|
||||
|
||||
[[ "${ARCH,,}" != "amd64" ]] && KVM="N"
|
||||
if [[ "${ARCH,,}" != "amd64" ]]; then
|
||||
KVM="N"
|
||||
warn "your CPU architecture is ${ARCH^^} and cannot provide KVM acceleration for x64 instructions, this will cause a major loss of performance."
|
||||
fi
|
||||
|
||||
if [[ "$KVM" != [Nn]* ]]; then
|
||||
|
||||
|
||||
Reference in New Issue
Block a user