diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7de8c90..e027ef8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -72,7 +72,7 @@ jobs:
- uses: actions/checkout@v3
-
name: Create a release
- uses: kroese/github-release@v6
+ uses: action-pack/github-release@v6
env:
GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
with:
@@ -81,7 +81,7 @@ jobs:
body: "Release v${{ vars.MAJOR }}.${{ vars.MINOR }}"
-
name: Increment minor version
- uses: kroese/increment@v1
+ uses: action-pack/increment@v1
with:
name: 'MINOR'
token: ${{ secrets.REPO_ACCESS_TOKEN }}
@@ -97,7 +97,7 @@ jobs:
fetch-depth: 0
-
name: Push to Gitlab mirror
- uses: kroese/gitlab-sync@v2
+ uses: action-pack/gitlab-sync@v2
with:
url: ${{ secrets.GITLAB_URL }}
token: ${{ secrets.GITLAB_TOKEN }}
diff --git a/docker-compose.yml b/docker-compose.yml
index 7e75af0..7591b4d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,6 +9,7 @@ services:
RAM_SIZE: "512M"
devices:
- /dev/kvm
+ - /dev/vhost-net
cap_add:
- NET_ADMIN
ports:
diff --git a/readme.md b/readme.md
index f714108..4513ceb 100644
--- a/readme.md
+++ b/readme.md
@@ -40,6 +40,7 @@ services:
DISK_SIZE: "16G"
devices:
- /dev/kvm
+ - /dev/vhost-net
cap_add:
- NET_ADMIN
ports:
diff --git a/run/check.sh b/run/check.sh
index 3c2d69a..0b74eb7 100644
--- a/run/check.sh
+++ b/run/check.sh
@@ -5,7 +5,7 @@ set -u
: ${DHCP:='N'}
-if [ "$DHCP" = "Y" ]; then
+if [[ "${DHCP}" == [Yy1]* ]]; then
PORT=5555
IP="127.0.0.1"
else
diff --git a/run/disk.sh b/run/disk.sh
index 6b7fd7b..2c1be79 100644
--- a/run/disk.sh
+++ b/run/disk.sh
@@ -36,7 +36,7 @@ if [ -f "${DATA}" ]; then
echo "INFO: Resizing data disk from $OLD_SIZE to $DATA_SIZE bytes.."
- if [ "$ALLOCATE" = "N" ]; then
+ if [[ "${ALLOCATE}" == [Nn]* ]]; then
# Resize file by changing its length
truncate -s "${DATA_SIZE}" "${DATA}";
@@ -58,7 +58,7 @@ if [ -f "${DATA}" ]; then
echo "ERROR: Could not allocate a file for the virtual disk." && exit 85
fi
- if [ "$ALLOCATE" = "Z" ]; then
+ if [[ "${ALLOCATE}" == [Zz]* ]]; then
GB=$(( (REQ + 1073741823)/1073741824 ))
@@ -81,7 +81,7 @@ fi
if [ ! -f "${DATA}" ]; then
- if [ "$ALLOCATE" = "N" ]; then
+ if [[ "${ALLOCATE}" == [Nn]* ]]; then
# Create an empty file
truncate -s "${DATA_SIZE}" "${DATA}"
@@ -102,7 +102,7 @@ if [ ! -f "${DATA}" ]; then
echo "ERROR: Could not allocate a file for the virtual disk." && exit 87
fi
- if [ "$ALLOCATE" = "Z" ]; then
+ if [[ "${ALLOCATE}" == [Zz]* ]]; then
echo "INFO: Preallocating ${DISK_SIZE} of diskspace, please wait..."
dd if=/dev/urandom of="${DATA}" count="${DATA_SIZE}" bs=1M iflag=count_bytes status=none
diff --git a/run/install.sh b/run/install.sh
index 830680f..f59b1d4 100644
--- a/run/install.sh
+++ b/run/install.sh
@@ -33,7 +33,7 @@ TMP="$STORAGE/tmp"
RD="$TMP/rd.gz"
rm -rf "$TMP" && mkdir -p "$TMP"
-[ "$DEBUG" = "Y" ] && set -x
+[[ "${DEBUG}" == [Yy1]* ]] && set -x
LOC="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
@@ -113,7 +113,7 @@ BOOT=$(find "$TMP" -name "*.bin.zip")
BOOT=$(echo "$BOOT" | head -c -5)
unzip -q -o "$BOOT".zip -d "$TMP"
-[ "$ALLOCATE" != "Z" ] && echo "Install: Allocating diskspace..."
+[[ "${ALLOCATE}" == [Zz]* ]] && echo "Install: Allocating diskspace..."
SYSTEM="$TMP/sys.img"
SYSTEM_SIZE=4954537983
@@ -130,7 +130,7 @@ if ! fallocate -l "${SYSTEM_SIZE}" "${SYSTEM}"; then
echo "ERROR: Could not allocate a file for the system disk." && exit 88
fi
- if [ "$ALLOCATE" = "Z" ]; then
+if [[ "${ALLOCATE}" == [Zz]* ]]; then
echo "Install: Preallocating 4 GB of diskspace..."
dd if=/dev/urandom of="${SYSTEM}" count="${SYSTEM_SIZE}" bs=1M iflag=count_bytes status=none
fi
@@ -211,6 +211,6 @@ mv -f "$SYSTEM" "$STORAGE"/"$BASE".system.img
rm -rf "$TMP"
{ set +x; } 2>/dev/null
-[ "$DEBUG" = "Y" ] && echo
+[[ "${DEBUG}" == [Yy1]* ]] && echo
return 0
diff --git a/run/network.sh b/run/network.sh
index c608315..ca1c147 100644
--- a/run/network.sh
+++ b/run/network.sh
@@ -25,7 +25,7 @@ configureDHCP() {
NETWORK=$(ip -o route | grep "${VM_NET_DEV}" | grep -v default | awk '{print $1}')
IP=$(ip address show dev "${VM_NET_DEV}" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
- [ "$DEBUG" = "Y" ] && set -x
+ [[ "${DEBUG}" == [Yy1]* ]] && set -x
{ ip link add link "${VM_NET_DEV}" "${VM_NET_VLAN}" type macvlan mode bridge 2> /dev/null ; rc=$?; } || :
if (( rc != 0 )); then
@@ -80,12 +80,6 @@ configureDHCP() {
echo "container: --device-cgroup-rule='c ${MAJOR}:* rwm' --device=/dev/vhost-net" && exit 21
fi
- # Create /dev/vhost-net
- if [ ! -c /dev/vhost-net ]; then
- mknod /dev/vhost-net c 10 238
- chmod 660 /dev/vhost-net
- fi
-
{ exec 40>>/dev/vhost-net; rc=$?; } || :
if (( rc != 0 )); then
@@ -99,7 +93,7 @@ configureDHCP() {
configureNAT () {
VM_NET_IP='20.20.20.21'
- [ "$DEBUG" = "Y" ] && set -x
+ [[ "${DEBUG}" == [Yy1]* ]] && set -x
#Create bridge with static IP for the VM guest
@@ -129,7 +123,7 @@ configureNAT () {
fi
{ set +x; } 2>/dev/null
- [ "$DEBUG" = "Y" ] && echo
+ [[ "${DEBUG}" == [Yy1]* ]] && echo
#Check port forwarding flag
if [[ $(< /proc/sys/net/ipv4/ip_forward) -eq 0 ]]; then
@@ -149,9 +143,15 @@ configureNAT () {
NET_OPTS="-netdev tap,ifname=${VM_NET_TAP},script=no,downscript=no,id=hostnet0"
+ { exec 40>>/dev/vhost-net; rc=$?; } || :
+
+ if (( rc == 0 )); then
+ NET_OPTS="$NET_OPTS,vhost=on,vhostfd=40"
+ fi
+
# Build DNS options from container /etc/resolv.conf
- if [ "$DEBUG" = "Y" ]; then
+ if [[ "${DEBUG}" == [Yy1]* ]]; then
echo "/etc/resolv.conf:" && echo && cat /etc/resolv.conf && echo
fi
@@ -178,7 +178,7 @@ configureNAT () {
DNSMASQ_OPTS=$(echo "$DNSMASQ_OPTS" | sed 's/\t/ /g' | tr -s ' ' | sed 's/^ *//')
- [ "$DEBUG" = "Y" ] && set -x
+ [[ "${DEBUG}" == [Yy1]* ]] && set -x
$DNSMASQ ${DNSMASQ_OPTS:+ $DNSMASQ_OPTS}
@@ -198,13 +198,19 @@ fi
[ ! -c /dev/net/tun ] && echo "ERROR: TUN network interface not available..." && exit 85
+# Create the necessary file structure for /dev/vhost-net
+if [ ! -c /dev/vhost-net ]; then
+ mknod /dev/vhost-net c 10 238
+ chmod 660 /dev/vhost-net
+fi
+
update-alternatives --set iptables /usr/sbin/iptables-legacy > /dev/null
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy > /dev/null
VM_NET_MAC="${VM_NET_MAC//-/:}"
GATEWAY=$(ip r | grep default | awk '{print $3}')
-if [ "$DEBUG" = "Y" ]; then
+if [[ "${DEBUG}" == [Yy1]* ]]; then
IP=$(ip address show dev "${VM_NET_DEV}" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
echo "INFO: Container IP is ${IP} with gateway ${GATEWAY}" && echo
@@ -213,12 +219,7 @@ if [ "$DEBUG" = "Y" ]; then
fi
-if [ "$DHCP" != "Y" ]; then
-
- # Configuration for static IP
- configureNAT
-
-else
+if [[ "${DHCP}" == [Yy1]* ]]; then
if [[ "$GATEWAY" == "172."* ]]; then
echo -n "ERROR: You cannot enable DHCP while the container is "
@@ -229,22 +230,29 @@ else
configureDHCP
# Display the received IP on port 5000
- HTML="DSM is using another IP address.
(Check the logfile to see which one was assigned.)"
+ HTML="DSM is using another IP address.
Check the Docker logfile to see which one was
assigned, or download the\
+ \
+ Synology Assistant utility."
pkill -f server.sh || true
/run/server.sh 80 "${HTML}" > /dev/null &
/run/server.sh 5000 "${HTML}" > /dev/null &
+else
+
+ # Configuration for static IP
+ configureNAT
+
fi
NET_OPTS="${NET_OPTS} -device virtio-net-pci,romfile=,netdev=hostnet0,mac=${VM_NET_MAC},id=net0"
-if [ "$DHCP" = "Y" ]; then
+if [[ "${DHCP}" == [Yy1]* ]]; then
# Add extra LAN interface for Docker Healthcheck script
NET_OPTS="${NET_OPTS} -netdev user,id=hostnet1,restrict=y,hostfwd=tcp::5555-:5000"
NET_OPTS="${NET_OPTS} -device virtio-net-pci,romfile=,netdev=hostnet1,id=net1"
fi
-[ "$DEBUG" = "Y" ] && echo && echo "Finished network setup.." && echo
+[[ "${DEBUG}" == [Yy1]* ]] && echo && echo "Finished network setup.." && echo
return 0
diff --git a/run/power.sh b/run/power.sh
index ba97874..08cfd03 100644
--- a/run/power.sh
+++ b/run/power.sh
@@ -32,7 +32,7 @@ _graceful_shutdown() {
# Don't send the powerdown signal because vDSM ignores ACPI signals
# echo 'system_powerdown' | nc -q 1 -w 1 localhost "${QEMU_MONPORT}" > /dev/null
- # Send shutdown command to host via serial port
+ # Send shutdown command to guest agent via serial port
RESPONSE=$(curl -s -m 2 -S http://127.0.0.1:2210/write?command=6 2>&1)
if [[ ! "${RESPONSE}" =~ "\"success\"" ]] ; then
diff --git a/run/run.sh b/run/run.sh
index 2d20f12..9557ae0 100755
--- a/run/run.sh
+++ b/run/run.sh
@@ -11,14 +11,15 @@ set -Eeuo pipefail
: ${RAM_SIZE:='512M'} # Maximum RAM amount
echo "Starting Virtual DSM for Docker v${VERSION}..."
+trap 'echo >&2 "Error status $? for: ${BASH_COMMAND} (line $LINENO/$BASH_LINENO)"' ERR
+
+[ ! -f "/run/run.sh" ] && echo "ERROR: Script must run inside Docker container!" && exit 11
+[ "$(id -u)" -ne "0" ] && echo "ERROR: Script must be executed with root privileges." && exit 12
STORAGE="/storage"
KERNEL=$(uname -r | cut -b 1)
-trap 'echo >&2 "Error status $? for: ${BASH_COMMAND} (line $LINENO/$BASH_LINENO)"' ERR
-
-[ ! -d "$STORAGE" ] && echo "Storage folder (${STORAGE}) not found!" && exit 69
-[ ! -f "/run/run.sh" ] && echo "Script must run inside Docker container!" && exit 60
+[ ! -d "$STORAGE" ] && echo "ERROR: Storage folder (${STORAGE}) not found!" && exit 13
if [ -f "$STORAGE"/dsm.ver ]; then
BASE=$(cat "${STORAGE}/dsm.ver")
@@ -58,7 +59,7 @@ fi
if [ -n "${KVM_ERR}" ]; then
echo "ERROR: KVM acceleration not detected ${KVM_ERR}, please enable it."
- [ "$DEBUG" != "Y" ] && exit 88
+ [[ "${DEBUG}" == [Yy1]* ]] && exit 88
else
KVM_OPTS=",accel=kvm -enable-kvm -cpu host"
fi
@@ -78,7 +79,7 @@ trap - ERR
set -m
(
- [ "$DEBUG" = "Y" ] && set -x
+ [[ "${DEBUG}" == [Yy1]* ]] && set -x
qemu-system-x86_64 ${ARGS:+ $ARGS} & echo $! > "${_QEMU_PID}"
{ set +x; } 2>/dev/null
)
diff --git a/run/serial.sh b/run/serial.sh
index 8766875..148178a 100644
--- a/run/serial.sh
+++ b/run/serial.sh
@@ -31,7 +31,7 @@ HOST_ARGS+=("-cpu_arch=${HOST_CPU}")
[ -n "$HOST_VERSION" ] && HOST_ARGS+=("-version=${HOST_VERSION}")
[ -n "$HOST_TIMESTAMP" ] && HOST_ARGS+=("-ts=${HOST_TIMESTAMP}")
-if [ "$HOST_DEBUG" = "Y" ]; then
+if [[ "${HOST_DEBUG}" == [Yy1]* ]]; then
set -x
./run/host.bin "${HOST_ARGS[@]}" &
{ set +x; } 2>/dev/null
diff --git a/run/server.sh b/run/server.sh
index 953ff2b..ae3c6ae 100644
--- a/run/server.sh
+++ b/run/server.sh
@@ -5,8 +5,8 @@ trap 'kill 0' EXIT
trap exit SIGINT SIGTERM
# Serve the page
-HTML="