添加DSM根分区检查与修复功能,屏蔽0B虚拟磁盘

This commit is contained in:
Ing 2024-11-27 15:13:22 +08:00
parent 7b4bb1a9f4
commit 5ae9098c11
20 changed files with 4231 additions and 4070 deletions

View File

@ -68,6 +68,7 @@ DT="$(readConfigKey "platforms.${PLATFORM}.dt" "${WORK_PATH}/platforms.yml")"
KVER="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kver" "${WORK_PATH}/platforms.yml")"
KPRE="$(readConfigKey "platforms.${PLATFORM}.productvers.\"${PRODUCTVER}\".kpre" "${WORK_PATH}/platforms.yml")"
MEV="$(virt-what 2>/dev/null)"
DMI="$(dmesg 2>/dev/null | grep -i "DMI:" | head -1 | sed 's/\[.*\] DMI: //i')"
CPU="$(awk -F': ' '/model name/ {print $2}' /proc/cpuinfo | uniq)"
MEM="$(awk '/MemTotal:/ {printf "%.0f", $2 / 1024}' /proc/meminfo) MB"
@ -76,6 +77,7 @@ printf "%s \033[1;36m%s(%s)\033[0m\n" "$(TEXT "Model: ")" "${MODEL}" "${PLATFO
printf "%s \033[1;36m%s(%s%s)\033[0m\n" "$(TEXT "Version: ")" "${PRODUCTVER}" "${BUILDNUM}" "$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}")"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "Kernel: ")" "${KERNEL}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "LKM: ")" "${LKM}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "MEV: ")" "${MEV:-physical}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "DMI: ")" "${DMI}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "CPU: ")" "${CPU}"
printf "%s \033[1;36m%s\033[0m\n" "$(TEXT "MEM: ")" "${MEM}"
@ -178,6 +180,7 @@ CMDLINE['pcie_aspm']="off"
# CMDLINE['nox2apic']="" # check platform
# CMDLINE['nomodeset']=""
CMDLINE['modprobe.blacklist']="${MODBLACKLIST}"
CMDLINE['mev']="${MEV:-physical}"
if echo "apollolake geminilake purley" | grep -wq "${PLATFORM}"; then
CMDLINE["nox2apic"]=""
@ -266,6 +269,7 @@ if [ "${DIRECT}" = "true" ]; then
grub-editenv ${USER_GRUBENVFILE} set dsm_version="${PRODUCTVER}(${BUILDNUM}$([ ${SMALLNUM:-0} -ne 0 ] && echo "u${SMALLNUM}"))"
grub-editenv ${USER_GRUBENVFILE} set dsm_kernel="${KERNEL}"
grub-editenv ${USER_GRUBENVFILE} set dsm_lkm="${LKM}"
grub-editenv ${USER_GRUBENVFILE} set sys_mev="${MEV:-physical}"
grub-editenv ${USER_GRUBENVFILE} set sys_dmi="${DMI}"
grub-editenv ${USER_GRUBENVFILE} set sys_cpu="${CPU}"
grub-editenv ${USER_GRUBENVFILE} set sys_mem="${MEM}"
@ -285,6 +289,7 @@ else
grub-editenv ${USER_GRUBENVFILE} unset dsm_version
grub-editenv ${USER_GRUBENVFILE} unset dsm_kernel
grub-editenv ${USER_GRUBENVFILE} unset dsm_lkm
grub-editenv ${USER_GRUBENVFILE} unset sys_mev
grub-editenv ${USER_GRUBENVFILE} unset sys_dmi
grub-editenv ${USER_GRUBENVFILE} unset sys_cpu
grub-editenv ${USER_GRUBENVFILE} unset sys_mem

View File

@ -215,7 +215,7 @@ function _get_fastest() {
speedlist+="${I} ${speed:-999}\n" # Assign default value 999 if speed is empty
done
fi
local fastest="$(echo -e "${speedlist}" | tr -s '\n' | grep -v '999$' | sort -k2n | head -1)"
local fastest="$(echo -e "${speedlist}" | tr -s '\n' | awk '$2 != "999"' | sort -k2n | head -1)"
URL="$(echo "${fastest}" | awk '{print $1}')"
SPD="$(echo "${fastest}" | awk '{print $2}')" # It is a float type
echo "${URL:-${1}}"
@ -438,6 +438,17 @@ function findDSMRoot() {
return 0
}
###############################################################################
# check and fix the DSM root partition
# 1 - DSM root path
function fixDSMRootPart() {
if mdadm --detail "${1}" 2>/dev/null | grep -i "State" | grep -iEq "active|FAILED|Not Started"; then
mdadm --stop "${1}" >/dev/null 2>&1
mdadm --assemble --scan >/dev/null 2>&1
fsck "${1}" >/dev/null 2>&1
fi
}
###############################################################################
# Copy DSM files to the boot partition
# 1 - DSM root path

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

@ -1519,8 +1519,7 @@ function showDisksInfo() {
MSG+="\Zb${NAME}\Zn\nPorts: "
PORTS=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n)
for P in ${PORTS}; do
if lsscsi -b 2>/dev/null | grep -v - | grep -q "\[${P}:"; then
DUMMY="$([ "$(cat /sys/class/scsi_host/host${P}/ahci_port_cmd 2>/dev/null)" = "0" ] && echo 1 || echo 2)"
if lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep -q "\[${P}:"; then
if [ "$(cat /sys/class/scsi_host/host${P}/ahci_port_cmd 2>/dev/null)" = "0" ]; then
MSG+="\Z1$(printf "%02d" ${P})\Zn "
else
@ -1537,16 +1536,16 @@ function showDisksInfo() {
for PCI in $(lspci -d ::104 2>/dev/null | awk '{print $1}'); do
NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://")
PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n)
PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l)
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
done
[ $(lspci -d ::107 2>/dev/null | wc -l) -gt 0 ] && MSG+="\nSerial Attached SCSI:\n"
[ $(lspci -d ::107 2>/dev/null | wc -l) -gt 0 ] && MSG+="\nSAS:\n"
for PCI in $(lspci -d ::107 2>/dev/null | awk '{print $1}'); do
NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://")
PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n)
PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l)
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
@ -1571,12 +1570,12 @@ function showDisksInfo() {
for PCI in $(lspci -d ::c03 2>/dev/null | awk '{print $1}'); do
NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://")
PORT=$(ls -l /sys/class/scsi_host 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n)
PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[${PORT}:" | wc -l)
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
done
[ $(ls -l /sys/class/mmc_host 2>/dev/null | grep mmc_host | wc -l) -gt 0 ] && MSG+="\nMMC:\n"
[ $(ls -l /sys/block/mmc* | wc -l) -gt 0 ] && MSG+="\nMMC:\n"
for PCI in $(lspci -d ::805 2>/dev/null | awk '{print $1}'); do
NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://")
PORTNUM=$(ls -l /sys/block/mmc* 2>/dev/null | grep "${PCI}" | wc -l)
@ -1588,7 +1587,7 @@ function showDisksInfo() {
for PCI in $(lspci -d ::108 2>/dev/null | awk '{print $1}'); do
NAME=$(lspci -s "${PCI}" 2>/dev/null | sed "s/\ .*://")
PORT=$(ls -l /sys/class/nvme 2>/dev/null | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/nvme//' | sort -n)
PORTNUM=$(lsscsi -b 2>/dev/null | grep -v - | grep "\[N:${PORT}:" | wc -l)
PORTNUM=$(lsscsi -bS 2>/dev/null | awk '$3 != "0"' | grep -v - | grep "\[N:${PORT}:" | wc -l)
[ ${PORTNUM} -eq 0 ] && continue
MSG+="\Zb${NAME}\Zn\nNumber: ${PORTNUM}\n"
NUMPORTS=$((${NUMPORTS} + ${PORTNUM}))
@ -1643,7 +1642,7 @@ function MountDSMVolume {
function formatDisks() {
rm -f "${TMP_PATH}/opts"
while read -r KNAME ID SIZE TYPE PKNAME; do
[ "${KNAME}" = "N/A" ] && continue
[ "${KNAME}" = "N/A" ] || [ "${SIZE:0:1}" = "0" ] && continue
[ "${KNAME:0:7}" = "/dev/md" ] && continue
[ "${KNAME}" = "${LOADER_DISK}" ] || [ "${PKNAME}" = "${LOADER_DISK}" ] && continue
printf "\"%s\" \"%-6s %-4s %s\" \"off\"\n" "${KNAME}" "${SIZE}" "${TYPE}" "${ID}" >>"${TMP_PATH}/opts"
@ -1732,6 +1731,7 @@ function allowDSMDowngrade() {
(
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
rm -f "${TMP_PATH}/mdX/etc/VERSION" "${TMP_PATH}/mdX/etc.defaults/VERSION"
@ -1762,6 +1762,7 @@ function resetDSMPassword() {
rm -f "${TMP_PATH}/menu"
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
if [ -f "${TMP_PATH}/mdX/etc/shadow" ]; then
@ -1806,6 +1807,7 @@ function resetDSMPassword() {
# local NEWPASSWD="$(echo "${VALUE}" | mkpasswd -m sha512)"
local NEWPASSWD="$(openssl passwd -6 -salt $(openssl rand -hex 8) "${VALUE}")"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
sed -i "s|^${USER}:[^:]*|${USER}:${NEWPASSWD}|" "${TMP_PATH}/mdX/etc/shadow"
@ -1851,6 +1853,7 @@ function addNewDSMUser() {
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
if [ -f "${TMP_PATH}/mdX/usr/syno/etc/esynoscheduler/esynoscheduler.db" ]; then
@ -1891,6 +1894,7 @@ function forceEnableDSMTelnetSSH() {
ONBOOTUP="${ONBOOTUP}echo \"DELETE FROM task WHERE task_name LIKE ''RRONBOOTUPRR_SSH'';\" | sqlite3 /usr/syno/etc/esynoscheduler/esynoscheduler.db\n"
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
if [ -f "${TMP_PATH}/mdX/usr/syno/etc/esynoscheduler/esynoscheduler.db" ]; then
@ -1933,6 +1937,7 @@ function removeBlockIPDB {
(
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
rm -f "${TMP_PATH}/mdX/etc/synoautoblock.db"
@ -1964,6 +1969,7 @@ function disablescheduledTasks {
(
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
if [ -f "${TMP_PATH}/mdX/usr/syno/etc/esynoscheduler/esynoscheduler.db" ]; then
@ -2003,6 +2009,7 @@ function initDSMNetwork {
(
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
rm -f "${TMP_PATH}/mdX/etc/sysconfig/network-scripts/ifcfg-bond"* "${TMP_PATH}/mdX/etc/sysconfig/network-scripts/ifcfg-eth"*
@ -2128,14 +2135,16 @@ function tryRecoveryDSM() {
DIALOG --title "$(TEXT "Settings")" \
--infobox "$(TEXT "Trying to recover an installed DSM system ...")" 0 0
DSMROOTS="$(findDSMRoot)"
if [ -z "${DSMROOTS}" ]; then
DSMROOTPART="$(echo "${DSMROOTS}" | head -n 1 | cut -d' ' -f1)"
if [ -z "${DSMROOTPART}" ]; then
DIALOG --title "$(TEXT "Settings")" \
--msgbox "$(TEXT "No DSM system partition(md0) found!\nPlease insert all disks before continuing.")" 0 0
return
fi
mkdir -p "${TMP_PATH}/mdX"
mount -t ext4 "$(echo "${DSMROOTS}" | head -n 1 | cut -d' ' -f1)" "${TMP_PATH}/mdX"
fixDSMRootPart "${DSMROOTPART}"
mount -t ext4 "${DSMROOTPART}" "${TMP_PATH}/mdX"
if [ $? -ne 0 ]; then
DIALOG --title "$(TEXT "Settings")" \
--msgbox "$(TEXT "Mount DSM system partition(md0) failed!\nPlease insert all disks before continuing.")" 0 0
@ -2359,6 +2368,7 @@ function reportBugs() {
if [ -n "${DSMROOTS}" ]; then
mkdir -p "${TMP_PATH}/mdX"
for I in ${DSMROOTS}; do
fixDSMRootPart "${I}"
mount -t ext4 "${I}" "${TMP_PATH}/mdX"
[ $? -ne 0 ] && continue
mkdir -p "${TMP_PATH}/logs/md0/log"
@ -3919,6 +3929,11 @@ function notepadMenu() {
if [ $# -ge 1 ]; then
$@
else
if [ -z "${MODEL}" ] && [ -z "${PRODUCTVER}" ] && [ -n "$(findDSMRoot)" ]; then
DIALOG --title "$(TEXT "Main menu")" \
--yesno "$(TEXT "An installed DSM system is detected on the hard disk. Do you want to try to restore it first?")" 0 0
[ $? -eq 0 ] && tryRecoveryDSM
fi
# Main loop
NEXT="m"
[ -n "$(ls ${TMP_PATH}/pats/*.pat 2>/dev/null)" ] && NEXT="u"

View File

@ -180,7 +180,7 @@
lspci -d ::104 # 查看 RAID 总线控制器
lspci -d ::105 # 查看 ATA 总线控制器
lspci -d ::106 # 查看 SATA 总线控制器
lspci -d ::107 # 查看 串行 Attached SCSI
lspci -d ::107 # 查看 SAS 总线控制器
lspci -d ::108 # 查看 NVM 控制器
ls -l /sys/class/scsi_host # 查看 ATA 硬盘 host 信息