Compare commits

..

7 Commits

Author SHA1 Message Date
Kroese
bc0defd813 feat: Add custom .yml for Github Codespaces (#1066) 2025-10-15 11:39:36 +02:00
Kroese
48e7a9fff0 fix: Round down minimum disk size (#1065) 2025-10-15 11:37:05 +02:00
Kroese
c2fa58ef27 feat: Fall back to slirp when passt fails (#1064) 2025-10-15 10:31:42 +02:00
Kroese
ea49cb144b feat: Validate user port configuration (#1063) 2025-10-14 16:44:11 +02:00
Kroese
b8e778a79d fix: Configure ports for Slirp networking (#1062) 2025-10-14 14:16:20 +02:00
Kroese
c70e12f0a2 fix: Lower spare disk space (#1061)
Reduced spare disk space threshold from 2GB to 512MB.
2025-10-14 03:33:25 +02:00
Kroese
6281205912 feat: Add "max" setting for DISK_SIZE (#1060) 2025-10-14 01:22:44 +02:00
4 changed files with 86 additions and 27 deletions

View File

@@ -2,5 +2,5 @@
"name": "dsm", "name": "dsm",
"service": "dsm", "service": "dsm",
"forwardPorts": [5000], "forwardPorts": [5000],
"dockerComposeFile": "compose.yml" "dockerComposeFile": ".github/codespaces.yml"
} }

19
.github/codespaces.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
services:
dsm:
container_name: dsm
image: vdsm/virtual-dsm
environment:
RAM_SIZE: "max"
DISK_SIZE: "max"
CPU_CORES: "max"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 5000:5000
volumes:
- ./dsm:/storage
restart: on-failure
stop_grace_period: 2m

View File

@@ -98,10 +98,10 @@ createDisk() {
local FS=$5 local FS=$5
local DATA_SIZE DIR SPACE GB FA local DATA_SIZE DIR SPACE GB FA
DATA_SIZE=$(numfmt --from=iec "$DISK_SPACE")
rm -f "$DISK_FILE" rm -f "$DISK_FILE"
DATA_SIZE=$(numfmt --from=iec "$DISK_SPACE")
if [[ "$ALLOCATE" != [Nn]* ]]; then if [[ "$ALLOCATE" != [Nn]* ]]; then
# Check free diskspace # Check free diskspace
@@ -424,7 +424,7 @@ addDisk () {
local DISK_FMT=$7 local DISK_FMT=$7
local DISK_IO=$8 local DISK_IO=$8
local DISK_CACHE=$9 local DISK_CACHE=$9
local DISK_EXT DIR SPACE DATA_SIZE FS PREV_FMT PREV_EXT CUR_SIZE local DISK_EXT DIR SPACE GB DATA_SIZE FS PREV_FMT PREV_EXT CUR_SIZE
DISK_EXT=$(fmt2ext "$DISK_FMT") DISK_EXT=$(fmt2ext "$DISK_FMT")
local DISK_FILE="$DISK_BASE.$DISK_EXT" local DISK_FILE="$DISK_BASE.$DISK_EXT"
@@ -432,6 +432,16 @@ addDisk () {
DIR=$(dirname "$DISK_FILE") DIR=$(dirname "$DISK_FILE")
[ ! -d "$DIR" ] && return 0 [ ! -d "$DIR" ] && return 0
if [[ "${DISK_SPACE,,}" == "max" ]]; then
local SPARE=536870912
SPACE=$(df --output=avail -B 1 "$DIR" | tail -n 1)
(( SPACE < SPARE )) && SPACE="$SPARE" || SPACE=$((SPACE-SPARE))
GB=$(( SPACE/1073741825 ))
DISK_SPACE="${GB}G"
fi
SPACE="${DISK_SPACE// /}" SPACE="${DISK_SPACE// /}"
[ -z "$SPACE" ] && SPACE="16G" [ -z "$SPACE" ] && SPACE="16G"
[ -z "${SPACE//[0-9. ]}" ] && SPACE="${SPACE}G" [ -z "${SPACE//[0-9. ]}" ] && SPACE="${SPACE}G"

View File

@@ -185,10 +185,12 @@ configureDNS() {
getHostPorts() { getHostPorts() {
local list="$1" local list=""
list=$(echo "${list// /}" | sed 's/,*$//g') list+="$MON_PORT,"
list+="${HOST_PORTS// /},"
[ -z "$list" ] && list="$MON_PORT" || list+=",$MON_PORT" # Remove duplicates
list=$(echo "${list//,,/,}," | awk 'BEGIN{RS=ORS=","} !seen[$0]++' | sed 's/,*$//g')
echo "$list" echo "$list"
return 0 return 0
@@ -196,15 +198,43 @@ getHostPorts() {
getUserPorts() { getUserPorts() {
local args=""
local list=$1
list=$(echo "${list// /}" | sed 's/,*$//g')
local ssh="22" local ssh="22"
local dsm="5000" local dsm="5000,5001"
[ -z "$list" ] && list="$ssh,$dsm" || list+=",$ssh,$dsm"
echo "$list" local list="$ssh,$dsm,"
list+="${USER_PORTS// /},"
local exclude
exclude=$(getHostPorts)
local ports=""
local userport=""
local hostport=""
for userport in ${list//,/ }; do
local num="${userport///tcp}"
num="${num///udp}"
for hostport in ${exclude//,/ }; do
local val="${hostport///tcp}"
if [[ "$num" == "${val///udp}" ]]; then
num=""
warn "Could not assign port ${val///udp} to \"USER_PORTS\" because it is already in \"HOST_PORTS\"!"
fi
done
[ -n "$num" ] && ports+="$userport,"
done
# Remove duplicates
ports=$(echo "${ports//,,/,}," | awk 'BEGIN{RS=ORS=","} !seen[$0]++' | sed 's/,*$//g')
echo "$ports"
return 0 return 0
} }
@@ -214,14 +244,12 @@ getSlirp() {
local list="" local list=""
list=$(getUserPorts) list=$(getUserPorts)
list="${list//,/ }"
list="${list## }"
list="${list%% }"
for port in $list; do for port in ${list//,/ }; do
proto="tcp" local proto="tcp"
num="${port%/tcp}" local num="${port%/tcp}"
[ -z "$num" ] && continue
if [[ "$port" == *"/udp" ]]; then if [[ "$port" == *"/udp" ]]; then
proto="udp" proto="udp"
@@ -235,6 +263,8 @@ getSlirp() {
args+="hostfwd=$proto::$num-$VM_NET_IP:$num," args+="hostfwd=$proto::$num-$VM_NET_IP:$num,"
done done
args=$(echo "$args" | sed 's/,*$//g')
echo "${args%?}" echo "${args%?}"
return 0 return 0
} }
@@ -255,13 +285,13 @@ configureSlirp() {
NET_OPTS="-netdev user,id=hostnet0,ipv4=on,host=$gateway,net=${gateway%.*}.0/24,dhcpstart=$ip,${ipv6}hostname=$VM_NET_HOST" NET_OPTS="-netdev user,id=hostnet0,ipv4=on,host=$gateway,net=${gateway%.*}.0/24,dhcpstart=$ip,${ipv6}hostname=$VM_NET_HOST"
local forward="" local forward=""
forward=$(getUserPorts "${USER_PORTS:-}") forward=$(getSlirp)
[ -n "$forward" ] && NET_OPTS+=",$forward" [ -n "$forward" ] && NET_OPTS+=",$forward"
if [[ "${DNSMASQ_DISABLE:-}" == [Yy1]* ]]; then if [[ "${DNSMASQ_DISABLE:-}" == [Yy1]* ]]; then
echo "$gateway" > /run/shm/qemu.gw echo "$gateway" > /run/shm/qemu.gw
else else
cp /etc/resolv.conf /etc/resolv.dnsmasq [ ! -f /etc/resolv.dnsmasq ] && cp /etc/resolv.conf /etc/resolv.dnsmasq
configureDNS "lo" "$ip" "$VM_NET_MAC" "$VM_NET_HOST" "$VM_NET_MASK" "$gateway" || return 1 configureDNS "lo" "$ip" "$VM_NET_MAC" "$VM_NET_HOST" "$VM_NET_MASK" "$gateway" || return 1
echo -e "nameserver 127.0.0.1\nsearch .\noptions ndots:0" >/etc/resolv.conf echo -e "nameserver 127.0.0.1\nsearch .\noptions ndots:0" >/etc/resolv.conf
fi fi
@@ -299,7 +329,7 @@ configurePasst() {
[ -n "$PASST_MTU" ] && PASST_OPTS+=" -m $PASST_MTU" [ -n "$PASST_MTU" ] && PASST_OPTS+=" -m $PASST_MTU"
local forward="" local forward=""
forward=$(getUserPorts "${USER_PORTS:-}") forward=$(getUserPorts)
forward="${forward///tcp}" forward="${forward///tcp}"
forward="${forward///udp}" forward="${forward///udp}"
@@ -316,7 +346,7 @@ configurePasst() {
PASST_OPTS+=" -q" PASST_OPTS+=" -q"
if [[ "${DNSMASQ_DISABLE:-}" != [Yy1]* ]]; then if [[ "${DNSMASQ_DISABLE:-}" != [Yy1]* ]]; then
cp /etc/resolv.conf /etc/resolv.dnsmasq [ ! -f /etc/resolv.dnsmasq ] && cp /etc/resolv.conf /etc/resolv.dnsmasq
echo -e "nameserver 127.0.0.1\nsearch .\noptions ndots:0" >/etc/resolv.conf echo -e "nameserver 127.0.0.1\nsearch .\noptions ndots:0" >/etc/resolv.conf
fi fi
@@ -331,8 +361,8 @@ configurePasst() {
if (( rc != 0 )); then if (( rc != 0 )); then
[ -f "$log" ] && cat "$log" [ -f "$log" ] && cat "$log"
error "Failed to start passt, reason: $rc" warn "failed to start passt ($rc), falling back to slirp networking!"
return 1 configureSlirp && return 0 || return 1
fi fi
fi fi
@@ -447,7 +477,7 @@ configureNAT() {
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy > /dev/null update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy > /dev/null
fi fi
exclude=$(getHostPorts "$HOST_PORTS") exclude=$(getHostPorts)
if [ -n "$exclude" ]; then if [ -n "$exclude" ]; then
if [[ "$exclude" != *","* ]]; then if [[ "$exclude" != *","* ]]; then