mirror of
https://github.com/RROrg/rr.git
synced 2025-12-14 07:59:39 +08:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cdcceea395 | ||
|
|
ce9017bae1 | ||
|
|
cfdf7cc3fc | ||
|
|
9a4103f028 | ||
|
|
15e88c0b38 | ||
|
|
2909e46732 | ||
|
|
8e7f50c2e5 | ||
|
|
6093ab1bd4 | ||
|
|
2b0985d276 | ||
|
|
e748c366f2 | ||
|
|
c59f446006 | ||
|
|
d39b0ada77 | ||
|
|
dbc819cdd8 | ||
|
|
9e24063ad7 |
5
.github/workflows/data.yml
vendored
5
.github/workflows/data.yml
vendored
@ -41,11 +41,10 @@ jobs:
|
|||||||
TAG=""
|
TAG=""
|
||||||
for i in {1..3}; do
|
for i in {1..3}; do
|
||||||
if [ "${PRERELEASE}" = "true" ]; then
|
if [ "${PRERELEASE}" = "true" ]; then
|
||||||
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1)"
|
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1 | sed 's/^[v|V]//g')"
|
||||||
else
|
else
|
||||||
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}')"
|
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}' | sed 's/^[v|V]//g')"
|
||||||
fi
|
fi
|
||||||
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
|
|
||||||
rm -f rr-${TAG}.img.zip
|
rm -f rr-${TAG}.img.zip
|
||||||
STATUS=$(curl -kL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "rr-${TAG}.img.zip")
|
STATUS=$(curl -kL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "rr-${TAG}.img.zip")
|
||||||
if [ $? -eq 0 ] && [ ${STATUS:-0} -eq 200 ]; then
|
if [ $? -eq 0 ] && [ ${STATUS:-0} -eq 200 ]; then
|
||||||
|
|||||||
15
.github/workflows/issues.yml
vendored
15
.github/workflows/issues.yml
vendored
@ -29,11 +29,13 @@ jobs:
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
def set_env(name, value):
|
def set_env(name, value):
|
||||||
with open(os.environ['GITHUB_ENV'], 'a', encoding='utf-8') as f:
|
subprocess.call(f'echo "{name}<<EOF" >> $GITHUB_ENV', shell=True)
|
||||||
f.write(f'{name}={value}\n')
|
subprocess.call(f'echo "{value}" >> $GITHUB_ENV', shell=True)
|
||||||
|
subprocess.call(f'echo "EOF" >> $GITHUB_ENV', shell=True)
|
||||||
|
|
||||||
issuetitle = """${{ github.event.issue.title }}"""
|
issuetitle = """${{ github.event.issue.title }}"""
|
||||||
issuebody = """${{ github.event.issue.body }}"""
|
issuebody = """${{ github.event.issue.body }}"""
|
||||||
|
|
||||||
@ -159,11 +161,10 @@ jobs:
|
|||||||
|
|
||||||
TAG=""
|
TAG=""
|
||||||
if [ "${PRERELEASE}" = "true" ]; then
|
if [ "${PRERELEASE}" = "true" ]; then
|
||||||
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1)"
|
TAG="$(curl -skL --connect-timeout 10 "${REPO}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1 | sed 's/^[v|V]//g')"
|
||||||
else
|
else
|
||||||
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}')"
|
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}' | sed 's/^[v|V]//g')"
|
||||||
fi
|
fi
|
||||||
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
|
|
||||||
rm -f rr-${TAG}.img.zip
|
rm -f rr-${TAG}.img.zip
|
||||||
STATUS=$(curl -kL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "rr-${TAG}.img.zip")
|
STATUS=$(curl -kL --connect-timeout 10 -w "%{http_code}" "${REPO}/releases/download/${TAG}/rr-${TAG}.img.zip" -o "rr-${TAG}.img.zip")
|
||||||
if [ $? -ne 0 ] || [ ${STATUS:-0} -ne 200 ]; then
|
if [ $? -ne 0 ] || [ ${STATUS:-0} -ne 200 ]; then
|
||||||
@ -268,7 +269,7 @@ jobs:
|
|||||||
;;
|
;;
|
||||||
vmdk)
|
vmdk)
|
||||||
echo "VMDK"
|
echo "VMDK"
|
||||||
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' rr/rr.vmdk
|
qemu-img convert rr/rr.img -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicSparse,compat6' rr/rr.vmdk
|
||||||
(cd rr && sha256sum rr.vmdk >../sha256sum)
|
(cd rr && sha256sum rr.vmdk >../sha256sum)
|
||||||
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vmdk.zip" -j rr/rr.vmdk sha256sum README.txt
|
zip -9 "rr-${{ env.model }}-${TAG}-${{ github.run_id }}.vmdk.zip" -j rr/rr.vmdk sha256sum README.txt
|
||||||
;;
|
;;
|
||||||
|
|||||||
39
README.md
39
README.md
@ -45,6 +45,45 @@ If you cannot connect to the Internet, please build a pre-compiled bootloader th
|
|||||||
--img <path> Local image path, use local image if set
|
--img <path> Local image path, use local image if set
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- Docker Compose:
|
||||||
|
```yml
|
||||||
|
# 请从最新版本中下载 rr.img 文件。
|
||||||
|
# 并将 <path_to_rr.img> 替换为你的 rr.img 文件的实际路径.
|
||||||
|
# Please download the rr.img file from the latest release.
|
||||||
|
# And replace <path_to_rr.img> with the actual path to your rr.img file.
|
||||||
|
|
||||||
|
version: "3.9"
|
||||||
|
services:
|
||||||
|
rr:
|
||||||
|
image: qemux/qemu:latest
|
||||||
|
container_name: rr
|
||||||
|
environment:
|
||||||
|
BOOT: ""
|
||||||
|
RAM_SIZE: "4G" # >= 4G recommended for DSM
|
||||||
|
CPU_CORES: "2"
|
||||||
|
DISK_FMT: "qcow2"
|
||||||
|
DISK_TYPE: "sata"
|
||||||
|
DISK_SIZE: "32G" # data disk size
|
||||||
|
ARGUMENTS: "-device nec-usb-xhci,id=usb0,multifunction=on -drive file=/rr.img,media=disk,format=raw,if=none,id=udisk1 -device usb-storage,bus=usb0.0,port=1,drive=udisk1,bootindex=999,removable=on"
|
||||||
|
devices:
|
||||||
|
- /dev/kvm
|
||||||
|
- /dev/net/tun
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
ports:
|
||||||
|
- 5000:5000 # For DSM management
|
||||||
|
- 5001:5001 # For DSM management
|
||||||
|
- 7681:7681 # For RR management
|
||||||
|
- 7304:7304 # For RR management
|
||||||
|
- 7080:7080 # For RR management
|
||||||
|
- 8006:8006 # For QEMU management
|
||||||
|
volumes:
|
||||||
|
- ./rr.img:/rr.img # <path_to_rr.img>:/rr.img
|
||||||
|
- ./data:/storage
|
||||||
|
restart: always
|
||||||
|
stop_grace_period: 2m
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
### 4: GPU:
|
### 4: GPU:
|
||||||
|
|
||||||
|
|||||||
BIN
docs/addons.xlsx
BIN
docs/addons.xlsx
Binary file not shown.
BIN
docs/models.xlsx
BIN
docs/models.xlsx
Binary file not shown.
2680
docs/modules.json
2680
docs/modules.json
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
docs/pats.xlsx
BIN
docs/pats.xlsx
Binary file not shown.
@ -113,7 +113,7 @@ printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "MEM: ")" "${MEM}"
|
|||||||
if readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q nvmesystem; then
|
if readConfigMap "addons" "${USER_CONFIG_FILE}" | grep -q nvmesystem; then
|
||||||
[ -z "$(ls /dev/nvme* | grep -vE "${LOADER_DISK}[0-9]?$" 2>/dev/null)" ] && printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please insert at least one m.2 disk for system installation.")"
|
[ -z "$(ls /dev/nvme* | grep -vE "${LOADER_DISK}[0-9]?$" 2>/dev/null)" ] && printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please insert at least one m.2 disk for system installation.")"
|
||||||
else
|
else
|
||||||
[ -z "$(ls /dev/sd* | grep -vE "${LOADER_DISK}[0-9]?$" 2>/dev/null)" ] && printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please insert at least one sata disk for system installation.")"
|
[ -z "$(ls /dev/sd* | grep -vE "${LOADER_DISK}[0-9]?$" 2>/dev/null)" ] && printf "\033[1;33m*** %s ***\033[0m\n" "$(TEXT "Notice: Please insert at least one sata disk for system installation.")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if checkBIOS_VT_d && [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
|
if checkBIOS_VT_d && [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
|
||||||
@ -164,6 +164,15 @@ fi
|
|||||||
|
|
||||||
CMDLINE['skip_vender_mac_interfaces']="$(seq -s, 0 $((${CMDLINE['netif_num']:-1} - 1)))"
|
CMDLINE['skip_vender_mac_interfaces']="$(seq -s, 0 $((${CMDLINE['netif_num']:-1} - 1)))"
|
||||||
|
|
||||||
|
ETHX="$(find /sys/class/net/ -mindepth 1 -maxdepth 1 ! -name lo -exec basename {} \; | sort)"
|
||||||
|
for N in ${ETHX}; do
|
||||||
|
MAC="$(cat "/sys/class/net/${N}/address" 2>/dev/null)" || MAC="00:00:00:00:00:00"
|
||||||
|
BUS="$(ethtool -i "${N}" 2>/dev/null | grep "bus-info" | cut -d' ' -f2)" || BUS="0000:00:00.0"
|
||||||
|
if [ ! "${MAC}" = "00:00:00:00:00:00" ] && [ ! "${BUS}" = "0000:00:00.0" ]; then
|
||||||
|
CMDLINE["R${BUS}"]="${MAC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# set fixed cmdline
|
# set fixed cmdline
|
||||||
if grep -q "force_junior" /proc/cmdline; then
|
if grep -q "force_junior" /proc/cmdline; then
|
||||||
CMDLINE['force_junior']=""
|
CMDLINE['force_junior']=""
|
||||||
@ -336,7 +345,7 @@ function _bootwait() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DIRECT="$(readConfigKey "directboot" "${USER_CONFIG_FILE}")"
|
DIRECT="$(readConfigKey "directboot" "${USER_CONFIG_FILE}")"
|
||||||
if [ "${DIRECT}" = "true" ] || [ "${MEV:-physical}" = "parallels" ]; then
|
if [ "${DIRECT}" = "true" ] || echo "parallels xen" | grep -qw "${MEV:-physical}"; then
|
||||||
# grubenv file limit is 1024 bytes.
|
# grubenv file limit is 1024 bytes.
|
||||||
grub-editenv "${USER_RSYSENVFILE}" create
|
grub-editenv "${USER_RSYSENVFILE}" create
|
||||||
grub-editenv "${USER_RSYSENVFILE}" set rr_version="${WTITLE}"
|
grub-editenv "${USER_RSYSENVFILE}" set rr_version="${WTITLE}"
|
||||||
@ -435,11 +444,8 @@ else
|
|||||||
IP="$(getIP)"
|
IP="$(getIP)"
|
||||||
echo "${IP}" | grep -q "^169\.254\." && IP=""
|
echo "${IP}" | grep -q "^169\.254\." && IP=""
|
||||||
[ -n "${IP}" ] && URL="http://${IP}:5000" || URL="http://find.synology.com/"
|
[ -n "${IP}" ] && URL="http://${IP}:5000" || URL="http://find.synology.com/"
|
||||||
python3 "${WORK_PATH}/include/functions.py" "makeqr" -d "${URL}" -l "6" -o "${TMP_PATH}/qrcode_boot.png"
|
python3 "${WORK_PATH}/include/functions.py" "makeqr" -d "${URL}" -l "7" -o "${TMP_PATH}/qrcode_boot.png"
|
||||||
[ -f "${TMP_PATH}/qrcode_boot.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_boot.png" >/dev/null 2>&1 || true
|
[ -f "${TMP_PATH}/qrcode_boot.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_boot.png" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
python3 "${WORK_PATH}/include/functions.py" "makeqr" -f "${WORK_PATH}/include/qhxg.png" -l "7" -o "${TMP_PATH}/qrcode_qhxg.png"
|
|
||||||
[ -f "${TMP_PATH}/qrcode_qhxg.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_qhxg.png" >/dev/null 2>&1 || true
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Executes DSM kernel via KEXEC
|
# Executes DSM kernel via KEXEC
|
||||||
|
|||||||
@ -61,15 +61,16 @@ function getAllModules() {
|
|||||||
UNPATH="${TMP_PATH}/modules"
|
UNPATH="${TMP_PATH}/modules"
|
||||||
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
|
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
|
||||||
|
|
||||||
for F in ${UNPATH}/*.ko; do
|
for D in "" "update"; do
|
||||||
[ ! -e "${F}" ] && continue
|
for F in ${UNPATH}/${D:+${D}/}*.ko; do
|
||||||
local N DESC
|
[ ! -e "${F}" ] && continue
|
||||||
N="$(basename "${F}" .ko)"
|
local N DESC
|
||||||
DESC="$(modinfo -F description "${F}" 2>/dev/null)"
|
N="$(basename "${F}" .ko)"
|
||||||
DESC="$(echo "${DESC}" | tr -d '\n\r\t\\' | sed "s/\"/'/g")"
|
DESC="$(modinfo -F description "${F}" 2>/dev/null)"
|
||||||
echo "${N} \"${DESC:-${N}}\""
|
DESC="$(echo "${DESC}" | tr -d '\n\r\t\\' | sed "s/\"/'/g")"
|
||||||
|
echo "${D:+${D}/}${N} \"${DESC:-${D:+${D}/}${N}}\""
|
||||||
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
rm -rf "${UNPATH}"
|
rm -rf "${UNPATH}"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,15 +123,18 @@ function installModules() {
|
|||||||
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
|
unpackModules "${PLATFORM}" "${PKVER}" "${UNPATH}"
|
||||||
|
|
||||||
ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")"
|
ODP="$(readConfigKey "odp" "${USER_CONFIG_FILE}")"
|
||||||
for F in ${UNPATH}/*.ko; do
|
for D in "" "update"; do
|
||||||
[ ! -e "${F}" ] && continue
|
for F in ${UNPATH}/${D:+${D}/}*.ko; do
|
||||||
M=$(basename "${F}")
|
[ ! -e "${F}" ] && continue
|
||||||
[ "${ODP}" = "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${M}" ] && continue
|
M=$(basename "${F}")
|
||||||
if echo "${MLIST}" | grep -wq "$(basename "${M}" .ko)"; then
|
[ "${ODP}" = "true" ] && [ -f "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}${M}" ] && continue # TODO: check if module is already loaded
|
||||||
cp -f "${F}" "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}"
|
if echo "${MLIST}" | grep -wq "${D:+${D}/}$(basename "${M}" .ko)"; then
|
||||||
else
|
mkdir -p "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}"
|
||||||
rm -f "${RAMDISK_PATH}/usr/lib/modules/${M}" 2>"${LOG_FILE}"
|
cp -f "${F}" "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}${M}" 2>"${LOG_FILE}"
|
||||||
fi
|
else
|
||||||
|
rm -f "${RAMDISK_PATH}/usr/lib/modules/${D:+${D}/}${M}" 2>"${LOG_FILE}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
rm -rf "${UNPATH}"
|
rm -rf "${UNPATH}"
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 227 KiB |
@ -263,9 +263,6 @@ if [ "${DSMLOGO}" = "true" ] && [ -c "/dev/fb0" ] && [ ! -f "/.dockerenv" ]; the
|
|||||||
[ -n "${IP}" ] && URL="http://${IP}:${TTYD:-7681}" || URL="http://rr:${TTYD:-7681}"
|
[ -n "${IP}" ] && URL="http://${IP}:${TTYD:-7681}" || URL="http://rr:${TTYD:-7681}"
|
||||||
python3 "${WORK_PATH}/include/functions.py" makeqr -d "${URL}" -l "0" -o "${TMP_PATH}/qrcode_init.png"
|
python3 "${WORK_PATH}/include/functions.py" makeqr -d "${URL}" -l "0" -o "${TMP_PATH}/qrcode_init.png"
|
||||||
[ -f "${TMP_PATH}/qrcode_init.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_init.png" >/dev/null 2>&1 || true
|
[ -f "${TMP_PATH}/qrcode_init.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_init.png" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
python3 "${WORK_PATH}/include/functions.py" makeqr -f "${WORK_PATH}/include/qhxg.png" -l "7" -o "${TMP_PATH}/qrcode_qhxg.png"
|
|
||||||
[ -f "${TMP_PATH}/qrcode_qhxg.png" ] && echo | fbv -acufi "${TMP_PATH}/qrcode_qhxg.png" >/dev/null 2>&1 || true
|
|
||||||
fi
|
fi
|
||||||
WEBHOOKURL="$(readConfigKey "webhookurl" "${USER_CONFIG_FILE}")"
|
WEBHOOKURL="$(readConfigKey "webhookurl" "${USER_CONFIG_FILE}")"
|
||||||
if [ -n "${WEBHOOKURL}" ] && [ ! -f "${TMP_PATH}/WebhookSent" ] && [ ! -f "/.dockerenv" ]; then
|
if [ -n "${WEBHOOKURL}" ] && [ ! -f "${TMP_PATH}/WebhookSent" ] && [ ! -f "/.dockerenv" ]; then
|
||||||
|
|||||||
@ -456,6 +456,7 @@ function reconfiguringV() {
|
|||||||
deleteConfigKey "addons.\"${ADDON}\"" "${USER_CONFIG_FILE}"
|
deleteConfigKey "addons.\"${ADDON}\"" "${USER_CONFIG_FILE}"
|
||||||
fi
|
fi
|
||||||
done <<<"$(readConfigMap "addons" "${USER_CONFIG_FILE}")"
|
done <<<"$(readConfigMap "addons" "${USER_CONFIG_FILE}")"
|
||||||
|
|
||||||
# Rewrite modules
|
# Rewrite modules
|
||||||
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
|
writeConfigKey "modules" "{}" "${USER_CONFIG_FILE}"
|
||||||
mergeConfigModules "$(getAllModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
|
mergeConfigModules "$(getAllModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" | awk '{print $1}')" "${USER_CONFIG_FILE}"
|
||||||
@ -3549,11 +3550,10 @@ function downloadExts() {
|
|||||||
TAG=""
|
TAG=""
|
||||||
if [ "${PRERELEASE}" = "true" ]; then
|
if [ "${PRERELEASE}" = "true" ]; then
|
||||||
# TAG="$(curl -skL --connect-timeout 10 "${PROXY}${3}/tags" | pup 'a[class="Link--muted"] attr{href}' | grep ".zip" | head -1)"
|
# TAG="$(curl -skL --connect-timeout 10 "${PROXY}${3}/tags" | pup 'a[class="Link--muted"] attr{href}' | grep ".zip" | head -1)"
|
||||||
TAG="$(curl -skL --connect-timeout 10 "${PROXY}${3}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1)"
|
TAG="$(curl -skL --connect-timeout 10 "${PROXY}${3}/tags" | grep "/refs/tags/.*\.zip" | sed -E 's/.*\/refs\/tags\/(.*)\.zip.*$/\1/' | sort -rV | head -1 | sed 's/^[v|V]//g')"
|
||||||
else
|
else
|
||||||
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${PROXY}${3}/releases/latest" | awk -F'/' '{print $NF}')"
|
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${PROXY}${3}/releases/latest" | awk -F'/' '{print $NF}' | sed 's/^[v|V]//g')"
|
||||||
fi
|
fi
|
||||||
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
|
|
||||||
if [ "${TAG:-latest}" = "latest" ]; then
|
if [ "${TAG:-latest}" = "latest" ]; then
|
||||||
MSG="$(printf "%s\n%s:\n%s\n" "$(TEXT "Error checking new version.")" "$(TEXT "Error")" "Tag is ${TAG}")"
|
MSG="$(printf "%s\n%s:\n%s\n" "$(TEXT "Error checking new version.")" "$(TEXT "Error")" "Tag is ${TAG}")"
|
||||||
DIALOG --title "${T}" \
|
DIALOG --title "${T}" \
|
||||||
|
|||||||
@ -31,6 +31,8 @@ productvers4: &productvers4
|
|||||||
kver: "4.4.180"
|
kver: "4.4.180"
|
||||||
"7.2":
|
"7.2":
|
||||||
kver: "4.4.302"
|
kver: "4.4.302"
|
||||||
|
"7.3":
|
||||||
|
kver: "4.4.302"
|
||||||
|
|
||||||
productvers5: &productvers5
|
productvers5: &productvers5
|
||||||
"7.1":
|
"7.1":
|
||||||
@ -39,6 +41,9 @@ productvers5: &productvers5
|
|||||||
"7.2":
|
"7.2":
|
||||||
kpre: "7.2"
|
kpre: "7.2"
|
||||||
kver: "5.10.55"
|
kver: "5.10.55"
|
||||||
|
"7.3":
|
||||||
|
kpre: "7.3"
|
||||||
|
kver: "5.10.55"
|
||||||
|
|
||||||
platforms:
|
platforms:
|
||||||
apollolake:
|
apollolake:
|
||||||
|
|||||||
@ -37,7 +37,7 @@ KVER="$(readConfigKey "kver" "${USER_CONFIG_FILE}")"
|
|||||||
KPRE="$(readConfigKey "kpre" "${USER_CONFIG_FILE}")"
|
KPRE="$(readConfigKey "kpre" "${USER_CONFIG_FILE}")"
|
||||||
|
|
||||||
# Sanity check
|
# Sanity check
|
||||||
if [ -z "${PLATFORM}" ] || [ -z "${KVER}" ]; then
|
if [ -z "${PLATFORM}" ] || [ -z "${KPRE:+${KPRE}-}${KVER}" ]; then
|
||||||
echo "ERROR: Configuration for model ${MODEL} and productversion ${PRODUCTVER} not found." >"${LOG_FILE}"
|
echo "ERROR: Configuration for model ${MODEL} and productversion ${PRODUCTVER} not found." >"${LOG_FILE}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@ -100,6 +100,7 @@ while IFS=': ' read -r KEY VALUE; do
|
|||||||
done <<<"$(readConfigMap "synoinfo" "${USER_CONFIG_FILE}")"
|
done <<<"$(readConfigMap "synoinfo" "${USER_CONFIG_FILE}")"
|
||||||
|
|
||||||
# Patches (diff -Naru OLDFILE NEWFILE > xxx.patch)
|
# Patches (diff -Naru OLDFILE NEWFILE > xxx.patch)
|
||||||
|
echo -n "."
|
||||||
PATCHS=(
|
PATCHS=(
|
||||||
"ramdisk-etc-rc-*.patch"
|
"ramdisk-etc-rc-*.patch"
|
||||||
"ramdisk-init-script-*.patch"
|
"ramdisk-init-script-*.patch"
|
||||||
@ -119,11 +120,26 @@ for PE in "${PATCHS[@]}"; do
|
|||||||
done
|
done
|
||||||
[ ${RET} -ne 0 ] && exit 1
|
[ ${RET} -ne 0 ] && exit 1
|
||||||
done
|
done
|
||||||
|
# for DSM 7.3
|
||||||
|
sed -i 's#/usr/syno/sbin/broadcom_update.sh#/usr/syno/sbin/broadcom_update.sh.rr#g' "${RAMDISK_PATH}/linuxrc.syno.impl"
|
||||||
|
# LKM
|
||||||
|
gzip -dc "${LKMS_PATH}/rp-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}-${LKM}.ko.gz" >"${RAMDISK_PATH}/usr/lib/modules/rp.ko" 2>"${LOG_FILE}" || exit 1
|
||||||
|
if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
|
||||||
|
# Copying fake modprobe
|
||||||
|
cp -f "${WORK_PATH}/patch/iosched-trampoline.sh" "${RAMDISK_PATH}/usr/sbin/modprobe"
|
||||||
|
else
|
||||||
|
# for issues/313
|
||||||
|
sed -i 's#/dev/console#/var/log/lrc#g' "${RAMDISK_PATH}/usr/bin/busybox"
|
||||||
|
sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' "${RAMDISK_PATH}/linuxrc.syno"
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir -p "${RAMDISK_PATH}/addons"
|
if [ "${PLATFORM}" = "broadwellntbap" ]; then
|
||||||
|
sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' "${RAMDISK_PATH}/usr/syno/share/environments.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
# Addons
|
# Addons
|
||||||
echo -n "."
|
echo -n "."
|
||||||
|
mkdir -p "${RAMDISK_PATH}/addons"
|
||||||
echo "Create addons.sh" >"${LOG_FILE}"
|
echo "Create addons.sh" >"${LOG_FILE}"
|
||||||
{
|
{
|
||||||
echo "#!/bin/sh"
|
echo "#!/bin/sh"
|
||||||
@ -142,7 +158,7 @@ echo "Create addons.sh" >"${LOG_FILE}"
|
|||||||
chmod +x "${RAMDISK_PATH}/addons/addons.sh"
|
chmod +x "${RAMDISK_PATH}/addons/addons.sh"
|
||||||
|
|
||||||
# This order cannot be changed.
|
# This order cannot be changed.
|
||||||
for ADDON in "redpill" "revert" "misc" "eudev" "disks" "localrss" "notify" "wol"; do
|
for ADDON in "redpill" "revert" "misc" "eudev" "netfix" "disks" "localrss" "notify" "wol"; do
|
||||||
PARAMS=""
|
PARAMS=""
|
||||||
if [ "${ADDON}" = "disks" ]; then
|
if [ "${ADDON}" = "disks" ]; then
|
||||||
[ -f "${USER_UP_PATH}/model.dts" ] && cp -f "${USER_UP_PATH}/model.dts" "${RAMDISK_PATH}/addons/model.dts"
|
[ -f "${USER_UP_PATH}/model.dts" ] && cp -f "${USER_UP_PATH}/model.dts" "${RAMDISK_PATH}/addons/model.dts"
|
||||||
@ -159,14 +175,17 @@ for ADDON in "${!ADDONS[@]}"; do
|
|||||||
echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1
|
echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >>"${RAMDISK_PATH}/addons/addons.sh" 2>>"${LOG_FILE}" || exit 1
|
||||||
done
|
done
|
||||||
|
|
||||||
# Extract ck modules to ramdisk
|
# Modules
|
||||||
echo -n "."
|
echo -n "."
|
||||||
installModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" "${!MODULES[@]}" || exit 1
|
installModules "${PLATFORM}" "${KPRE:+${KPRE}-}${KVER}" "${!MODULES[@]}" || exit 1
|
||||||
|
# Build modules dependencies
|
||||||
# Copying fake modprobe
|
# ${WORK_PATH}/depmod -a -b ${RAMDISK_PATH} 2>/dev/null # addon eudev will do this
|
||||||
[ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ] && cp -f "${WORK_PATH}/patch/iosched-trampoline.sh" "${RAMDISK_PATH}/usr/sbin/modprobe"
|
# Copying modulelist
|
||||||
# Copying LKM to /usr/lib/modules
|
if [ -f "${USER_UP_PATH}/modulelist" ]; then
|
||||||
gzip -dc "${LKMS_PATH}/rp-${PLATFORM}-${KPRE:+${KPRE}-}${KVER}-${LKM}.ko.gz" >"${RAMDISK_PATH}/usr/lib/modules/rp.ko" 2>"${LOG_FILE}" || exit 1
|
cp -f "${USER_UP_PATH}/modulelist" "${RAMDISK_PATH}/addons/modulelist"
|
||||||
|
else
|
||||||
|
cp -f "${WORK_PATH}/patch/modulelist" "${RAMDISK_PATH}/addons/modulelist"
|
||||||
|
fi
|
||||||
|
|
||||||
# Patch synoinfo.conf
|
# Patch synoinfo.conf
|
||||||
echo -n "."
|
echo -n "."
|
||||||
@ -189,17 +208,7 @@ fi
|
|||||||
echo -n "."
|
echo -n "."
|
||||||
echo "Modify files" >"${LOG_FILE}"
|
echo "Modify files" >"${LOG_FILE}"
|
||||||
# Remove function from scripts
|
# Remove function from scripts
|
||||||
[ "2" = "${BUILDNUM:0:1}" ] && find "${RAMDISK_PATH}/addons/" -type f -name "*.sh" -exec sed -i 's/function //g' {} \;
|
[ "${BUILDNUM}" -le 25556 ] && find "${RAMDISK_PATH}/addons/" -type f -name "*.sh" -exec sed -i 's/function //g' {} \;
|
||||||
|
|
||||||
# Build modules dependencies
|
|
||||||
# ${WORK_PATH}/depmod -a -b ${RAMDISK_PATH} 2>/dev/null # addon eudev will do this
|
|
||||||
|
|
||||||
# Copying modulelist
|
|
||||||
if [ -f "${USER_UP_PATH}/modulelist" ]; then
|
|
||||||
cp -f "${USER_UP_PATH}/modulelist" "${RAMDISK_PATH}/addons/modulelist"
|
|
||||||
else
|
|
||||||
cp -f "${WORK_PATH}/patch/modulelist" "${RAMDISK_PATH}/addons/modulelist"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# backup current loader configs
|
# backup current loader configs
|
||||||
mkdir -p "${RAMDISK_PATH}/usr/rr"
|
mkdir -p "${RAMDISK_PATH}/usr/rr"
|
||||||
@ -232,18 +241,6 @@ for N in $(seq 0 7); do
|
|||||||
echo -e "DEVICE=eth${N}\nBOOTPROTO=dhcp\nONBOOT=yes\nIPV6INIT=auto_dhcp\nIPV6_ACCEPT_RA=1" >"${RAMDISK_PATH}/etc/sysconfig/network-scripts/ifcfg-eth${N}"
|
echo -e "DEVICE=eth${N}\nBOOTPROTO=dhcp\nONBOOT=yes\nIPV6INIT=auto_dhcp\nIPV6_ACCEPT_RA=1" >"${RAMDISK_PATH}/etc/sysconfig/network-scripts/ifcfg-eth${N}"
|
||||||
done
|
done
|
||||||
|
|
||||||
# issues/313
|
|
||||||
if [ "$(echo "${KVER:-4}" | cut -d'.' -f1)" -lt 5 ]; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
sed -i 's#/dev/console#/var/log/lrc#g' "${RAMDISK_PATH}/usr/bin/busybox"
|
|
||||||
sed -i '/^echo "START/a \\nmknod -m 0666 /dev/console c 1 3' "${RAMDISK_PATH}/linuxrc.syno"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${PLATFORM}" = "broadwellntbap" ]; then
|
|
||||||
sed -i 's/IsUCOrXA="yes"/XIsUCOrXA="yes"/g; s/IsUCOrXA=yes/XIsUCOrXA=yes/g' "${RAMDISK_PATH}/usr/syno/share/environments.sh"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Call user patch scripts
|
# Call user patch scripts
|
||||||
echo -n "."
|
echo -n "."
|
||||||
for F in ${SCRIPTS_PATH}/*.sh; do
|
for F in ${SCRIPTS_PATH}/*.sh; do
|
||||||
|
|||||||
2
guide.md
2
guide.md
@ -49,7 +49,7 @@
|
|||||||
# brew install qemu-img # MacOS
|
# brew install qemu-img # MacOS
|
||||||
|
|
||||||
# img to vmdk (VMWare / ESXi6 / ESXi7)
|
# img to vmdk (VMWare / ESXi6 / ESXi7)
|
||||||
qemu-img convert -O vmdk -o adapter_type=lsilogic,subformat=streamOptimized,compat6 rr.img rr.vmdk
|
qemu-img convert -O vmdk -o adapter_type=lsilogic,subformat=monolithicSparse,compat6 rr.img rr.vmdk
|
||||||
|
|
||||||
# img to vmdk (ESXi8)
|
# img to vmdk (ESXi8)
|
||||||
qemu-img convert -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat,compat6 rr.img rr.vmdk
|
qemu-img convert -O vmdk -o adapter_type=lsilogic,subformat=monolithicFlat,compat6 rr.img rr.vmdk
|
||||||
|
|||||||
@ -365,7 +365,7 @@ function createvmx() {
|
|||||||
# Convert raw image to VMDK
|
# Convert raw image to VMDK
|
||||||
rm -rf "VMX_${VMNAME}"
|
rm -rf "VMX_${VMNAME}"
|
||||||
mkdir -p "VMX_${VMNAME}"
|
mkdir -p "VMX_${VMNAME}"
|
||||||
qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=streamOptimized,compat6' "${BLIMAGE}" "VMX_${VMNAME}/${VMNAME}-disk1.vmdk"
|
qemu-img convert -O vmdk -o 'adapter_type=lsilogic,subformat=monolithicSparse,compat6' "${BLIMAGE}" "VMX_${VMNAME}/${VMNAME}-disk1.vmdk" # 'adapter_type=lsilogic,subformat=streamOptimized,compat6'
|
||||||
qemu-img create -f vmdk "VMX_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
|
qemu-img create -f vmdk "VMX_${VMNAME}/${VMNAME}-disk2.vmdk" "32G"
|
||||||
|
|
||||||
# Create VM configuration
|
# Create VM configuration
|
||||||
@ -466,7 +466,7 @@ function convertova() {
|
|||||||
# Download and install ovftool if it doesn't exist
|
# Download and install ovftool if it doesn't exist
|
||||||
if [ ! -x ovftool/ovftool ]; then
|
if [ ! -x ovftool/ovftool ]; then
|
||||||
rm -rf ovftool ovftool.zip
|
rm -rf ovftool ovftool.zip
|
||||||
curl -skL https://github.com/rgl/ovftool-binaries/raw/main/archive/VMware-ovftool-4.6.0-21452615-lin.x86_64.zip -o ovftool.zip
|
curl -skL https://github.com/rgl/ovftool-binaries/raw/main/archive/VMware-ovftool-4.6.3-24031167-lin.x86_64.zip -o ovftool.zip
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "Failed to download ovftool"
|
echo "Failed to download ovftool"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@ -71,8 +71,7 @@ while true; do
|
|||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--tag)
|
--tag)
|
||||||
TAG="$2"
|
TAG="$(echo "$2" | sed 's/^[v|V]//g')"
|
||||||
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
|
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
--img)
|
--img)
|
||||||
@ -97,8 +96,7 @@ if ! command -v qm >/dev/null 2>&1; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$TAG" ]; then
|
if [ -z "$TAG" ]; then
|
||||||
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}')"
|
TAG="$(curl -skL --connect-timeout 10 -w "%{url_effective}" -o /dev/null "${REPO}/releases/latest" | awk -F'/' '{print $NF}' | sed 's/^[v|V]//g')"
|
||||||
[ "${TAG:0:1}" = "v" ] && TAG="${TAG:1}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${IMG}" ] && [ -f "${IMG}" ]; then
|
if [ -n "${IMG}" ] && [ -f "${IMG}" ]; then
|
||||||
@ -139,7 +137,14 @@ fi
|
|||||||
echo "Creating VM with RR ... "
|
echo "Creating VM with RR ... "
|
||||||
|
|
||||||
# 获取可用的 VMID
|
# 获取可用的 VMID
|
||||||
VMID="$(($(qm list | awk 'NR>1{print $1}' | sort -n | tail -1 2>/dev/null || echo 99) + 1))"
|
last_vmid=$(qm list | awk 'NR>1{print$1}' | sort -n | tail -1 2>/dev/null)
|
||||||
|
if [ -z "$last_vmid" ]; then
|
||||||
|
# 如果 last_vmid 是空字符串,说明没有VM,设置一个起始ID
|
||||||
|
VMID=100
|
||||||
|
else
|
||||||
|
# 否则,在最后一个ID的基础上加1
|
||||||
|
VMID=$((last_vmid + 1))
|
||||||
|
fi
|
||||||
ARGS=""
|
ARGS=""
|
||||||
SATAIDX=0
|
SATAIDX=0
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user