mirror of
https://github.com/vdsm/virtual-dsm.git
synced 2025-11-07 18:43:41 +08:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
413a089e02 | ||
|
|
01e23f22fb | ||
|
|
308a764bb0 | ||
|
|
5ad5f8a8ef | ||
|
|
3c342a05aa | ||
|
|
d793921bcf | ||
|
|
5365a9ed4e | ||
|
|
7a55c650d0 | ||
|
|
ede42b3647 | ||
|
|
8e41b4e567 | ||
|
|
899687d3f2 | ||
|
|
2d97bc1cef | ||
|
|
538d7f0195 | ||
|
|
dcf95a8591 | ||
|
|
7f7272b7c8 | ||
|
|
c30248f93e | ||
|
|
cf90c9da1f |
2
.github/workflows/check.yml
vendored
2
.github/workflows/check.yml
vendored
@@ -11,4 +11,4 @@ jobs:
|
|||||||
- name: Run ShellCheck
|
- name: Run ShellCheck
|
||||||
uses: ludeeus/action-shellcheck@master
|
uses: ludeeus/action-shellcheck@master
|
||||||
env:
|
env:
|
||||||
SHELLCHECK_OPTS: -x -e SC2001 -e SC2002 -e SC2223 -e SC2034 -e SC2064 -e SC2317 -e SC2028 -e SC2153
|
SHELLCHECK_OPTS: -x -e SC2001 -e SC2002 -e SC2223 -e SC2034 -e SC2064 -e SC2317 -e SC2028 -e SC2153 -e SC2004
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ RUN apt-get update && apt-get -y upgrade && \
|
|||||||
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
COPY run/*.sh /run/
|
COPY run/*.sh /run/
|
||||||
COPY agent/*.sh /agent/
|
|
||||||
|
|
||||||
COPY --from=builder /qemu-host.bin /run/host.bin
|
COPY --from=builder /qemu-host.bin /run/host.bin
|
||||||
|
|
||||||
RUN chmod +x /run/*.sh && chmod +x /run/*.bin
|
RUN chmod +x /run/*.sh && chmod +x /run/*.bin
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
VERSION="8"
|
VERSION="9"
|
||||||
HEADER="VirtualDSM Agent"
|
HEADER="VirtualDSM Agent"
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
@@ -45,8 +45,12 @@ function downloadUpdate {
|
|||||||
|
|
||||||
[[ "$remote_size" == "" || "$remote_size" == "0" ]] && return
|
[[ "$remote_size" == "" || "$remote_size" == "0" ]] && return
|
||||||
|
|
||||||
|
remote_size=$(($remote_size+0))
|
||||||
|
((remote_size<100)) && return
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "${BASH_SOURCE[0]}")
|
SCRIPT=$(readlink -f "${BASH_SOURCE[0]}")
|
||||||
local_size=$(stat -c%s "$SCRIPT")
|
local_size=$(stat -c%s "$SCRIPT")
|
||||||
|
local_size=$(($local_size+0))
|
||||||
|
|
||||||
[[ remote_size -eq local_size ]] && return
|
[[ remote_size -eq local_size ]] && return
|
||||||
|
|
||||||
@@ -126,31 +130,6 @@ else
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
delay=500
|
|
||||||
elapsed=$((($(date +%s%N) - ts)/1000000))
|
|
||||||
|
|
||||||
if [[ delay -gt elapsed ]]; then
|
|
||||||
difference=$((delay-elapsed))
|
|
||||||
float=$(echo | awk -v diff="${difference}" '{print diff * 0.001}')
|
|
||||||
sleep "$float"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Display message in docker log output
|
|
||||||
|
|
||||||
IP=$(ip address show dev eth0 | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
|
|
||||||
|
|
||||||
if [[ "$IP" == "20.20"* ]]; then
|
|
||||||
MSG="port 5000"
|
|
||||||
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
|
# Wait for NMI interrupt as a shutdown signal
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
|
|||||||
12
readme.md
12
readme.md
@@ -62,7 +62,7 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
DISK_SIZE: "256G"
|
DISK_SIZE: "256G"
|
||||||
```
|
```
|
||||||
|
|
||||||
This can also be used to resize the existing disk to a larger capacity without data loss.
|
This can also be used to resize the existing disk to a larger capacity without any data loss.
|
||||||
|
|
||||||
* ### How do I change the location of the virtual disk?
|
* ### How do I change the location of the virtual disk?
|
||||||
|
|
||||||
@@ -162,18 +162,18 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
* ### How do I install a specific version of vDSM?
|
* ### How do I install a specific version of vDSM?
|
||||||
|
|
||||||
By default, version 7.2 will be installed, but if you prefer an older version, you can add its URL to your compose file as follows:
|
By default, version 7.2.1 will be installed, but if you prefer an older version, you can add its download URL to your compose file as follows:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
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.
|
With this method, it is even possible to switch between different versions while keeping all your file data intact.
|
||||||
|
|
||||||
* ### How do I passthrough my GPU?
|
* ### How do I passthrough my GPU?
|
||||||
|
|
||||||
To passthrough your GPU, add the following lines to your compose file:
|
To passthrough your Intel GPU, add the following lines to your compose file:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
@@ -182,11 +182,11 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
- /dev/dri
|
- /dev/dri
|
||||||
```
|
```
|
||||||
|
|
||||||
This can be used to enable facial recognition in Synology Photos for example.
|
This can be used to enable the facial recognition function in Synology Photos for example.
|
||||||
|
|
||||||
* ### What are the differences compared to the standard DSM?
|
* ### What are the differences compared to the standard DSM?
|
||||||
|
|
||||||
There are only two minor differences: the Virtual Machine Manager package is not provided, and Surveillance Station doesn't include any free licenses.
|
There are only two minor differences: the Virtual Machine Manager package is not available, and Surveillance Station will not include any free licenses.
|
||||||
|
|
||||||
* ### Is this project legal?
|
* ### Is this project legal?
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ DL="https://global.synologydownload.com/download/DSM"
|
|||||||
if [ -z "$URL" ]; then
|
if [ -z "$URL" ]; then
|
||||||
|
|
||||||
if [ "$ARCH" == "amd64" ]; then
|
if [ "$ARCH" == "amd64" ]; then
|
||||||
URL="$DL/release/7.2/64570-1/DSM_VirtualDSM_64570.pat"
|
URL="$DL/release/7.2.1/69057-1/DSM_VirtualDSM_69057.pat"
|
||||||
else
|
else
|
||||||
URL="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
|
URL="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
|
||||||
fi
|
fi
|
||||||
@@ -230,18 +230,6 @@ rm -f "$MOUNT/.SynoUpgradePackages/ActiveInsight-"*
|
|||||||
[ -f "$HDP.txz" ] && tar xpfJ "$HDP.txz" --absolute-names -C "$MOUNT/"
|
[ -f "$HDP.txz" ] && tar xpfJ "$HDP.txz" --absolute-names -C "$MOUNT/"
|
||||||
[ -f "$IDB.txz" ] && tar xpfJ "$IDB.txz" --absolute-names -C "$MOUNT/usr/syno/synoman/indexdb/"
|
[ -f "$IDB.txz" ] && tar xpfJ "$IDB.txz" --absolute-names -C "$MOUNT/usr/syno/synoman/indexdb/"
|
||||||
|
|
||||||
# Install Agent
|
|
||||||
|
|
||||||
LOC="$MOUNT/usr/local/bin"
|
|
||||||
mkdir -p "$LOC"
|
|
||||||
cp /agent/agent.sh "$LOC/agent.sh"
|
|
||||||
chmod 755 "$LOC/agent.sh"
|
|
||||||
|
|
||||||
LOC="$MOUNT/usr/local/etc/rc.d"
|
|
||||||
mkdir -p "$LOC"
|
|
||||||
cp /agent/service.sh "$LOC/agent.sh"
|
|
||||||
chmod 755 "$LOC/agent.sh"
|
|
||||||
|
|
||||||
info "Install: Installing system partition..."
|
info "Install: Installing system partition..."
|
||||||
|
|
||||||
LABEL="1.44.1-42218"
|
LABEL="1.44.1-42218"
|
||||||
|
|||||||
10
run/power.sh
10
run/power.sh
@@ -39,16 +39,11 @@ _graceful_shutdown() {
|
|||||||
|
|
||||||
echo && error "Could not send shutdown command to the guest ($RESPONSE)"
|
echo && error "Could not send shutdown command to the guest ($RESPONSE)"
|
||||||
|
|
||||||
# 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}")"
|
kill -15 "$(cat "${_QEMU_PID}")"
|
||||||
pkill -f qemu-system-x86_64 || true
|
pkill -f qemu-system-x86_64 || true
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
while [ "$(cat ${_QEMU_SHUTDOWN_COUNTER})" -lt "${QEMU_POWERDOWN_TIMEOUT}" ]; do
|
while [ "$(cat ${_QEMU_SHUTDOWN_COUNTER})" -lt "${QEMU_POWERDOWN_TIMEOUT}" ]; do
|
||||||
|
|
||||||
# Increase the counter
|
# Increase the counter
|
||||||
@@ -58,8 +53,9 @@ _graceful_shutdown() {
|
|||||||
if echo 'info version'| nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 ; then
|
if echo 'info version'| nc -q 1 -w 1 localhost "${QEMU_MONPORT}" >/dev/null 2>&1 ; then
|
||||||
|
|
||||||
sleep 1
|
sleep 1
|
||||||
CNT="$(cat ${_QEMU_SHUTDOWN_COUNTER})/${QEMU_POWERDOWN_TIMEOUT}"
|
|
||||||
[[ "${DEBUG}" == [Yy1]* ]] && info "Shutting down, waiting... (${CNT})"
|
#CNT="$(cat ${_QEMU_SHUTDOWN_COUNTER})/${QEMU_POWERDOWN_TIMEOUT}"
|
||||||
|
#[[ "${DEBUG}" == [Yy1]* ]] && info "Shutting down, waiting... (${CNT})"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
63
run/print.sh
Normal file
63
run/print.sh
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -Eeuo pipefail
|
||||||
|
|
||||||
|
info () { echo -e >&2 "\E[1;34m❯\E[1;36m $1\E[0m" ; }
|
||||||
|
error () { echo -e >&2 "\E[1;31m❯ ERROR: $1\E[0m" ; }
|
||||||
|
|
||||||
|
retry=true
|
||||||
|
|
||||||
|
while [ "$retry" = true ]
|
||||||
|
do
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Retrieve IP from guest VM
|
||||||
|
|
||||||
|
set +e
|
||||||
|
RESPONSE=$(curl -s -m 16 -S http://127.0.0.1:2210/read?command=10 2>&1)
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [[ ! "${RESPONSE}" =~ "\"success\"" ]] ; then
|
||||||
|
error "Failed to connect to guest: $RESPONSE" && continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Retrieve the HTTP port number
|
||||||
|
if [[ ! "${RESPONSE}" =~ "\"http_port\"" ]] ; then
|
||||||
|
error "Failed to parse response from guest: $RESPONSE" && continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
rest=${RESPONSE#*http_port}
|
||||||
|
rest=${rest#*:}
|
||||||
|
rest=${rest%%,*}
|
||||||
|
PORT=${rest%%\"*}
|
||||||
|
|
||||||
|
[ -z "${PORT}" ] && continue
|
||||||
|
|
||||||
|
# Retrieve the IP address
|
||||||
|
if [[ ! "${RESPONSE}" =~ "eth0" ]] ; then
|
||||||
|
error "Failed to parse response from guest: $RESPONSE" && continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
rest=${RESPONSE#*eth0}
|
||||||
|
rest=${rest#*ip}
|
||||||
|
rest=${rest#*:}
|
||||||
|
rest=${rest#*\"}
|
||||||
|
IP=${rest%%\"*}
|
||||||
|
|
||||||
|
[ -z "${IP}" ] && continue
|
||||||
|
|
||||||
|
retry=false
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$IP" == "20.20"* ]]; then
|
||||||
|
MSG="port ${PORT}"
|
||||||
|
else
|
||||||
|
MSG="http://${IP}:${PORT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "" >&2
|
||||||
|
info "--------------------------------------------------------"
|
||||||
|
info " You can now login to DSM at ${MSG}"
|
||||||
|
info "--------------------------------------------------------"
|
||||||
|
echo "" >&2
|
||||||
@@ -45,7 +45,7 @@ if [[ "${HOST_DEBUG}" == [Yy1]* ]]; then
|
|||||||
{ set +x; } 2>/dev/null
|
{ set +x; } 2>/dev/null
|
||||||
echo
|
echo
|
||||||
else
|
else
|
||||||
./run/host.bin "${HOST_ARGS[@]}" 2> /dev/null &
|
./run/host.bin "${HOST_ARGS[@]}" >/dev/null &
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Configure serial ports
|
# Configure serial ports
|
||||||
|
|||||||
Reference in New Issue
Block a user