- Verified the repository backup rc in migrate.sh. `_persistent_backup_repos()` now aborts before any destructive step when the tar archive is missing or corrupt, removing the invalid backup itself. - Verified the restore rc in migrate.sh. `_restore_backup()` now reports failure instead of printing a green "Backup restored" message, and its caller distinguishes a restored backup from a failed restore. - Made the upgrade phases fail honestly. `apt upgrade` and `apt full-upgrade` now abort with `apt --fix-broken install` + `dpkg --configure -a` instructions instead of reporting "completed successfully" over a partially-upgraded system. - Made repository source writes atomic. Both writers tee into a `.tmp` file and move into place, and the `/etc/apt/sources.list` removal now happens after the write. - Corrected the SID warning text in migrate.sh to reflect that security fixes arrive via package uploads rather than a nonexistent sid-security suite. - Added exit-path cleanup traps for the temp `.deb` files: `trap 'rm -f "$deb_path"' RETURN` in `heroic.sh`and `tools.sh`. - Tightened Heroic download handling: the API fetch uses `curl -fsS --connect-timeout 10 --max-time 30`, the download uses `curl -fsSL --max-time 300`, and the `.deb` is validated with both `dpkg-deb --info` and `dpkg-deb --contents`; `sudo apt install` is guarded with `if !` before the temporary file is deleted. - Tightened the OpenRGB install path: the Codeberg API fetch uses `curl -fsS --connect-timeout 10 --max-time 30` and the download `curl -fsSL --max-time 300`, with the same dual `dpkg-deb` integrity check as the Heroic fallback. - Guarded the OpenRGB post-install side effects: the script now aborts after removing the failed `.deb` if `sudo apt install` returns non-zero, so `modprobe i2c-dev`, `/etc/modules`, the `i2c` group membership, `udevadm`, and the `setcap` step no longer run when the package is absent.
9.1 KiB
Option 5: Firmware, Wireless & Bluetooth
1. The Hidden Debian "Problem"
In standard Debian packaging, the meta-package firmware-linux-nonfree serves as a generic aggregator for hardware blobs. However, due to internal dependency resolution rules and conservative versioning strategies within the repository, this package often fails to automatically include vendor-specific firmware drivers for newer or niche network controllers (specifically Realtek Wi-Fi/Bluetooth and Intel Ethernet/Wi-Fi variants).
This script acts as an intelligent injector to bridge that gap. It does not rely solely on the meta-package's Recommends field; instead, it actively scans the hardware topology to identify missing dependencies. By decoupling the detection from the installation logic, the architecture ensures that even if the base package is installed, specific vendor blobs (e.g., firmware-iwlwifi, firmware-realtek) are explicitly pulled in only when their corresponding hardware IDs are confirmed present on the system. This prevents "half-baked" network connectivity where the interface exists but lacks the necessary firmware to initialize.
2. Dual Scan Engine (PCI & USB)
To ensure comprehensive hardware detection while minimizing false positives, the script utilizes a dual-scan engine that interrogates both PCI and USB buses with strict filtering logic:
- PCI Bus Scanning (
lspci): The engine parseslspci -nnoutput specifically targeting lines containing "network controller" or "ethernet controller". This captures both wireless adapters (e.g., Intel AX200) and wired NICs (e.g., Realtek RTL8125 2.5GbE), ensuring that Ethernet firmware requirements are also met during the process. - USB Bus Scanning (
lsusb): The USB scan applies keyword filtering to ignore peripherals unrelated to networking, such as audio devices or card readers. It specifically looks for terms like "wireless", "wifi", "802.11", and "wlan". Bluetooth devices are also detected separately throughPCI_BT_DEVSandUSB_BT_DEVS. - Deduplication: The collected device lists are merged into a single array (
dev_list) to prevent duplicate processing of the same hardware instance across different bus categories, ensuring a clean plan generation.
3. Dynamic Hardware Mapping Matrix
The script employs an associative mapping strategy in _detect_firmware_needs to translate raw vendor strings from lspci/lsusb into specific Debian package names. This matrix is critical for handling the "Intel Split" and other vendor-specific requirements:
- Vendor Filtering: The engine first filters out generic or unsupported vendors (e.g., non-Realtek, non-Intel, non-Atheros) to avoid unnecessary package pulls.
- Package Assignment Logic:
- Intel Wi-Fi Hardware ➔
firmware-iwlwifi(Specific driver for wireless chips). - Intel Ethernet Hardware ➔
firmware-intel-misc(Often pulled viaRecommendsof the base package, but explicitly tracked here). - Realtek Hardware ➔
firmware-realtek. - MediaTek / Ralink Hardware ➔
firmware-mediatek. - Atheros / Qualcomm Hardware ➔
firmware-atheros.
- Intel Wi-Fi Hardware ➔
This mapping ensures that if a system contains an Intel Wi-Fi 6 card, the script explicitly queues firmware-iwlwifi regardless of whether the base meta-package claims to cover it. The output is rendered as a deduplicated plan with visual indicators (e.g., [+] package ← hardware) for user clarity.
4. Installation Execution Flow (Atomic Pipeline)
The installation process follows a strict atomic pipeline defined in install_firmware, ensuring system stability and version consistency:
- Repository Validation: The script first verifies that
/etc/apt/sources.listor.d/contains thenon-freecomponent. If absent, it halts to prevent installation failures. - Plan Rendering & Confirmation: A diagnostic tree is generated showing detected controllers and planned packages. The user must explicitly confirm ("Apply the network & firmware plan?") before proceeding.
- Base Meta-Package Selection (Backports vs. Stable):
- If
firmware-linux-nonfreeis already installed, the script checks for a newer version in backports (${DEBIAN_CODENAME}-backports). It prompts to upgrade if available, as backports often contain firmware for very recent hardware not yet in stable. - If not installed, it presents a choice between Stable (Ultra-tested) and Backports (Recommended for modern hardware).
- If
- Sequential Injection: After the base package is secured, the script iterates through
_DETECTED_FW_PKGS. It usesapt-cache policyto validate availability before installing specific vendor packages (firmware-realtek, etc.), skipping those already present or unavailable in repositories.
5. Broadcom Wireless Support (DKMS Single-Path)
Broadcom chipsets require proprietary handling because no open-source driver covers most 14e4:* devices on modern kernels. The current implementation in firmware.sh:_handle_wireless uses a single-path DKMS flow (broadcom-sta-dkms + wl module) — not a 3-tier fallback:
-
Device detection — Iterates
PCI_NET_DEVS(parsed fromlspci -nnby the on-demand detection battery) and extracts the Broadcom ID14e4:XXXX. Non-Broadcom devices are skipped. -
Dependency guard — Verifies
linux-headers-amd64anddkmsare available viaapt-cache show. If missing, shows:"linux-headers-amd64 or dkms are not available in your repositories." -
User confirmation —
whiptail --yesno "Install broadcom-sta-dkms, dkms, and wireless-tools?" -
Step-by-step install (allows partial failure without aborting the whole module):
_run_cmd "Broadcom Dependencies" "sudo DEBIAN_FRONTEND=noninteractive apt install -y dkms wireless-tools linux-headers-amd64" || true _run_cmd "Broadcom Driver" "sudo DEBIAN_FRONTEND=noninteractive apt install -y broadcom-sta-dkms" || true -
Blacklist persistence — Writes
/etc/modprobe.d/blacklist-broadcom.conf:blacklist b43 blacklist b43legacy blacklist brcmsmac blacklist bcma blacklist ssb -
SSH Warning + Module Switch — Before unloading current WiFi modules, the script warns about SSH disconnection. Then removes conflicting modules and loads the Broadcom driver:
_msg "Network Warning" "The script is about to unload current WiFi kernel modules to load the Broadcom driver.
If you are connected via SSH over WiFi, YOUR CONNECTION WILL DROP. Please reconnect after a few seconds." _run_cmd "Modprobe" "sudo modprobe -r b43 b43legacy b44 bcma brcmsmac brcmfmac ssb wl 2>/dev/null || true" || true _run_cmd "Modprobe" "sudo modprobe wl" || true
7. **Initramfs** — Rebuilds the initramfs to include the new `wl` module:
```bash
_run_cmd "Initramfs" "sudo update-initramfs -u" || true
-
Combo BT handling — If a Broadcom Bluetooth device is also present (
PCI_BT_DEVSgrepbroadcom), writessoftdep wl post: btusbto/etc/modprobe.d/broadcom-combo.conf -
Post-DKMS verification — Checks for
/lib/modules/$(uname -r)/updates/dkms/wl.ko*. If missing, shows the last 20 lines ofdmesgand offersdpkg-reconfigure broadcom-sta-dkms. On success, verifieslsmod | grep ^wland reportsBroadcom WiFi activated (wl module loaded)ordriver installed but wl module did not load — reboot required.
USB Broadcom (0a5c vendor, lsusb) is detected but not auto-installed — the script shows a message that Linux lacks native drivers for most USB Broadcom WiFi chips and that ndiswrapper may be needed.
Historical note: Earlier drafts of this document described a 3-tier system (
firmware-brcm80211→firmware-b43-installer→broadcom-sta-dkms). The current script has consolidated to the DKMS path only. The other firmware packages are still available via the basefirmware-linux-nonfreemetapackage and vendor-specific packages (firmware-realtek, etc.).
6. Bluetooth Stack Integration
Bluetooth support is handled through a dedicated module (bluetooth.sh) that integrates seamlessly with the firmware detection process:
- Hardware Detection: The script identifies both PCI and USB Bluetooth controllers using
PCI_BT_DEVSandUSB_BT_DEVSarrays, ensuring comprehensive coverage of all Bluetooth hardware types. - Base Stack Installation: When Bluetooth hardware is detected, the system installs the core stack (
bluez,bluez-utils,bluez-obexd) if not already present. - Desktop Environment Optimization: Based on the detected desktop environment:
- KDE: Installs
bluedeviland optionallypipewire-pulse+wireplumberfor Pipewire audio server integration. - GNOME: Uses built-in GNOME Bluetooth support in
gnome-control-center. - XFCE/Other: Installs
bluemanas the GTK Bluetooth manager.
- KDE: Installs
- Service Management: The script ensures the Bluetooth service is enabled and started automatically on boot, with session restart or reboot recommendation for desktop applets to load properly.
This modular approach keeps Bluetooth handling separate from network firmware while maintaining tight integration through shared device detection arrays and coordinated installation flow.