qemu 运行 linux
- ubuntu16.04
- 使用busybox编译最小文件系统,使用qemu运行起来。
- 内容来自 奔跑吧linux内核第6章
- 这里将输入代码过程集合到了几个.sh文件,不做重复的工作 !
- 当然网好是前提,最好挂代理.
安装工具
首先需要安装qemu gcc, ubuntu16.04中自带的gcc版本较低,这里我们安装书中推荐的gcc-arm-linux-gnueabi
1
sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential
下载busybox源码
书中推荐版本是1.24,但最新版本已经到了busybox-1.27.2.这里我们使用最新版
1
wget https://busybox.net/downloads/busybox-1.27.2.tar.bz2
解压到 busybox 文件夹
1
tar -jxvf busybox-1.27.2.tar.bz2
下载linux内核源码
还是以配套的4.0源码为例,(提醒:内核解压后大约占800MB,请预留出足够空间)
1
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.gz
解压到linux文件夹
1
tar -jxvf linux-4.0.tar.gz
编译最小文件系统
- 别问我最小文件系统是什么,我也有点😵,但是先用起来.
首先利用 busybox 手工编译一个最小文件系统。
在busybox文件夹下1
2
3
4export ARCH=ARM
export CROSS_COMPILE=arm-linux-gnueabi-
make menuconfig
make install进入menuconfig后,配置静态编译
1
2
3Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)然后 make install 编译完成。编译完成后,把 busybox 根目录下面的_install 目录拷贝到 linux-4.0 下。
进入_install 目录,创建 etc、dev 等目录。
1
2
3
4mkdir etc
mkdir dev
mkdir mnt
mkdir -p etc/init.d/在_install /etc/init.d/目录下创建 文件名rcS 的文件,写入以下内容:
1
2
3
4
5
6
7
8
9mkdir –p /proc
mkdir –p /tmp
mkdir -p /sys
mkdir –p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev –s同时使用
chmod +x rcS
修改rcS的可执行权限.在_install /etc 目录创建文件名 fstab 的文件,并写入以下内容。
1
2
3
4
5proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0在_install /etc 目录创建文件名 inittab 的文件,并写入如下内容。
1
2
3
4::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a –r在_install/dev 目录下创建如下设备节点,以root权限执行
1
2
3cd _install/dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
.sh(配合chmod +x使用)
build.sh: 编译busybox
1
2
3
4export ARCH=ARM
export CROSS_COMPILE=arm-linux-gnueabi-
make menuconfig
make installcreat.sh: _install文件夹下处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36rm -rf etc
rm -rf dev
rm -rf mnt
mkdir etc
mkdir dev
mkdir mnt
mkdir -p etc/init.d/
echo "mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
" > etc/init.d/rcS
chmod +x etc/init.d/rcS
echo "proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
" > etc/fstab
echo "::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
" > etc/inittab
cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
编译内核
编译内核
1
2
3
4
5cd linux-4.0
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make menuconfig配置 initramfs,在 initramfs source file 中填入_install。另外需要把 Default kernel command string 清空。
1
2
3
4
5General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(_install) Initramfs source file(s)
Boot options -->
()Default kernel command string配置 memory split 为“3G/1G user/kernel split”以及打开高端内存。
1
2
3Kernel Features --->
Memory split (3G/1G user/kernel split) --->
[ *] High Memory Support开始编译 kernel
1
2make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make dtbs运行 QEMU 来模拟 4 核 Cortex-A9 的 Versatile Express 开发平台。
1
qemu-system-arm -M vexpress-a9 -smp 4 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic
.sh(配合chmod +x)
build.sh : 编译内核
1
2
3
4
5
6export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make menuconfig
make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make dtbsrun.sh : 运行arm内核
1
qemu-system-arm -M vexpress-a9 -smp 4 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographicyun