查看真实的qcow2镜像中二进制数据-以MBR为例

71次阅读
没有评论

共计 3020 个字符,预计需要花费 8 分钟才能阅读完成。

查看真实的qcow2镜像中二进制数据:

问题:如何查看qcow2镜像的MBR中的Bootloader代码?使用qemu-nbd工具,这个一般安装了qemu之后都有的。

1 安装nbd模块

0、nbd模块未安装

[root@qemuswtpmsm4 ~]# sudo modprobe nbd max_part=8
modprobe: FATAL: Module nbd not found.

1、查看Linux版本以及内核版本

[root@qemuswtpmsm4 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@qemuswtpmsm4 ~]# uname -r
3.10.0-1160.el7.x86_64

2、安装相关包

yum install kernel-devel kernel-headers elfutils-libelf-devel gcc+ gcc-c++

3、下载对应的内核包

https://vault.centos.org/7.9.2009/os/Source/SPackages/kernel-3.10.0-1160.el7.src.rpm

#根据自己的系统版本去下载
#7.9.2009  为redhat-release 系统版本
#3.10.0-1160.el7.x86_64  为uname -r  内核信息

4、解压

 rpm -ivh kernel-3.10.0-1160.el7.src.rpm

 find / |grep rpmbuild
 cd /root/rpmbuild/SOURCES
 tar -xvf linux-3.10.0-1160.el7.tar.xz -C /usr/src/kernels/

 #解压后文件:/usr/src/kernels/
 ll /usr/src/kernels/
drwxr-xr-x. 22 root root 4096 May 30 18:20 3.10.0-1160.90.1.el7.x86_64
drwxr-xr-x. 22 root root 4096 May 30 18:20 3.10.0-1160.el7.x86_64
drwxrwxr-x. 24 root root 4096 May 30 18:30 linux-3.10.0-1160.el7

5、编译

cd /usr/src/kernels/linux-3.10.0-1160.el7/

#删除所有编译生成文件,内核配置文件
make mrproper

cp /usr/src/kernels/3.10.0-1160.90.1.el7.x86_64/Module.symvers ./

cp /boot/config-3.10.0-1160.el7.x86_64 ./.config

#备份当前.config文件为.config.old
make oldconfig

make prepare

make scripts

6、编译

make CONFIG_BLK_DEV_NBD=m M=drivers/block 

错误

drivers/block/nbd.c: 在函数‘__nbd_ioctl’中:
drivers/block/nbd.c:619:19: 错误:‘REQ_TYPE_SPECIAL’未声明(在此函数内第一次使用)
   sreq.cmd_type = REQ_TYPE_SPECIAL;
                   ^
drivers/block/nbd.c:619:19: 附注:每个未声明的标识符在其出现的函数内只报告一次
make[1]: *** [drivers/block/nbd.o] 错误 1
make: *** [_module_drivers/block] 错误 2
vim drivers/block/nbd.c

//sreq.cmd_type = REQ_TYPE_SPECIAL;
sreq.cmd_type = 7;  #修改为7

#重新执行一次
make CONFIG_BLK_DEV_NBD=m M=drivers/block

报错

No rule to make target 'tools/objtool/objtool'

原因:缺少参数:

# 添加参数后执行
make CONFIG_BLK_DEV_NBD=m M=drivers/block CONFIG_STACK_VALIDATION=

7、复制编译好的内核模块文件

cp drivers/block/nbd.ko /lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/block/
depmod -a #生成 modules.dep 和映射文件

8、验证

[root@qemuswtpmsm4 ~]# modinfo nbd
filename:       /lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/block/nbd.ko
license:        GPL
description:    Network Block Device
retpoline:      Y
rhelversion:    7.9
srcversion:     EDE909A294AC5FE08E81957
depends:
vermagic:       3.10.0 SMP mod_unload modversions
parm:           nbds_max:number of network block devices to initialize (default: 16) (int)
parm:           max_part:number of partitions per device (default: 0) (int)
parm:           debugflags:flags for controlling debug output (int)

2 挂载qcow2镜像为块设备

sudo modprobe nbd max_part=8 #Linux 内核模块 nbd 并设置网络块设备(Network Block Device,即 NBD)最大分区数为 8 。
qemu-nbd -c /dev/nbd0 <qcow2_filename>

执行以上命令后,qcow2 镜像文件就会被挂载为 /dev/nbd0 块设备。

3 使用hexdump等工具查看块设备内容

sudo hexdump -C /dev/nbd0 | less

该命令会将 /dev/nbd0 块设备的内容以十六进制形式输出,并使用 less 工具进行分页显示。

查看MBR代码:512字节

  hexdump -n 512 -e '16/1 "%02x " "\n"' /dev/nbd0

该命令作用是将 /dev/nbd0 设备的前 512 个字节以十六进制格式输出。其中-n 512 选项表示只转储前 512 个字节。-e 选项用于指定输出格式,16/1 "%02x " 表示每行输出 16 个字节,每个字节使用两位十六进制表示,并在字节之间添加一个空格。最后的 "\n" 表示在每行的结尾添加一个换行符。

[root@qemuswtpmsm4 lyy]#  hexdump -n 512 -e '16/1 "%02x " "\n"' /dev/nbd0
eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0
fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00
00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75
....
29 82 8e fe ff ff 00 08 20 00 00 f8 5f 02 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

4 卸载/dev/nbd0块设备

sudo qemu-nbd -d /dev/nbd0
正文完
 
landery
版权声明:本站原创文章,由 landery 2023-05-31发表,共计3020字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)