Compare commits

..

28 Commits
25.9.2 ... main

Author SHA1 Message Date
Ing
3ad6ba68a6 优化脚本,简化条件判断,移除不必要的 LOCALBUILD 检查 2025-09-24 14:02:44 +08:00
Ing
0c77bada57 删除 localbuild.sh 和 sourcebuild.sh 脚本,优化构建流程 2025-09-24 01:37:48 +08:00
Ing
03f2cea7f9 更新构建脚本 2025-09-24 00:37:13 +08:00
github-actions[bot]
cb56fa695d update 2025-09-24 00:22:28 2025-09-24 00:22:28 +08:00
github-actions[bot]
95235c314e update 2025-09-23 22:06:56 2025-09-23 22:06:56 +08:00
Ing
b2f7dac7ba Implement code changes to functionality 2025-09-23 22:03:53 +08:00
Ing
80d03e0e3c 添加 unpackInitrd 函数以解压 initrd 文件,支持多种压缩格式 2025-09-23 18:10:35 +08:00
Ing
4e5edb325a 优化模块处理逻辑,支持自定义路径并简化模块依赖获取 2025-09-23 12:56:13 +08:00
Ing
a51c5f7c27 更新 helper.sh 和 pve.sh 文件权限为可执行 2025-09-20 17:09:28 +08:00
github-actions[bot]
885c5e4a28 update 2025-09-20 10:40:37 2025-09-20 10:40:37 +08:00
github-actions[bot]
12fc9c218d update 2025-09-20 02:06:32 2025-09-20 02:06:32 +08:00
Ing
9dca1fe830 优化 boot.sh 和 init.sh,修复 MAC 地址获取逻辑,支持 Docker 环境 2025-09-20 02:03:46 +08:00
Ing
e8dc96a9b3 优化 pve.sh 脚本,修复 virtio9p 挂载标签设置逻辑 2025-09-19 15:01:22 +08:00
Ing
c939661a45 修复 menu.sh 中的变量引用错误 2025-09-18 22:07:13 +08:00
Ing
4884158996 优化 pve.sh 脚本,添加存储参数支持,改进存储获取逻辑 2025-09-18 14:03:55 +08:00
Ing
ef6ed60c46 优化 pve.sh 脚本,修复存储获取逻辑 2025-09-17 17:37:17 +08:00
Ing
2f02843dff 优化 boot.sh 和 functions.sh,修复设备检测逻辑,支持 Docker 环境 2025-09-17 12:59:52 +08:00
Ing
38caa773d7 优化 GitHub Actions 脚本,改进环境变量设置逻辑 2025-09-17 12:59:30 +08:00
Ing
59112312c6 优化 initDSMNetwork 函数,改进网络脚本处理逻辑 2025-09-17 12:56:35 +08:00
Ing
9710c33f35 Add online assistance option 2025-09-17 12:55:29 +08:00
Ing
32cfc2b257 优化 pve.sh 脚本,增加参数支持和错误处理,改进镜像下载和导入逻辑 2025-09-16 03:11:01 +08:00
Ing
c1de95e364 在 README.md 中新增 PVE 部分,提供通过 curl 安装 pve.sh 脚本的命令 2025-09-12 13:30:06 +08:00
Ing
db85e17b02 新增 pve.sh 脚本,支持创建和配置 Proxmox VE 虚拟机 2025-09-12 13:23:43 +08:00
github-actions[bot]
801c0396a3 update 2025-09-10 16:26:53 2025-09-10 16:26:53 +08:00
github-actions[bot]
cac93e6a5c update 2025-09-09 18:06:22 2025-09-09 18:06:22 +08:00
github-actions[bot]
5b5fbd501e update 2025-09-09 17:18:42 2025-09-09 17:18:42 +08:00
Ing
903c292e35 更新网络配置脚本,移除 ovs 和 bond 设置 2025-09-09 15:10:29 +08:00
github-actions[bot]
0c1b7d6a2e update 2025-09-07 18:27:01 2025-09-07 18:27:01 +08:00
41 changed files with 8190 additions and 8489 deletions

View File

@ -38,7 +38,7 @@ jobs:
echo "Delaying for 1 minutes..."
sleep 60
- name: Get Release RR
- name: Get Data
run: |
REPO="${{ github.server_url }}/${{ github.repository }}"
PRERELEASE="true"
@ -57,18 +57,17 @@ jobs:
exit 1
fi
unzip rr-${TAG}.img.zip -d "rr"
unzip rr-${TAG}.img.zip -d rr rr.img
export TERM=xterm
. scripts/func.sh "${{ secrets.RRORG }}"
sudo ./localbuild.sh create rr/ws rr/rr.img
if [ $? -ne 0 ]; then
echo "create failed"
exit 1
fi
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "rr/rr.img"
rm -rf "/tmp/mnt/p3"
mkdir -p "/tmp/mnt/p3"
mount "${LOOPX}p3" "/tmp/mnt/p3"
unpackInitrd /tmp/mnt/p3/initrd-rr "rr/initrd"
- name: Get data
run: |
sudo apt update
sudo apt install -y locales busybox dialog gettext sed gawk jq curl
sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils cpio xz-utils lz4 lzma bzip2 gzip zstd
@ -78,10 +77,14 @@ jobs:
sudo mv -f "$(realpath $(which python3))/EXTERNALLY-MANAGED" "$(realpath $(which python3))/EXTERNALLY-MANAGED.bak" 2>/dev/null || true
sudo pip3 install -U -r scripts/requirements.txt
python3 scripts/func.py getmodels -w "rr/ws/initrd" -j "docs/models.json" -x "docs/models.xlsx"
python3 scripts/func.py getpats -w "rr/ws/initrd" -j "docs/pats.json" -x "docs/pats.xlsx"
python3 scripts/func.py getaddons -w "rr/ws" -j "docs/addons.json" -x "docs/addons.xlsx"
python3 scripts/func.py getmodules -w "rr/ws" -j "docs/modules.json" -x "docs/modules.xlsx"
python3 scripts/func.py getmodels -w "rr/initrd" -j "docs/models.json" -x "docs/models.xlsx"
python3 scripts/func.py getpats -w "rr/initrd" -j "docs/pats.json" -x "docs/pats.xlsx"
python3 scripts/func.py getaddons -w "/tmp" -j "docs/addons.json" -x "docs/addons.xlsx"
python3 scripts/func.py getmodules -w "/tmp" -j "docs/modules.json" -x "docs/modules.xlsx"
sudo umount "/tmp/mnt/p3"
sudo losetup -d "${LOOPX}"
rm -rf "/tmp/mnt/p3"
- name: Upload to Artifacts
if: success()

View File

@ -27,68 +27,51 @@ jobs:
shell: python
run: |
# -*- coding: utf-8 -*-
import json, subprocess
def set_output(name, value):
subprocess.call(f'echo "{name}<<EOF" >> $GITHUB_ENV', shell=True)
subprocess.call(f'echo "{value}" >> $GITHUB_ENV', shell=True)
subprocess.call(f'echo "EOF" >> $GITHUB_ENV', shell=True)
import json
import os
issuetitle = ${{ toJSON(github.event.issue.title) }}
issuebody = ${{ toJSON(github.event.issue.body) }}
def set_env(name, value):
with open(os.environ['GITHUB_ENV'], 'a', encoding='utf-8') as f:
f.write(f'{name}={value}\n')
issuetitle = """${{ github.event.issue.title }}"""
issuebody = """${{ github.event.issue.body }}"""
iscustom = 'false'
warinfo = 'false'
format = ''
size = ''
template = ''
language= ''
sn = ''
macs = ''
tips = ''
model = ''
version = ''
kernel = ''
addons = ''
modules = ''
fields = {
"format": "",
"size": "",
"template": "",
"language": "",
"sn": "",
"macs": "",
"tips": "",
"model": "",
"version": "",
"kernel": "",
"addons": "",
"modules": ""
}
try:
if issuetitle.lower().startswith('custom'):
if issuetitle.strip().lower().startswith('custom'):
jsonbody = json.loads(issuebody)
iscustom = 'true'
format = jsonbody.get('format', '')
size = jsonbody.get('size', '')
template = jsonbody.get('template', '')
language = jsonbody.get('language', '')
sn = jsonbody.get('sn', '')
macs = jsonbody.get('macs', '')
tips = jsonbody.get('tips', '')
model = jsonbody.get('model', '')
version = jsonbody.get('version', '')
kernel = jsonbody.get('kernel', '')
addons = jsonbody.get('addons', '')
modules = jsonbody.get('modules', '')
except ValueError as e:
for k in fields:
fields[k] = jsonbody.get(k, "")
except Exception:
pass
if iscustom == 'false':
if issuebody.find('DMI') < 0 and issuebody.find('CPU') < 0 and issuebody.find('NIC') < 0:
if not any(x in issuebody for x in ['DMI', 'CPU', 'NIC']):
warinfo = 'true'
set_output("iscustom", iscustom)
set_output("warinfo", warinfo)
set_output("format", format)
set_output("size", size)
set_output("template", template)
set_output("language", language)
set_output("sn", sn)
set_output("macs", macs)
set_output("tips", tips)
set_output("model", model)
set_output("version", version)
set_output("kernel", kernel)
set_output("addons", addons)
set_output("modules", modules)
set_env("iscustom", iscustom)
set_env("warinfo", warinfo)
for k, v in fields.items():
set_env(k, v)
- name: Update Comment Warinfo
if: env.warinfo == 'true'
@ -165,39 +148,9 @@ jobs:
run: |
# 累了, 毁灭吧!
# yq need sudo !!!
function deleteConfigKey() {
sudo yq eval "del(.${1})" --inplace "${2}" 2>/dev/null
}
function writeConfigKey() {
local value="${2}"
[ "${value}" = "{}" ] && sudo yq eval ".${1} = {}" --inplace "${3}" 2>/dev/null || sudo yq eval ".${1} = \"${value}\"" --inplace "${3}" 2>/dev/null
}
function readConfigKey() {
local result
result=$(sudo yq eval ".${1} | explode(.)" "${2}" 2>/dev/null)
[ "${result}" = "null" ] && echo "" || echo "${result}"
}
function mergeConfigModules() {
# Error: bad file '-': cannot index array with '8139cp' (strconv.ParseInt: parsing "8139cp": invalid syntax)
# When the first key is a pure number, yq will not process it as a string by default. The current solution is to insert a placeholder key.
local MS ML XF
MS="RRORG\n${1// /\\n}"
ML="$(echo -en "${MS}" | awk '{print "modules."$1":"}')"
XF=$(mktemp 2>/dev/null)
XF=${XF:-/tmp/tmp.XXXXXXXXXX}
echo -en "${ML}" | sudo yq -p p -o y >"${XF}"
deleteConfigKey "modules.\"RRORG\"" "${XF}"
sudo yq eval-all --inplace '. as $item ireduce ({}; . * $item)' --inplace "${2}" "${XF}" 2>/dev/null
rm -f "${XF}"
}
. scripts/func.sh "${{ secrets.RRORG }}"
REPO="${{ github.server_url }}/${{ github.repository }}"
MODEL="${{ env.model }}"
VERSION="${{ env.version }}"
PRERELEASE="true"
TAG=""
@ -214,63 +167,39 @@ jobs:
exit 1
fi
unzip rr-${TAG}.img.zip -d "rr"
unzip rr-${TAG}.img.zip -d rr rr.img
export TERM=xterm
echo "TAG=${TAG}" >> $GITHUB_ENV
sudo ./localbuild.sh create rr/ws rr/rr.img
if [ $? -ne 0 ]; then
echo "create failed"
exit 1
fi
case "${{ env.size }}" in
2GB)
echo "2GB"
;;
4GB)
echo "4GB"
resizeImg rr/rr.img +2048M
;;
8GB)
echo "8GB"
resizeImg rr/rr.img +6144M
;;
*)
echo "unknown size"
;;
esac
# sudo cp -rf files/initrd/opt/rr/* rr/ws/initrd/opt/rr/
# sudo sed -i "s/set -e/set -ex/" rr/ws/initrd/opt/rr/init.sh
# sudo sed -i '/^alias/i\set -x' rr/ws/initrd/opt/rr/menu.sh
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" rr/rr.img
[ -n "${{ env.language }}" ] && echo "${{ env.language }}.UTF-8" | sudo tee rr/ws/mnt/p1/.locale
sudo ./localbuild.sh init
if [ $? -ne 0 ]; then
echo "init failed"
exit 1
fi
if [ -n "${{ env.kernel }}" ]; then
echo "set kernel"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
writeConfigKey "kernel" "${{ env.kernel }}" "${USER_CONFIG_FILE}"
fi
sudo ./localbuild.sh config "${MODEL}" "${VERSION}"
if [ $? -ne 0 ]; then
echo "config failed"
exit 1
fi
if [ -n "${{ env.sn }}" ]; then
echo "set sn: ${{ env.sn }}"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
writeConfigKey "sn" "${{ env.sn }}" "${USER_CONFIG_FILE}"
fi
if [ -n "${{ env.macs }}" ]; then
echo "set macs: ${{ env.macs }}"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
MACS=($(echo "${{ env.macs }}" | sed 's/[:-]//g' | sed 's/.*/\U&/' | sed 's/[;,]/ /g'))
writeConfigKey "mac1" "${MACS[0]}" "${USER_CONFIG_FILE}"
writeConfigKey "mac2" "${MACS[1]}" "${USER_CONFIG_FILE}"
fi
if [ -n "${{ env.tips }}" ]; then
echo "set tips: ${{ env.tips }}"
echo -e "${{ env.tips }}" | sudo tee rr/ws/mnt/p3/AddTips
fi
if [ -n "${{ env.addons }}" ]; then
echo "set addons: ${{ env.addons }}"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
writeConfigKey "addons" "{}" "${USER_CONFIG_FILE}"
echo "Building..."
{
[ -n "${{ env.language }}" ] && echo "echo \"${{ env.language }}.UTF-8\" >/mnt/p1/.locale"
[ -n "${{ env.tips }}" ] && echo "echo -e \"${{ env.tips }}\" >/mnt/p3/AddTips"
[ -n "${{ env.kernel }}" ] && echo "menu.sh writeConfigKey \"kernel\" \"${{ env.kernel }}\" \"\${USER_CONFIG_FILE}\""
echo "menu.sh modelMenu \"${{ env.model }}\""
echo "menu.sh productversMenu \"${{ env.version }}\""
[ -n "${{ env.addons }}" ] && {
echo "menu.sh writeConfigKey \"addons\" \"{}\" \"\${USER_CONFIG_FILE}\""
IFS=',' read -ra ADDON_ARR <<< "${{ env.addons }}"
for A in "${ADDON_ARR[@]}"; do
if echo "${A}" | grep -qE '^[^:]+:[^:]+$'; then
@ -280,74 +209,41 @@ jobs:
KEY="${A}"
VAL=""
fi
writeConfigKey "addons.\"${KEY}\"" "${VAL}" "${USER_CONFIG_FILE}"
echo "menu.sh writeConfigKey \"addons.\\\"${KEY}\\\"\" \"${VAL}\" \"\${USER_CONFIG_FILE}\""
done
fi
}
[ ! "custom" = "${{ env.kernel }}" ] && [ -n "${{ env.modules }}" ] && {
echo "menu.sh writeConfigKey \"modules\" \"{}\" \"\${USER_CONFIG_FILE}\""
echo "menu.sh mergeConfigModules \"$(echo "${{ env.modules }}" | sed 's/,/\\n/g')\" \"\${USER_CONFIG_FILE}\""
}
echo "menu.sh make"
echo "menu.sh cleanCache"
[ -n "${{ env.sn }}" ] && echo "menu.sh writeConfigKey \"sn\" \"${{ env.sn }}\" \"\${USER_CONFIG_FILE}\""
[ -n "${{ env.macs }}" ] && {
MACS=($(echo "${{ env.macs }}" | sed 's/[:-]//g' | sed 's/.*/\U&/' | sed 's/[;,]/ /g'))
[ -n "${MACS[0]}" ] && echo "menu.sh writeConfigKey \"mac1\" \"${MACS[0]}\" \"\${USER_CONFIG_FILE}\""
[ -n "${MACS[1]}" ] && echo "menu.sh writeConfigKey \"mac2\" \"${MACS[1]}\" \"\${USER_CONFIG_FILE}\""
}
[ "true" = "${{ env.template }}" ] && {
echo "menu.sh writeConfigKey \"sn\" \"\" \"\${USER_CONFIG_FILE}\""
echo "menu.sh writeConfigKey \"mac1\" \"\" \"\${USER_CONFIG_FILE}\""
echo "menu.sh writeConfigKey \"mac2\" \"\" \"\${USER_CONFIG_FILE}\""
}
} > build.sh
chmod +x build.sh
if [ ! "custom" = "${{ env.kernel }}" ] && [ -n "${{ env.modules }}" ]; then
echo "set modules: ${{ env.modules }}"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
mergeConfigModules "$(echo "${{ env.modules }}" | sed 's/,/\n/g')" "${USER_CONFIG_FILE}"
# for M in $(echo "${{ env.modules }}" | sed 's/,/ /g'); do
# writeConfigKey "modules.\"${M}\"" "" "${USER_CONFIG_FILE}"
# done
fi
docker pull wjz304/rr:${TAG}
docker run --rm --privileged -p 7681:7681 -p 7304:7304 -p 7080:7080 -p 7022:22 -v ${PWD}/build.sh:/opt/rr/build.sh wjz304/rr:${TAG} bash build.sh
sudo ./localbuild.sh build
if [ $? -ne 0 ]; then
echo "build failed"
exit 1
fi
if [ "true" = "${{ env.template }}" ]; then
echo "set template: ${{ env.template }}"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
writeConfigKey "sn" "" "${USER_CONFIG_FILE}"
writeConfigKey "mac1" "" "${USER_CONFIG_FILE}"
writeConfigKey "mac2" "" "${USER_CONFIG_FILE}"
fi
sudo ./localbuild.sh pack rr/rr.img
if [ $? -ne 0 ]; then
echo "pack failed"
exit 1
fi
case "${{ env.size }}" in
2GB)
echo "2GB"
;;
4GB)
echo "4GB"
sudo ./localbuild.sh resize rr/rr.img +2048M
;;
8GB)
echo "8GB"
sudo ./localbuild.sh resize rr/rr.img +6144M
;;
*)
echo "unknown size"
;;
esac
sudo losetup --detach "${LOOPX}"
ls rr -al
RR_VERSION_FILE="rr/ws/mnt/p1/RR_VERSION"
USER_CONFIG_FILE="rr/ws/mnt/p1/user-config.yml"
{
echo "RR: "
echo " VERSION: $(cat "${RR_VERSION_FILE}" 2>/dev/null | head -1)"
echo " VERSION: ${TAG}"
echo " CUSTOM: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
echo
echo "DSM:"
echo " MODEL: $(readConfigKey "model" "${USER_CONFIG_FILE}")"
echo " VERSION: $(readConfigKey "productver" "${USER_CONFIG_FILE}")"
echo " KERNEL: $(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
echo " PATURL: $(readConfigKey "paturl" "${USER_CONFIG_FILE}")"
echo " PATSUM: $(readConfigKey "patsum" "${USER_CONFIG_FILE}")"
echo
echo
echo "After the image is written to the disk, it will boot directly into DSM without the need to compile again."
echo "Of course, you can also modify the settings yourself."
} >README.txt
@ -355,52 +251,47 @@ jobs:
case "${{ env.format }}" in
ova)
echo "OVA"
. scripts/func.sh "${{ secrets.RRORG }}"
convertova "rr/rr.img" "rr/rr.ova"
(cd rr && sha256sum rr.ova >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.ova.zip" -j rr/rr.ova ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.ova.zip" -j rr/rr.ova sha256sum README.txt
;;
vmx)
echo "VMX"
. scripts/func.sh "${{ secrets.RRORG }}"
convertvmx "rr/rr.img" "rr.vmx" # rr.vmx is a directory
(cd rr.vmx && sha256sum * >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vmx.zip" -r rr.vmx ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vmx.zip" -r rr.vmx sha256sum README.txt
;;
vmdk)
echo "VMDK"
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' rr/rr.vmdk
(cd rr && sha256sum rr.vmdk >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vmdk.zip" -j rr/rr.vmdk ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vmdk.zip" -j rr/rr.vmdk sha256sum README.txt
;;
flat)
echo "FLAT"
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicFlat,compat6' rr/rr.vmdk
(cd rr && sha256sum rr*.vmdk >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.flat.zip" -j rr/rr*.vmdk ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.flat.zip" -j rr/rr*.vmdk sha256sum README.txt
;;
vhd)
echo "VHD"
. scripts/func.sh "${{ secrets.RRORG }}"
qemu-img convert rr/rr.img -O vpc rr/rr.vhd
createvmc "rr/rr.vhd" "rr/rr.vmc"
(cd rr && sha256sum rr.vhd >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vhd.zip" -j rr/rr.vmc rr/rr.vhd ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vhd.zip" -j rr/rr.vmc rr/rr.vhd sha256sum README.txt
;;
vhdx)
echo "VHDX"
qemu-img convert rr/rr.img -O vhdx -o subformat=dynamic rr/rr.vhdx
(cd rr && sha256sum rr.vhdx >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.vhdx.zip" -j rr/rr.vhdx ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vhdx.zip" -j rr/rr.vhdx sha256sum README.txt
;;
*)
echo "IMG"
(cd rr && sha256sum rr.img >../sha256sum)
zip -9 "rr-${MODEL}-${TAG}-${{ github.run_id }}.img.zip" -j rr/rr.img ${USER_CONFIG_FILE} sha256sum README.txt
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.img.zip" -j rr/rr.img sha256sum README.txt
esac
echo "TAG=${TAG}" >> $GITHUB_ENV
- name: Upload to Artifacts
if: env.iscustom == 'true' && success()
uses: actions/upload-artifact@v4

View File

@ -32,6 +32,19 @@ If you cannot connect to the Internet, please build a pre-compiled bootloader th
- Addons: [addons](https://github.com/RROrg/rr/raw/main/docs/addons.xlsx)
- Modules: [modules](https://github.com/RROrg/rr/raw/main/docs/modules.xlsx)
- Proxmox VE One Click Install:
```
curl -fsSL https://github.com/RROrg/rr/raw/refs/heads/main/scripts/pve.sh | bash -s -- --bltype usb
# Optional Parameters:
--onboot <0|1> Enable VM on boot, default 1 (enable)
--efi <0|1> Enable UEFI boot, default 1 (enable)
--bltype <sata|usb|nvme> Bootloader disk type, default sata
--9ppath <path> Set to /path/to/9p to mount 9p share
--tag <tag> Image tag, download latest release if not set
--img <path> Local image path, use local image if set
```
### 4: GPU:

View File

@ -1 +1 @@
25.9.2
25.9.5

View File

@ -359,6 +359,26 @@
"zh_TW": "雜項功能. (一些必要的修改的集合.)"
}
},
"monitor": {
"system": false,
"description": {
"en_US": "Monitor Power Management (Only supports graphics card drivers).",
"ar_SA": "إدارة الطاقة للمراقبة(يدعم فقط برامج تشغيل بطاقة الرسومات).",
"de_DE": "Überwachung der Energieverwaltung (nur unterstützt Graphikkartendrivers).",
"es_ES": "Monitoreo de la gestión de energía (solo admite controladores de tarjeta gráfica).",
"fr_FR": "Surveillance de la gestion de l'alimentation (seulement les pilotes de carte graphique sont pris en charge).",
"ja_JP": "電源管理の監視 (グラフィックスカードドライバーのみサポート)。",
"ko_KR": "모니터 전원 관리 (그래픽 카드 드라이버만 지원)。",
"ru_RU": "Мониторинг управления питанием (только поддерживает драйверы графических карт).",
"th_TH": "การตรวจสอบการบริหารจัดการพลังงาน (แค่สนับสนุนไดรเวอร์การทำงานของการ์ดราฟิก).",
"tr_TR": "Monitör Güç Yönetimi (grafik kart sürücüsü destekliyor).",
"uk_UA": "Моніторинг управління живленням (тільки підтримує драйвери графічних карток).",
"vi_VN": "Quản lý nguồn điện (chỉ hỗ trợ các driver của card đồ họa).",
"zh_CN": "显示器电源管理 (仅支持显卡已驱动的环境)。",
"zh_HK": "顯示器電源管理 (僅支持显卡已驅動的环境)。",
"zh_TW": "顯示器電源管理 (僅支持显卡已驅動的环境)。"
}
},
"mountloader": {
"system": false,
"description": {
@ -759,6 +779,26 @@
"zh_TW": "作者: GXNAS. 強制將 UPS 供電時的待機模式修改為關機. 參數: -f - 關機前觸發關機任務; -e - 待機模式前發關機任務(不修改為關機)."
}
},
"virtiofs": {
"system": false,
"description": {
"en_US": "Auto mount virtio9p and virtiofs file systems (effective after rebooting the system after creating the storage space for the first time since it is mounted to the first storage space by default).",
"ar_SA": "تلقائيا تركيب أنظمة ملفات virtio9p و virtiofs (تدخل حيز التنفيذ بعد إعادة تشغيل النظام بعد إنشاء مساحة التخزين لأول مرة حيث يتم تركيبها في مساحة التخزين الأولى بشكل افتراضي).",
"de_DE": "Installiert virtio9p und virtiofs automatisch (da sie standardmäßig im ersten Speicherplatz gemountet werden, werden sie wirksam, nachdem das System zum ersten Mal installiert und der Speicherplatz erstellt und neu gestartet wurde).",
"es_ES": "Installs virtio9p and virtiofs automatically (effective after rebooting the system after creating the storage space for the first time since it is mounted to the first storage space by default).",
"fr_FR": "Monte automatiquement les systèmes de fichiers virtio9p et virtiofs (efficace après le redémarrage du système après la création de l'espace de stockage pour la première fois car il est monté sur le premier espace de stockage par défaut).",
"ja_JP": "virtio9pおよびvirtiofsファイルシステムを自動的にマウントしますデフォルトで最初のストレージスペースにマウントされるため、システムを再起動して最初にストレージスペースを作成した後に有効になります。",
"ko_KR": "virtio9p 및 virtiofs 파일 시스템을 자동으로 마운트합니다(기본적으로 첫 번째 스토리지 공간에 마운트되므로 시스템을 재부팅한 후 처음으로 스토리지 공간을 만든 후에 적용됨).",
"ru_RU": "Автоматически монтирует файловые системы virtio9p и virtiofs (вступает в силу после перезагрузки системы после создания хранилища в первый раз, так как по умолчанию оно монтируется в первое хранилище).",
"th_TH": "ติดตั้งระบบไฟล์ virtio9p และ virtiofs โดยอัตโนมัติ (มีผลหลังจากรีบูตระบบหลังจากสร้างพื้นที่จัดเก็บข้อมูลเป็นครั้งแรกเนื่องจากจะถูกเมานต์ไปยังพื้นที่จัดเก็บข้อมูลแรกโดยค่าเริ่มต้น)",
"tr_TR": "virtio9p ve virtiofs dosya sistemlerini otomatik olarak bağlar (varsayılan olarak ilk depolama alanına bağlandığından, depolama alanı ilk kez oluşturulduktan sonra sistemi yeniden başlattıktan sonra geçerlidir).",
"uk_UA": "Автоматично монтує файлові системи virtio9p та virtiofs (вступає в силу після перезавантаження системи після створення сховища у перший раз, оскільки за замовчуванням воно монтується у перший сховище).",
"vi_VN": "Tự động gắn hệ thống tệp virtio9p và virtiofs (có hiệu lực sau khi khởi động lại hệ thống sau khi tạo không gian lưu trữ lần đầu tiên vì nó được gắn vào không gian lưu trữ đầu tiên theo mặc định).",
"zh_CN": "自动挂载 virtio9p 和 virtiofs 文件系统(由于默认挂载到第一个存储空间,所以首次安装系统创建存储空间后重启生效).",
"zh_HK": "自動掛載 virtio9p 和 virtiofs 文件系統(由於默認掛載到第一個存儲空間,所以首次安裝系統創建存儲空間後重启生效).",
"zh_TW": "自動掛載 virtio9p 和 virtiofs 檔案系統(由於預設掛載到第一個儲存空間,所以首次安裝系統建立儲存空間後重新啟動生效)."
}
},
"vmtools": {
"system": false,
"description": {

Binary file not shown.

Binary file not shown.

View File

@ -812,6 +812,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -2066,6 +2070,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -3080,6 +3088,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -4262,6 +4274,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -5260,6 +5276,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -6442,6 +6462,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -7440,6 +7464,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -8622,6 +8650,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -9632,6 +9664,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -10822,6 +10858,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -11832,6 +11872,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -13026,6 +13070,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -13624,6 +13672,10 @@
"description": "Fairchild FUSB302 Type-C Chip Driver",
"depends": "tcpm,usb-common"
},
"fuse": {
"description": "Filesystem in Userspace",
"depends": ""
},
"gpio-beeper": {
"description": "Generic GPIO beeper driver",
"depends": ""
@ -14532,6 +14584,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -14736,6 +14792,10 @@
"description": "Virtio SCSI HBA driver (Compiled by RR for DSM)",
"depends": "virtio,virtio_ring,blk-mq-virtio"
},
"virtiofs": {
"description": "Virtio Filesystem (Compiled by RR for DSM)",
"depends": "fuse,virtio_ring,virtio"
},
"vmw_pvscsi": {
"description": "VMware PVSCSI driver (Compiled by RR for DSM)",
"depends": ""
@ -15274,6 +15334,10 @@
"description": "Fairchild FUSB302 Type-C Chip Driver",
"depends": "tcpm,usb-common"
},
"fuse": {
"description": "Filesystem in Userspace",
"depends": ""
},
"gasket": {
"description": "Google Gasket driver framework",
"depends": "dmabuf"
@ -16186,6 +16250,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -16410,6 +16478,10 @@
"description": "Virtio SCSI HBA driver (Compiled by RR for DSM)",
"depends": "virtio,virtio_ring,blk-mq-virtio"
},
"virtiofs": {
"description": "Virtio Filesystem (Compiled by RR for DSM)",
"depends": "fuse,virtio_ring,virtio"
},
"vmw_pvscsi": {
"description": "VMware PVSCSI driver (Compiled by RR for DSM)",
"depends": ""
@ -17385,6 +17457,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -18627,6 +18703,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -19233,6 +19313,10 @@
"description": "Fairchild FUSB302 Type-C Chip Driver",
"depends": "tcpm,usb-common"
},
"fuse": {
"description": "Filesystem in Userspace",
"depends": ""
},
"gpio-beeper": {
"description": "Generic GPIO beeper driver",
"depends": ""
@ -20057,6 +20141,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -20277,6 +20365,10 @@
"description": "Virtio SCSI HBA driver (Compiled by RR for DSM)",
"depends": "virtio,virtio_ring,blk-mq-virtio"
},
"virtiofs": {
"description": "Virtio Filesystem (Compiled by RR for DSM)",
"depends": "fuse,virtio_ring,virtio"
},
"vmw_pvscsi": {
"description": "VMware PVSCSI driver (Compiled by RR for DSM)",
"depends": ""
@ -21227,6 +21319,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -22425,6 +22521,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -23459,6 +23559,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -24677,6 +24781,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -25263,6 +25371,10 @@
"description": "Fairchild FUSB302 Type-C Chip Driver",
"depends": "tcpm"
},
"fuse": {
"description": "Filesystem in Userspace",
"depends": ""
},
"gpio-beeper": {
"description": "Generic GPIO beeper driver",
"depends": ""
@ -26151,6 +26263,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_sas": {
"description": "SAS Transport Attributes",
"depends": ""
@ -26371,6 +26487,10 @@
"description": "Virtio SCSI HBA driver (Compiled by RR for DSM)",
"depends": "virtio,virtio_ring,blk-mq-virtio"
},
"virtiofs": {
"description": "Virtio Filesystem (Compiled by RR for DSM)",
"depends": "fuse,virtio_ring,virtio"
},
"vmw_pvscsi": {
"description": "VMware PVSCSI driver (Compiled by RR for DSM)",
"depends": ""
@ -27349,6 +27469,10 @@
"description": "low-level driver for Silicon Image SATA controller (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -28579,6 +28703,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -29173,6 +29301,10 @@
"description": "Fairchild FUSB302 Type-C Chip Driver",
"depends": "tcpm"
},
"fuse": {
"description": "Filesystem in Userspace",
"depends": ""
},
"gpio-beeper": {
"description": "Generic GPIO beeper driver",
"depends": ""
@ -30065,6 +30197,10 @@
"description": "Stochastic Fairness Queueing discipline (Compiled by RR for DSM)",
"depends": ""
},
"scsi_debug": {
"description": "SCSI debug adapter driver (Compiled by RR for DSM)",
"depends": ""
},
"scsi_transport_fc": {
"description": "FC Transport Attributes",
"depends": ""
@ -30289,6 +30425,10 @@
"description": "Virtio SCSI HBA driver (Compiled by RR for DSM)",
"depends": "virtio,virtio_ring,blk-mq-virtio"
},
"virtiofs": {
"description": "Virtio Filesystem (Compiled by RR for DSM)",
"depends": "fuse,virtio_ring,virtio"
},
"vmw_pvscsi": {
"description": "VMware PVSCSI driver (Compiled by RR for DSM)",
"depends": ""

Binary file not shown.

View File

@ -251,394 +251,25 @@
"sum": "00000000000000000000000000000000"
}
},
"DS220+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS220%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS220%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS220%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS220%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS220%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS220%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS224+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS224%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS224%2B_69057.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS2419+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS2419%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS2419%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS2419%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS2419%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS2419%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS2419%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS2419+II": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS2419%2BII_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS2419%2BII_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS2419%2BII_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS2419%2BII_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS2419%2BII_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS2419%2BII_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS2422+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS2422%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS2422%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS2422%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS2422%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS2422%2B_42661.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS2422%2B_42218.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS3622xs+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS3622xs%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS3622xs%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS3622xs%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS3622xs%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS3622xs%2B_42661.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS420+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS420%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS420%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS420%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS420%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS420%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS420%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS423+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS423%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS423%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS423%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962/DSM_DS423%2B_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS620slim": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS620slim_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS620slim_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057/DSM_DS620slim_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS620slim_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS620slim_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS620slim_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS720+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS720%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS720%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS720%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS720%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS720%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS720%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS723+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS723%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS723%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS723%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962/DSM_DS723%2B_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS920+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS920%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DS920%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS920%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS920%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DS920%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DS920%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS923+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DS923%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DS923%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DS923%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962/DSM_DS923%2B_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"DVA1622": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DVA1622_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DVA1622_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DVA1622_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DVA1622_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"DVA3219": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_DVA3219_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_DVA3219_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_DVA3219_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_DVA3219_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_DVA3219_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_DVA3219_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"DS220+": {},
"DS224+": {},
"DS2419+": {},
"DS2419+II": {},
"DS2422+": {},
"DS3622xs+": {},
"DS420+": {},
"DS423+": {},
"DS620slim": {},
"DS720+": {},
"DS723+": {},
"DS920+": {},
"DS923+": {},
"DVA1622": {},
"DVA3219": {},
"DVA3221": {},
"FS2500": {},
"FS3400": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_FS3400_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_FS3400_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_FS3400_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_FS3400_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_FS3400_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_FS3400_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"FS3410": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_FS3410_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_FS3410_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_FS3410_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_FS3410_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"FS3400": {},
"FS3410": {},
"FS3600": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_FS3600_72806.pat",
@ -1021,14 +652,6 @@
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS820%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS820%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS820%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS820RP+": {
@ -1109,78 +732,11 @@
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_SA3200D_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_SA3200D_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_SA3200D_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"SA3400": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_SA3400_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_SA3400_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_SA3400_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_SA3400_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_SA3400_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_SA3400_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"SA3400D": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_SA3400D_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_SA3400D_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_SA3400D_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962/DSM_SA3400D_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"SA3410": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_SA3410_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057/DSM_SA3410_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_SA3410_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962/DSM_SA3410_42962.pat",
"sum": "00000000000000000000000000000000"
}
},
"SA3400": {},
"SA3400D": {},
"SA3410": {},
"SA3600": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_SA3600_72806.pat",
@ -1493,196 +1049,13 @@
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_FS2017_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_FS2017_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_FS2017_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS18017xs+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS18017xs%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS18017xs%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS18017xs%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS18017xs%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS18017xs%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS18017xs%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS2418+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS2418%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS2418%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS2418%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS2418%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS2418%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS2418%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS2418RP+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS2418RP%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS2418RP%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS2418RP%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS2418RP%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS2418RP%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS2418RP%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS2818RP+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS2818RP%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS2818RP%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS2818RP%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS2818RP%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS2818RP%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS2818RP%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS3617RPxs": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS3617RPxs_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS3617RPxs_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS3617RPxs_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS3617RPxs_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS3617RPxs_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS3617RPxs_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS3617xs+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS3617xs%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS3617xs%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS3617xs%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS3617xs%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS3617xs%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS3617xs%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
},
"RS4017xs+": {
"7.2.2-72806-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.2/72806/DSM_RS4017xs%2B_72806.pat",
"sum": "00000000000000000000000000000000"
},
"7.0.1-42218-0": {
"url": "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_RS4017xs%2B_42218.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.1-69057-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2.1/69057-1/DSM_RS4017xs%2B_69057.pat",
"sum": "00000000000000000000000000000000"
},
"7.2.0-64570-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.2/64570-1/DSM_RS4017xs%2B_64570.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.1-42962-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1.1/42962-1/DSM_RS4017xs%2B_42962.pat",
"sum": "00000000000000000000000000000000"
},
"7.1.0-42661-1": {
"url": "https://global.synologydownload.com/download/DSM/release/7.1/42661-1/DSM_RS4017xs%2B_42661.pat",
"sum": "00000000000000000000000000000000"
}
}
"RS18017xs+": {},
"RS2418+": {},
"RS2418RP+": {},
"RS2818RP+": {},
"RS3617RPxs": {},
"RS3617xs+": {},
"RS4017xs+": {}
}

Binary file not shown.

View File

@ -112,7 +112,7 @@ printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "MEM: ")" "${MEM}"
if ! readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q nvmesystem; then
HASATA=0
for D in $(lsblk -dpno NAME); do
for D in $(lsblk -dpno KNAME); do
[ "${D}" = "${LOADER_DISK}" ] && continue
if echo "sata sas scsi" | grep -wq "$(getBus "${D}")"; then
HASATA=1
@ -363,7 +363,7 @@ if [ "${DIRECT}" = "true" ] || [ "${MEV:-physical}" = "parallels" ]; then
_bootwait || exit 0
printf "\033[1;33m%s\033[0m\n" "$(TEXT "Reboot to boot directly in DSM")"
reboot
[ ! -f "/.dockerenv" ] && reboot
exit 0
else
rm -f "${USER_RSYSENVFILE}" 2>/dev/null || true
@ -390,14 +390,14 @@ else
printf "."
sleep 1
done
if [ ! -f "/.dockerenv" ]; then
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
fi
printf "$(TEXT "Waiting IP.\n")"
for N in ${ETHX}; do
COUNT=0
DRIVER="$(basename "$(realpath "/sys/class/net/${N}/device/driver" 2>/dev/null)" 2>/dev/null)"
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)"
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)" || MAC="00:00:00:00:00:00"
printf "%s(%s): " "${N}" "${MAC}@${DRIVER}"
while true; do
if false && [ ! "${N::3}" = "eth" ]; then
@ -464,6 +464,7 @@ else
fi
done
if [ ! -f "/.dockerenv" ]; then
# Disconnect wireless
lsmod | grep -q iwlwifi && for F in /sys/class/net/wlan*; do
[ ! -e "${F}" ] && continue
@ -481,5 +482,6 @@ else
# Reboot
KERNELWAY="$(readConfigKey "kernelway" "${USER_CONFIG_FILE}")"
[ "${KERNELWAY}" = "kexec" ] && kexec -e || poweroff
fi
exit 0
fi

0
files/initrd/opt/rr/extract-vmlinux Normal file → Executable file
View File

Binary file not shown.

34
files/initrd/opt/rr/helper.sh Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# shellcheck disable=SC2059
[ -z "${WORK_PATH}" ] || [ ! -d "${WORK_PATH}/include" ] && WORK_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. "${WORK_PATH}/include/functions.sh"
# lock
exec 911>"${TMP_PATH}/helper.lock"
flock -n 911 || {
MSG="$(TEXT "Another instance is already running.")"
dialog --colors --aspect 50 --title "$(TEXT "Online Assistance")" --msgbox "${MSG}" 0 0
exit 1
}
trap 'flock -u 911; rm -f "${TMP_PATH}/helper.lock"' EXIT INT TERM HUP
{
printf "$(TEXT "Closing this window or press 'ctrl + c' to exit the assistance.")\n"
printf "$(TEXT "Please give the following link to the helper. (Click to open and copy)")\n"
printf " 👇\n"
sshx -q --name "RR-Helper" 2>&1
[ $? -ne 0 ] && while true; do sleep 1; done
} | dialog --colors --aspect 50 --title "$(TEXT "Online Assistance")" --progressbox "$(TEXT "Notice: Please keep this window open.")" 20 100 2>&1
clear
echo -e "$(TEXT "Call \033[1;32mmenu.sh\033[0m to return to menu")"
"${WORK_PATH}/init.sh"

View File

@ -8,7 +8,7 @@
# shellcheck disable=SC2034
RR_VERSION="25.9.2"
RR_VERSION="25.9.5"
RR_RELEASE=""
RR_TITLE="RR v${RR_VERSION}"

View File

@ -246,6 +246,7 @@ function _sort_netif() {
ETHLIST=""
for F in /sys/class/net/eth*; do
[ ! -e "${F}" ] && continue
local ETH MAC BUS
ETH="$(basename "${F}")"
MAC="$(cat "/sys/class/net/${ETH}/address" 2>/dev/null | sed 's/://g; s/.*/\L&/')"
BUS="$(ethtool -i "${ETH}" 2>/dev/null | grep bus-info | cut -d' ' -f2)"
@ -288,10 +289,11 @@ function _sort_netif() {
# 1 - device path
function getBus() {
local BUS=""
[ -f "/.dockerenv" ] && BUS="docker"
# usb/ata(ide)/sata/sas/spi(scsi)/virtio/mmc/nvme
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,TRAN 2>/dev/null | grep "${1} " | awk '{print $2}' | sed 's/^ata$/ide/' | sed 's/^spi$/scsi/') #Spaces are intentional
# usb/scsi(ide/sata/sas)/virtio/mmc/nvme/vmbus/xen(xvd)
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep "${1} " | awk '{print $2}' | awk -F':' '{print $(NF-1)}' | sed 's/_host//' | sed 's/^.*xen.*$/xen/') # Spaces are intentional
[ -z "${BUS}" ] && BUS=$(lsblk -dpno KNAME,SUBSYSTEMS 2>/dev/null | grep "${1} " | awk '{split($2,a,":"); if(length(a)>1) print a[length(a)-1]}' | sed 's/_host//' | sed 's/^.*xen.*$/xen/') # Spaces are intentional
[ -z "${BUS}" ] && BUS="unknown"
echo "${BUS}"
return 0

View File

@ -10,18 +10,20 @@
# Unpack modules from a tgz file
# 1 - Platform
# 2 - Kernel Version
# 3 - dummy path
function unpackModules() {
local PLATFORM=${1}
local PKVER=${2}
local UNPATH=${3:-"${TMP_PATH}/modules"}
local KERNEL
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
rm -rf "${TMP_PATH}/modules"
mkdir -p "${TMP_PATH}/modules"
rm -rf "${UNPATH}"
mkdir -p "${UNPATH}"
if [ "${KERNEL}" = "custom" ]; then
tar -zxf "${CKS_PATH}/modules-${PLATFORM}-${PKVER}.tgz" -C "${TMP_PATH}/modules"
tar -zxf "${CKS_PATH}/modules-${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}"
else
tar -zxf "${MODULES_PATH}/${PLATFORM}-${PKVER}.tgz" -C "${TMP_PATH}/modules"
tar -zxf "${MODULES_PATH}/${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}"
fi
}
@ -29,16 +31,18 @@ function unpackModules() {
# Packag modules to a tgz file
# 1 - Platform
# 2 - Kernel Version
# 3 - dummy path
function packagModules() {
local PLATFORM=${1}
local PKVER=${2}
local UNPATH=${3:-"${TMP_PATH}/modules"}
local KERNEL
KERNEL="$(readConfigKey "kernel" "${USER_CONFIG_FILE}")"
if [ "${KERNEL}" = "custom" ]; then
tar -zcf "${CKS_PATH}/modules-${PLATFORM}-${PKVER}.tgz" -C "${TMP_PATH}/modules" .
tar -zcf "${CKS_PATH}/modules-${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}" .
else
tar -zcf "${MODULES_PATH}/${PLATFORM}-${PKVER}.tgz" -C "${TMP_PATH}/modules" .
tar -zcf "${MODULES_PATH}/${PLATFORM}-${PKVER}.tgz" -C "${UNPATH}" .
fi
}
@ -54,9 +58,10 @@ function getAllModules() {
return 1
fi
unpackModules "${PLATFORM}" "${PKVER}"
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
for F in ${TMP_PATH}/modules/*.ko; do
for F in ${UNPATH}/*.ko; do
[ ! -e "${F}" ] && continue
local N DESC
N="$(basename "${F}" .ko)"
@ -65,7 +70,35 @@ function getAllModules() {
echo "${N} \"${DESC:-${N}}\""
done
rm -rf "${TMP_PATH}/modules"
rm -rf "${UNPATH}"
}
function getLoadedModules() {
local PLATFORM=${1}
local PKVER=${2}
if [ -z "${PLATFORM}" ] || [ -z "${PKVER}" ]; then
return 1
fi
UNPATH="${TMP_PATH}/lib/modules/$(uname -r)"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
depmod -a -b "${TMP_PATH}" >/dev/null 2>&1
ALL_KO=$(
find /sys/devices -name modalias -exec cat {} \; | while read -r modalias; do
modprobe -d "${TMP_PATH}" --resolve-alias "${modalias}" 2>/dev/null
done | sort -u
)
rm -rf "${UNPATH}"
ALL_DEPS=""
for M in ${ALL_KO}; do
ALL_DEPS="${ALL_DEPS} $(getdepends "${PLATFORM}" "${PKVER}" "${M}")"
done
echo "${ALL_DEPS}" | tr ' ' '\n' | grep -v '^$' | sort -u
return 0
}
###############################################################################
@ -85,10 +118,11 @@ function installModules() {
shift 2
MLIST="${*}"
unpackModules "${PLATFORM}" "${PKVER}"
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")"
for F in ${TMP_PATH}/modules/*.ko; do
for F in ${UNPATH}/*.ko; do
[ ! -e "${F}" ] && continue
M=$(basename "${F}")
[ "${ODP}" = "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue
@ -98,6 +132,7 @@ function installModules() {
rm -f "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}"
fi
done
rm -rf "${UNPATH}"
mkdir -p "${RAMDISK_PATH}/usr/lib/firmware"
KERNEL=$(readConfigKey "kernel" "${USER_CONFIG_FILE}")
@ -109,8 +144,6 @@ function installModules() {
if [ $? -ne 0 ]; then
return 1
fi
rm -rf "${TMP_PATH}/modules"
return 0
}
@ -129,11 +162,12 @@ function addToModules() {
return 1
fi
unpackModules "${PLATFORM}" "${PKVER}"
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
cp -f "${KOFILE}" "${TMP_PATH}/modules"
cp -f "${KOFILE}" "${UNPATH}"
packagModules "${PLATFORM}" "${PKVER}"
packagModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
}
###############################################################################
@ -151,11 +185,12 @@ function delToModules() {
return 1
fi
unpackModules "${PLATFORM}" "${PKVER}"
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
rm -f "${TMP_PATH}/modules/${KONAME}"
rm -f "${UNPATH}/${KONAME}"
packagModules "${PLATFORM}" "${PKVER}"
packagModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
}
###############################################################################
@ -165,9 +200,9 @@ function delToModules() {
# 3 - ko name
function getdepends() {
function _getdepends() {
if [ -f "${TMP_PATH}/modules/${1}.ko" ]; then
if [ -f "${UNPATH}/${1}.ko" ]; then
local depends
depends="$(modinfo -F depends "${TMP_PATH}/modules/${1}.ko" 2>/dev/null | sed 's/,/\n/g')"
depends="$(modinfo -F depends "${UNPATH}/${1}.ko" 2>/dev/null | sed 's/,/\n/g')"
if [ "$(echo "${depends}" | wc -w)" -gt 0 ]; then
for k in ${depends}; do
echo "${k}"
@ -186,9 +221,10 @@ function getdepends() {
return 1
fi
unpackModules "${PLATFORM}" "${PKVER}"
UNPATH="${TMP_PATH}/modules"
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
_getdepends "${KONAME}" | sort -u
echo "${KONAME}"
rm -rf "${TMP_PATH}/modules"
rm -rf "${UNPATH}"
}

View File

@ -94,7 +94,7 @@ fi
initConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
initConfigKey "modblacklist" "evbug,cdc_ether" "${USER_CONFIG_FILE}"
if [ ! "LOCALBUILD" = "${LOADER_DISK}" ]; then
if [ ! -f "/.dockerenv" ]; then
if arrayExistItem "sortnetif:" "$(readConfigMap "addons" "${USER_CONFIG_FILE}")"; then
_sort_netif "$(readConfigKey "addons.sortnetif" "${USER_CONFIG_FILE}")"
fi
@ -129,19 +129,16 @@ PID="0x0001"
TYPE="DoM"
BUS=$(getBus "${LOADER_DISK}")
BUSLIST="usb sata sas scsi nvme mmc ide virtio vmbus xen"
BUSLIST="usb sata sas scsi nvme mmc ide virtio vmbus xen docker"
if [ "${BUS}" = "usb" ]; then
VID="0x$(udevadm info --query property --name "${LOADER_DISK}" 2>/dev/null | grep "ID_VENDOR_ID" | cut -d= -f2)"
PID="0x$(udevadm info --query property --name "${LOADER_DISK}" 2>/dev/null | grep "ID_MODEL_ID" | cut -d= -f2)"
[ "${VID}" = "0x" ] || [ "${PID}" = "0x" ] && die "$(TEXT "The loader disk does not support the current USB Portable Hard Disk.")"
TYPE="flashdisk"
elif ! echo "${BUSLIST}" | grep -wq "${BUS}"; then
if [ "LOCALBUILD" = "${LOADER_DISK}" ]; then
echo "LOCALBUILD MODE"
elif [ "${BUS}" = "docker" ]; then
TYPE="PC"
else
elif ! echo "${BUSLIST}" | grep -wq "${BUS}"; then
die "$(printf "$(TEXT "The loader disk does not support the current %s, only %s DoM is supported.")" "${BUS}" "${BUSLIST// /\/}")"
fi
fi
# Save variables to user config file
@ -169,6 +166,9 @@ if ! loaderIsConfigured; then
elif grep -q "IWANTTOCHANGETHECONFIG" /proc/cmdline; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "User requested edit settings.")"
BOOT=0
elif [ -f "/.dockerenv" ]; then
printf "\033[1;33m%s\033[0m\n" "$(TEXT "Docker edit settings.")"
BOOT=0
fi
# If is to boot automatically, do it
@ -200,13 +200,15 @@ while [ ${COUNT} -lt 30 ]; do
sleep 1
done
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
if [ ! -f "/.dockerenv" ]; then
[ ! -f /var/run/dhcpcd/pid ] && /etc/init.d/S41dhcpcd restart >/dev/null 2>&1 || true
fi
printf "$(TEXT "Waiting IP.\n")"
for N in ${ETHX}; do
COUNT=0
DRIVER="$(basename "$(realpath "/sys/class/net/${N}/device/driver" 2>/dev/null)" 2>/dev/null)"
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)"
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)" || MAC="00:00:00:00:00:00"
printf "%s(%s): " "${N}" "${MAC}@${DRIVER}"
while true; do
if [ -z "$(cat "/sys/class/net/${N}/carrier" 2>/dev/null)" ]; then
@ -255,7 +257,7 @@ fi
printf "\n"
DSMLOGO="$(readConfigKey "dsmlogo" "${USER_CONFIG_FILE}")"
if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ] && [ ! "LOCALBUILD" = "${LOADER_DISK}" ]; then
if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ] && [ ! -f "/.dockerenv" ]; then
IP="$(getIP)"
echo "${IP}" | grep -q "^169\.254\." && IP=""
[ -n "${IP}" ] && URL="http://${IP}:${TTYD:-7681}" || URL="http://rr:${TTYD:-7681}"
@ -266,7 +268,7 @@ if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ] && [ ! "LOCALBUILD" = "${LOADE
[ -f "${TMP_PATH}/qrcode_qhxg.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_qhxg.png" >/dev/null 2>&1 || true
fi
WEBHOOKURL="$(readConfigKey "webhookurl" "${USER_CONFIG_FILE}")"
if [ -n "${WEBHOOKURL}" ] && [ ! -f "${TMP_PATH}/WebhookSent" ]; then
if [ -n "${WEBHOOKURL}" ] && [ ! -f "${TMP_PATH}/WebhookSent" ] && [ ! -f "/.dockerenv" ]; then
DMI="$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i')"
IP="$(getIP)"
echo "${IP}" | grep -q "^169\.254\." && IP=""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
25.9.2
25.9.5

View File

@ -1,251 +0,0 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
if [ "$(id -u)" -ne 0 ]; then
echo "This script must be run as root"
exit 1
fi
function help() {
cat <<EOF
Usage: $0 <command> [args]
Commands:
create [workspace] [rr.img] - Create the workspace
init - Initialize the environment
config [model] [version] - Config the DSM system
build - Build the DSM system
pack [rr.img] - Pack to rr.img
help - Show this help
EOF
exit 1
}
function create() {
local WORKSPACE RRIMGPATH LOOPX INITRD_FILE INITRD_FORMAT
WORKSPACE="$(realpath "${1:-workspace}")"
RRIMGPATH="$(realpath "${2:-rr.img}")"
if [ ! -f "${RRIMGPATH}" ]; then
echo "File not found: ${RRIMGPATH}"
exit 1
fi
sudo apt update
sudo apt install -y locales busybox dialog gettext sed gawk jq curl
sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils dosfstools cpio xz-utils lz4 lzma bzip2 gzip zstd
# sudo snap install yq
if ! type yq >/dev/null 2>&1 || ! yq --version 2>/dev/null | grep -q "v4."; then
sudo curl -kL https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/bin/yq && sudo chmod a+x /usr/bin/yq
fi
# Backup the original python3 executable.
sudo mv -f "$(realpath "$(which python3)")/EXTERNALLY-MANAGED" "$(realpath "$(which python3)")/EXTERNALLY-MANAGED.bak" 2>/dev/null || true
sudo pip3 install -U click requests requests-toolbelt qrcode[pil] beautifulsoup4
sudo locale-gen ar_SA.UTF-8 de_DE.UTF-8 en_US.UTF-8 es_ES.UTF-8 fr_FR.UTF-8 ja_JP.UTF-8 ko_KR.UTF-8 ru_RU.UTF-8 th_TH.UTF-8 tr_TR.UTF-8 uk_UA.UTF-8 vi_VN.UTF-8 zh_CN.UTF-8 zh_HK.UTF-8 zh_TW.UTF-8
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "${RRIMGPATH}"
# Check partitions and ignore errors
fsck.vfat -aw "${LOOPX}p1" >/dev/null 2>&1 || true
fsck.ext2 -p "${LOOPX}p2" >/dev/null 2>&1 || true
fsck.ext4 -p "${LOOPX}p3" >/dev/null 2>&1 || true
echo "Mounting image file"
for i in {1..3}; do
rm -rf "/tmp/mnt/p${i}"
mkdir -p "/tmp/mnt/p${i}"
sudo mount "${LOOPX}p${i}" "/tmp/mnt/p${i}" || {
echo "Can't mount ${LOOPX}p${i}."
exit 1
}
done
echo "Create WORKSPACE"
rm -rf "${WORKSPACE}"
mkdir -p "${WORKSPACE}/mnt" "${WORKSPACE}/tmp" "${WORKSPACE}/initrd"
cp -rpf /tmp/mnt/p{1,2,3} "${WORKSPACE}/mnt/"
INITRD_FILE="${WORKSPACE}/mnt/p3/initrd-rr"
INITRD_FORMAT=$(file -b --mime-type "${INITRD_FILE}")
case "${INITRD_FORMAT}" in
*'x-cpio'*) (cd "${WORKSPACE}/initrd" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
*'x-xz'*) (cd "${WORKSPACE}/initrd" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'x-lz4'*) (cd "${WORKSPACE}/initrd" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'x-lzma'*) (cd "${WORKSPACE}/initrd" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'x-bzip2'*) (cd "${WORKSPACE}/initrd" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'gzip'*) (cd "${WORKSPACE}/initrd" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'zstd'*) (cd "${WORKSPACE}/initrd" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*) ;;
esac
sudo sync
for i in {1..3}; do
sudo umount "/tmp/mnt/p${i}"
rm -rf "/tmp/mnt/p${i}"
done
sudo losetup --detach "${LOOPX}"
if [ ! -f "${WORKSPACE}/initrd/opt/rr/init.sh" ] || [ ! -f "${WORKSPACE}/initrd/opt/rr/menu.sh" ]; then
echo "initrd decompression failed."
exit 1
fi
rm -f "$(dirname "${BASH_SOURCE[0]}")/rr.env"
cat <<EOF >"$(dirname "${BASH_SOURCE[0]}")/rr.env"
export LOADER_DISK="LOCALBUILD"
export CHROOT_PATH="${WORKSPACE}"
EOF
echo "OK."
}
function init() {
if [ ! -f "$(dirname "${BASH_SOURCE[0]}")/rr.env" ]; then
echo "Please run init first"
exit 1
fi
. "$(dirname "${BASH_SOURCE[0]}")/rr.env"
pushd "${CHROOT_PATH}/initrd/opt/rr" || exit 1
echo "init"
./init.sh
local RET=$?
popd || exit 1
[ ${RET} -ne 0 ] && echo "Failed." || echo "Success."
exit ${RET}
}
function config() {
if [ ! -f "$(dirname "${BASH_SOURCE[0]}")/rr.env" ]; then
echo "Please run init first"
exit 1
fi
. "$(dirname "${BASH_SOURCE[0]}")/rr.env"
local RET=1
pushd "${CHROOT_PATH}/initrd/opt/rr" || exit 1
while true; do
if [ -z "${1}" ]; then
echo "menu"
./menu.sh || break
RET=0
else
echo "model"
./menu.sh modelMenu "${1:-SA6400}" || break
echo "version"
./menu.sh productversMenu "${2:-7.2}" || break
RET=0
fi
break
done
popd || exit 1
[ ${RET} -ne 0 ] && echo "Failed." || echo "Success."
exit ${RET}
}
function build() {
if [ ! -f "$(dirname "${BASH_SOURCE[0]}")/rr.env" ]; then
echo "Please run init first"
exit 1
fi
. "$(dirname "${BASH_SOURCE[0]}")/rr.env"
local RET=1
pushd "${CHROOT_PATH}/initrd/opt/rr" || exit 1
while true; do
echo "build"
./menu.sh make -1 || break
echo "clean"
./menu.sh cleanCache -1 || break
RET=0
break
done
popd || exit 1
[ ${RET} -ne 0 ] && echo "Failed." || echo "Success."
exit ${RET}
}
function pack() {
if [ ! -f "$(dirname "${BASH_SOURCE[0]}")/rr.env" ]; then
echo "Please run init first"
exit 1
fi
. "$(dirname "${BASH_SOURCE[0]}")/rr.env"
local RRIMGPATH LOOPX
RRIMGPATH="$(realpath "${1:-rr.img}")"
rm -f "${RRIMGPATH}"
gzip -dc "${CHROOT_PATH}/initrd/opt/rr/grub.img.gz" >"${RRIMGPATH}"
fdisk -l "${RRIMGPATH}"
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "${RRIMGPATH}"
# Check partitions and ignore errors
fsck.vfat -aw "${LOOPX}p1" >/dev/null 2>&1 || true
fsck.ext2 -p "${LOOPX}p2" >/dev/null 2>&1 || true
fsck.ext4 -p "${LOOPX}p3" >/dev/null 2>&1 || true
echo "Mounting image file"
for i in {1..3}; do
rm -rf "/tmp/mnt/p${i}"
mkdir -p "/tmp/mnt/p${i}"
sudo mount "${LOOPX}p${i}" "/tmp/mnt/p${i}" || {
echo "Can't mount ${LOOPX}p${i}."
exit 1
}
done
echo "Pack image file"
for i in {1..3}; do
[ ${i} -eq 1 ] && sudo cp -af "${CHROOT_PATH}/mnt/p${i}/"{.locale,.timezone} "/tmp/mnt/p${i}/" 2>/dev/null
sudo cp -rf "${CHROOT_PATH}/mnt/p${i}/"* "/tmp/mnt/p${i}" || {
echo "Can't cp ${LOOPX}p${i}."
exit 1
}
done
sudo sync
for i in {1..3}; do
sudo umount "/tmp/mnt/p${i}"
rm -rf "/tmp/mnt/p${i}"
done
sudo losetup --detach "${LOOPX}"
echo "OK."
exit 0
}
function resize() {
local INPUT_FILE="${1}"
local CHANGE_SIZE="${2}"
local OUTPUT_FILE="${3:-${INPUT_FILE}}"
[ -z "${INPUT_FILE}" ] || [ ! -f "${INPUT_FILE}" ] && exit 1
[ -z "${CHANGE_SIZE}" ] && exit 1
INPUT_FILE="$(realpath "${INPUT_FILE}")"
OUTPUT_FILE="$(realpath "${OUTPUT_FILE}")"
local SIZE=$(($(du -sm "${INPUT_FILE}" 2>/dev/null | awk '{print $1}')$(echo "${CHANGE_SIZE}" | sed 's/M//g; s/b//g')))
[ "${SIZE:-0}" -lt 0 ] && exit 1
if [ ! "${INPUT_FILE}" = "${OUTPUT_FILE}" ]; then
sudo cp -f "${INPUT_FILE}" "${OUTPUT_FILE}"
fi
sudo truncate -s ${SIZE}M "${OUTPUT_FILE}"
echo -e "d\n\nn\n\n\n\n\nn\nw" | sudo fdisk "${OUTPUT_FILE}" >/dev/null 2>&1
local LOOPX LOOPXPY
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "${OUTPUT_FILE}"
LOOPXPY="$(find "${LOOPX}p"* -maxdepth 0 2>/dev/null | sort -n | tail -1)"
sudo e2fsck -fp "${LOOPXPY:-${LOOPX}p3}"
sudo resize2fs "${LOOPXPY:-${LOOPX}p3}"
sudo losetup -d "${LOOPX}"
}
"$@"

View File

@ -242,6 +242,34 @@ function getModules() {
echo "Getting Modules end"
}
# unpack initrd
# $1 initrd file
# $2 output path
function unpackInitrd() {
local INITRD_FILE="${1}"
local OUTPUT_PATH="${2}"
[ -z "${INITRD_FILE}" ] || [ ! -f "${INITRD_FILE}" ] && exit 1
INITRD_FILE="$(realpath "${INITRD_FILE}")"
OUTPUT_PATH="$(realpath "${OUTPUT_PATH}")"
mkdir -p "${OUTPUT_PATH}"
local INITRD_FORMAT
INITRD_FORMAT=$(file -b --mime-type "${INITRD_FILE}")
case "${INITRD_FORMAT}" in
*'x-cpio'*) (cd "${OUTPUT_PATH}" && sudo cpio -idm <"${INITRD_FILE}") >/dev/null 2>&1 ;;
*'x-xz'*) (cd "${OUTPUT_PATH}" && xz -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'x-lz4'*) (cd "${OUTPUT_PATH}" && lz4 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'x-lzma'*) (cd "${OUTPUT_PATH}" && lzma -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'x-bzip2'*) (cd "${OUTPUT_PATH}" && bzip2 -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'gzip'*) (cd "${OUTPUT_PATH}" && gzip -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*'zstd'*) (cd "${OUTPUT_PATH}" && zstd -dc "${INITRD_FILE}" | sudo cpio -idm) >/dev/null 2>&1 ;;
*) ;;
esac
}
# repack initrd
# $1 initrd file
# $2 plugin path

233
scripts/pve.sh Executable file
View File

@ -0,0 +1,233 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
REPO="https://github.com/RROrg/rr"
# 参数
ONBOOT=1 # 开机启动默认1
EFI=1 # 启用 UEFI 引导默认1
BLTYPE="sata" # 引导盘类型, 支持 sata,usb,nvme 默认 sata
STORAGE="" # 存储,默认自动获取
V9PPATH="" # 添加 virtio9p 挂载目录,默认空不添加
VFSDIRID="" # 添加 virtiofs 挂载文件夹id默认空不添加
TAG="" # 镜像tag默认自动获取
IMG="" # 本地镜像路径,默认空
usage() {
echo "Usage: $0 [--onboot <0|1>] [--efi <0|1>] [--bltype <sata|usb|nvme>] [--storage <name>]"
echo " [--v9ppath <path>] [--vfsdirid <dirid>] [--tag <tag>] [--img <path>]"
echo ""
echo " --onboot <0|1> Enable VM on boot, default 1 (enable)"
echo " --efi <0|1> Enable UEFI boot, default 1 (enable)"
echo " --bltype <sata|usb|nvme> Bootloader disk type, default sata"
echo " --storage <name> Storage name for images, as local-lvm, default auto get"
echo " --v9ppath <path> Set to /path/to/9p to mount virtio 9p share"
echo " --vfsdirid <dirid> Set to <dirid> to mount virtio fs share"
echo " --tag <tag> Image tag, download latest release if not set"
echo " --img <path> Local image path, use local image if set"
}
ARGS=$(getopt -o '' --long onboot:,efi:,bltype:,storage:,v9ppath:,vfsdirid:,tag:,img: -n "$0" -- "$@")
if [ $? -ne 0 ]; then
usage
exit 1
fi
eval set -- "$ARGS"
while true; do
case "$1" in
--onboot)
ONBOOT="$2"
echo "$ONBOOT" | grep -qvE '^(0|1)$' && ONBOOT=1
shift 2
;;
--efi)
EFI="$2"
echo "$EFI" | grep -qvE '^(0|1)$' && EFI=1
shift 2
;;
--bltype)
BLTYPE="$2"
echo "$BLTYPE" | grep -qvE '^(sata|usb|nvme)$' && BLTYPE="sata"
shift 2
;;
--storage)
STORAGE="$2"
[ -n "${STORAGE}" ] && pvesm status -content images | grep -qw "^${STORAGE}" || STORAGE=""
shift 2
;;
--v9ppath)
V9PPATH="$2"
[ -d "${V9PPATH}" ] && V9PPATH="$(realpath "${V9PPATH}")" || V9PPATH=""
shift 2
;;
--vfsdirid)
VFSDIRID="$2"
[ -n "${VFSDIRID}" ] && pvesh ls /cluster/mapping/dir | grep -qw "${VFSDIRID}" || VFSDIRID=""
shift 2
;;
--tag)
TAG="$2"
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
shift 2
;;
--img)
IMG="$2"
[ -f "${IMG}" ] && IMG="$(realpath "${IMG}")" || IMG=""
shift 2
;;
--)
shift
break
;;
*)
usage
exit 1
;;
esac
done
if ! command -v qm >/dev/null 2>&1; then
echo "Not a Proxmox VE environment"
exit 1
fi
if [ -z "$TAG" ]; then
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}')"
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
fi
if [ -n "${IMG}" ] && [ -f "${IMG}" ]; then
IMG_PATH="${IMG}"
else
if ! command -v curl >/dev/null 2>&1; then
apt-get update >/dev/null 2>&1 && apt-get install -y curl >/dev/null 2>&1
fi
rm -f "/tmp/rr-${TAG}.img.zip"
echo "Downloading rr-${TAG}.img.zip ... "
STATUS=$(curl -skL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "/tmp/rr-${TAG}.img.zip")
if [ $? -ne 0 ] || [ "${STATUS:-0}" -ne 200 ]; then
rm -f "/tmp/rr-${TAG}.img.zip"
echo "Download failed rr-${TAG}.img.zip"
exit 1
fi
if ! command -v unzip >/dev/null 2>&1; then
apt-get update >/dev/null 2>&1 && apt-get install -y unzip >/dev/null 2>&1
fi
IMG_FILE=$(unzip -l "/tmp/rr-${TAG}.img.zip" | awk '{print $4}' | grep '\.img$' | head -1)
if [ -z "${IMG_FILE}" ]; then
echo "No img file found in rr-${TAG}.img.zip"
exit 1
fi
IMG_PATH="/tmp/${IMG_FILE}"
rm -f "${IMG_PATH}"
echo "Unzipping rr-${TAG}.img.zip ... "
unzip -o "/tmp/rr-${TAG}.img.zip" -d /tmp/ "${IMG_FILE}" >/dev/null 2>&1
STATUS=$?
rm -f "/tmp/rr-${TAG}.img.zip"
if [ "${STATUS:-0}" -ne 0 ]; then
rm -f "${IMG_PATH}"
echo "Unzip failed rr-${TAG}.img.zip"
exit 1
fi
fi
echo "Creating VM with RR ... "
# 获取可用的 VMID
VMID="$(($(qm list | awk 'NR>1{print $1}' | sort -n | tail -1 2>/dev/null || echo 99) + 1))"
ARGS=""
SATAIDX=0
# 创建 VM
qm create ${VMID} --name RR-DSM --machine q35 --ostype l26 --vga virtio --sockets 1 --cores 2 --cpu host --numa 0 --memory 4096 --scsihw virtio-scsi-single
if [ $? -ne 0 ]; then
echo "Create VM failed"
exit 1
fi
# 获取 存储
[ -z "${STORAGE}" ] && STORAGE=$(pvesm status -content images | awk 'NR>1 {print $1}' | grep local | tail -1)
if [ -z "${STORAGE}" ]; then
echo "No storage for images"
qm destroy ${VMID} --purge
exit 1
fi
# 启用 UEFI 引导
if [ "${EFI:-1}" -eq 1 ]; then
if ! qm set ${VMID} --bios ovmf --efidisk0 ${STORAGE}:4,efitype=4m,pre-enrolled-keys=0; then
echo "Set UEFI failed"
qm destroy ${VMID} --purge
exit 1
fi
fi
# 导入 RR 镜像
BLDISK=$(qm importdisk ${VMID} "${IMG_PATH}" "${STORAGE}" | grep 'successfully imported disk' | sed -n "s/.*'\(.*\)'.*/\1/p")
STATUS=$?
if [ "${STATUS:-0}" -ne 0 ] || [ -z "${BLDISK}" ]; then
echo "Import disk failed"
qm destroy ${VMID} --purge
exit 1
fi
[ -n "${IMG}" ] || rm -f "${IMG_PATH}"
case "${BLTYPE}" in
usb)
ARGS+="-device nec-usb-xhci,id=usb-bus0,multifunction=on -drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=usb1 -device usb-storage,bus=usb-bus0.0,port=1,drive=usb1,bootindex=999,removable=on "
;;
nvme)
ARGS+="-drive file=$(pvesm path ${BLDISK}),media=disk,format=raw,if=none,id=nvme1 -device nvme,drive=nvme1,serial=nvme001 "
;;
sata)
qm set ${VMID} --sata$((SATAIDX++)) "${BLDISK}"
;;
*)
echo "Setting bootloader disk failed"
qm destroy ${VMID} --purge
exit 1
;;
esac
X86_VENDOR=$(awk -F: '/vendor_id/ {gsub(/^[ \t]+/, "", $2); print $2; exit}' /proc/cpuinfo)
VT_FLAGS=$(grep '^flags' /proc/cpuinfo | head -n 1 | grep -wEo 'vmx|svm')
ARGS+="-cpu host,+kvm_pv_eoi,+kvm_pv_unhalt,${VT_FLAGS:+${VT_FLAGS},}hv_vendor_id=${X86_VENDOR:-unknown} "
if [ -d "${V9PPATH}" ]; then
[ "virtio9p" = "${VFSDIRID}" ] && V9PTAG="virtio9p0" || V9PTAG="virtio9p"
ARGS+="-fsdev local,security_model=passthrough,id=fsdev0,path=${V9PPATH} -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=${V9PTAG} "
fi
qm set ${VMID} --args "${ARGS}"
if [ $? -ne 0 ]; then
echo "Set args failed"
qm destroy ${VMID} --purge
exit 1
fi
if [ -n "${VFSDIRID}" ]; then
# pvesh create /cluster/mapping/dir --id "${VFSDIRID}" -map node=node1,path=/path/to/share1 --map node=node2,path=/path/to/share2
qm set ${VMID} --virtiofs0 dirid=${VFSDIRID},cache=always,direct-io=1
fi
# 添加 32G 数据盘
qm set ${VMID} --sata$((SATAIDX++)) ${STORAGE}:32
BRIDGE=$(awk -F: '/^iface vmbr/ {print $1}' /etc/network/interfaces | awk '{print $2}' | head -1)
if [ -z "${BRIDGE}" ]; then
echo "Get bridge failed"
qm destroy ${VMID} --purge
exit 1
fi
qm set ${VMID} --net0 virtio,bridge=${BRIDGE}
qm set ${VMID} --serial0 socket
qm set ${VMID} --agent enabled=1
qm set ${VMID} --smbios1 "uuid=$(cat /proc/sys/kernel/random/uuid),manufacturer=$(echo -n "RROrg" | base64),product=$(echo -n "RR" | base64),version=$(echo -n "$TAG" | base64),base64=1"
qm set ${VMID} --onboot "${ONBOOT}"
echo "Created success, VMID=${VMID}"

View File

@ -1,117 +0,0 @@
#!/usr/bin/env bash
#
# Copyright (C) 2022 Ing <https://github.com/wjz304>
#
# This is free software, licensed under the MIT License.
# See /LICENSE for more information.
#
# sudo apt update
# sudo apt install -y locales busybox dialog gettext sed gawk jq curl
# sudo apt install -y python-is-python3 python3-pip libelf-dev qemu-utils dosfstools cpio xz-utils lz4 lzma bzip2 gzip zstd
# # sudo snap install yq
# if ! type yq >/dev/null 2>&1 || ! yq --version 2>/dev/null | grep -q "v4."; then
# sudo curl -kL https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/bin/yq && sudo chmod a+x /usr/bin/yq
# fi
#
# # Backup the original python3 executable.
# sudo mv -f "$(realpath $(which python3))/EXTERNALLY-MANAGED" "$(realpath $(which python3))/EXTERNALLY-MANAGED.bak" 2>/dev/null || true
# sudo pip3 install -U click requests requests-toolbelt qrcode[pil] beautifulsoup4
#
# sudo locale-gen ar_SA.UTF-8 de_DE.UTF-8 en_US.UTF-8 es_ES.UTF-8 fr_FR.UTF-8 ja_JP.UTF-8 ko_KR.UTF-8 ru_RU.UTF-8 th_TH.UTF-8 tr_TR.UTF-8 uk_UA.UTF-8 vi_VN.UTF-8 zh_CN.UTF-8 zh_HK.UTF-8 zh_TW.UTF-8
#
# export TOKEN="${1}"
#
if [ "$(id -u)" -ne 0 ]; then
echo "This script must be run as root"
exit 1
fi
. scripts/func.sh "${TOKEN}"
echo "Get extractor"
getCKs "files/mnt/p3/cks" "true"
getLKMs "files/mnt/p3/lkms" "true"
getAddons "files/mnt/p3/addons" "true"
getModules "files/mnt/p3/modules" "true"
getBuildroot "files/mnt/p3" "true"
getExtractor "files/mnt/p3/extractor"
echo "Repack initrd"
convertpo2mo "files/initrd/opt/rr/lang"
repackInitrd "files/mnt/p3/initrd-rr" "files/initrd"
if [ -n "${1}" ]; then
LOADER_DISK="LOCALBUILD"
CHROOT_PATH="$(realpath files)"
export LOADER_DISK="LOCALBUILD"
export CHROOT_PATH="${CHROOT_PATH}"
(
cd "${CHROOT_PATH}/initrd/opt/rr" || exit 1
./init.sh
./menu.sh modelMenu "${1}"
./menu.sh productversMenu "${2:-7.2}"
./menu.sh make -1
./menu.sh cleanCache -1
)
fi
IMAGE_FILE="rr.img"
gzip -dc "files/initrd/opt/rr/grub.img.gz" >"${IMAGE_FILE}"
fdisk -l "${IMAGE_FILE}"
LOOPX=$(sudo losetup -f)
sudo losetup -P "${LOOPX}" "${IMAGE_FILE}"
# Check partitions and ignore errors
fsck.vfat -aw "${LOOPX}p1" >/dev/null 2>&1 || true
fsck.ext2 -p "${LOOPX}p2" >/dev/null 2>&1 || true
fsck.ext4 -p "${LOOPX}p3" >/dev/null 2>&1 || true
for i in {1..3}; do
[ ! -d "files/mnt/p${i}" ] && continue
rm -rf "/tmp/mnt/p${i}"
mkdir -p "/tmp/mnt/p${i}"
echo "Mounting ${LOOPX}p${i}"
sudo mount "${LOOPX}p${i}" "/tmp/mnt/p${i}" || {
echo "Can't mount ${LOOPX}p${i}."
break
}
echo "Copying files to ${LOOPX}p${i}"
[ ${i} -eq 1 ] && sudo cp -af "files/mnt/p${i}/"{.locale,.timezone} "/tmp/mnt/p${i}/" 2>/dev/null || true
sudo cp -rf "files/mnt/p${i}/"* "/tmp/mnt/p${i}" || true
sudo sync
echo "Unmounting ${LOOPX}p${i}"
sudo umount "/tmp/mnt/p${i}" || {
echo "Can't umount ${LOOPX}p${i}."
break
}
rm -rf "/tmp/mnt/p${i}"
done
sudo losetup --detach "${LOOPX}"
resizeImg "${IMAGE_FILE}" "+2560M"
# convertova "${IMAGE_FILE}" "${IMAGE_FILE/.img/.ova}"
# update.zip
sha256sum update-list.yml update-check.sh >sha256sum
zip -9j "update.zip" update-list.yml update-check.sh
while read -r F; do
if [ -d "${F}" ]; then
FTGZ="$(basename "${F}").tgz"
tar -zcf "${FTGZ}" -C "${F}" .
sha256sum "${FTGZ}" >>sha256sum
zip -9j "update.zip" "${FTGZ}"
rm -f "${FTGZ}"
else
(cd "$(dirname "${F}")" && sha256sum "$(basename "${F}")") >>sha256sum
zip -9j "update.zip" "${F}"
fi
done <<<"$(yq '.replace | explode(.) | to_entries | map([.key])[] | .[]' update-list.yml)"
zip -9j "update.zip" sha256sum