Linux学习记录(二)

记录本人学习的过程和遇到的问题


QEMU安装与Linux内核环境搭建

  • Linux学习记录(二)
  • 一、QEMU安装
    • 1.什么是QEMU
    • 2.QEMU安装
  • 二、Linux内核环境搭建
    • 1.编译内核源码
    • 2.配置内核编译菜单
    • 3 配置busybox
    • 4 制作rootfs
  • 三 、启动QMEU调试
  • 结束


一、QEMU安装

1.什么是QEMU

QEMU是“Quick Emulator”的缩写,是一个用C语言编写的开源虚拟化软件。QEMU有几种虚拟化模式。首先,它可以使用基于内核的虚拟机(KVM)执行x86处理器硬件虚拟化,以几乎比拟硬件本机的速度执行运算任务。其次,它可以通过机器代码的实时转换来模拟其他处理器以用于虚拟机运行不同平台的操作系统。最后,它可以使用实时转换为其他架构运行简单的程序,类似于Linux中的Wine。因为QEMU没有图形用户界面(GUI),而其提供的核心能力又是关键而重要的,因此通常用作更复杂的虚拟化管理器的一部分。
具体的解释可以看看大佬的讲解QEMU架构浅析。

2.QEMU安装

1.使用QEMU源码编译安装

首先安装一堆依赖包,然后下载QEMU源码,接着配置和编译安装 QEMU,但是编译是总是出错,弄了好久也没解决。
安装时还会用到root权限,只需在命令行输入

su

然后输入用户密码就可以了,如果不行参考csdn博文1。
1.自动安装
自动安装,虽然版本不高,但是出现的问题会少一点。打开终端输入:

apt-get install qemu

接着再输入:

apt-get install qemu-system

输入 qemu- 敲击tab键,就能列出可以模拟的环境。

二、Linux内核环境搭建

本章主要参考来源为博文2,感谢分享。

1.编译内核源码

错误提醒,这里先列出过程中遇到的问题:

1.国内源出问题,无法下载,一番排查发现是电脑没网了,吐了。

2.显示错误:
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[1]: *** [menuconfig] Error 1
make: *** [menuconfig] Error 2
窗口小了,弹窗没法显示,调大界面或全屏就行了。

3.显示错误:

*** Unable to find the ncurses libraries or the
*** required header files.
*** make menuconfig’ requires the ncurses libraries.
*** Install ncurses (ncurses-devel) and try again.
解决方法,下载所需文件:

sudo apt-get install ncurses-dev

4.报如下错误:
cannot generate ORC metadata …

解决法:依次输入

apt install libelf-dev
apt install libssl-dev

下面开始正式操作步骤:


首先输入以下命令获取源码:

wget https://mirrors.edge.kernel/pub/linux/kernel/v4.x/linux-4.14.191.tar.gz

然后解压源码:

tar -xvf linux-4.14.191.tar.gz

解压后进入源码根目录linux-4.14.191:

cd linux-4.14.191

指定编译的架构,依次执行:

export ARCH=x86
make x86_64_defconfig

2.配置内核编译菜单

代码如下(示例):

输入打开菜单命令

make menuconfig

在弹窗界面中找到Processor type and features


在目录找到下面的语句,按N键取消,关闭地址随机化。

[] Randomize the address of the kernel image (KASLR)

下一步启用内核debug,后退到设置主界面,Kernel hacking —> ,点击enter进入子目录,找到Compile-time checks and compiler options —>

点击enter进入子目录之后,按Y键选中以下两个选项

 [*] Compile the kernel with debug info
[*]   Provide GDB scripts for kernel debuggin


保存一下退出,就可以开始编译内核了:

make -j 20

-j 指定并行编译作业数,这个特别慢,运行许久,突然崩溃:

最终没有生成所需的:linux4.14.191/arch/x86_64/boot/bzImage文件。只能调大内存又跑了一遍才成功,关掉电脑其他应用,终于成功了:

3 配置busybox

首先去这里下载一个,例如版本1.32.0:

然后解压:

tar -jxvf busybox-1.32.0.tar.bz2

如果遇到这种错误:

先检查一下是不是缺少bz2解压包,输入命令:

apt install bzip2

如果还是不行,说明压缩包不在主目录,将压缩包复制到主目录,再执行命令,大概率结果还是不行。查了好久也不知道怎么解决,想到了前面用到的wget命令,直接在后面加上下载地址:

wget https://www.busybox.net/downloads/busybox-1.32.0.tar.bz2

下载完解压即可,完美解决了这个简单的难题。
然后进入busybox根目录

cd busybox-1.32.0

进入编译选项菜单

make menuconfig

把busybox配置为静态编译,找到Settings —>,enter进入子目录,找到并选择[*] Build static binary (no shared libs)
版本不同叫法会有一点点不同。

4 制作rootfs

制作rootfs镜像文件,便于把busybox安装到其中
在busybox-1.32.0文件夹下使用dd命令创建文件,并格式化为ext4文件系统。

dd if=/dev/zero of=rootfs.img bs=1M count=10
mkfs.ext4 rootfs.img

创建用于挂载该镜像文件的目录fs,挂载后才能往里面写入busybox。
使用mount命令将rootfs.img挂载到fs目录,编译busybox并写入fs目录中。

szp@r420-PowerEdge-R420:~$ mkdir fs
szp@r420-PowerEdge-R420:~/busybox-1.32.0$ sudo mount -t ext4 -o loop rootfs.img ./fs
szp@r420-PowerEdge-R420:~/busybox-1.32.0$ sudo make install CONFIG_PREFIX=./fs

注意切换文件路径,不然会报错,就算不报错后面跑系统时还是会出错,比如:

出现这种错误,建议从头制作rootfs镜像文件


接下来对写入的busybox进行补充配置,注意切换路径。

szp@r420-PowerEdge-R420:~/busybox-1.32.0/fs$ sudo mkdir proc dev etc home mnt
szp@r420-PowerEdge-R420:~/busybox-1.32.0/fs$ sudo cp -r ../examples/bootfloppy/etc/* etc/
szp@r420-PowerEdge-R420:~/busybox-1.32.0$ sudo chmod -R 777 fs/ 

制作完成的rootfs目录如下:

最后,卸载rootfs.img

szp@r420-PowerEdge-R420:~/busybox-1.32.0$ sudo umount fs

三 、启动QMEU调试

使用如下命令启动无GUI的qemu:

qemu-system-x86_64 -kernel ./linux-4.14.191/arch/x86/boot/bzImage  -hda ./busybox-1.32.0/rootfs.img  -append "root=/dev/sda console=ttyS0" -nographic

注意:
x86这个目录可能有些版本叫x86_64,就是生成bzImage时的目录,如果没注意到,也可以使用文件命令查一下。

其中参数含义如下:

-kernel # 指定编译好的内核镜像
-hda  # 指定硬盘
-append "root=/dev/sda" 指示根文件系统 console=ttyS0  把QEMU的输入输出定向到当前终端上
-nographic 不使用图形输出窗口
-s 是-gdb tcp::1234缩写,监听1234端口,在GDB中可以通过target remote localhost:1234连接

启动后如下图:

Ctrl+A 松开后按 X 退出qemu。

结束

更多推荐

Linux学习记录(二)QEMU安装与Linux内核环境搭建