QEMU模拟Cortex-A9,运行kernel、rootfs

宿主机:Centos7(Kernel3.10.0)

交叉编译工具链:gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabi
QEMU:2.0.0
Linux kernel:4.4.0
busybox:1.27.2

安装交叉编译链

https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/armeb-linux-gnueabi/gcc-linaro-6.2.1-2016.11-i686_armeb-linux-gnueabi.tar.xz

解压:

tar –xvf gcc-linaro-6.2.1-2016.11-i686_armeb-linux-gnueabi.tar.xz

安装:

mv gcc-linaro-6.2.1-2016.11-i686_armeb-linux-gnueabi /usr/local/arm-linux-gnueabi

编辑/etc/profile,添加:PATH=$PATH:/usr/local/arm-linux-gnueabi/bin

安装qemu-system-arm

yum install –y qemu-system-arm

编译内核

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

cd linux && git checkout v4.4

编译

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm menuconfig

编译成功后,arch/arm/boot目录下生成内核镜像文件zImage

制作根文件系统

https://busybox.net/downloads/busybox-1.27.2.tar.bz2

解压

tar –xvf busybox-1.27.2.tar.bz2

编译

cd busybox-1.27.2

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm menuconfig

出现图形界面,做如下配置(这一步是可选的,如果执行了就可以不用执行cp /usr/arm-linux-gnueabi/lib rootfs/这一步):

Busybox Settings --->

  Build Options --->

    [*] Build BusyBox as a static binary (no shared libs)

完成后,执行:

make CROSS_COMPILE=arm-linux-gnueabi-

完成后,执行:

make install

完成后,该目录下生成的_install中即是基本的busybox指令。

创建bash脚本,并运行(注意这里不能使用ext4格式,否则内核启动后文件系统是只读的,原因目前不清楚):

#!/bin/bash

##

# etc: https://download.csdn.net/download/hbuxiaofei/10588736

##

rm -rf rootfs

rm -rf tmpfs

rm -rf rootfs.ext3

mkdir rootfs

mkdir -p rootfs/proc/

mkdir -p rootfs/sys/

mkdir -p rootfs/tmp/

mkdir -p rootfs/root/

mkdir -p rootfs/var/

mkdir -p rootfs/mnt/

cp busybox-1.25.1/_install/* rootfs/ -arf

cp /usr/local/arm-linux-gnueabi/lib rootfs/ -arf

cp etc rootfs/ -arf

mkdir -p rootfs/dev/

mknod rootfs/dev/tty1 c 4 1

mknod rootfs/dev/tty2 c 4 2

mknod rootfs/dev/tty3 c 4 3

mknod rootfs/dev/tty4 c 4 4

mknod rootfs/dev/console c 5 1

mknod rootfs/dev/null c 1 3

dd if=/dev/zero of=rootfs.ext3 bs=1M count=64

mkfs.ext3 rootfs.ext3

mkdir -p tmpfs

mount -t ext3 rootfs.ext3 tmpfs/ -o loop

cp -r rootfs/* tmpfs/

umount tmpfs

 

<think>我们正在讨论的是在QEMU中启动OpenWrt,并指定了内核文件。用户想知道OpenWrt的根目录在哪里。 在OpenWrt中,根目录通常是只读的,并且使用initramfs作为根文件系统。根据用户提供的命令,他们使用的是`openwrt-realview-vmlinux-initramfs.elf`,这是一个包含initramfs的内核镜像。这意味着根文件系统被嵌入到内核中,因此根目录在内存中(ramdisk),而不是在物理磁盘上。 因此,当使用initramfs镜像启动时,OpenWrt的根目录位于内存中,路径为`/`。 但是,用户可能想知道在宿主机上这个根文件系统的位置(即编译后的文件在宿主机上的位置)。在OpenWrt构建系统中,initramfs镜像是由内核构建过程中生成的,其根文件系统的内容在构建过程中被压缩到内核中。在构建目录中,我们可以找到构建根文件系统的目录。 具体来说,在OpenWrt构建系统中,initramfs的根目录内容通常位于: `build_dir/target-*/linux-*/root-realview/` (注意:这里的*是具体的架构和子目录,例如`build_dir/target-arm_cortex-a9_musl_eabi/linux-realview/root-realview`) 但是,由于用户使用的是预编译的ELF文件(位于`bin/realview/`目录下),所以宿主机上的根目录内容已经被打包进这个ELF文件,并不再以目录形式存在。 因此,回答用户的问题: 在QEMU虚拟机中,启动后根目录是`/`(内存文件系统)。 在宿主机上,原始的根目录内容位于构建目录的`build_dir/target-*/linux-*/root-realview/`下,但已经被打包进内核镜像。 如果用户想要在宿主机上查看根文件系统的内容,可以使用工具如`cpio`来提取initramfs。但是,由于这个内核是ELF格式并且包含压缩的initramfs,提取步骤可能稍微复杂。 步骤: 1. 使用`binwalk`或`dd`等工具从ELF文件中分离出initramfs部分(通常是一个cpio归档)。 2. 解压cpio归档。 但是,请注意,OpenWrt构建的initramfs镜像通常使用cpio归档,并且可能经过压缩(如gzip)。提取方法如下(假设initramfs部分是gzip压缩的cpio): ```bash # 使用binwalk找到压缩的cpio归档的偏移量 binwalk -e bin/realview/openwrt-realview-vmlinux-initramfs.elf # 或者手动查找并提取 # 1. 找到压缩的cpio归档的起始位置(例如,通过搜索cpio魔术字) # 2. 使用dd提取 # 3. 解压并解包 更简单的方法:使用`skipcpio`工具(如果有)或者使用脚本。 不过,对于OpenWrt构建的initramfs,我们可以尝试: ```bash # 将ELF文件重命名为vmlinux,然后使用extract-ikconfig脚本(该脚本通常可以处理包含initramfs的内核) # 或者使用: strings bin/realview/openwrt-realview-vmlinux-initramfs.elf | grep cpio -m1 -B10 -A10 # 但更直接的方法是使用unmkinitramfs(在ubuntu上)或者dracut工具,但这些可能不适用于OpenWrt的镜像。 实际上,OpenWrt的initramfs构建过程生成的是附加在内核后面的cpio归档(可能压缩)。我们可以尝试: ```bash # 1. 找到内核结束和initramfs开始的位置(通常在内核末尾之后) # 2. 使用dd跳过内核部分,然后解压剩余部分。 但是,由于我们不知道确切的内核大小,这可能会很复杂。 另一种方法是使用QEMU启动,然后通过ssh或串口进入系统,直接查看根目录内容。 因此,我们给用户的回答是: 在QEMU虚拟机中,根目录位于内存中,路径为`/`。 在宿主机上,构建过程中生成的根目录内容位于`build_dir/target-*/linux-*/root-realview/`目录下。而最终的ELF镜像已经将根文件系统打包,无法直接以目录形式访问,但可以通过工具提取。 根据用户的问题,他们可能更关心在QEMU启动后的根目录位置,所以重点回答在虚拟机内是`/`。 现在,按照要求,我们需要在最后提出3-5个相关问题。 注意:问题必须与用户的问题和我们的回答相关。 可能的问题: 1. 如何从宿主机提取OpenWrt的initramfs镜像中的根文件系统? 2. 在OpenWrt中,如何将根目录从initramfs切换到物理磁盘? 3. 在QEMU中启动OpenWrt后,如何通过串口登录系统? 4. 如何修改OpenWrt的initramfs镜像中的文件? 5. 如何为OpenWrt添加自定义文件到根文件系统? 我们将选择3-5个问题。 注意:第一行必须是“§§相关问题§§”,然后列举问题。 由于用户的问题是关于根目录位置,我们提出以下相关问题: §§相关问题§§ 1. 如何从宿主机提取OpenWrt的initramfs镜像中的根文件系统? 2. 在OpenWrt中,如何将根目录从initramfs切换到物理磁盘? 3. 在QEMU中启动OpenWrt后,如何通过串口登录系统? 4. 如何修改OpenWrt的initramfs镜像中的文件? 我们输出4个问题。</think>在QEMU中启动OpenWrt时,根目录的位置取决于系统配置。根据您提供的命令参数分析: 1. **内核位置**: `-kernel bin/realview/openwrt-realview-vmlinux-initramfs.elf` 指定了内核文件路径,该文件位于OpenWrt编译输出的`bin/realview/`目录下。 2. **根目录位置**: 由于使用了 **`initramfs.elf`** 格式的内核(文件名包含`-initramfs`),这表示根文件系统已**直接嵌入内核镜像**中。启动后: - 根文件系统在内存中运行,路径为 **`/`** - **没有单独的物理根目录**(如磁盘分区或镜像文件) 3. **验证方法**: 启动后通过串口登录系统(`-nographic`参数将串口输出到终端),执行: ```bash mount | grep rootfs ``` 输出类似:`rootfs on / type rootfs (rw)` ### 关键说明: - **initramfs特性**:所有根目录文件已压缩打包到内核,启动时解压到内存 - **宿主机路径**:编译生成的根文件系统原始内容位于OpenWrt构建目录的: ```bash build_dir/target-*/linux-realview/root-realview/ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值