手动解压内核的最佳方法

手动解压内核的最佳方法

我在 Raspberry Pi 4 usb 启动 ssd 上。
操作系统:Ubuntu 桌面 20.04.2 64 位 arm64

为了在没有 SD 卡的情况下在 USB 上启动,我将启动配置为在解压缩的 vmlinux 上启动。

这是由于缺少使用压缩内核 vmlinu 通过 USB 启动的功能

因此我使用一个脚本绑定到 apt 事件,在内核更新后对其进行解压。
我的脚本如下:

#... controls 
zcat vmlinuz > vmlinux
#... 

它可以工作,但是现在,我发现,与更新的内核版本相关的是这个脚本:
/usr/src/linux-raspi-headers-5.4.0-1028/scripts/extract-vmlinux

在我看来,这个脚本也解压了内核。

我的问题是:最好使用此脚本,除非

像这个命令:# extract-vmlinux vmlinuz > vmlinux
这个命令正确吗?

答案1

最好使用它,extract-vmlinux原因如下:

  • 您不知道使用了哪种压缩。可能是 gzip、LZ4、Bzip2、XZ……最新的extract-vmlinux脚本知道如何提取每种压缩内核,但您仍然需要相关的命令行实用程序。
  • 压缩内核与简单的压缩文件不同。它们是自解压的,因此包含二进制标头。内核映像本身可能在它之前或之后还有其他二进制对象。我很惊讶这zcat对你有用;对于 LZ4 压缩内核,简单地使用lz4cat对我来说不起作用。

出于与你不同的原因,我写了内核安装钩子脚本用于extract-vmlinux解压 LZ4 压缩的 Ubuntu 内核。这应该可以帮助您在 Raspberry Pi 上实现同样的功能。

答案2

我会将您的解决方案与我的解决方案整合在一起。
我将在更新后执行 apt 挂钩
,但会考虑在内核安装后挂钩中移动,
这是我的代码:

#!/bin/bash -e

#Set Variables
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux
EXTRACT_VMLINUX="/usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux"
if ! [ -x $EXTRACT_VMLINUX ]; then
  echo -e "\e[32m$EXTRACT_VMLINUX is not executable\e[0m"
  echo -e "\e[32mI will use zcat!\e[0m"
  EXTRACT_VMLINUX="zcat -qf"
fi

if [ -e $BTPATH/check.md5 ]; then
    if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
      echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
          exit 0
    else 
          echo -e "\e[31mHash check failed, kernel will be furter investigate\e[0m"
    fi
fi

mv $DKPATH $DKPATH.bak

if [ ! $? == 0 ]; then
  echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
  exit 1
else 
  echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
fi
# Decompress the new kernel 
echo "Decompressing kernel: "$CKPATH".............."
$EXTRACT_VMLINUX $CKPATH > $DKPATH
if [ ! $? == 0 ]; then
  echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
  exit 1
else
  echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
fi

#Hash the new kernel for checking
md5sum $CKPATH $DKPATH > $BTPATH/check.md5

if [ ! $? == 0 ]; then
    echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
else 
    echo -e "\e[32mMD5 generated Succesfully\e[0m"
fi

#Exit
exit 0

更新

有一个问题:
如果我执行 $EXTRACT_VMLINUX /boot/firmware/vmlinuz && echo 'ok'
输出将是:


extract-vmlinux:无法找到vmlinux。ok

extract-vmlinux 如果失败,不要抛出错误:不要退出 1, 如果我们使用它
,这是一个坏消息,如果失败,我们可以检查它
zcat -qf vmlinuz > vmlinux

所以最好不要使用 extract-vmlinux 而改用 zcat。

对于 rpi 用户

在 Ubuntu 20.04.2 上,不再需要在 Raspberry Pi 4 上的 USB 上解压内核:

在 config.txt 中我们可以使用kernel=vmlinuz它,并且无需解压即可工作。

此致

相关内容