Отключение Энергосбережения Pi4/5

Raspberry Pi 4:
Имеет встроенный USB 3.0 контроллер, но не выводит PCIe наружу.

pcie_aspm=off влияет на поведение USB 3.0 и Ethernet, может улучшить стабильность под высокой нагрузкой.

Raspberry Pi 5:
Имеет полноценный PCIe-шлюз (можно подключать NVMe и прочее).

Здесь pcie_aspm=off особенно полезен:

стабилизирует поведение при работе с SSD, NVMe, USB-хабами,

может решить отвал сети при сжатии/копировании.

disable_pcie_aspm.sh
#!/bin/bash
# disable_pcie_aspm.sh — добавляет pcie_aspm=off в /boot/cmdline.txt, если его ещё нет
 
set -euo pipefail
 
CMDLINE_FILE="/boot/cmdline.txt"
KEYWORD="pcie_aspm=off"
 
# Проверка на наличие строки
if grep -q "$KEYWORD" "$CMDLINE_FILE"; then
  echo "✅ Параметр уже установлен: $KEYWORD"
else
  echo "[*] Добавляю $KEYWORD в $CMDLINE_FILE"
  sudo sed -i "s|$| $KEYWORD|" "$CMDLINE_FILE"
  echo "✅ Добавлено. Перезагрузите Raspberry Pi, чтобы применить."
fi
power_mode.sh
#!/bin/bash
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# ==AUTOEXEC==
# === Power Mode ===
# power_mode.sh
# Меню управления энергосбережением: CPU и Wi-Fi на Raspberry Pi
# Универсальный скрипт для Pi 4/5: CPU, Wi-Fi, USB + постоянный USB-on через udev
 
set -euo pipefail
 
UDEV_RULE_PATH="/etc/udev/rules.d/99-usb-power.rules"
 
# Определение модели
MODEL=$(tr -d '\0' </proc/device-tree/model)
echo "🧠 Устройство: $MODEL"
 
# CPU governor
GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
echo "🖥️ Режим CPU: $GOV"
 
# Wi-Fi
WIFI_IF=$(iw dev | awk '$1=="Interface"{print $2}' | head -n1)
if [[ -n "$WIFI_IF" ]]; then
  WIFI_STATE=$(iw dev "$WIFI_IF" get power_save | awk '{print $NF}')
  echo "📶 Wi-Fi интерфейс: $WIFI_IF, энергосбережение: $WIFI_STATE"
else
  echo "📶 Wi-Fi интерфейс не найден."
fi
 
# USB
USB_STATE=$(grep . /sys/bus/usb/devices/usb*/power/control | sort -u | tr '\n' ' ')
echo "🔌 USB power control (текущие): $USB_STATE"
 
 
# 💡 Оценка конфигурации
CONFIG_STATUS_ICON=""
CONFIG_STATUS_DESC=""
 
if [[ "$GOV" == "ondemand" && "$USB_STATE" == *"on"* ]]; then
  CONFIG_STATUS_ICON="🌿"
  CONFIG_STATUS_DESC="Максимальное энергосбережение с сохранением стабильности (USB всегда активен)"
elif [[ "$GOV" == "performance" && "$USB_STATE" == *"on"* ]]; then
  CONFIG_STATUS_ICON="🔥"
  CONFIG_STATUS_DESC="Высокая производительность, USB не уходит в сон"
elif [[ "$GOV" == "ondemand" && "$USB_STATE" == *"auto"* ]]; then
  CONFIG_STATUS_ICON="💤"
  CONFIG_STATUS_DESC="Минимальное энергопотребление (CPU и USB в энергосбережении)"
elif [[ "$GOV" == "performance" && "$USB_STATE" == *"auto"* ]]; then
  CONFIG_STATUS_ICON="⚡"
  CONFIG_STATUS_DESC="Производительность активна, но USB может отключаться"
else
  CONFIG_STATUS_ICON="⚙️"
  CONFIG_STATUS_DESC="Смешанный режим: нестандартная комбинация"
fi
 
echo "$CONFIG_STATUS_ICON Конфигурация: $CONFIG_STATUS_DESC"
 
# udev правило
if [[ -f "$UDEV_RULE_PATH" ]]; then
  echo "📂 Udev-правило обнаружено: $UDEV_RULE_PATH (USB всегда включено)"
else
  echo "📂 Udev-правило НЕ найдено (USB отключается по умолчанию)"
fi
 
echo ""
echo "🔧 Выберите действие:"
echo "  1 - 🔁 Переключить CPU между performance и ondemand"
echo "  2 - 📶 Включить/отключить энергосбережение Wi-Fi"
echo "  3 - 🔌 Включить/отключить энергосбережение USB (до перезагрузки)"
echo "  4 - 📂 Создать/удалить udev-правило для ПЕРМАНЕНТНОГО включения USB"
echo "  0 - ❌ Выход"
read -rp "👉 Выбор: " choice
 
case "$choice" in
  1)
    if [[ "$GOV" == "performance" ]]; then
      read -rp "🌙 Переключить в ondemand? [y/N] " ans
      [[ "$ans" =~ ^[Yy]$ ]] && for c in /sys/devices/system/cpu/cpu[0-9]*; do echo ondemand | sudo tee "$c/cpufreq/scaling_governor"; done
    else
      read -rp "🚀 Переключить в performance? [y/N] " ans
      [[ "$ans" =~ ^[Yy]$ ]] && for c in /sys/devices/system/cpu/cpu[0-9]*; do echo performance | sudo tee "$c/cpufreq/scaling_governor"; done
    fi
    ;;
  2)
    if [[ -n "$WIFI_IF" ]]; then
      if [[ "$WIFI_STATE" == "on" ]]; then
        read -rp "📶 Отключить энергосбережение Wi-Fi ($WIFI_IF)? [y/N] " ans
        [[ "$ans" =~ ^[Yy]$ ]] && sudo iw dev "$WIFI_IF" set power_save off
      else
        read -rp "🔌 Включить энергосбережение Wi-Fi ($WIFI_IF)? [y/N] " ans
        [[ "$ans" =~ ^[Yy]$ ]] && sudo iw dev "$WIFI_IF" set power_save on
      fi
    fi
    ;;
  3)
    if [[ "$USB_STATE" == *"auto"* ]]; then
      read -rp "🔋 Отключить USB энергосбережение (on)? [y/N] " ans
      [[ "$ans" =~ ^[Yy]$ ]] && for path in /sys/bus/usb/devices/usb*/power/control; do echo on | sudo tee "$path"; done
    else
      read -rp "🌙 Включить USB энергосбережение (auto)? [y/N] " ans
      [[ "$ans" =~ ^[Yy]$ ]] && for path in /sys/bus/usb/devices/usb*/power/control; do echo auto | sudo tee "$path"; done
    fi
    ;;
  4)
    if [[ -f "$UDEV_RULE_PATH" ]]; then
      read -rp "❌ Удалить udev-правило и вернуть поведение по умолчанию? [y/N] " ans
      if [[ "$ans" =~ ^[Yy]$ ]]; then
        sudo rm "$UDEV_RULE_PATH"
        sudo udevadm control --reload
        echo "✅ Правило удалено."
      fi
    else
      read -rp "📂 Создать правило для постоянного включения USB? [y/N] " ans
      if [[ "$ans" =~ ^[Yy]$ ]]; then
        echo 'ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="on"' | sudo tee "$UDEV_RULE_PATH" >/dev/null
        sudo udevadm control --reload
        sudo udevadm trigger --subsystem-match=usb --action=add
        echo "✅ Правило создано: $UDEV_RULE_PATH"
      fi
    fi
    ;;
  0)
    echo "👋 Выход." ;;
  *)
    echo "❓ Неверный выбор." ;;
esac