简而言之:
如何从系统备份中提取VERSION,SUBVERSION和PATCHLEVEl号.img
?理想情况下,没有root权限。
扩展:
从下一页:
https://www.raspberrypi.org/downloads/raspbian/
提供的Debianzip
提取为.img
,代表用于手臂架构的Debian / Raspian系统的完整系统备份。
为了生成自定义内核,需要知道系统的VERSION,SUBVERSION和PATCHLEVEL,这与典型的内核所提供的等效。
$ uname -r
4.9.0-3-amd64
最简单的方法是直接加载系统并运行命令,但是在这种情况下不适用。
目标:
映像的内核需要打补丁并交叉编译。我的意图是为此过程创建一个脚本,因此在内核更新到来时可以“轻松地”进一步应用它。
这似乎适用于该2017-09-07-raspbian-stretch-lite.img
站点上的图像:
$ sudo kpartx -rva 2017-09-07-raspbian-stretch-lite.img
add map loop0p1 (252:19): 0 85622 linear 7:0 8192
add map loop0p2 (252:20): 0 3528040 linear 7:0 94208
$ sudo mount -r /dev/mapper/loop0p1 mnt
$ LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}
' < mnt/kernel.img | gunzip | grep -aPom1 'Linux version \S+'
Linux version 4.9.41+
(其中\37\213\10\0
标识压缩数据的开始)。
作为非根用户,并假设第一个分区在映像中始终为4MiB,请使用GNU从该vfat分区中mtools
提取kernel.img
:
$ MTOOLS_SKIP_CHECK=1 mtype -i 2017-09-07-raspbian-stretch-lite.img@@4M ::kernel.img|
LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}' |
gunzip | grep -aPom1 'Linux version \K\S+'
4.9.41+
如果不是,则在具有/dev/fd
支持(和GNU grep
)的系统上:
MTOOLS_SKIP_CHECK=1 MTOOLSRC=/dev/fd/3 mtype z:kernel.img \
3<< EOF 4< 2017-09-07-raspbian-stretch-lite.img |
drive z:
file="/dev/fd/4"
partition=1
EOF
LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}' |
gunzip | grep -aPom1 'Linux version \K\S+'
(在其他系统上,请使用file="2017-09-07-raspbian-stretch-lite.img"
,/dev/fd/4
仅用于使其更易于适应任意文件名)
从zip文件中,您应该能够不必提取整个图像,而只需提取第一个分区即可:
#! /bin/zsh -
zip=${1?zip file missing}
MTOOLS_SKIP_CHECK=1 mtype -i =(
unzip -p -- "$zip" | perl -ne '
BEGIN{$/=\512}
if ($. == 1) {
($offset, $size) = unpack("x454L<2",$_)
} elsif ($. > $offset) {
print;
if ($. == $offset + $size - 1) {exit}
}') ::kernel.img |
LC_ALL=C gawk -v RS='\37\213\10\0' 'NR==2{printf "%s", RS $0; exit}' |
gunzip | grep -aPom1 'Linux version \K\S+'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句