add ucode autodetection, move ucode installation to bootloader

This commit is contained in:
Tobias Powalowski 2023-02-02 10:23:55 +01:00
parent 4889cb6995
commit d94471b002
2 changed files with 44 additions and 52 deletions

View file

@ -1,6 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org> # created by Tobias Powalowski <tpowa@archlinux.org>
if [[ "${_RUNNING_ARCH}" == "x86_64" && "$(grep -q 'Intel' /proc/cpuinfo)" ]]; then
_UCODE="intel-ucode.img"
_UCODE_PKG="intel-ucode"
fi
if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]]; then
if grep -q 'AMD' /proc/cpuinfo; then
_UCODE="amd-ucode.img"
_UCODE_PKG="amd-ucode"
fi
fi
_getrootfstype() { _getrootfstype() {
_ROOTFS="$(_getfstype "${_ROOTDEV}")" _ROOTFS="$(_getfstype "${_ROOTDEV}")"
} }
@ -304,12 +315,10 @@ _do_efistub_parameters() {
_KERNEL="${_VMLINUZ_EFISTUB}" _KERNEL="${_VMLINUZ_EFISTUB}"
else else
_KERNEL="${_VMLINUZ}" _KERNEL="${_VMLINUZ}"
if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then
_INITRD_INTEL_UCODE="${_INTEL_UCODE}"
fi
fi fi
if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]]; then if [[ -n "${_UCODE}" ]]; then
_INITRD_AMD_UCODE="${_AMD_UCODE}" _INITRD_UCODE="${_UCODE}"
fi fi
_INITRD="${_INITRAMFS}" _INITRD="${_INITRAMFS}"
else else
@ -318,12 +327,10 @@ _do_efistub_parameters() {
_KERNEL="${_UEFISYS_PATH}/${_VMLINUZ_EFISTUB}" _KERNEL="${_UEFISYS_PATH}/${_VMLINUZ_EFISTUB}"
else else
_KERNEL="${_UEFISYS_PATH}/${_VMLINUZ}" _KERNEL="${_UEFISYS_PATH}/${_VMLINUZ}"
if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then
_INITRD_INTEL_UCODE="${_UEFISYS_PATH}/${_INTEL_UCODE}"
fi
fi fi
if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]]; then if [[ -n "${_UCODE}" ]]; then
_INITRD_AMD_UCODE="${_UEFISYS_PATH}/${_AMD_UCODE}" _INITRD_UCODE="${_UEFISYS_PATH}/${_UCODE}"
fi fi
_INITRD="${_UEFISYS_PATH}/${_INITRAMFS}" _INITRD="${_UEFISYS_PATH}/${_INITRAMFS}"
fi fi
@ -338,13 +345,9 @@ _do_efistub_copy_to_efisys() {
cp -f "${_DESTDIR}/boot/${_VMLINUZ}" "${_DESTDIR}/${_UEFISYS_MP}/${_KERNEL}" cp -f "${_DESTDIR}/boot/${_VMLINUZ}" "${_DESTDIR}/${_UEFISYS_MP}/${_KERNEL}"
rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD}" rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD}"
cp -f "${_DESTDIR}/boot/${_INITRAMFS}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD}" cp -f "${_DESTDIR}/boot/${_INITRAMFS}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD}"
if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then if [[ -n "${_INITRD_UCODE}" ]]; then
rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_INTEL_UCODE}" rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_UCODE}"
cp -f "${_DESTDIR}/boot/${_INTEL_UCODE}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_INTEL_UCODE}" cp -f "${_DESTDIR}/boot/${_UCODE}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_UCODE}"
fi
if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]]; then
rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_AMD_UCODE}"
cp -f "${_DESTDIR}/boot/${_AMD_UCODE}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_AMD_UCODE}"
fi fi
sleep 5 sleep 5
_dialog --infobox "Enable automatic copying of system files\nto EFI SYSTEM PARTITION (ESP) on installed system..." 4 50 _dialog --infobox "Enable automatic copying of system files\nto EFI SYSTEM PARTITION (ESP) on installed system..." 4 50
@ -355,10 +358,14 @@ Description=Copy EFISTUB Kernel and Initramfs files to EFI SYSTEM PARTITION
PathChanged=/boot/${_VMLINUZ} PathChanged=/boot/${_VMLINUZ}
PathChanged=/boot/${_INITRAMFS} PathChanged=/boot/${_INITRAMFS}
CONFEOF CONFEOF
[[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]] && \ if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]]; then
echo "PathChanged=/boot/${_AMD_UCODE}" >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path" if grep -q 'AMD' /proc/cpuinfo; then
[[ "${_RUNNING_ARCH}" == "x86_64" ]] && \ echo "PathChanged=/boot/${_UCODE}" >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path"
echo "PathChanged=/boot/${_INTEL_UCODE}" >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path" fi
fi
if [[ "${_RUNNING_ARCH}" == "x86_64" && "$(grep -q 'Intel' /proc/cpuinfo)" ]]; then
echo "PathChanged=/boot/${_UCODE}" >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path"
fi
cat << CONFEOF >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path" cat << CONFEOF >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path"
Unit=efistub_copy.service Unit=efistub_copy.service
[Install] [Install]
@ -372,12 +379,10 @@ Type=oneshot
ExecStart=/usr/bin/cp -f /boot/${_VMLINUZ} /${_UEFISYS_MP}/${_KERNEL} ExecStart=/usr/bin/cp -f /boot/${_VMLINUZ} /${_UEFISYS_MP}/${_KERNEL}
ExecStart=/usr/bin/cp -f /boot/${_INITRAMFS} /${_UEFISYS_MP}/${_INITRD} ExecStart=/usr/bin/cp -f /boot/${_INITRAMFS} /${_UEFISYS_MP}/${_INITRD}
CONFEOF CONFEOF
[[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]] && \ if [[ -n "${_INITRD_UCODE}" ]]; then
echo "ExecStart=/usr/bin/cp -f /boot/${_AMD_UCODE} /${_UEFISYS_MP}/${_INITRD_AMD_UCODE}" \ echo "ExecStart=/usr/bin/cp -f /boot/${_UCODE} /${_UEFISYS_MP}/${_INITRD_UCODE}" \
>> "${_DESTDIR}/etc/systemd/system/efistub_copy.service"
[[ "${_RUNNING_ARCH}" == "x86_64" ]] && \
echo "ExecStart=/usr/bin/cp -f /boot/${_INTEL_UCODE} /${_UEFISYS_MP}/${_INITRD_INTEL_UCODE}" \
>> "${_DESTDIR}/etc/systemd/system/efistub_copy.service" >> "${_DESTDIR}/etc/systemd/system/efistub_copy.service"
fi
if [[ "${_DESTDIR}" == "/install" ]]; then if [[ "${_DESTDIR}" == "/install" ]]; then
systemd-nspawn -q -D "${_DESTDIR}" systemctl enable efistub_copy.path &>"${_NO_LOG}" systemd-nspawn -q -D "${_DESTDIR}" systemctl enable efistub_copy.path &>"${_NO_LOG}"
else else
@ -412,10 +417,9 @@ _do_systemd_boot_uefi() {
! [[ -d "${_DESTDIR}/${_UEFISYS_MP}/loader/entries" ]] && mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/loader/entries" ! [[ -d "${_DESTDIR}/${_UEFISYS_MP}/loader/entries" ]] && mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/loader/entries"
echo "title Arch Linux" > "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf" echo "title Arch Linux" > "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
echo "linux /${_KERNEL}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf" echo "linux /${_KERNEL}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
[[ "${_RUNNING_ARCH}" == "x86_64" ]] && \ if [[ -n "${_INITRD_UCODE}" ]]; then
echo "initrd /${_INITRD_INTEL_UCODE}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf" echo "initrd /${_INITRD_UCODE}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
[[ "${_RUNNING_ARCH}" == "x86_64" || "${_RUNNING_ARCH}" == "aarch64" ]] && \ fi
echo "initrd /${_INITRD_AMD_UCODE}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
cat << GUMEOF >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf" cat << GUMEOF >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
initrd /${_INITRD} initrd /${_INITRD}
options ${_KERNEL_PARAMS_MOD} options ${_KERNEL_PARAMS_MOD}
@ -469,10 +473,9 @@ menuentry "Arch Linux" {
icon /EFI/refind/icons/os_arch.png icon /EFI/refind/icons/os_arch.png
loader /${_KERNEL} loader /${_KERNEL}
CONFEOF CONFEOF
[[ "${_RUNNING_ARCH}" == "x86_64" ]] && \ if [[ -n "${_INITRD_UCODE}" ]]; then
echo " initrd /${_INITRD_INTEL_UCODE}" >> "${_REFIND_CONFIG}" echo " initrd /${_INITRD_UCODE}" >> "${_REFIND_CONFIG}"
[[ "${_RUNNING_ARCH}" == "x86_64" || "${_RUNNING_ARCH}" == "aarch64" ]] && \ fi
echo " initrd /${_INITRD_AMD_UCODE}" >> "${_REFIND_CONFIG}"
cat << CONFEOF >> "${_REFIND_CONFIG}" cat << CONFEOF >> "${_REFIND_CONFIG}"
initrd /${_INITRD} initrd /${_INITRD}
options "${_KERNEL_PARAMS_MOD}" options "${_KERNEL_PARAMS_MOD}"
@ -675,7 +678,7 @@ menuentry "Arch Linux" {
set gfxpayload="keep" set gfxpayload="keep"
${_GRUB_ROOT_DRIVE} ${_GRUB_ROOT_DRIVE}
${_LINUX_MOD_COMMAND} ${_LINUX_MOD_COMMAND}
initrd ${_SUBDIR}/${_AMD_UCODE} ${_SUBDIR}/${_INITRAMFS} initrd ${_SUBDIR}/${_UCODE} ${_SUBDIR}/${_INITRAMFS}
} }
EOF EOF
_NUMBER=$((_NUMBER+1)) _NUMBER=$((_NUMBER+1))
@ -686,7 +689,7 @@ menuentry "Arch Linux" {
set gfxpayload="keep" set gfxpayload="keep"
${_GRUB_ROOT_DRIVE} ${_GRUB_ROOT_DRIVE}
${_LINUX_MOD_COMMAND} ${_LINUX_MOD_COMMAND}
initrd ${_SUBDIR}/${_INTEL_UCODE} ${_SUBDIR}/${_AMD_UCODE} ${_SUBDIR}/${_INITRAMFS} initrd ${_SUBDIR}/${_UCODE} ${_SUBDIR}/${_UCODE} ${_SUBDIR}/${_INITRAMFS}
} }
EOF EOF
if [[ -n "${_UEFI_BOOT}" ]]; then if [[ -n "${_UEFI_BOOT}" ]]; then
@ -961,6 +964,10 @@ _install_bootloader() {
_select_source || return 1 _select_source || return 1
fi fi
_prepare_pacman _prepare_pacman
if [[ -n "${_UCODE_PKG}" ]]; then
PACKAGES="${_UCODE_PKG}"
_run_pacman
fi
if [[ -n "${_UEFI_BOOT}" ]]; then if [[ -n "${_UEFI_BOOT}" ]]; then
_install_bootloader_uefi _install_bootloader_uefi
else else

View file

@ -6,11 +6,6 @@ LANG=C.UTF8
_LOCAL_DB="/var/cache/pacman/pkg/archboot.db" _LOCAL_DB="/var/cache/pacman/pkg/archboot.db"
_RUNNING_ARCH="$(uname -m)" _RUNNING_ARCH="$(uname -m)"
_KERNELPKG="linux" _KERNELPKG="linux"
_INTEL_UCODE="intel-ucode.img"
# name of amd ucode initramfs image
_AMD_UCODE="amd-ucode.img"
# name of the initramfs filesystem
_INITRAMFS="initramfs-${_KERNELPKG}.img"
# name of the kernel image # name of the kernel image
[[ "${_RUNNING_ARCH}" == "x86_64" || "${_RUNNING_ARCH}" == "riscv64" ]] && _VMLINUZ="vmlinuz-${_KERNELPKG}" [[ "${_RUNNING_ARCH}" == "x86_64" || "${_RUNNING_ARCH}" == "riscv64" ]] && _VMLINUZ="vmlinuz-${_KERNELPKG}"
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
@ -119,17 +114,7 @@ _auto_packages() {
# only add firmware if already used # only add firmware if already used
_linux_firmware _linux_firmware
_marvell_firmware _marvell_firmware
### HACK: # ucode package, expression needs to be fixed for bash 5.2.x:
# always add intel-ucode on x86_64
if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then
_PACKAGES="${_PACKAGES//\ intel-ucode\ / }"
_PACKAGES="${_PACKAGES} intel-ucode"
fi
# always add amd-ucode
if [[ "${_RUNNING_ARCH}" == "x86_64" || "${_RUNNING_ARCH}" == "aarch64" ]]; then
_PACKAGES="${_PACKAGES//\ amd-ucode\ / }"
_PACKAGES="${_PACKAGES} amd-ucode"
fi
### HACK: ### HACK:
# always add lvm2, cryptsetup, mdadm, nano, neovim and bash-completion # always add lvm2, cryptsetup, mdadm, nano, neovim and bash-completion
_PACKAGES="${_PACKAGES//\ lvm2\ / }" _PACKAGES="${_PACKAGES//\ lvm2\ / }"