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
    4
    export ARCH=ARM
    export CROSS_COMPILE=arm-linux-gnueabi-
    make menuconfig
    make install
  • 进入menuconfig后,配置静态编译

    1
    2
    3
    Busybox 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
    4
    mkdir etc
    mkdir dev
    mkdir mnt
    mkdir -p etc/init.d/
  • 在_install /etc/init.d/目录下创建 文件名rcS 的文件,写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    同时使用 chmod +x rcS修改rcS的可执行权限.

  • 在_install /etc 目录创建文件名 fstab 的文件,并写入以下内容。

    1
    2
    3
    4
    5
    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
  • 在_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
    3
    cd _install/dev/
    sudo mknod console c 5 1
    sudo mknod null c 1 3

.sh(配合chmod +x使用)

  • build.sh: 编译busybox

    1
    2
    3
    4
    export ARCH=ARM
    export CROSS_COMPILE=arm-linux-gnueabi-
    make menuconfig
    make install
  • creat.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
    36
    rm -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
    5
    cd 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
    5
    General 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
    3
    Kernel Features --->
    Memory split (3G/1G user/kernel split) --->
    [ *] High Memory Support
  • 开始编译 kernel

    1
    2
    make 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
    6
    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabi-
    make vexpress_defconfig
    make menuconfig
    make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
    make dtbs
  • run.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