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