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?

  • squid_slime@lemm.eeOP
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    2 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."