共计 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
正文完