CR-2026-06-19: Implementation
Implementation
Phase 0: Pre-Change Btrfs Snapshot
Take a read-only btrfs snapshot before modifying boot configuration. This provides a filesystem-level rollback point independent of the boot entry rollback documented in the rollback page.
| The P16g deploy project (thinkpad-t16g) uses native btrfs snapshots β not snapper. The rollback procedure is documented in Phase 13 (Maintenance) of the deploy project. |
sudo btrfs subvolume list / | awk '{print $NF}'
@ @snapshots @var_log
@home is on a separate LUKS volume (crypthome), not cryptroot. It does not appear in this listing. Root subvolume snapshots cannot affect /home.
|
ls -la /.snapshots/ 2>&1
If /.snapshots does not exist, create it:
sudo mkdir -p /.snapshots
sudo btrfs subvolume snapshot -r / /.snapshots/pre-psr-fix-2026-06-19
sudo btrfs subvolume list /.snapshots | awk '{print $NF}'
@snapshots/pre-psr-fix-2026-06-19
@ @snapshots @var_log @/var/lib/portables @/var/lib/machines pre-psr-fix-2026-06-19
Snapshot Rollback Procedure (if needed)
If the boot parameter change causes a worse problem than it fixes, roll back the entire filesystem state from a live USB or LTS kernel:
# 1. Boot from LTS kernel or live USB
# 2. Unlock and mount the btrfs volume
sudo cryptsetup luksOpen /dev/<device> cryptroot
sudo mount /dev/mapper/cryptroot /mnt
# 3. Replace current @ with the snapshot
sudo mv /mnt/@ /mnt/@broken-psr-fix
sudo btrfs subvolume snapshot /mnt/@snapshots/pre-psr-fix-2026-06-19 /mnt/@
# 4. Reboot into restored system
sudo umount /mnt
sudo reboot
After successful verification (Phase 4), the snapshot can be kept as a reference point or removed:
# Optional cleanup after verified success
sudo btrfs subvolume delete /.snapshots/pre-psr-fix-2026-06-19
Phase 1: Fix ESP Boot Entries (Immediate)
Both ESP entries are missing i915.enable_psr=0. This phase appends it to the options line in both.
sudo awk '/^options/' /boot/efi/loader/entries/arch.conf /boot/efi/loader/entries/arch-lts.conf
i915.enable_psr=0)/boot/efi/loader/entries/arch.conf:options cryptdevice=UUID=... security=apparmor /boot/efi/loader/entries/arch-lts.conf:options cryptdevice=UUID=... security=apparmor
options cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor options cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor
sudo sed -i '/^options/ s/$/ i915.enable_psr=0/' /boot/efi/loader/entries/arch.conf /boot/efi/loader/entries/arch-lts.conf
sudo awk '/^options/' /boot/efi/loader/entries/arch.conf /boot/efi/loader/entries/arch-lts.conf
/boot/efi/loader/entries/arch.conf:options cryptdevice=UUID=... security=apparmor i915.enable_psr=0 /boot/efi/loader/entries/arch-lts.conf:options cryptdevice=UUID=... security=apparmor i915.enable_psr=0
options cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor i915.enable_psr=0 options cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor i915.enable_psr=0
Phase 2: Create Persistent Kernel Command Line
Without /etc/kernel/cmdline, every kernel update regenerates ESP entries from scratch. This file is the canonical source that kernel-install reads when generating boot entries.
ls -la /etc/kernel/cmdline 2>&1
ls: cannot access '/etc/kernel/cmdline': No such file or directory
"/etc/kernel/cmdline": No such file or directory (os error 2)
echo 'cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor i915.enable_psr=0' | sudo tee /etc/kernel/cmdline
cat /etc/kernel/cmdline
i915.enable_psr=0 at end)cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor i915.enable_psr=0
cryptdevice=UUID=a33cc5e6-0e54-4aa4-bc26-d08a212aa32a:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw nvidia_drm.modeset=1 mem_sleep_default=s2idle acpi_mask_gpe=0x6E lsm=landlock,lockdown,yama,integrity,apparmor,bpf apparmor=1 security=apparmor i915.enable_psr=0
Phase 3: Clean Up Stale XBOOTLDR Entry
The /boot/loader/entries/arch.conf (XBOOTLDR copy) has the parameter but is not read by systemd-boot. Synchronize it with the ESP version to avoid future confusion.
sudo awk '/^options/' /boot/loader/entries/arch.conf
This file already has i915.enable_psr=0 from the May 23 edit. No change needed unless it has drifted. If the output matches the ESP version, skip this step.
|
Phase 4: Reboot and Verify
sudo reboot
After reboot, verify the login screen appears on the internal panel without an external monitor connected.