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?

  • Static_Rocket@lemmy.world
    link
    fedilink
    English
    arrow-up
    9
    ·
    3 months ago

    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.

  • moreeni@lemm.ee
    link
    fedilink
    arrow-up
    7
    ·
    3 months ago

    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.

    • squid_slime@lemm.eeOP
      link
      fedilink
      arrow-up
      3
      ·
      3 months ago

      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.

  • kittenz@lemmy.blahaj.zone
    link
    fedilink
    arrow-up
    9
    arrow-down
    2
    ·
    edit-2
    3 months ago

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

  • noddy@beehaw.org
    link
    fedilink
    arrow-up
    4
    ·
    3 months ago

    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.

    • squid_slime@lemm.eeOP
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      3 months ago

      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."
      
      
      • noddy@beehaw.org
        link
        fedilink
        arrow-up
        1
        ·
        3 months ago

        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.