使用qemu模拟调试内核和debian根文件系统

 

开发环境:Ubuntu 14.04.3 LTS  64bit

sudo debootstrap jessie /mnt/jessie http://mirrors.163.com/debian

在/mnt/jessie目录下建立一个init文件,内容如下:

[email protected]380:~$ sudo vi /mnt/jessie/init
#!/bin/sh
# devtmpfs does not get automounted for initramfs
echo "******** init **********"
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init $*

参考linux 内核文档 Documentation/filesystems/ramfs-rootfs-initramfs.txt,用下面脚本打包initramfs

[email protected]380:/mnt$ cat mkinitramfs.sh 

#!/bin/sh

# Copyright 2006 Rob Landley <[email protected]> and TimeSys Corporation.
# Licensed under GPL version 2

if [ $# -ne 2 ]
then
  echo "usage: mkinitramfs directory imagename.cpio.gz"
  exit 1
fi

if [ -d "$1" ]
then
  echo "creating $2 from $1"
  (cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
else
  echo "First argument must be a directory"
  exit 1
fi

 

打包命令:

mkinitramfs.sh jessie rootfs.cpio.gz

 

使用以下命令启动内核和根文件系统:

qemu-system-x86_64  -kernel bzImage -initrd /mnt/rootfs.cpio.gz  /dev/zero -m 2G -nographic -append "console=ttyS0"

 

问题:启动时无法进入initramfs,原因是没根目录下的 init文件。

[   11.815891] rtc_cmos 00:00: setting system clock to 2015-12-02 07:21:59 UTC (1449040919)
[   11.818523] BIOS EDD facility v0.16 2004-Jun-25, 0 devices found
[   11.818900] EDD information not available.
[   11.819783] ALSA device list:
[   11.819991]   No soundcards found.
[   12.396667] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3
[   12.403434] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[   12.403941] Please append a correct "root=" boot option; here are the available partitions:
[   12.404870] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[   12.405584] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.13.0 #7
[   12.405945] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
[   12.406561]  0000000000008001 ffff880074d01dd0 ffffffff81b8de3a ffffffff8201c2c8
[   12.407087]  ffff880074d01e48 ffffffff81b89a24 223d746f00000010 ffff880074d01e58
[   12.407557]  ffff880074d01df8 000000000000004f ffff880074d01e68 0000000000000052
[   12.408077] Call Trace:
[   12.408502]  [<ffffffff81b8de3a>] dump_stack+0x45/0x56
[   12.408502]  [<ffffffff81b89a24>] panic+0xc2/0x1c1
[   12.408502]  [<ffffffff8234e338>] mount_block_root+0x1a8/0x250
[   12.408502]  [<ffffffff8234e61b>] mount_root+0xf1/0xfa
[   12.408502]  [<ffffffff8234f2a0>] ? initrd_load+0x2c9/0x2d8
[   12.408502]  [<ffffffff8234e78b>] prepare_namespace+0x167/0x19f
[   12.408502]  [<ffffffff8234e04a>] kernel_init_freeable+0x1c4/0x1d1
[   12.408502]  [<ffffffff8234d833>] ? do_early_param+0x88/0x88
[   12.408502]  [<ffffffff81b85b00>] ? rest_init+0x80/0x80
[   12.408502]  [<ffffffff81b85b0e>] kernel_init+0xe/0x120
[   12.408502]  [<ffffffff81b9f2ac>] ret_from_fork+0x7c/0xb0
[   12.408502]  [<ffffffff81b85b00>] ? rest_init+0x80/0x80
[   12.408502] general protection fault: fff2 [#1] SMP
[   12.408502] Modules linked in:
[   12.408502] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.13.0 #7
[   12.408502] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
[   12.408502] task: ffff880074c58000 ti: ffff880074d00000 task.ti: ffff880074d00000
[   12.408502] RIP: 0010:[<ffffffff81b89aea>]  [<ffffffff81b89aea>] panic+0x188/0x1c1
[   12.408502] RSP: 0018:ffff880074d01de0  EFLAGS: 00000246
[   12.408502] RAX: 0000000000006a6a RBX: ffffffff8201c2c8 RCX: 00000000000000a0
[   12.408502] RDX: 000000000000006a RSI: 0000000000000000 RDI: ffffffff826c8a70
[   12.408502] RBP: ffff880074d01e48 R08: 0000000000000001 R09: 00000000000001e1
[   12.408502] R10: 736572203f205d3e R11: 3030623538623138 R12: 0000000000000000
[   12.408502] R13: 0000000000000000 R14: 0000000000000000 R15: ffff88007fa93000
[   12.408502] FS:  0000000000000000(0000) GS:ffff880077800000(0000) knlGS:0000000000000000
[   12.408502] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[   12.408502] CR2: 00007fbb08c44140 CR3: 000000000220c000 CR4: 00000000000006f0
[   12.408502] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   12.408502] DR3: 0000000000000000 DR6: 0000000000000000 DR7: 0000000000000000
[   12.408502] Stack:
[   12.408502]  223d746f00000010 ffff880074d01e58 ffff880074d01df8 000000000000004f
[   12.408502]  ffff880074d01e68 0000000000000052 ffff880000095070 6120657361656c50
[   12.408502]  00000000000001ce ffff88007fa93000 0000000000008001 0000000000008001
[   12.408502] Call Trace:
[   12.408502]  [<ffffffff8234e338>] mount_block_root+0x1a8/0x250
[   12.408502]  [<ffffffff8234e61b>] mount_root+0xf1/0xfa
[   12.408502]  [<ffffffff8234f2a0>] ? initrd_load+0x2c9/0x2d8
[   12.408502]  [<ffffffff8234e78b>] prepare_namespace+0x167/0x19f
[   12.408502]  [<ffffffff8234e04a>] kernel_init_freeable+0x1c4/0x1d1
[   12.408502]  [<ffffffff8234d833>] ? do_early_param+0x88/0x88
[   12.408502]  [<ffffffff81b85b00>] ? rest_init+0x80/0x80
[   12.408502]  [<ffffffff81b85b0e>] kernel_init+0xe/0x120
[   12.408502]  [<ffffffff81b9f2ac>] ret_from_fork+0x7c/0xb0
[   12.408502]  [<ffffffff81b85b00>] ? rest_init+0x80/0x80
[   12.408502] Code: 00 00 49 ff cc 74 0c bf 58 89 41 00 e8 e0 90 83 ff eb ef 48 83 c3 64 eb b6 83 3d a1 80 93 00 00 74 05 e8 5a 3f 4e ff fb 45 31 e4 <4d> 39 ec 7c 18 41 83 f6 01 44 89 f7 ff 15 64 80 93 00 49 01 c4
[   12.408502] RIP  [<ffffffff81b89aea>] panic+0x188/0x1c1
[   12.408502]  RSP <ffff880074d01de0>
[   12.408502] ---[ end trace 96badb4295b8f792 ]---

qemu提供了几个快捷键,ctrl+a h打开帮助

  • C-a h    print this help  
  • C-a x    exit emulator   退出
  • C-a s    save disk data back to file (if -snapshot)  
  • C-a t    toggle console timestamps  
  • C-a b    send break (magic sysrq)  
  • C-a c    switch between console and monitor   在linux控制台和qemu的控制终端切换
  • C-a C-a  sends C-a 
  • 时间: 2024-11-05 14:59:38

    使用qemu模拟调试内核和debian根文件系统的相关文章

    为mini2440创建debian根文件系统

    为mini2440创建debian根文件系统 by HYH | 2018 年 4 月 17 日 下午 8:42 一.准备 1.需要在debian环境下,且安装有debootstrap. 2.由于mini2440比较老,所以使用armel架构的linux软件.而且由于官方使用的内核也比较老所以不能使用debian 9(代号:stretch),如果移植了较新内核(3.x,4.X),可以尝试使用Debian 9.具体的发行版本可查询:https://www.debian.org/releases/.

    qemu+gdb调试内核出现remote ‘g’ packet reply is too long

    今天尝试用qemu+gdb的方式调试内核,但是当设置了断点,程序执行到断点时就报错:remote 'g' packet reply is too long,错误图片如下 解决办法网上了,说是改一下gdb/remote.c的代码,开始一脸懵逼,都不知道改哪里,知道看到了这篇博客:https://blog.csdn.net/baidu_31504167/article/details/93853921.这篇文章讲到了如何避免这个问题: 重新下载gdb源码版本可以自己选,应该都行,然后修改源码目录下

    linux 内核移植和根文件系统的制作

    1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRAVERSION = .1 其 中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4.2.5

    Linux内核启动及根文件系统载入过程

    上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了.本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为

    ubuntu12.04下使用qemu模拟mips处理器安装debian

    注:ubuntu是不支持mips处理器的,只能在x86下安装运行第一步.安装qemu sudo apt-get install qemu qemu-system .执行 qemu-system-mips --version 发现版本太低,因为后面需要更高版本的qemu. 下载http://wiki.qemu-project.org/download/qemu-2.1.2.tar.bz2,然后解压,执行 make ,这一步执行的时间很长,make完成后执行 make install . 如果之前执

    Qemu+gdb跟踪内核源码

    1.编译安装Qemu Qemu源码下载地址:http://wiki.qemu.org/Download linux下可以直接用wget下载: wget http://wiki.qemu.org/download/qemu-2.2.0.tar.bz 解压缩bz2文件: tar -jxvf qemu-2.2.0.tar.bz 由于我只有模拟x86的需求,所以在编译之前先配置Qemu: cd qemu-2.2.2 ./configure --atrget-list=i386-softmmu make

    VELT-0.1.6开发:载入根文件系统

    快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 VELT的全称是Visual EmbedLinuxTools,它是一个visual studio插件,用以辅助完毕Linux开发. 利用这个插件,将能够在visualstudio的IDE中进行Linux应用程序的开发(包含编译和调试),也能够进行uboot和linux内核的编译和调试,并依据编译时的错误信息正确定位到源

    Linux根文件系统裁剪 论文阅读笔记

    Linux裁剪方法研究 2006 2 Linux裁剪原理: 2 Linux嵌入式系统根文件系统的选择与制作 2006 3 Linux嵌入式系统根文件系统的选择与制作 2006 3 基于ARM的嵌入式Linux操作系统移植的研究 2006 5 基于ARM的嵌入式文件系统研究与设计 2010 6 基于嵌入式Linux的Ext2根文件系统制作分析 2015 6 嵌入式Linux裁剪研究 2009 7 嵌入式Linux根文件系统的构建与分析 2015 8 嵌入式Linux共享库裁剪技术分析与改进 200

    以Qemu模拟Linux,学习Linux内核

    文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html维护日志:2013-02-21 建立文档(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明.文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖