![手动解压内核的最佳方法](https://linux22.com/image/1180043/%E6%89%8B%E5%8A%A8%E8%A7%A3%E5%8E%8B%E5%86%85%E6%A0%B8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95.png)
我在 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
它,并且无需解压即可工作。
此致