mirror of
https://github.com/vdsm/virtual-dsm.git
synced 2025-11-07 02:23:42 +08:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fcd7b8a825 | ||
|
|
575da1f574 | ||
|
|
3a507f5bf6 | ||
|
|
a3d6e3740c | ||
|
|
53e0330e21 | ||
|
|
f935c1e28a | ||
|
|
6a0c708224 | ||
|
|
a407d2d94d | ||
|
|
53605bd6e8 | ||
|
|
944faaa927 | ||
|
|
fb7cfc09de | ||
|
|
b9ae73e322 |
12
Dockerfile
12
Dockerfile
@@ -10,11 +10,12 @@ FROM qemux/qemu-host as builder
|
|||||||
FROM debian:trixie-slim
|
FROM debian:trixie-slim
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
ARG TARGETPLATFORM
|
||||||
ARG DEBCONF_NOWARNINGS="yes"
|
ARG DEBCONF_NOWARNINGS "yes"
|
||||||
ARG DEBIAN_FRONTEND noninteractive
|
ARG DEBIAN_FRONTEND "noninteractive"
|
||||||
|
ARG DEBCONF_NONINTERACTIVE_SEEN "true"
|
||||||
|
|
||||||
RUN apt-get update && apt-get -y upgrade \
|
RUN if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi \
|
||||||
&& if [ "$TARGETPLATFORM" != "linux/amd64" ]; then extra="qemu-user"; fi \
|
&& apt-get update \
|
||||||
&& apt-get --no-install-recommends -y install \
|
&& apt-get --no-install-recommends -y install \
|
||||||
jq \
|
jq \
|
||||||
tini \
|
tini \
|
||||||
@@ -28,6 +29,7 @@ RUN apt-get update && apt-get -y upgrade \
|
|||||||
xz-utils \
|
xz-utils \
|
||||||
iptables \
|
iptables \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
|
apt-utils \
|
||||||
dnsmasq \
|
dnsmasq \
|
||||||
fakeroot \
|
fakeroot \
|
||||||
net-tools \
|
net-tools \
|
||||||
@@ -50,7 +52,7 @@ ENV RAM_SIZE "1G"
|
|||||||
ENV DISK_SIZE "16G"
|
ENV DISK_SIZE "16G"
|
||||||
ENV CPU_CORES "1"
|
ENV CPU_CORES "1"
|
||||||
|
|
||||||
ARG VERSION_ARG="0.0"
|
ARG VERSION_ARG "0.0"
|
||||||
RUN echo "$VERSION_ARG" > /run/version
|
RUN echo "$VERSION_ARG" > /run/version
|
||||||
|
|
||||||
HEALTHCHECK --interval=60s --start-period=45s --retries=2 CMD /run/check.sh
|
HEALTHCHECK --interval=60s --start-period=45s --retries=2 CMD /run/check.sh
|
||||||
|
|||||||
20
readme.md
20
readme.md
@@ -95,7 +95,6 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
ALLOCATE: "N"
|
|
||||||
DISK_FMT: "qcow2"
|
DISK_FMT: "qcow2"
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -188,9 +187,26 @@ docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
|||||||
|
|
||||||
This can be used to enable the facial recognition function in Synology Photos for example.
|
This can be used to enable the facial recognition function in Synology Photos for example.
|
||||||
|
|
||||||
|
* ### How do I passthrough a disk?
|
||||||
|
|
||||||
|
When running the container inside a virtualized environment, it is possible to passthrough disk devices directly, instead of binding a folder containing an image. As these devices are already backed by an image on the host, this removes an extra layer.
|
||||||
|
|
||||||
|
This allows for easier management and higher performance. To do so, you can add those devices to your compose file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
environment:
|
||||||
|
DEVICE: "/dev/sda"
|
||||||
|
DEVICE2: "/dev/sdb"
|
||||||
|
devices:
|
||||||
|
- /dev/sda
|
||||||
|
- /dev/sdb
|
||||||
|
```
|
||||||
|
|
||||||
|
Please beware that any existing data on the device will be wiped, as DSM will format its partition table during first use. So do NOT passthrough devices containing valueable data.
|
||||||
|
|
||||||
* ### How do I install a specific version of vDSM?
|
* ### How do I install a specific version of vDSM?
|
||||||
|
|
||||||
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:
|
By default, version 7.2 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:
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
[ -f "/run/qemu.end" ] && echo "QEMU is shutting down.." && exit 1
|
[ -f "/run/shm/qemu.end" ] && echo "QEMU is shutting down.." && exit 1
|
||||||
[ ! -f "/run/qemu.pid" ] && echo "QEMU is not running yet.." && exit 0
|
[ ! -f "/run/shm/qemu.pid" ] && echo "QEMU is not running yet.." && exit 0
|
||||||
|
|
||||||
file="/run/dsm.url"
|
file="/run/shm/dsm.url"
|
||||||
address="/run/qemu.ip"
|
address="/run/shm/qemu.ip"
|
||||||
|
|
||||||
[ ! -f "$file" ] && echo "DSM has not enabled networking yet.." && exit 1
|
[ ! -f "$file" ] && echo "DSM has not enabled networking yet.." && exit 1
|
||||||
|
|
||||||
|
|||||||
89
src/disk.sh
89
src/disk.sh
@@ -401,8 +401,35 @@ addDisk () {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addDevice () {
|
||||||
|
|
||||||
|
local DISK_ID=$1
|
||||||
|
local DISK_DEV=$2
|
||||||
|
local DISK_DESC=$3
|
||||||
|
local DISK_INDEX=$4
|
||||||
|
local DISK_ADDRESS=$5
|
||||||
|
|
||||||
|
[ -z "$DISK_DEV" ] && return 0
|
||||||
|
[ ! -b "$DISK_DEV" ] && error "Device $DISK_DEV 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-$DISK_ID,iothread=io2,bus=pcie.0,addr=$DISK_ADDRESS \
|
||||||
|
-drive file=$DISK_DEV,if=none,id=drive-$DISK_ID,format=raw,cache=$DISK_CACHE,aio=$DISK_IO,discard=$DISK_DISCARD,detect-zeroes=on \
|
||||||
|
-device scsi-hd,bus=hw-$DISK_ID.0,channel=0,scsi-id=0,lun=0,drive=drive-$DISK_ID,id=$DISK_ID,rotation_rate=$DISK_ROTATION,bootindex=$DISK_INDEX"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
DISK_EXT="$(fmt2ext "$DISK_FMT")" || exit $?
|
DISK_EXT="$(fmt2ext "$DISK_FMT")" || exit $?
|
||||||
|
|
||||||
|
if [ -z "$ALLOCATE" ]; then
|
||||||
|
if [[ "${DISK_FMT,,}" == "raw" ]]; then
|
||||||
|
ALLOCATE="Y"
|
||||||
|
else
|
||||||
|
ALLOCATE="N"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$ALLOCATE" == [Nn]* ]]; then
|
if [[ "$ALLOCATE" == [Nn]* ]]; then
|
||||||
DISK_TYPE="growable"
|
DISK_TYPE="growable"
|
||||||
DISK_ALLOC="preallocation=off"
|
DISK_ALLOC="preallocation=off"
|
||||||
@@ -444,52 +471,38 @@ if [ ! -f "$DISK3_FILE.img" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
DISK4_FILE="/storage4/data4"
|
DISK4_FILE="/storage4/data4"
|
||||||
DISK5_FILE="/storage5/data5"
|
|
||||||
DISK6_FILE="/storage6/data6"
|
|
||||||
|
|
||||||
: ${DISK2_SIZE:=''}
|
: ${DISK2_SIZE:=''}
|
||||||
: ${DISK3_SIZE:=''}
|
: ${DISK3_SIZE:=''}
|
||||||
: ${DISK4_SIZE:=''}
|
: ${DISK4_SIZE:=''}
|
||||||
: ${DISK5_SIZE:=''}
|
|
||||||
: ${DISK6_SIZE:=''}
|
|
||||||
|
|
||||||
addDisk "userdata" "$DISK1_FILE" "$DISK_EXT" "disk" "$DISK_SIZE" "3" "0xc" "$DISK_FMT" || exit $?
|
: ${DEVICE:=''} # Docker variables to passthrough a block device, like /dev/vdc1.
|
||||||
addDisk "userdata2" "$DISK2_FILE" "$DISK_EXT" "disk2" "$DISK2_SIZE" "4" "0xd" "$DISK_FMT" || exit $?
|
|
||||||
addDisk "userdata3" "$DISK3_FILE" "$DISK_EXT" "disk3" "$DISK3_SIZE" "5" "0xe" "$DISK_FMT" || exit $?
|
|
||||||
addDisk "userdata4" "$DISK4_FILE" "$DISK_EXT" "disk4" "$DISK4_SIZE" "9" "0x7" "$DISK_FMT" || exit $?
|
|
||||||
addDisk "userdata5" "$DISK5_FILE" "$DISK_EXT" "disk5" "$DISK5_SIZE" "10" "0x8" "$DISK_FMT" || exit $?
|
|
||||||
addDisk "userdata6" "$DISK6_FILE" "$DISK_EXT" "disk6" "$DISK6_SIZE" "11" "0x9" "$DISK_FMT" || exit $?
|
|
||||||
|
|
||||||
addDevice () {
|
|
||||||
|
|
||||||
local DISK_ID=$1
|
|
||||||
local DISK_DEV=$2
|
|
||||||
local DISK_INDEX=$3
|
|
||||||
local DISK_ADDRESS=$4
|
|
||||||
|
|
||||||
[ -z "$DISK_DEV" ] && return 0
|
|
||||||
[ ! -b "$DISK_DEV" ] && error "Device $DISK_DEV 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-$DISK_ID,iothread=io2,bus=pcie.0,addr=$DISK_ADDRESS \
|
|
||||||
-drive file=$DISK_DEV,if=none,id=drive-$DISK_ID,format=raw,cache=$DISK_CACHE,aio=$DISK_IO,discard=$DISK_DISCARD,detect-zeroes=on \
|
|
||||||
-device scsi-hd,bus=hw-$DISK_ID.0,channel=0,scsi-id=0,lun=0,drive=drive-$DISK_ID,id=$DISK_ID,rotation_rate=$DISK_ROTATION,bootindex=$DISK_INDEX"
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
: ${DEVICE:=''} # Docker variable to passthrough a block device, like /dev/vdc1.
|
|
||||||
: ${DEVICE2:=''}
|
: ${DEVICE2:=''}
|
||||||
: ${DEVICE3:=''}
|
: ${DEVICE3:=''}
|
||||||
: ${DEVICE4:=''}
|
: ${DEVICE4:=''}
|
||||||
: ${DEVICE5:=''}
|
|
||||||
: ${DEVICE6:=''}
|
|
||||||
|
|
||||||
addDevice "userdata7" "$DEVICE" "6" "0xf" || exit $?
|
if [ -n "$DEVICE" ]; then
|
||||||
addDevice "userdata8" "$DEVICE2" "7" "0x5" || exit $?
|
addDevice "userdata" "$DEVICE" "device" "3" "0xc" || exit $?
|
||||||
addDevice "userdata9" "$DEVICE3" "8" "0x6" || exit $?
|
else
|
||||||
addDevice "userdata4" "$DEVICE4" "9" "0x7" || exit $?
|
addDisk "userdata" "$DISK1_FILE" "$DISK_EXT" "disk" "$DISK_SIZE" "3" "0xc" "$DISK_FMT" || exit $?
|
||||||
addDevice "userdata5" "$DEVICE5" "10" "0x8" || exit $?
|
fi
|
||||||
addDevice "userdata6" "$DEVICE6" "11" "0x9" || exit $?
|
|
||||||
|
if [ -n "$DEVICE2" ]; then
|
||||||
|
addDevice "userdata2" "$DEVICE2" "device2" "4" "0xd" || exit $?
|
||||||
|
else
|
||||||
|
addDisk "userdata2" "$DISK2_FILE" "$DISK_EXT" "disk2" "$DISK2_SIZE" "4" "0xd" "$DISK_FMT" || exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$DEVICE3" ]; then
|
||||||
|
addDevice "userdata3" "$DEVICE3" "device3" "5" "0xe" || exit $?
|
||||||
|
else
|
||||||
|
addDisk "userdata3" "$DISK3_FILE" "$DISK_EXT" "disk3" "$DISK3_SIZE" "5" "0xe" "$DISK_FMT" || exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$DEVICE4" ]; then
|
||||||
|
addDevice "userdata4" "$DEVICE4" "device4" "6" "0xf" || exit $?
|
||||||
|
else
|
||||||
|
addDisk "userdata4" "$DISK4_FILE" "$DISK_EXT" "disk4" "$DISK4_SIZE" "6" "0xf" "$DISK_FMT" || exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
11
src/entry.sh
11
src/entry.sh
@@ -2,7 +2,7 @@
|
|||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
echo "❯ Starting Virtual DSM for Docker v$(</run/version)..."
|
echo "❯ Starting Virtual DSM for Docker v$(</run/version)..."
|
||||||
echo "❯ For support visit https://github.com/vdsm/virtual-dsm/"
|
echo "❯ For support visit https://github.com/vdsm/virtual-dsm"
|
||||||
|
|
||||||
cd /run
|
cd /run
|
||||||
|
|
||||||
@@ -22,11 +22,12 @@ if [[ "$CONSOLE" == [Yy]* ]]; then
|
|||||||
exec qemu-system-x86_64 ${ARGS:+ $ARGS}
|
exec qemu-system-x86_64 ${ARGS:+ $ARGS}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[[ "$DEBUG" == [Yy1]* ]] && info "$VERS" && set -x
|
[[ "$DEBUG" == [Yy1]* ]] && info "$VERS" && echo "Arguments: $ARGS" && echo
|
||||||
msg=$(qemu-system-x86_64 ${ARGS:+ $ARGS})
|
{ qemu-system-x86_64 ${ARGS:+ $ARGS} >"$QEMU_OUT" 2>"$QEMU_LOG"; rc=$?; } || :
|
||||||
|
(( rc != 0 )) && error "$(cat "$QEMU_LOG")" && exit 15
|
||||||
|
|
||||||
{ set +x; } 2>/dev/null && terminal "$msg"
|
terminal
|
||||||
tail -fn +0 "$QEMU_LOG" 2>/dev/null &
|
tail -fn +0 "$QEMU_LOG" 2>/dev/null &
|
||||||
cat "$QEMU_TERM" 2>/dev/null & wait $! || true
|
cat "$QEMU_TERM" 2>/dev/null & wait $! || :
|
||||||
|
|
||||||
sleep 1 && finish 0
|
sleep 1 && finish 0
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ if [ -f "$RDC" ]; then
|
|||||||
(( rc != 0 )) && error "Failed to extract $RDC, reason $rc" && exit 92
|
(( rc != 0 )) && error "Failed to extract $RDC, reason $rc" && exit 92
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p /run/extract
|
rm -rf /run/extract && mkdir -p /run/extract
|
||||||
for file in $TMP/usr/lib/libcurl.so.4 \
|
for file in $TMP/usr/lib/libcurl.so.4 \
|
||||||
$TMP/usr/lib/libmbedcrypto.so.5 \
|
$TMP/usr/lib/libmbedcrypto.so.5 \
|
||||||
$TMP/usr/lib/libmbedtls.so.13 \
|
$TMP/usr/lib/libmbedtls.so.13 \
|
||||||
@@ -211,6 +211,7 @@ else
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
rm -rf /run/extract
|
||||||
info "Install: Preparing system partition..."
|
info "Install: Preparing system partition..."
|
||||||
|
|
||||||
BOOT=$(find "$TMP" -name "*.bin.zip")
|
BOOT=$(find "$TMP" -name "*.bin.zip")
|
||||||
@@ -275,15 +276,8 @@ PKG="$TMP/packages"
|
|||||||
HDP="$TMP/synohdpack_img"
|
HDP="$TMP/synohdpack_img"
|
||||||
|
|
||||||
[ ! -f "$HDA.tgz" ] && error "The PAT file contains no OS image." && exit 64
|
[ ! -f "$HDA.tgz" ] && error "The PAT file contains no OS image." && exit 64
|
||||||
|
|
||||||
mv "$HDA.tgz" "$HDA.txz"
|
mv "$HDA.tgz" "$HDA.txz"
|
||||||
|
|
||||||
if [[ "$ROOT" != [Nn]* ]]; then
|
|
||||||
|
|
||||||
tar xpfJ "$HDA.txz" --absolute-names -C "$MOUNT/"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -d "$PKG" ] && mv "$PKG/" "$MOUNT/.SynoUpgradePackages/"
|
[ -d "$PKG" ] && mv "$PKG/" "$MOUNT/.SynoUpgradePackages/"
|
||||||
rm -f "$MOUNT/.SynoUpgradePackages/ActiveInsight-"*
|
rm -f "$MOUNT/.SynoUpgradePackages/ActiveInsight-"*
|
||||||
|
|
||||||
@@ -301,6 +295,8 @@ NUMBLOCKS="622560" # (4980480 * 512) / 4096
|
|||||||
|
|
||||||
if [[ "$ROOT" != [Nn]* ]]; then
|
if [[ "$ROOT" != [Nn]* ]]; then
|
||||||
|
|
||||||
|
tar xpfJ "$HDA.txz" --absolute-names --skip-old-files -C "$MOUNT/"
|
||||||
|
|
||||||
info "Install: Installing system partition..."
|
info "Install: Installing system partition..."
|
||||||
|
|
||||||
mke2fs -q -t ext4 -b 4096 -d "$MOUNT/" -L "$LABEL" -F -E "offset=$OFFSET" "$SYSTEM" "$NUMBLOCKS"
|
mke2fs -q -t ext4 -b 4096 -d "$MOUNT/" -L "$LABEL" -F -E "offset=$OFFSET" "$SYSTEM" "$NUMBLOCKS"
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ getInfo() {
|
|||||||
|
|
||||||
GATEWAY=$(ip r | grep default | awk '{print $3}')
|
GATEWAY=$(ip r | grep default | awk '{print $3}')
|
||||||
IP=$(ip address show dev "$VM_NET_DEV" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
|
IP=$(ip address show dev "$VM_NET_DEV" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
|
||||||
echo "$IP" > /run/qemu.ip
|
echo "$IP" > /run/shm/qemu.ip
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/power.sh
32
src/power.sh
@@ -10,18 +10,16 @@ API_HOST="127.0.0.1:2210"
|
|||||||
QEMU_TERM=""
|
QEMU_TERM=""
|
||||||
QEMU_PORT=7100
|
QEMU_PORT=7100
|
||||||
QEMU_TIMEOUT=50
|
QEMU_TIMEOUT=50
|
||||||
QEMU_PID="/run/qemu.pid"
|
QEMU_PID="/run/shm/qemu.pid"
|
||||||
QEMU_LOG="/run/qemu.log"
|
QEMU_LOG="/run/shm/qemu.log"
|
||||||
QEMU_END="/run/qemu.end"
|
QEMU_OUT="/run/shm/qemu.out"
|
||||||
|
QEMU_END="/run/shm/qemu.end"
|
||||||
|
|
||||||
if [[ "$KVM" == [Nn]* ]]; then
|
if [[ "$KVM" == [Nn]* ]]; then
|
||||||
API_TIMEOUT=$(( API_TIMEOUT*2 ))
|
API_TIMEOUT=$(( API_TIMEOUT*2 ))
|
||||||
QEMU_TIMEOUT=$(( QEMU_TIMEOUT*2 ))
|
QEMU_TIMEOUT=$(( QEMU_TIMEOUT*2 ))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f "$QEMU_PID"
|
|
||||||
rm -f "$QEMU_LOG"
|
|
||||||
rm -f "$QEMU_END"
|
|
||||||
touch "$QEMU_LOG"
|
touch "$QEMU_LOG"
|
||||||
|
|
||||||
_trap() {
|
_trap() {
|
||||||
@@ -62,15 +60,25 @@ finish() {
|
|||||||
|
|
||||||
terminal() {
|
terminal() {
|
||||||
|
|
||||||
local msg=$1
|
local dev=""
|
||||||
|
|
||||||
if [[ "${msg,,}" != "char"* || "$msg" != *"serial0)" ]]; then
|
if [ -f "$QEMU_OUT" ]; then
|
||||||
echo "$msg"
|
|
||||||
|
local msg
|
||||||
|
msg="$(cat "$QEMU_OUT")"
|
||||||
|
|
||||||
|
if [ -n "$msg" ]; then
|
||||||
|
|
||||||
|
if [[ "${msg,,}" != "char"* || "$msg" != *"serial0)" ]]; then
|
||||||
|
echo "$msg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dev="${msg#*/dev/p}"
|
||||||
|
dev="/dev/p${dev%% *}"
|
||||||
|
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local dev="${msg#*/dev/p}"
|
|
||||||
dev="/dev/p${dev%% *}"
|
|
||||||
|
|
||||||
if [ ! -c "$dev" ]; then
|
if [ ! -c "$dev" ]; then
|
||||||
dev=$(echo 'info chardev' | nc -q 1 -w 1 localhost "$QEMU_PORT" | tr -d '\000')
|
dev=$(echo 'info chardev' | nc -q 1 -w 1 localhost "$QEMU_PORT" | tr -d '\000')
|
||||||
dev="${dev#*serial0}"
|
dev="${dev#*serial0}"
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ set -Eeuo pipefail
|
|||||||
info () { printf "%b%s%b" "\E[1;34m❯ \E[1;36m" "$1" "\E[0m\n" >&2; }
|
info () { printf "%b%s%b" "\E[1;34m❯ \E[1;36m" "$1" "\E[0m\n" >&2; }
|
||||||
error () { printf "%b%s%b" "\E[1;31m❯ " "ERROR: $1" "\E[0m\n" >&2; }
|
error () { printf "%b%s%b" "\E[1;31m❯ " "ERROR: $1" "\E[0m\n" >&2; }
|
||||||
|
|
||||||
file="/run/dsm.url"
|
file="/run/shm/dsm.url"
|
||||||
address="/run/qemu.ip"
|
address="/run/shm/qemu.ip"
|
||||||
shutdown="/run/qemu.end"
|
shutdown="/run/shm/qemu.end"
|
||||||
url="http://127.0.0.1:2210/read?command=10"
|
url="http://127.0.0.1:2210/read?command=10"
|
||||||
|
|
||||||
resp_err="Guest returned an invalid response:"
|
resp_err="Guest returned an invalid response:"
|
||||||
|
|||||||
32
src/reset.sh
32
src/reset.sh
@@ -15,7 +15,7 @@ trap 'error "Status $? while: $BASH_COMMAND (line $LINENO/$BASH_LINENO)"' ERR
|
|||||||
: ${DEBUG:='N'} # Disable debugging mode
|
: ${DEBUG:='N'} # Disable debugging mode
|
||||||
: ${COUNTRY:=''} # Country code for mirror
|
: ${COUNTRY:=''} # Country code for mirror
|
||||||
: ${CONSOLE:='N'} # Disable console mode
|
: ${CONSOLE:='N'} # Disable console mode
|
||||||
: ${ALLOCATE:='Y'} # Preallocate diskspace
|
: ${ALLOCATE:=''} # Preallocate diskspace
|
||||||
: ${ARGUMENTS:=''} # Extra QEMU parameters
|
: ${ARGUMENTS:=''} # Extra QEMU parameters
|
||||||
: ${CPU_CORES:='1'} # Amount of CPU cores
|
: ${CPU_CORES:='1'} # Amount of CPU cores
|
||||||
: ${RAM_SIZE:='1G'} # Maximum RAM amount
|
: ${RAM_SIZE:='1G'} # Maximum RAM amount
|
||||||
@@ -31,20 +31,25 @@ VERS=$(qemu-system-x86_64 --version | head -n 1 | cut -d '(' -f 1)
|
|||||||
# Check folder
|
# Check folder
|
||||||
|
|
||||||
STORAGE="/storage"
|
STORAGE="/storage"
|
||||||
[ ! -d "$STORAGE" ] && error "Storage folder ($STORAGE) not found!" && exit 13
|
if [ ! -d "$STORAGE" ]; then
|
||||||
|
error "Storage folder ($STORAGE) not found!" && exit 13
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "/run/shm" ]; then
|
||||||
|
if [ -d "/dev/shm" ]; then
|
||||||
|
ln -s /dev/shm /run/shm
|
||||||
|
else
|
||||||
|
error "Folder /dev/shm not found!" && exit 14
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Cleanup files
|
# Cleanup files
|
||||||
|
rm -f /tmp/server.*
|
||||||
rm -f /run/dsm.url
|
rm -f /run/shm/qemu.*
|
||||||
rm -f /run/qemu.ip
|
rm -f /run/shm/dsm.url
|
||||||
rm -f /run/qemu.log
|
|
||||||
rm -f /run/qemu.pid
|
|
||||||
rm -f /run/qemu.end
|
|
||||||
|
|
||||||
# Cleanup dirs
|
# Cleanup dirs
|
||||||
|
|
||||||
rm -rf /tmp/dsm
|
rm -rf /tmp/dsm
|
||||||
rm -f /tmp/server.*
|
|
||||||
rm -rf "$STORAGE/tmp"
|
rm -rf "$STORAGE/tmp"
|
||||||
|
|
||||||
# Helper functions
|
# Helper functions
|
||||||
@@ -130,17 +135,14 @@ addPackage() {
|
|||||||
|
|
||||||
info "Installing $desc..."
|
info "Installing $desc..."
|
||||||
|
|
||||||
export DEBCONF_NOWARNINGS="yes"
|
|
||||||
export DEBIAN_FRONTEND="noninteractive"
|
|
||||||
|
|
||||||
[ -z "$COUNTRY" ] && setCountry
|
[ -z "$COUNTRY" ] && setCountry
|
||||||
|
|
||||||
if [[ "${COUNTRY^^}" == "CN" ]]; then
|
if [[ "${COUNTRY^^}" == "CN" ]]; then
|
||||||
sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
|
sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
|
||||||
fi
|
fi
|
||||||
|
|
||||||
apt-get -qq update
|
DEBIAN_FRONTEND=noninteractive apt-get -qq update
|
||||||
apt-get -qq --no-install-recommends -y install "$pkg" > /dev/null
|
DEBIAN_FRONTEND=noninteractive apt-get -qq --no-install-recommends -y install "$pkg" > /dev/null
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ else
|
|||||||
HTML=$(html "xxx")
|
HTML=$(html "xxx")
|
||||||
|
|
||||||
{ echo "#!/bin/bash"
|
{ echo "#!/bin/bash"
|
||||||
echo "[ -f \"/run/dsm.url\" ] && LOCATION=\$(cat \"/run/dsm.url\")"
|
echo "[ -f \"/run/shm/dsm.url\" ] && LOCATION=\$(cat \"/run/shm/dsm.url\")"
|
||||||
echo "HTML=\"$HTML\"; [ -z \"\$LOCATION\" ] && BODY=\"$WAIT\" || BODY=\"$BODY\"; HTML=\${HTML/xxx/\$BODY}"
|
echo "HTML=\"$HTML\"; [ -z \"\$LOCATION\" ] && BODY=\"$WAIT\" || BODY=\"$BODY\"; HTML=\${HTML/xxx/\$BODY}"
|
||||||
echo "printf '%b' \"HTTP/1.1 200 OK\\nContent-Length: \${#HTML}\\nConnection: close\\n\\n\$HTML\""
|
echo "printf '%b' \"HTTP/1.1 200 OK\\nContent-Length: \${#HTML}\\nConnection: close\\n\\n\$HTML\""
|
||||||
} > "$TMP_FILE"
|
} > "$TMP_FILE"
|
||||||
|
|||||||
Reference in New Issue
Block a user