Uncompressing Linux..... done, booting the kernel.

内核启动卡在Uncompressing Linux..... done, booting the kernel.这好像是个老生常谈的问题了。成因在网上也罗列了很多种,可这次我碰到的,却没百度出解决方法,纠结了我很久才解决。

我先把造成Uncompressing Linux..... done, booting the kernel.的常见的几种可能再罗列一下

1、机器码不匹配

解决方法:在配置内核时开启debug 

Kernel hacking -> Kernel low-level debugging functions 是打开的
 Kernel hacking -> Kernel low-level debugging messages via S3C UART 也是打开的

在Device Drivers->Character devices->Serial drivers中选择加载Samsung SoC serial support ,然后再选上Support for console on Samsung SoC serial port 。
如果是机器码不匹配的问题,就会出现相关打印信息例如

Machine configuration botched (nr 182), unable to continue.

核对一下你的uboot机器码是否匹配。

如果不匹配,你可以修改uboot include/asm-arm/mach-types.h 文件中有关机器码的定义。或者修改内核 arch/arm/tools/mach-types 文件。

在新内核移植时有关机器码的修改步骤及分析如下:

修改机器码,机器码在2/arch/arm/mach-s3c2440/mach-test2440.c文件中MACHINE_START(TEST2440, "TEST2440")这一行定义的,第二个参数无所谓,重要的是第一个参数,在gcc编译这个mach-test2440.c的时候,会把TEST2440匹配到/include/asm-arm/mach-types.h中的"#define MACH_TYPE_TEST2440 N"这里, 如果在mach-types.h中找不到MACH_TYPE_TEST2440的定义, gcc编译mach-test2440.c则报错;
还有,/include/asm-arm/mach-types.h是每次make zImage过程中, 由arch/arm/tools/mach-types文件生成的,
总结,修改机器码,涉及内核代码的三个地方,MACHINE_START宏,mach-types.h,mach-types,初启动时,bootloader向内核传递一个机器码。

 

2、串口配置不正确

确保在配置内核时选上了在Device Drivers->Character devices->Serial drivers中选择加载Samsung SoC serial support ,然后再选上Support for console on Samsung SoC serial port 。

3、arch/arm/mach-s3c2440/Kconfig配置文件设置出错,某项关键选项没选上。

这个情况在网上不多见,但是一出错就会让人很纠结。如果芯片级或板级关键配置没选上或导致内核启动进入start_kernel函数之前就进入死循环。如果芯片级的配置没选上,会在内核执行完cpu id号匹配函数__lookup_processor_type()后进入死循环,这种情况你无论怎么配置内核的debug,串口都不会再有打印信息输出了。只有点个灯之类的才能跟踪代码的执行。

这种情况往往在打印Uncompressing Linux..... done, booting the kernel后就无任何输出了,即便你配置了debug。

我碰到这种情况是因为我在arch/arm/mach-s3c2440/Kconfig 上没有select ARCH_S3C2440。

导致Uncompressing Linux..... done, booting the kernel 卡住的大致就这几种情况。


<think>我们正在处理用户关于QEMU启动OpenWrt镜像时出现的两个错误: 1. /etc/qemu-ifup: no bridge for guest interface found 2. pulseaudio设置失败 首先,我们需要理解这两个错误的含义和原因,然后提供解决方法。 错误1:/etc/qemu-ifup: no bridge for guest interface found 这个错误发生在QEMU尝试为虚拟机设置网络接口时。QEMU使用一个脚本(通常是/etc/qemu-ifup)来在宿主机上配置网络桥接。这个错误表明脚本无法找到可用的桥接接口。 可能的原因: - 宿主机上没有配置网络桥接。 - 桥接接口的名称与脚本中期望的不匹配。 - 执行脚本的用户权限不足(通常需要root权限)。 错误2:pulseaudio设置失败 这个错误与音频设备有关。QEMU尝试使用PulseAudio作为音频后端,但可能由于PulseAudio服务未运行或配置问题导致失败。 可能的原因: - 宿主机上未安装PulseAudio。 - PulseAudio服务未运行。 - 权限问题(用户没有访问PulseAudio的权限)。 接下来,我们分别提供解决方法。 对于错误1:网络桥接问题 步骤1:检查宿主机上的桥接配置 在宿主机上,我们可以使用以下命令检查现有的桥接接口: ```bash brctl show ``` 或者(如果使用iproute2): ```bash ip link show type bridge ``` 如果没有桥接接口,我们需要创建一个。 步骤2:创建桥接接口(以br0为例) 创建桥接接口并添加物理接口(例如eth0)到桥接中。注意:这可能会暂时中断网络连接。 编辑网络配置文件(以Ubuntu为例,使用netplan): 创建或编辑/etc/netplan/01-netcfg.yaml,添加类似以下内容: ```yaml network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no bridges: br0: interfaces: [eth0] dhcp4: yes ``` 然后应用配置: ```bash sudo netplan apply ``` 或者,手动创建(临时): ```bash sudo ip link add name br0 type bridge sudo ip link set br0 up sudo ip link set eth0 master br0 ``` 步骤3:确保QEMU使用的网络脚本正确 QEMU通常使用/etc/qemu-ifup和/etc/qemu-ifdown脚本。检查/etc/qemu-ifup脚本,确保它能够识别你创建的桥接接口(如br0)。 一个简单的/etc/qemu-ifup脚本示例: ```bash #!/bin/sh # 脚本参数:网络接口名(由QEMU提供) if [ -n "$1" ]; then # 将接口添加到桥接br0 sudo ip link set $1 up sudo ip link set $1 master br0 exit 0 else echo "Error: no interface specified" exit 1 fi ``` 确保脚本有执行权限,并且使用QEMU时以root权限运行(或者使用sudo)或者配置sudoers免密执行相关命令。 步骤4:运行QEMU时指定网络参数 在启动QEMU时,确保指定了正确的网络选项。例如: ```bash qemu-system-x86_64 -net nic -net tap,script=/etc/qemu-ifup ... ``` 或者使用更现代的选项: ```bash qemu-system-x86_64 -device virtio-net-pci,netdev=net0 -netdev tap,id=net0,script=/etc/qemu-ifup ... ``` 对于错误2:PulseAudio设置失败 步骤1:检查PulseAudio服务 确保宿主机上安装了PulseAudio并且服务正在运行: ```bash pulseaudio --check ``` 如果返回非0,可以尝试启动: ```bash pulseaudio --start ``` 步骤2:权限配置 确保当前用户有权限使用PulseAudio。通常,用户需要是audio组的成员。 检查用户组: ```bash groups ``` 如果没有audio组,添加用户到audio组: ```bash sudo usermod -aG audio $USER ``` 然后重新登录。 步骤3:配置QEMU使用正确的音频后端 如果不需要音频,可以直接在QEMU中禁用音频设备。但OpenWrt通常不需要音频,所以禁用可能是最简单的方案。 在QEMU启动参数中,可以禁用音频: ```bash -soundhw none ``` 或者不添加任何音频设备。 如果希望保留音频,可以尝试使用其他音频后端,例如ALSA: ```bash -audiodev alsa,id=audio0 -device ich9-intel-hda -device hda-output,audiodev=audio0 ``` 但是,对于OpenWrt镜像,通常不需要音频设备,所以禁用是最佳选择。 综合解决方案: 1. 配置宿主机桥接网络,并确保/etc/qemu-ifup脚本正确设置。 2. 在启动QEMU时,使用正确的网络参数,确保脚本被调用。 3. 禁用音频(推荐)或者修复PulseAudio配置。 示例启动命令(禁用音频): ```bash qemu-system-x86_64 \ -M pc \ -nographic \ -drive file=openwrt.img,format=raw \ -device virtio-net-pci,netdev=net0 \ -netdev tap,id=net0,script=/etc/qemu-ifup \ -soundhw none ``` 注意:如果使用非root用户运行QEMU,需要配置sudo权限来执行网络脚本中的命令(如ip命令),或者使用qemu-bridge-helper(推荐)。 另外,关于qemu-bridge-helper: QEMU提供了一个更安全的方式来管理桥接网络,即使用qemu-bridge-helper。配置方法: 步骤1:创建配置文件/etc/qemu/bridge.conf ```bash allow br0 ``` 步骤2:在QEMU启动参数中使用: ```bash -netdev bridge,id=net0,br=br0 -device virtio-net-pci,netdev=net0 ``` 这样就不需要/etc/qemu-ifup脚本了。 总结: 我们提供了两个错误的详细原因和解决方法。用户可以根据实际情况选择配置桥接网络和禁用音频设备(或修复音频)来解决。 最后,生成相关问题: 1. 如何为QEMU虚拟机配置桥接网络? 2. QEMU中如何禁用不需要的硬件设备(如音频)? 3. 如何解决QEMU中PulseAudio的权限问题? 4. 使用qemu-bridge-helper有什么优势? 5. OpenWrt镜像在QEMU中运行还需要哪些特殊配置?</think>### QEMU启动OpenWrt镜像错误分析与解决 #### 错误1:`/etc/qemu-ifup: no bridge for guest interface found` **原因分析** 此错误表明QEMU无法为虚拟机找到有效的网络桥接接口。当使用`-net tap`参数时,QEMU会调用`/etc/qemu-ifup`脚本配置宿主机网络桥接,但未找到可用的桥接设备[^1]。 **解决方案** 1. **创建网络桥接** 在宿主机上创建桥接接口(如`br0`)并绑定物理网卡: ```bash sudo ip link add name br0 type bridge sudo ip link set eth0 master br0 # eth0替换为你的物理网卡名 sudo ip link set br0 up ``` 2. **配置脚本权限** 确保`/etc/qemu-ifup`脚本有可执行权限: ```bash sudo chmod +x /etc/qemu-ifup ``` 3. **使用qemu-bridge-helper(推荐)** 修改QEMU启动参数: ```bash -netdev bridge,id=net0,br=br0 -device virtio-net-pci,netdev=net0 ``` 创建配置文件允许桥接: ```bash echo "allow br0" | sudo tee /etc/qemu/bridge.conf ``` #### 错误2:PulseAudio设置失败 **原因分析** 通常因宿主机未运行PulseAudio服务或权限不足导致,常见于无桌面环境的服务器系统[^2]。 **解决方案** 1. **禁用音频设备(推荐)** 在QEMU启动参数中添加: ```bash -soundhw none ``` OpenWrt作为路由器系统通常无需音频支持。 2. **修复PulseAudio服务** 若需保留音频: ```bash # 启动PulseAudio服务 pulseaudio --start --exit-idle-time=-1 # 添加用户到audio组 sudo usermod -aG audio $USER ``` 3. **改用ALSA后端** 替换音频驱动: ```bash -audiodev alsa,id=audio0 -device ich9-intel-hda -device hda-output,audiodev=audio0 ``` --- #### 完整启动示例 ```bash qemu-system-x86_64 \ -M virt -nographic -m 512 \ -drive file=openwrt.img,format=raw \ -netdev bridge,id=net0,br=br0 \ -device virtio-net-pci,netdev=net0 \ -soundhw none ``` #### 关键验证步骤 1. 检查桥接状态: ```bash ip link show br0 ``` 2. 确认镜像网络配置: ```bash fdisk -l openwrt.img # 确保包含网络驱动 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值