如何使用QEMU的确定性记录和重放功能进行Linux内核启动?

时间:2017-10-27 08:01:42

标签: linux linux-kernel qemu

QEMU支持确定性记录和重播,如https://github.com/qemu/qemu/blob/v2.9.0/docs/replay.txt

所述

但是,我无法重放完整的Linux内核启动:它总是挂起。

这些是我正在运行的命令:

#!/usr/bin/env bash
cmd="\
time \
./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 \
-M pc \
-append 'root=/dev/sda console=ttyS0 nokaslr printk.time=y - lkmc_eval=\"/rand_check.out;wget -S google.com;/poweroff.out;\"' \
-kernel './buildroot/output.x86_64~/images/bzImage' \
-nographic \
\
-drive file=./buildroot/output.x86_64~/images/rootfs.ext2,if=none,id=img-direct,format=raw \
-drive driver=blkreplay,if=none,image=img-direct,id=img-blkreplay \
-device ide-hd,drive=img-blkreplay \
\
-netdev user,id=net1 \
-device rtl8139,netdev=net1 \
-object filter-replay,id=replay,netdev=net1 \
"
echo "$cmd"
eval "$cmd -icount 'shift=7,rr=record,rrfile=replay.bin'"
# Different than previous.
eval "$cmd -icount 'shift=7,rr=record,rrfile=replay.bin'"
# Same as previous.
eval "$cmd -icount 'shift=7,rr=replay,rrfile=replay.bin'"

我的内核和根文件系统是使用此Buildroot设置生成的:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0a1a600d49d1292be82a47cfde6f0355996478f0,它使用QEMU v2.9.0。

lkmc_eval被我的init脚本篡改了。在这里,我们打印通常是随机的用户空间,以检查我们是否确实是确定性的,然后关闭机器。

我如何提出这些命令:

树内文档说没有网络支持,但wiki和git日志说它们是从v2.9.0开始添加的,所以我认为文档与wiki相比已经过时了。

使用该设置,启动重播进展得相当远,但挂起信息:

[   31.692427] NET: Registered protocol family 17

在初始记录中,下一条消息应为:

[   31.777326] sd 1:0:0:0: [sda] Attached SCSI disk

所以我怀疑这是一个块设备问题。

时间戳是相同的,所以我相信记录和重播到目前为止都有效。

如果我只使用网络:

-net none

然后记录本身挂起:

[   19.669685] ALSA device list:
[   19.670756]   No soundcards found.

如果有人想尝试针对它的QEMU补丁,只需检查/qemu/内的补丁并运行:

./build -t host-qemu-reconfigure

重建。

1 个答案:

答案 0 :(得分:1)

您的命令行看起来不错,但不幸的是,此版本中的记录/重播是QEMU。 我希望它能在最近的几周内修复。