【微知】qemu如何配置ctrl+c不退出qemu系统?(-chardev stdio,id=char0,signal=off)

背景

直接通过qemu启动系统后,经常因为在系统中执行一条命令敲ctrl+c造成系统退出。如何让qemu不响应这个signal?

原因

在 QEMU 中,Ctrl+C 默认会发送 SIGINT 信号,导致 QEMU 进程退出。

方法

在qemu启动系统的时候可以指定参数来禁用信号处理,-chardev参数。
在启动 QEMU 时,添加 -chardev 参数并设置 signal=off,可以禁用 Ctrl+C 的默认行为。

qemu-system-x86_64 \
  -chardev stdio,id=char0,signal=off \
  -serial chardev:char0 \
  -nographic \
  ...其他参数...

这样配置后,Ctrl+C 将不会导致 QEMU 退出

===== TEST FINISHED OK ===== [dragon@localhost ova_temp]$ export LIBGUESTFS_BACKEND=direct [dragon@localhost ova_temp]$ export LIBGUESTFS_DEBUG=1 [dragon@localhost ova_temp]$ sudo -E virt-v2v -i disk win2003-disk1.vmdk -o local -os ~/vms/win2003/ libguestfs: create: flags = 0, handle = 0x5628d0bb1710, program = virt-v2v libguestfs: create: flags = 0, handle = 0x5628d0bb1da0, program = virt-v2v [ 0.0] Opening the source -i disk win2003-disk1.vmdk libguestfs: create: flags = 0, handle = 0x5628d0bb43f0, program = virt-v2v libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b' libguestfs: command: run: qemu-img libguestfs: command: run: \ info libguestfs: command: run: \ -U libguestfs: command: run: \ --output json libguestfs: command: run: \ ./win2003-disk1.vmdk libguestfs: parse_json: qemu-img info JSON output:\n{\n "virtual-size": 42949672960,\n "filename": "./win2003-disk1.vmdk",\n "cluster-size": 65536,\n "format": "vmdk",\n "actual-size": 2682425344,\n "format-specific": {\n "type": "vmdk",\n "data": {\n "cid": 2370822867,\n "parent-cid": 4294967295,\n "create-type": "streamOptimized",\n "extents": [\n {\n "compressed": true,\n "virtual-size": 42949672960,\n "filename": "./win2003-disk1.vmdk",\n "cluster-size": 65536,\n "format": ""\n }\n ]\n }\n },\n "dirty-flag": false\n}\n\n [ 0.0] Creating an overlay to protect the source from being modified libguestfs: create: flags = 0, handle = 0x5628d0bb5ab0, program = virt-v2v libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b' libguestfs: command: run: qemu-img libguestfs: command: run: \ info libguestfs: command: run: \ -U libguestfs: command: run: \ --output json libguestfs: command: run: \ /var/tmp/v2vovl4d77de.qcow2 libguestfs: parse_json: qemu-img info JSON output:\n{\n "backing-filename-format": "vmdk",\n "virtual-size": 42949672960,\n "filename": "/var/tmp/v2vovl4d77de.qcow2",\n "cluster-size": 65536,\n "format": "qcow2",\n "actual-size": 200704,\n "format-specific": {\n "type": "qcow2",\n "data": {\n "compat": "1.1",\n "lazy-refcounts": false,\n "refcount-bits": 16,\n "corrupt": false\n }\n },\n "full-backing-filename": "/home/dragon/ova_temp/win2003-disk1.vmdk",\n "backing-filename": "/home/dragon/ova_temp/win2003-disk1.vmdk",\n "dirty-flag": false\n}\n\n libguestfs: create: flags = 0, handle = 0x5628d0bb72d0, program = virt-v2v libguestfs: command: run: qemu-img --help | grep -sqE -- '\binfo\b.*-U\b' libguestfs: command: run: qemu-img libguestfs: command: run: \ info libguestfs: command: run: \ -U libguestfs: command: run: \ --output json libguestfs: command: run: \ /var/tmp/v2vovl4d77de.qcow2 libguestfs: parse_json: qemu-img info JSON output:\n{\n "backing-filename-format": "vmdk",\n "virtual-size": 42949672960,\n "filename": "/var/tmp/v2vovl4d77de.qcow2",\n "cluster-size": 65536,\n "format": "qcow2",\n "actual-size": 200704,\n "format-specific": {\n "type": "qcow2",\n "data": {\n "compat": "1.1",\n "lazy-refcounts": false,\n "refcount-bits": 16,\n "corrupt": false\n }\n },\n "full-backing-filename": "/home/dragon/ova_temp/win2003-disk1.vmdk",\n "backing-filename": "/home/dragon/ova_temp/win2003-disk1.vmdk",\n "dirty-flag": false\n}\n\n [ 0.1] Opening the overlay libguestfs: create: flags = 0, handle = 0x5628d0bb99f0, program = virt-v2v libguestfs: launch: program=virt-v2v libguestfs: launch: identifier=v2v libguestfs: launch: version=1.40.2libvirt libguestfs: launch: backend registered: unix libguestfs: launch: backend registered: uml libguestfs: launch: backend registered: libvirt libguestfs: launch: backend registered: direct libguestfs: launch: backend=direct libguestfs: launch: tmpdir=/tmp/libguestfssJzX3j libguestfs: launch: umask=0022 libguestfs: launch: euid=0 libguestfs: begin building supermin appliance libguestfs: run supermin libguestfs: command: run: /usr/bin/supermin libguestfs: command: run: \ --build libguestfs: command: run: \ --verbose libguestfs: command: run: \ --if-newer libguestfs: command: run: \ --lock /var/tmp/.guestfs-0/lock libguestfs: command: run: \ --copy-kernel libguestfs: command: run: \ -f ext2 libguestfs: command: run: \ --host-cpu x86_64 libguestfs: command: run: \ /usr/lib64/guestfs/supermin.d libguestfs: command: run: \ -o /var/tmp/.guestfs-0/appliance.d supermin: version: 5.1.19 supermin: rpm: detected RPM version 4.15 supermin: package handler: fedora/rpm supermin: acquiring lock on /var/tmp/.guestfs-0/lock supermin: if-newer: output does not need rebuilding libguestfs: finished building supermin appliance libguestfs: begin testing qemu features libguestfs: checking for previously cached test results of /usr/bin/qemu-kvm, in /var/tmp/.guestfs-0 libguestfs: loading previously cached test results libguestfs: qemu version: 4.1 libguestfs: qemu mandatory locking: yes libguestfs: qemu KVM: enabled libguestfs: finished testing qemu features /usr/bin/qemu-kvm \ -global virtio-blk-pci.scsi=off \ -no-user-config \ -enable-fips \ -nodefaults \ -display none \ -machine accel=kvm:tcg \ -cpu host \ -m 2150 \ -no-reboot \ -rtc driftfix=slew \ -no-hpet \ -global kvm-pit.lost_tick_policy=discard \ -kernel /var/tmp/.guestfs-0/appliance.d/kernel \ -initrd /var/tmp/.guestfs-0/appliance.d/initrd \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-pci,rng=rng0 \ -device virtio-scsi-pci,id=scsi \ -drive file=/var/tmp/v2vovl4d77de.qcow2,cache=unsafe,format=qcow2,copy-on-read=on,discard=unmap,id=hd0,if=none \ -device scsi-hd,drive=hd0 \ -drive file=/var/tmp/.guestfs-0/appliance.d/root,snapshot=on,id=appliance,cache=unsafe,if=none,format=raw \ -device scsi-hd,drive=appliance \ -device virtio-serial-pci \ -serial stdio \ -device sga \ -chardev socket,path=/tmp/libguestfsMJl3al/guestfsd.sock,id=channel0 \ -device virtserialport,chardev=channel0,name=org.libguestfs.channel.0 \ -netdev user,id=usernet,net=169.254.0.0/16 \ -device virtio-net-pci,netdev=usernet \ -append "panic=1 console=ttyS0 edd=off udevtimeout=6000 udev.event-timeout=6000 no_timer_check printk.time=1 cgroup_disable=memory usbcore.nousb cryptomgr.notests tsc=reliable 8250.nr_uarts=1 root=/dev/sdb selinux=0 guestfs_verbose=1 guestfs_network=1 TERM=xterm guestfs_identifier=v2v" qemu-kvm: Parameter 'type' expects a netdev backend type libguestfs: child_cleanup: 0x5628d0bb99f0: child process died libguestfs: sending SIGTERM to process 222751 virt-v2v: error: libguestfs error: guestfs_launch failed, see earlier error messages If reporting bugs, run virt-v2v with debugging enabled and include the complete output: virt-v2v -v -x [...] libguestfs: closing guestfs handle 0x5628d0bb99f0 (state 0) libguestfs: command: run: rm libguestfs: command: run: \ -rf /tmp/libguestfssJzX3j libguestfs: command: run: rm libguestfs: command: run: \ -rf /tmp/libguestfsMJl3al libguestfs: closing guestfs handle 0x5628d0bb72d0 (state 0) libguestfs: closing guestfs handle 0x5628d0bb5ab0 (state 0) libguestfs: closing guestfs handle 0x5628d0bb43f0 (state 0) libguestfs: closing guestfs handle 0x5628d0bb1da0 (state 0) libguestfs: closing guestfs handle 0x5628d0bb1710 (state 0) [dragon@localhost ova_temp]$
最新发布
11-04
<think>我们正在解决virt-v2v转换磁盘镜像时出现的错误:'qemu-kvm: Parameter 'type' expects a netdev backend type' 根据引用[1],这个错误通常与qemu配置或二进制文件有关,可能是由于qemu的版本问题或配置错误导致的。 引用[2]提到了qemu中关于audiodev的配置,但这似乎与网络设备(netdev)无关。因此,我们主要关注引用[1]的提示。 可能的解决方案: 1. 检查qemu的版本和配置,确保安装的是官方仓库中经过测试的版本。 2. 检查virt-v2v命令中是否指定了正确的网络设备类型。 3. 查看virt-v2v转换时使用的XML配置,特别是网络设备部分。 然而,virt-v2v在转换过程中会自动生成XML配置,因此我们需要关注的是virt-v2v的环境配置。 详细步骤: 步骤1:确认qemu-kvm和libvirt的版本 运行以下命令: ``` qemu-kvm --version virsh --version virt-v2v --version ``` 步骤2:检查libvirt的默认网络配置 因为错误信息提到了“netdev backend type”,所以可能是默认网络配置有问题。我们可以尝试修改libvirt的默认网络设置。 步骤3:创建一个新的libvirt网络定义文件(例如:default.xml): ```xml <network> <name>default</name> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network> ``` 步骤4:重新定义默认网络: ``` sudo virsh net-destroy default sudo virsh net-undefine default sudo virsh net-define default.xml sudo virsh net-start default sudo virsh net-autostart default ``` 步骤5:尝试再次运行virt-v2v命令。 如果问题依旧,可能是qemu配置问题。 步骤6:检查qemu的二进制文件是否支持指定的网络后端。 可以尝试运行以下命令来检查qemu支持的网络后端: ``` qemu-kvm -netdev help ``` 注意:在较新的qemu版本中,可能使用`-device help`来查看支持的所有设备。 步骤7:根据输出,查看virt-v2v转换命令中使用的网络设备类型是否被支持。 由于virt-v2v内部调用qemu,我们需要确保qemu配置正确。在有些情况下,重新安装qemu可以解决。 步骤8:重新安装qemu-kvm和相关软件包(以CentOS为例): ``` sudo yum reinstall qemu-kvm libvirt virt-v2v ``` 步骤9:重启libvirtd服务: ``` sudo systemctl restart libvirtd ``` 如果上述步骤能解决问题,我们可以尝试在virt-v2v命令中显式指定网络设备类型,但是virt-v2v本身并没有直接提供这样的选项。因此,我们可以尝试修改virt-v2v的转换过程,通过自定义XML来指定网络设备。 步骤10:使用virt-v2v的`--network`和`--bridge`选项来指定网络连接方式,例如: ``` virt-v2v -i disk source-disk -o local -os /path/to/output --network network=default ``` 或者使用桥接: ``` virt-v2v -i disk source-disk -o local -os /path/to/output --bridge br0 ``` 这样可以避免使用可能导致问题的默认网络设置。 如果问题仍然存在,可能需要升级整个虚拟化套件或更换版本。 考虑到用户之前的环境,我们注意到用户使用的是Kylin系统(从内核版本可以看出)。因此,可能需要检查Kylin系统的特定软件包或补丁。 最后,如果所有方法都失败,我们可以尝试使用其他的转换工具,例如qemu-img结合virt-install手动转换,但这超出了本问题的范围。 下面我们将上述步骤整理成用户友好的解决方案。 </think>### 解决 virt-v2v 转换时出现 "Parameter 'type' expects a netdev backend type" 错误的完整方案 此错误通常由 **QEMU/KVM 配置问题** 或 **网络设备定义错误** 引起。以下是系统化的解决方案: --- #### 步骤 1:验证 QEMU 网络配置 ```bash # 检查 QEMU 支持的网络后端类型 $ qemu-system-x86_64 -netdev help Available netdev backend types: user # 用户模式网络 tap # TAP设备 socket # 套接字连接 ... # 检查当前 libvirt 默认网络配置 $ virsh net-dumpxml default <network> <name>default</name> <forward mode='nat'/> # 确保存在此配置 ... </network> ``` 若输出无 `forward mode='nat'` 需重建默认网络[^1]。 --- #### 步骤 2:重建 libvirt 默认网络 ```bash # 删除损坏的默认网络 $ sudo virsh net-destroy default $ sudo virsh net-undefine default # 重建 NAT 网络 $ sudo virsh net-define /usr/share/libvirt/networks/default.xml $ sudo virsh net-start default $ sudo virsh net-autostart default ``` --- #### 步骤 3:检查虚拟机 XML 定义 在转换前检查源虚拟机配置: ```xml <!-- 错误配置示例 --> <interface type='network'> <source network='default'/> <model type='virtio'/> </interface> <!-- 修正为 --> <interface type='network'> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> <!-- 必须添加地址 --> </interface> ``` 关键点: 1. 确保 `<address>` 字段存在 2. 验证 `<model type>` 值有效(常用 `virtio`/`e1000`) --- #### 步骤 4:显式指定网络后端类型 转换命令中添加网络参数: ```bash $ sudo virt-v2v -i disk win2003.vmdk \ -o local -os /var/lib/libvirt/images/ \ --network network:default,model=virtio # 显式指定模型 ``` --- #### 步骤 5:更新 QEMU/KVM 组件 ```bash # CentOS/Kylin 系统 $ sudo yum update qemu-kvm libvirt virt-v2v # Ubuntu/Debian 系统 $ sudo apt update && sudo apt install --reinstall qemu-system libvirt-daemon ``` --- #### 步骤 6:验证 QEMU 二进制兼容性 ```bash $ ldd $(which qemu-system-x86_64) | grep net libvirt_net.so => /usr/lib64/libvirt_net.so (0x00007f8e...) # 确保无 "not found" $ strings $(which qemu-system-x86_64) | grep 'netdev backend type' # 检查错误字符串 ``` --- ### 根本原因分析 此错误通常由以下原因触发: 1. **XML 地址字段缺失**:虚拟机定义缺少 `<address>` 配置 2. **网络模型匹配**:指定的 `<model type>` 与 QEMU 编译选项冲突 3. **默认网络损坏**:libvirt 的 default 网络配置异常 4. **组件版本冲突**:较旧的 virt-v2v 与新版 QEMU 兼容 --- ### 相关问题 1. 如何修复转换后 Windows 虚拟机的网络驱动问题? 2. virt-v2v 转换过程中遇到 "Unsupported PCI controller" 错误该如何解决? 3. 将 VMware 虚拟机转换为 KVM 的最佳实践是什么? 4. 如何为转换后的 Windows 2003 安装 virtio 网络驱动程序? [^1]: 参考 QEMU 官方文档:Network Device Backend Types [^2]: Libvirt 网络配置指南:Default NAT Network Setup
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值