Skip Navigation

Kernel Maintenance By a Novice.

been using Arch for years but i am still a novice, yesterday i had found that in order for something to work on my system i will need to edit a few lines in kernel which i did, then removed unnecessary modules > intel, > nvidia, compiled. it worked great but with Arch and its rolling release i am dreading the next update and having to go through this again.
what methods are there to automate this process?

17
17 comments
  • What modifications were required? The good part of a rolling release is that upstreaming things means you only have to deal with manual fixes for like 2 or 3 updates.

    10
    • set LINK_TRAINING_ATTEMPTS from 5 to 10 in drivers/gpu/drm/amd/display/dc/link/link_dpms.c and set LINK_TRAINING_RETRY_DELAY from 50 to 100 in drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c.

      i doubt this will be added to kernel as its a fix for an issue that isn't wide spread.

      6
      • That wouldn't be accepted as is, but those sound like tunables. They could be exposed as kernel parameters. May be worth submitting the patch as an RFC just to call attention to it.

        19
      • Use diff patches and automate with some bash scripting.

        8
  • You could write a bash script to automate this process. Pacman supports hooks for updates, so after kernel updates you could set it up to automatically run the script.

    7
    • not looked in to pacman hooks but will need to now lol any i made a script that downloads, unzips and patches then compiles so mostly hands free.

      3
  • This is the perfect use case for gentoo, there is a documented process for adding kernel patches and saving a kernel build configuration

    6
  • I use a custom kernel on my laptop. I just modified the PKGBUILD of the official arch kernel package, and added my patch as a file. Then I could build a proper package with makepkg. I'm planning on setting up my server to automatically build the patched kernel and serve it in a private arch repository, so I don't have to compile the kernel on my laptop regularly. I'm waiting on forgejo (git forge I host on my server) version 9 to be released first, as it should support arch package hosting by then.

    4
    • this sounds very involved initially but hands off after the fact.

      Script
      #!/bin/bash
      
      cd ~/ || exit
      
      LATEST_KERNEL=$(curl -s https://www.kernel.org | grep -Po 'linux-\d+\.\d+\.\d+\.tar\.xz' | head -1)
      echo "Latest Kernel: $LATEST_KERNEL"
      
      KERNEL_URL="https://cdn.kernel.org/pub/linux/kernel/v6.x/$LATEST_KERNEL"
      echo "Kernel URL: $KERNEL_URL"
      
      DIR_NAME=$(echo $LATEST_KERNEL | sed 's/\.tar\.xz//')
      mkdir -p ./$DIR_NAME
      
      wget -O ./$DIR_NAME/$LATEST_KERNEL "$KERNEL_URL" || exit
      
      tar -xf ./$DIR_NAME/$LATEST_KERNEL -C ./$DIR_NAME || exit
      
      EXTRACTED_DIR=$(tar -tf ./$DIR_NAME/$LATEST_KERNEL | head -1 | cut -f1 -d"/")
      
      cd ./$DIR_NAME/$EXTRACTED_DIR || exit
      
      zcat /proc/config.gz > .config
      echo "Kernel config copied."
      
      if [ -f "drivers/gpu/drm/amd/display/dc/link/link_dpms.c" ] && [ -f "drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c" ]; then
          echo "Files found, proceeding with modifications..."
          
          sed -i 's/#define LINK_TRAINING_RETRY_DELAY 50 \/\* ms \*\//#include <linux\/module.h>\nstatic int link_training_retry_delay = 50;\nmodule_param(link_training_retry_delay, int, 0644);\nMODULE_PARM_DESC(link_training_retry_delay, "Delay between link training retries (ms)");\n#define LINK_TRAINING_RETRY_DELAY link_training_retry_delay/' drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c
          
          sed -i 's/#define LINK_TRAINING_ATTEMPTS 4/#include <linux\/module.h>\nstatic int link_training_attempts = 4;\nmodule_param(link_training_attempts, int, 0644);\nMODULE_PARM_DESC(link_training_attempts, "Number of link training attempts");\n#define LINK_TRAINING_ATTEMPTS link_training_attempts/' drivers/gpu/drm/amd/display/dc/link/link_dpms.c
          
      else
          echo "One or both files not found in the kernel source directory."
      fi
      
      echo "Kernel modifications complete."
      
      make olddefconfig || exit
      #make || exit
      
      echo "Compiling the kernel..."
      make -j16 || exit
      
      echo "Building modules..."
      sudo make modules_install || exit   
      
      echo "Installing the kernel..."
      sudo make install || exit   
      
      echo "Backing up existing kernel files..."
      sudo cp /boot/vmlinuz-linux /boot/vmlinuz-linux.bak
      sudo cp /boot/initramfs-linux.img /boot/initramfs-linux.img.bak
      
      echo "Moving new kernel files to /boot..."
      sudo cp ./arch/x86/boot/bzImage /boot/vmlinuz-fix
      sudo mkinitcpio -k $(make kernelrelease) -c /etc/mkinitcpio.conf -g /boot/initramfs-fix.img
      
      if [ -f /boot/vmlinuz-fix ] && [ -f /boot/initramfs-fix.img ]; then
          echo "Kernel and initramfs moved to /boot successfully."
      else
          echo "Failed to move kernel or initramfs files to /boot."
          exit 1
      fi
      
      echo "Kernel compilation, installation, and file replacement completed successfully."
      
      
      1
You've viewed 17 comments.