[关闭]
@donghanyuan0609 2022-10-26T16:40:04.000000Z 字数 3078 阅读 235

QEMU Debug Kernel

安装系统

  1. #!/bin/bash
  2. DISK_IMG="$HOME/data/fastswap.qcow2"
  3. ISO="$HOME/data/ubuntu-20.04.5-live-server-amd64.iso"
  4. sudo qemu-system-x86_64 -m 64G -enable-kvm \
  5. -hda $DISK_IMG \
  6. -cdrom $ISO \
  7. -net user,hostfwd=tcp::10022-:22 \
  8. -net nic \
  9. -vnc :1

用 remmina 连接 VNC ,端口 5901,remmina 支持 SSH Tunnel 代理,如果用非 ssh 方式的 socks5 代理,可以用 proxychains:

  1. proxychains4 -f ict_proxy.conf -q /usr/bin/remmina

运行系统

  1. #!/bin/bash
  2. DISK_IMG="$HOME/data/fastswap.qcow2"
  3. sudo qemu-system-x86_64 -m 64G -enable-kvm \
  4. -hda $DISK_IMG \
  5. -cpu host,+monitor \
  6. -smp cpus=20 \
  7. -fsdev local,security_model=passthrough,id=fsdev0,path=${SHARED_FOLDER} \
  8. -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
  9. -net user,hostfwd=tcp::10022-:22 \
  10. -net nic \
  11. -vnc :1

调试内核

  1. sudo ${QEMU_PATH}/qemu-system-x86_64 -m 64G -enable-kvm \
  2. -kernel $KERNEL \
  3. -append "root=/dev/sda2 earlyprintk=ttyS0 console=ttyS0 nopti nokaslr mitigations=off systemd.unified_cgroup_hierarchy=1" \
  4. -cpu host \
  5. -smp cpus=20 \
  6. -hda $DISK_IMG \
  7. -fsdev local,security_model=passthrough,id=fsdev0,path=${SHARED_FOLDER} \
  8. -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
  9. -net nic \
  10. -net user,hostfwd=tcp::10022-:22 \
  11. -vnc :1 \
  12. -gdb tcp::1235
  13. # 其中 `-fsdev` 和 `-device` 这两行是用来共享目录的

这个方式用于连 init 都出错的情况下用,如果要在虚拟机里跑应用还是要在虚拟机里完整编译安装内核。

挂载 qcow2 硬盘

here

注意:挂载时需要保证虚拟机是关闭的。

  1. sudo modprobe nbd
  2. sudo qemu-nbd --connect=/dev/nbd0 $QCOW2_DISK
  3. sudo fdisk /dev/nbd0 -l
  4. sudo mount /dev/nbd0p2 ~/data/mountpoint
  5. # -----------------
  6. sudo umount ~/data/mountpoint
  7. sudo qemu-nbd --disconnect /dev/nbd0
  8. sudo rmmod nbd

网络

QEMU >=7.2 : Changelog

取消了 slirp 的默认支持,需要在编译 QEMU 时手动开启

configure 添加选项: --enable-slirp ,host 安装 libslirp-dev

虚拟机和主机之间共享目录

使用 9pfs:ref1, ref2

官方文档:9psetup

qemu 编译选项支持 virtfs

  1. ../../../configure --target-list=x86_64-softmmu --enable-debug --enable-virtfs --enable-slirp

需要安装依赖库 libcap, libattr ,如果缺失了会提示

重新编译 qemu 。

启动参数添加 virtfs

  1. -fsdev local,security_model=passthrough,id=fsdev0,path=/path/to/share \
  2. -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare

其中 /path/to/share 替换成实际的共享目录

guest 内核中挂载共享目录

  1. sudo mkdir -p /mnt/share
  2. sudo mount -t 9p -o trans=virtio,version=9p2000.L hostshare /mnt/share

加到 /etc/fstab 中:

  1. # <file system> <mount point> <type> <options> <dump> <pass>
  2. hostshare /mnt/share 9p trans=virtio,version=9p2000.L 0 0

其中 hostshare 是 qemu 启动参数中的 mount_tag 设定的值

更新 /etc/initramfs-tools/modules ,添加:

  1. 9p
  2. 9pnet
  3. 9pnet_virtio

或配置 systemd.mount (好像用不了)

参考 回答

调试内核时注意

编译选项中,开启 9p 文件系统支持(以挂载共享目录):

  1. CONFIG_NET_9P=y
  2. CONFIG_9P_FS=y
  3. CONFIG_VIRTIO_PCI=y
  4. CONFIG_NET_9P_VIRTIO=y
  5. CONFIG_9P_FS_POSIX_ACL=y
  6. CONFIG_NET_9P_DEBUG=y

Cgroup V2

安装 libcgroup1cgroup-tools ,在内核启动选项(GRUB_CMDLINE_LINUX_DEFAULT)中添加:

  1. systemd.unified_cgroup_hierarchy=1

执行 sudo update-grub 后重启,即可只使用 cgroup v2。

参考

查看是否只开启了 cgroup v2: mount | grep cgroup ,只有 v2 条目就正确。

编译内核加版本号

添加编译选项:

  1. CONFIG_LOCALVERSION="-prof" # 给内核版本号加个标记
  2. CONFIG_LOCALVERSION_AUTO=y

查看版本号:include/generated/utsrelease.h

debug kernel 识别不到网卡

需要开启 E1000 支持

  1. CONFIG_E1000=y
  2. CONFIG_E1000E=y
  3. CONFIG_E1000E_HWTS=y

debug kernel 记得拷贝源码和安装模块

需要往文件系统里安装内核模块,源代码也要拷贝到文件系统中

  1. # 先挂载 qcow2 rootfs
  2. # ------
  3. # 安装内核模块 (在 host 上)
  4. sudo make -j$(nproc) INSTALL_MOD_STRIP=1 modules_install INSTALL_MOD_PATH=~/data/rootfs
  5. # 拷贝源代码 (在 host 上)
  6. sudo cp -r ~/linux-5.11 ~/data/rootfs/home/ubuntu/
  7. # 需要用 root 拷贝,拷过去之后在 guest 上 sudo chown
  8. # ------
  9. # 卸载 rootfs

进入 guest 后,找到 lib/modules/[当前内核版本]/ ,修一下失效的软链接。

(update: 上面的方法还是可能有问题,师兄的建议是,把源码目录直接拷到虚拟机硬盘里,在虚拟机里面完整地重新编译安装)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注