From 54b86ff46181bc62bc8defc1fcc5d9243348630a Mon Sep 17 00:00:00 2001 From: AuxXxilium Date: Sat, 4 Nov 2023 10:55:31 +0100 Subject: [PATCH] arc/storage: rewrite for SAS & DT Signed-off-by: AuxXxilium --- files/initrd/opt/arc/arc.sh | 19 --- files/initrd/opt/arc/include/storage.sh | 216 ++++++++++++------------ 2 files changed, 108 insertions(+), 127 deletions(-) diff --git a/files/initrd/opt/arc/arc.sh b/files/initrd/opt/arc/arc.sh index 45fd2bcd..2ad9b82c 100755 --- a/files/initrd/opt/arc/arc.sh +++ b/files/initrd/opt/arc/arc.sh @@ -150,13 +150,6 @@ function arcMenu() { break fi done - for F in "$(readModelArray "${M}" "dt")"; do - if [ "${DT}" = "true" ] && [ ${SASCONTROLLER} -gt 0 ]; then - COMPATIBLE=0 - FLGNEX=1 - break - fi - done fi [ "${DT}" = "true" ] && DT="DT" || DT="" [ "${BETA}" = "true" ] && BETA="Beta" || BETA="" @@ -182,12 +175,6 @@ function arcMenu() { # read model config for dt and aes if [ "${MODEL}" != "${resp}" ]; then MODEL="${resp}" - # Check for DT and SAS Controller - DT="$(readModelKey "${resp}" "dt")" - if [ "${DT}" = "true" ] && [ ${SASCONTROLLER} -gt 0 ]; then - # There is no Raid/SCSI Support for DT Models - WARNON=2 - fi # Check for AES if ! grep -q "^flags.*aes.*" /proc/cpuinfo; then WARNON=4 @@ -376,10 +363,6 @@ function arcsettings() { dialog --backtitle "$(backtitle)" --title "Arc Warning" \ --msgbox "WARN: Your Controller has more than 8 Disks connected. Max Disks per Controller: 8" 0 0 fi - if [ ${WARNON} -eq 2 ]; then - dialog --backtitle "$(backtitle)" --title "Arc Warning" \ - --msgbox "WARN: You have selected a DT Model. There is no support for SAS Controller." 0 0 - fi if [ ${WARNON} -eq 3 ]; then dialog --backtitle "$(backtitle)" --title "Arc Warning" \ --msgbox "WARN: You have more than 8 Ethernet Ports. There are only 8 supported by DSM." 0 0 @@ -390,8 +373,6 @@ function arcsettings() { fi # Select Extensions extensionSelection - # Select Fix - #fixSelection # Config is done writeConfigKey "arc.confdone" "true" "${USER_CONFIG_FILE}" CONFDONE="$(readConfigKey "arc.confdone" "${USER_CONFIG_FILE}")" diff --git a/files/initrd/opt/arc/include/storage.sh b/files/initrd/opt/arc/include/storage.sh index d2e2eea6..76809c4a 100755 --- a/files/initrd/opt/arc/include/storage.sh +++ b/files/initrd/opt/arc/include/storage.sh @@ -1,115 +1,115 @@ # Get PortMap for Loader function getmap() { - # Sata Disks - if [ ${SATACONTROLLER} -gt 0 ]; then - # Clean old files - [ -f "${TMP_PATH}/drivesmax" ] && rm -f "${TMP_PATH}/drivesmax" - touch "${TMP_PATH}/drivesmax" - [ -f "${TMP_PATH}/drivescon" ] && rm -f "${TMP_PATH}/drivescon" - touch "${TMP_PATH}/drivescon" - [ -f "${TMP_PATH}/ports" ] && rm -f "${TMP_PATH}/ports" - touch "${TMP_PATH}ports" - [ -f "${TMP_PATH}/remap" ] && rm -f "${TMP_PATH}/remap" - touch "${TMP_PATH}/remap" - # Do the work - let DISKIDXMAPIDX=0 - DISKIDXMAP="" - let DISKIDXMAPIDXMAX=0 - DISKIDXMAPMAX="" - SATADRIVES=0 - for PCI in $(lspci -d ::106 | awk '{print $1}'); do - NUMPORTS=0 - CONPORTS=0 - unset HOSTPORTS - declare -A HOSTPORTS + if [ ! "${DT}" = "true" ]; then + # Sata Disks + if [ ${SATACONTROLLER} -gt 0 ]; then + # Clean old files + [ -f "${TMP_PATH}/drivesmax" ] && rm -f "${TMP_PATH}/drivesmax" + touch "${TMP_PATH}/drivesmax" + [ -f "${TMP_PATH}/drivescon" ] && rm -f "${TMP_PATH}/drivescon" + touch "${TMP_PATH}/drivescon" + [ -f "${TMP_PATH}/ports" ] && rm -f "${TMP_PATH}/ports" + touch "${TMP_PATH}ports" + [ -f "${TMP_PATH}/remap" ] && rm -f "${TMP_PATH}/remap" + touch "${TMP_PATH}/remap" + # Do the work + let DISKIDXMAPIDX=0 + DISKIDXMAP="" + let DISKIDXMAPIDXMAX=0 + DISKIDXMAPMAX="" + SATADRIVES=0 + for PCI in $(lspci -d ::106 | awk '{print $1}'); do + NUMPORTS=0 + CONPORTS=0 + unset HOSTPORTS + declare -A HOSTPORTS + while read -r LINE; do + ATAPORT="$(echo ${LINE} | grep -o 'ata[0-9]*')" + PORT=$(echo ${ATAPORT} | sed 's/ata//') + HOSTPORTS[${PORT}]=$(echo ${LINE} | grep -o 'host[0-9]*$') + done < <(ls -l /sys/class/scsi_host | grep -F "${PCI}") + while read -r PORT; do + ls -l /sys/block | grep -F -q "${PCI}/ata${PORT}" && ATTACH=1 || ATTACH=0 + PCMD=$(cat /sys/class/scsi_host/${HOSTPORTS[${PORT}]}/ahci_port_cmd) + [ ${PCMD} = 0 ] && DUMMY=1 || DUMMY=0 + [ ${ATTACH} = 1 ] && CONPORTS=$((${CONPORTS} + 1)) && echo "$((${PORT} - 1))" >>"${TMP_PATH}/ports" + [ ${DUMMY} = 1 ] # Do nothing for now + NUMPORTS=$((${NUMPORTS} + 1)) + done < <(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n) + [ ${NUMPORTS} -gt 8 ] && NUMPORTS=8 + [ ${CONPORTS} -gt 8 ] && CONPORTS=8 + echo -n "${NUMPORTS}" >>"${TMP_PATH}/drivesmax" + echo -n "${CONPORTS}" >>"${TMP_PATH}/drivescon" + DISKIDXMAP=$DISKIDXMAP$(printf "%02x" $DISKIDXMAPIDX) + let DISKIDXMAPIDX=$DISKIDXMAPIDX+$CONPORTS + DISKIDXMAPMAX=$DISKIDXMAPMAX$(printf "%02x" $DISKIDXMAPIDXMAX) + let DISKIDXMAPIDXMAX=$DISKIDXMAPIDXMAX+$NUMPORTS + SATADRIVES=$((${SATADRIVES} + ${CONPORTS})) + done + SATAPORTMAPMAX="$(<"${TMP_PATH}/drivesmax")" + SATAPORTMAP="$(<"${TMP_PATH}/drivescon")" + LASTDRIVE=0 + # Check for VM while read -r LINE; do - ATAPORT="$(echo ${LINE} | grep -o 'ata[0-9]*')" - PORT=$(echo ${ATAPORT} | sed 's/ata//') - HOSTPORTS[${PORT}]=$(echo ${LINE} | grep -o 'host[0-9]*$') - done < <(ls -l /sys/class/scsi_host | grep -F "${PCI}") - while read -r PORT; do - ls -l /sys/block | grep -F -q "${PCI}/ata${PORT}" && ATTACH=1 || ATTACH=0 - PCMD=$(cat /sys/class/scsi_host/${HOSTPORTS[${PORT}]}/ahci_port_cmd) - [ ${PCMD} = 0 ] && DUMMY=1 || DUMMY=0 - [ ${ATTACH} = 1 ] && CONPORTS=$((${CONPORTS} + 1)) && echo "$((${PORT} - 1))" >>"${TMP_PATH}/ports" - [ ${DUMMY} = 1 ] # Do nothing for now - NUMPORTS=$((${NUMPORTS} + 1)) - done < <(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n) - [ ${NUMPORTS} -gt 8 ] && NUMPORTS=8 - [ ${CONPORTS} -gt 8 ] && CONPORTS=8 - echo -n "${NUMPORTS}" >>"${TMP_PATH}/drivesmax" - echo -n "${CONPORTS}" >>"${TMP_PATH}/drivescon" - DISKIDXMAP=$DISKIDXMAP$(printf "%02x" $DISKIDXMAPIDX) - let DISKIDXMAPIDX=$DISKIDXMAPIDX+$CONPORTS - DISKIDXMAPMAX=$DISKIDXMAPMAX$(printf "%02x" $DISKIDXMAPIDXMAX) - let DISKIDXMAPIDXMAX=$DISKIDXMAPIDXMAX+$NUMPORTS - SATADRIVES=$((${SATADRIVES} + ${CONPORTS})) - done - SATAPORTMAPMAX="$(<"${TMP_PATH}/drivesmax")" - SATAPORTMAP="$(<"${TMP_PATH}/drivescon")" - LASTDRIVE=0 - # Check for VM - while read -r LINE; do - if [ "${BUS}" != "usb" ] && [ ${LINE} -eq 0 ] && [ "${LOADER_DISK}" = "/dev/sda" ]; then - MAXDISKS="$(readModelKey "${MODEL}" "disks")" - if [ ${MAXDISKS} -lt ${SATADRIVES} ]; then - MAXDISKS=${SATADRIVES} + if [ "${BUS}" != "usb" ] && [ ${LINE} -eq 0 ] && [ "${LOADER_DISK}" = "/dev/sda" ]; then + MAXDISKS="$(readModelKey "${MODEL}" "disks")" + if [ ${MAXDISKS} -lt ${SATADRIVES} ]; then + MAXDISKS=${SATADRIVES} + fi + echo -n "${LINE}>${MAXDISKS}:" >>"${TMP_PATH}/remap" + elif [ ! ${LINE} = ${LASTDRIVE} ]; then + echo -n "${LINE}>${LASTDRIVE}:" >>"${TMP_PATH}/remap" + LASTDRIVE=$((${LASTDRIVE} + 1)) + elif [ ${LINE} = ${LASTDRIVE} ]; then + LASTDRIVE=$((${LINE} + 1)) fi - echo -n "${LINE}>${MAXDISKS}:" >>"${TMP_PATH}/remap" - elif [ ${LINE} != ${LASTDRIVE} ]; then - echo -n "${LINE}>${LASTDRIVE}:" >>"${TMP_PATH}/remap" - LASTDRIVE=$((${LASTDRIVE} + 1)) - elif [ ${LINE} = ${LASTDRIVE} ]; then - LASTDRIVE=$((${LINE} + 1)) - fi - done < <(cat "${TMP_PATH}/ports") - fi - # SAS Disks - if [ $(lspci -d ::107 | wc -l) -gt 0 ]; then - SASDRIVES=0 - for PCI in $(lspci -d ::107 | awk '{print $1}'); do - NAME=$(lspci -s "${PCI}" | sed "s/\ .*://") - PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) - PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l) - SASDRIVES=$((${SASDRIVES} + ${PORTNUM})) - done - fi - # USB Disks - if [ $(ls -l /sys/class/scsi_host | grep usb | wc -l) -gt 0 ]; then - USBDRIVES=0 - for PCI in $(lspci -d ::c03 | awk '{print $1}'); do - NAME=$(lspci -s "${PCI}" | sed "s/\ .*://") - PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) - PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l) - [ ${PORTNUM} -eq 0 ] && continue - USBDRIVES=$((${USBDRIVES} + ${PORTNUM})) - done - fi - # NVMe Disks - if [ $(lspci -d ::108 | wc -l) -gt 0 ]; then - NVMEDRIVES=0 - for PCI in $(lspci -d ::108 | awk '{print $1}'); do - NAME=$(lspci -s "${PCI}" | sed "s/\ .*://") - PORT=$(ls -l /sys/class/nvme | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/nvme//' | sort -n) - PORTNUM=$(lsscsi -b | grep -v - | grep "\[N:${PORT}:" | wc -l) - NVMEDRIVES=$((${NVMEDRIVES} + ${PORTNUM})) - done - fi - # Disk Count for MaxDisks - DRIVES=$((${SATADRIVES:-0} + ${SASDRIVES:-0} + ${USBDRIVES:-0} + ${NVMEDRIVES:-0})) - [ -n "${SATADRIVES}" ] && writeConfigKey "device.satadrives" "${SATADRIVES}" "${USER_CONFIG_FILE}" - [ -n "${SASDRIVES}" ] && writeConfigKey "device.sasdrives" "${SASDRIVES}" "${USER_CONFIG_FILE}" - [ -n "${USBDRIVES}" ] && writeConfigKey "device.usbdrives" "${USBDRIVES}" "${USER_CONFIG_FILE}" - [ -n "${NVMEDRIVES}" ] && writeConfigKey "device.nvmedrives" "${NVMEDRIVES}" "${USER_CONFIG_FILE}" - writeConfigKey "device.drives" "${DRIVES}" "${USER_CONFIG_FILE}" - if [ ${DRIVES} -gt 26 ]; then - TEXT+="\nYou have connected more then 26 Disks." - TEXT+="\nDSM can only adress a maximum of 26 Disks." - dialog --backtitle "$(backtitle)" --colors --title "Arc Disks" \ - --msgbox "${TEXT}" 0 0 - fi - # Compute PortMap Options - if [ "${DT}" != "true" ]; then + done < <(cat "${TMP_PATH}/ports") + fi + # SAS Disks + if [ $(lspci -d ::107 | wc -l) -gt 0 ]; then + SASDRIVES=0 + for PCI in $(lspci -d ::107 | awk '{print $1}'); do + NAME=$(lspci -s "${PCI}" | sed "s/\ .*://") + PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) + PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l) + SASDRIVES=$((${SASDRIVES} + ${PORTNUM})) + done + fi + # USB Disks + if [ $(ls -l /sys/class/scsi_host | grep usb | wc -l) -gt 0 ]; then + USBDRIVES=0 + for PCI in $(lspci -d ::c03 | awk '{print $1}'); do + NAME=$(lspci -s "${PCI}" | sed "s/\ .*://") + PORT=$(ls -l /sys/class/scsi_host | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/host//' | sort -n) + PORTNUM=$(lsscsi -b | grep -v - | grep "\[${PORT}:" | wc -l) + [ ${PORTNUM} -eq 0 ] && continue + USBDRIVES=$((${USBDRIVES} + ${PORTNUM})) + done + fi + # NVMe Disks + if [ $(lspci -d ::108 | wc -l) -gt 0 ]; then + NVMEDRIVES=0 + for PCI in $(lspci -d ::108 | awk '{print $1}'); do + NAME=$(lspci -s "${PCI}" | sed "s/\ .*://") + PORT=$(ls -l /sys/class/nvme | grep "${PCI}" | awk -F'/' '{print $NF}' | sed 's/nvme//' | sort -n) + PORTNUM=$(lsscsi -b | grep -v - | grep "\[N:${PORT}:" | wc -l) + NVMEDRIVES=$((${NVMEDRIVES} + ${PORTNUM})) + done + fi + # Disk Count for MaxDisks + DRIVES=$((${SATADRIVES:-0} + ${SASDRIVES:-0} + ${USBDRIVES:-0} + ${NVMEDRIVES:-0})) + [ -n "${SATADRIVES}" ] && writeConfigKey "device.satadrives" "${SATADRIVES}" "${USER_CONFIG_FILE}" + [ -n "${SASDRIVES}" ] && writeConfigKey "device.sasdrives" "${SASDRIVES}" "${USER_CONFIG_FILE}" + [ -n "${USBDRIVES}" ] && writeConfigKey "device.usbdrives" "${USBDRIVES}" "${USER_CONFIG_FILE}" + [ -n "${NVMEDRIVES}" ] && writeConfigKey "device.nvmedrives" "${NVMEDRIVES}" "${USER_CONFIG_FILE}" + writeConfigKey "device.drives" "${DRIVES}" "${USER_CONFIG_FILE}" + if [ ${DRIVES} -gt 26 ]; then + TEXT+="\nYou have connected more then 26 Disks." + TEXT+="\nDSM can only adress a maximum of 26 Disks." + dialog --backtitle "$(backtitle)" --colors --title "Arc Disks" \ + --msgbox "${TEXT}" 0 0 + fi + # Compute PortMap Options if [ ${SATACONTROLLER} -gt 0 ]; then SATAREMAP="$(awk '{print $1}' "${TMP_PATH}/remap" | sed 's/.$//')" # Show recommended Option to user