linux下eclipse启动android模拟器出现PANIC: Could not open: /home/zhoumeng/.android/avd/av

本文解决了一个常见的 Linux 下 Eclipse 启动 Android 模拟器的问题,即模拟器无法找到 avd2.ini 文件导致启动失败。通过创建软链接指向正确的配置文件位置解决了这一问题。

linux下eclipse启动android模拟器出现PANIC: Could not open: /home/zhoumeng/.android/avd/avd2.ini错误的一种解决办法

背景:

eclipse 程序包放在/home/usename/下面

问题及解决方法:

AVD Manager 创建的虚拟设备的相关信息会存放在以下两个地方:

/root/.android

/home/username/.android

目录中的内容都是一样的:

androidtool.cfg  avd       default.keyset
androidwin.cfg   ddms.cfg  modem-nv-ram-5554

虚拟设备的信息在avd目录中

但eclipse启动模拟器时,默认的选用/home/username/.android目录下的文件,但由于某种原因总是启动失败,会有

下面的错误信息提示:

[2012-01-11 12:18:05 - ManifestDemo] Performing com.manifestdemo.ManifestDemoActivity activity launch
[2012-01-11 12:18:05 - ManifestDemo] Automatic Target Mode: Preferred AVD 'avd2' is not available. Launching new emulator.
[2012-01-11 12:18:05 - ManifestDemo] Launching a new emulator with Virtual Device 'avd2'
[2012-01-11 12:18:05 - Emulator] PANIC: Could not open: /home/zhoumeng/.android/avd/avd2.ini

该信息说无法打开avd2.ini的这个文件。

查看该路径后发现,目录中并不存在这个avd2.ini文件,但是在/root/.android中确有这个文件,这就比较奇怪了。

查看/home/username/.android的权限没有什么问题,且eclipse的启动也是在取得了root权限下执行的。

在网上找了一些相关问题的资料,大多数是在windows下出现该问题的解决办法:

1.android ERROR: unknown virtual device name解决办法
打开系统属性-->环境变量—>在“系统变量”那一个GroupBox下面选择“新建”-->变量名为 "ANDROID_SDK_HOME”
 (注意,这个变量名不能改变,只能是这个名字!),然后 把变量值改为你想把AVD所在的".android”文件夹放置的位置,
比如:"F:\AndroidEmulator”,在这里我把它放在 Android SDK包中,值为:"D:\SDK\Android\android-sdk- windows-1.5_r3”,
如下图所示。 设定成功的话 ,在eclipse里preferneces -> Android -> Bulid Setting里
为如下结果:Default debug keystore: F:\Android_Emulator\\.android\debug.keystore
然后这样就可以一劳永逸了!!!

2.emulator-5554 disconnected! Cancelling 'oms.Hello.HelloOpone' launch!

在eclipse里面改变一下你run的时候的设置就好了.
右点你的工程后run里面有一个run configrations,
在里面有一个选项每次运行都察掉记录 wipe....的,选上就好了.

linux下并没有什么好的解决办法,最近这几天实在是被这个问题搞的头大。还有一点比较奇怪的是,并不是每次启动的时候都出现这个错误。

最后想到一个方法:既然每次创建设备的时候在目录/root/.android中会有文件出现,而/home/username/.android中没有,那么就不要/home/username/.android中的文件了。删掉它。只使用/root/.android。但是还有一个问题,eclipse启动时默认的是查找路径/home/username/.android,那么,好了,可以更改这个默认选项就可一了。

但是比较悲催的是,在eclipse中找了好久,没找到怎么改这个选项的地方,实在悲剧。。。。。好在linux中还有一个软链接的东西,在/home/username/里创建一个目录,该目录链接到/root/.android即可

步骤如下:

rm -r /home/username/.android

ln -s /root/.android ./.android

<think>我们正在使用BusyBox和QEMU编译并运行Linux内核,但遇到了内核恐慌(kernel panic)错误: "kernel panic: not syncing: requested init /linuxrc failed" 这个错误通常发生在内核无法执行指定的初始化程序(init程序)时。在BusyBox环境中,我们通常将init指向/bin/busybox,而BusyBox会执行初始化过程。但是,如果内核找不到或无法执行指定的init程序,就会引发此错误。 根据错误信息,它请求的init是`/linuxrc`,这可能是由于我们的initramfs中没有正确设置init程序。 回顾之前构建BusyBox根文件系统的步骤,我们创建了一个名为`init`的软链接指向`/bin/busybox`,并且这个`init`程序必须位于根文件系统的根目录下。内核默认会尝试执行几个init程序,其中包括`/init`,如果找不到则尝试`/linuxrc`等。 因此,错误提示`/linuxrc`失败,说明内核没有在根文件系统中找到`/init`,于是尝试了`/linuxrc`,但也没有找到(或者找到了但无法执行)。 可能的原因及解决方案: 1. **init程序未正确创建**: 在BusyBox的安装目录(`_install`)中,我们需要创建一个名为`init`的软链接指向`bin/busybox`。如果没有创建,或者创建错误,就会导致此问题。 解决方案:确保在BusyBox的安装目录(即`_install`目录)中执行: ln -s bin/busybox init 2. **init程序权限问题**: `init`程序必须具有可执行权限。虽然软链接本身没有权限,但它指向的`busybox`必须可执行。 解决方案:确保`bin/busybox`具有可执行权限。在编译BusyBox后,`make install`会设置好权限,但如果你手动复制,可能需要检查。 3. **initramfs打包时未包含init程序**: 在生成initramfs时,要确保当前目录(即`_install`目录)下有`init`这个软链接,并且它指向的`bin/busybox`也在目录中。 解决方案:在生成initramfs之前,检查`_install`目录下是否有`init`,并且`bin/busybox`存在。 4. **内核配置问题**: 内核配置中必须支持initramfs,并且要确保在配置中指定了正确的initramfs路径(但我们在生成initramfs后将其作为外部文件提供给内核,所以配置中通常留空)。 另外,检查内核配置中是否启用了必要的文件系统(如ext2, ramfs, tmpfs等)以及ELF二进制支持。 5. **BusyBox编译问题**: 如果BusyBox没有正确编译,比如没有编译为静态二进制,而是动态链接,那么在没有动态库的环境中就无法执行。 解决方案:在编译BusyBox时,配置为静态编译(Settings -> Build static binary (no shared libs))。 6. **QEMU启动参数错误**: 在启动QEMU时,我们使用`-initrd`参数指定initramfs文件,确保路径正确。 具体步骤检查: 步骤1:检查BusyBox的`_install`目录结构 - 必须有`init` -> `bin/busybox` - 必须有`bin/busybox`(静态链接,可执行) 步骤2:重新生成initramfs 在`_install`目录下执行: find . | cpio -H newc -o | gzip > ../initramfs.cpio.gz 步骤3:检查内核配置 确保内核配置中支持initramfs(在`General setup` -> `Initial RAM filesystem and RAM disk (initramfs/initrd) support`)是启用的。 步骤4:运行QEMU时,确保initramfs文件路径正确 qemu-system-x86_64 -kernel bzImage -initrd initramfs.cpio.gz ... 如果以上步骤都正确,通常可以解决。 另外,如果还是无法解决,可以在QEMU启动参数中添加`init=/bin/sh`来指定init程序(但前提是sh必须存在): -append "init=/bin/sh" 但更推荐的方法是确保`init`软链接正确。 示例修复步骤: 进入BusyBox的`_install`目录: cd busybox-1.37.0/_install # 检查init是否存在,如果不存在则创建 if [ ! -e init ]; then ln -s bin/busybox init fi # 检查busybox是否可执行 chmod +x bin/busybox # 重新生成initramfs find . | cpio -H newc -o | gzip > ../initramfs.cpio.gz 然后复制到内核源码目录,再次运行QEMU。 如果问题依旧,可以解压initramfs检查: mkdir test cd test gzip -dc ../initramfs.cpio.gz | cpio -idmv ls -l # 检查根目录下是否有init,并且指向正确 注意:在生成initramfs时,当前目录下的所有文件和目录都会被包含,所以确保在`_install`目录下执行。 如果以上步骤都正确,那么问题可能在内核配置,请检查内核配置中关于initramfs的支持是否打开,以及文件系统支持(特别是proc、sysfs等,因为我们的rcS脚本会挂载它们)。</think>### 解决 "kernel panic: not syncing: requested init /linuxrc failed" 错误 这个错误发生在内核无法执行指定的初始化程序(init)时,常见于使用BusyBox构建的initramfs环境。以下是完整解决方案: #### 错误原因分析 1. **init程序路径错误**:内核尝试执行`/linuxrc`但找不到该文件 2. **权限问题**:init程序缺少可执行权限 3. **文件系统支持缺失**:内核未编译必要的文件系统驱动 4. **BusyBox配置错误**:未正确创建init软链接 --- ### 修复步骤 #### ✅ 1. 检查init程序链接 ```bash cd busybox/_install ls -l init # 必须存在且指向/bin/busybox # 若不存在则创建: ln -sf bin/busybox init ``` #### ✅ 2. 验证文件权限 ```bash chmod +x bin/busybox # 确保busybox可执行 chmod +x etc/init.d/rcS # 确保初始化脚本可执行 ``` #### ✅ 3. 更新内核配置 重新配置内核,确保启用关键选项: ```bash cd linux-* make menuconfig ``` 启用以下选项: ``` General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (/path/to/initramfs.cpio.gz) Initramfs source file # 指定路径 File systems ---> [*] Second extended fs support # ext2 [*] SquashFS 4.0 - Squashed file system support [*] Inotify support for userspace ``` #### ✅ 4. 重建initramfs ```bash cd busybox/_install # 确保包含所有必要目录 mkdir -p proc sys dev etc/init.d # 重新生成initramfs find . | cpio -H newc -o > ../initramfs.cpio gzip -f ../initramfs.cpio ``` #### ✅ 5. 测试启动(添加调试参数) ```bash qemu-system-x86_64 \ -kernel arch/x86/boot/bzImage \ -initrd ../busybox/initramfs.cpio.gz \ -append "init=/init rdinit=/sbin/init console=ttyS0 earlyprintk=ttyS0" \ -nographic ``` > 关键参数说明: > - `init=/init`:明确指定init程序路径 > - `rdinit=/sbin/init`:备用初始化路径 > - `earlyprintk`:启用早期调试输出 --- ### 高级排查方法 1. **检查initramfs内容**: ```bash mkdir test; cd test zcat ../initramfs.cpio.gz | cpio -idmv tree # 验证文件结构 ``` 2. **静态编译BusyBox**: 在BusyBox配置中启用: ``` Settings ---> [*] Build static binary (no shared libs) ``` 3. **添加调试脚本**: 在`etc/init.d/rcS`开头添加: ```bash echo "Init script started!" > /dev/kmsg ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值