mirror of
https://github.com/RROrg/rr.git
synced 2025-06-21 05:51:05 +08:00
110 lines
3.7 KiB
Bash
Executable File
110 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
. /opt/arpl/include/functions.sh
|
|
|
|
# Sanity check
|
|
loaderIsConfigured || die "Loader is not configured!"
|
|
|
|
# Print text centralized, if variable ${COLUMNS} is defined
|
|
clear
|
|
TITLE="BOOTING..."
|
|
if [ -z "${COLUMNS}" ]; then
|
|
echo -e "\033[1;33m${TITLE}\033[0m"
|
|
else
|
|
printf "\033[1;33m%*s\033[0m\n" $(((${#TITLE}+${COLUMNS})/2)) "${TITLE}"
|
|
fi
|
|
|
|
# Check if DSM zImage changed, patch it if necessary
|
|
ZIMAGE_HASH="`readConfigKey "zimage-hash" "${USER_CONFIG_FILE}"`"
|
|
if [ "`sha256sum "${ORI_ZIMAGE_FILE}" | awk '{print$1}'`" != "${ZIMAGE_HASH}" ]; then
|
|
echo -e "\033[1;43mDSM zImage changed\033[0m"
|
|
/opt/arpl/zimage-patch.sh
|
|
if [ $? -ne 0 ]; then
|
|
dialog --backtitle "`backtitle`" --title "Error" \
|
|
--msgbox "zImage not patched:\n`<"${LOG_FILE}"`" 12 70
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
# Check if DSM ramdisk changed, patch it if necessary
|
|
RAMDISK_HASH="`readConfigKey "ramdisk-hash" "${USER_CONFIG_FILE}"`"
|
|
if [ "`sha256sum "${ORI_RDGZ_FILE}" | awk '{print$1}'`" != "${RAMDISK_HASH}" ]; then
|
|
echo -e "\033[1;43mDSM Ramdisk changed\033[0m"
|
|
/opt/arpl/ramdisk-patch.sh
|
|
if [ $? -ne 0 ]; then
|
|
dialog --backtitle "`backtitle`" --title "Error" \
|
|
--msgbox "Ramdisk not patched:\n`<"${LOG_FILE}"`" 12 70
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
# Load necessary variables
|
|
VID="`readConfigKey "vid" "${USER_CONFIG_FILE}"`"
|
|
PID="`readConfigKey "pid" "${USER_CONFIG_FILE}"`"
|
|
MODEL="`readConfigKey "model" "${USER_CONFIG_FILE}"`"
|
|
BUILD="`readConfigKey "build" "${USER_CONFIG_FILE}"`"
|
|
SN="`readConfigKey "sn" "${USER_CONFIG_FILE}"`"
|
|
|
|
declare -A CMDLINE
|
|
|
|
# Fixed values
|
|
CMDLINE['netif_num']=0
|
|
# Automatic values
|
|
CMDLINE['syno_hw_version']="${MODEL}"
|
|
[ -z "${VID}" ] && VID="0x0000" # Sanity check
|
|
[ -z "${PID}" ] && PID="0x0000" # Sanity check
|
|
CMDLINE['vid']="${VID}"
|
|
CMDLINE['pid']="${PID}"
|
|
CMDLINE['sn']="${SN}"
|
|
|
|
# Read cmdline
|
|
while IFS="=" read KEY VALUE; do
|
|
[ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}"
|
|
done < <(readModelMap "${MODEL}" "builds.${BUILD}.cmdline")
|
|
while IFS="=" read KEY VALUE; do
|
|
[ -n "${KEY}" ] && CMDLINE["${KEY}"]="${VALUE}"
|
|
done < <(readConfigMap "cmdline" "${USER_CONFIG_FILE}")
|
|
|
|
# Check if machine has EFI
|
|
[ -d /sys/firmware/efi ] && EFI=1 || EFI=0
|
|
# Read EFI bug value
|
|
EFI_BUG="`readModelKey "${MODEL}" "builds.${BUILD}.efi-bug"`"
|
|
|
|
LOADER_DISK="`blkid | grep 'LABEL="ARPL3"' | cut -d3 -f1`"
|
|
BUS=`udevadm info --query property --name ${LOADER_DISK} | grep ID_BUS | cut -d= -f2`
|
|
|
|
# Prepare command line
|
|
CMDLINE_LINE=""
|
|
[ ${EFI} -eq 1 ] && CMDLINE_LINE+="withefi "
|
|
[ "${BUS}" = "ata" ] && CMDLINE_LINE+="synoboot_satadom=1 "
|
|
CMDLINE_LINE+="console=ttyS0,115200n8 earlyprintk log_buf_len=32M earlycon=uart8250,io,0x3f8,115200n8 elevator=elevator root=/dev/md0 loglevel=15"
|
|
for KEY in ${!CMDLINE[@]}; do
|
|
VALUE="${CMDLINE[${KEY}]}"
|
|
CMDLINE_LINE+=" ${KEY}"
|
|
[ -n "${VALUE}" ] && CMDLINE_LINE+="=${VALUE}"
|
|
done
|
|
# Escape special chars
|
|
CMDLINE_LINE=`echo ${CMDLINE_LINE} | sed 's/>/\\\\>/g'`
|
|
|
|
# Inform user
|
|
echo -e "Model: \033[1;36m${MODEL}\033[0m"
|
|
echo -e "Build: \033[1;36m${BUILD}\033[0m"
|
|
echo -e "Cmdline:\n\033[1;36m${CMDLINE_LINE}\033[0m"
|
|
echo -e "\033[1;37mLoading DSM kernel...\033[0m"
|
|
|
|
# Executes DSM kernel via KEXEC
|
|
history -a
|
|
sync
|
|
if [ "${EFI_BUG}" = "yes" -a ${EFI} -eq 1 ]; then
|
|
echo -e "\033[1;33mWarning, running kexec with --noefi param, strange things will happen!!\033[0m"
|
|
kexec --noefi -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog
|
|
else
|
|
kexec -l "${MOD_ZIMAGE_FILE}" --initrd "${MOD_RDGZ_FILE}" --command-line="${CMDLINE_LINE}" >"${LOG_FILE}" 2>&1 || dieLog
|
|
fi
|
|
/sbin/swapoff -a >/dev/null 2>&1 || true
|
|
/bin/umount -a -r >/dev/null 2>&1 || true
|
|
echo -e "\033[1;37mBooting...\033[0m"
|
|
kexec -e -a >"${LOG_FILE}" 2>&1 || dieLog
|