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?

  • 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.

    • 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 \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 \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."
      
      
      • Yeah the thought is that as long as my patch applies without error, I would get the latest kernel automatically built and can just update my laptop normally with pacman. And since I have a server anyways I might as well use it to compile the kernel at night. I’m also thinking of doing the same with some aur packages as well.