risc-v中文社区

 找回密码
 立即注册
查看: 2062|回复: 0

从源码编译linux-4.9内核并运行一个最小的busybox文件系统(...

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-8-1 16:07:04 | 显示全部楼层 |阅读模式
之前有写过一篇:《带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统

但是不少粉丝反映碰到了各种问题,包括但不限于:

无法创建文件,提示read only file-system

配置文件错误

无法挂载根文件系统等

由于旧的文章已经无法编辑,今天我重新更新一篇,希望可以解决大家碰到的问题。

我的环境:

开发环境:ubuntu 14.04

linux源码版本:linux-4.9.229

busybox源码版本:busybox-1.30.0

qemu-system-x86_64版本:2.0.0

本文教你完成下列过程:

1.下载linux并编译linux内核源码

2.编译busybox

3.制作一个最小的根文件系统

4.qemu启动你编译好的内核和根文件系统


linux源码下载地址:

https://mirrors.edge.kernel.org/pub/linux/kernel/

我选择的版本是:4.9.229

https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz

下载到本地,解压,然后进入linux-4.9.229目录:

1.指定硬件体系架构。

为了减少安装编译器的过程,我在本例中使用的是x86,因为我的开发环境就是x86。如果你要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器。

# export ARCH=x86
2.配置board config,此处配置为 x86_64_defconfig。好了,我们点好菜了,菜单就是x86_64_defconfig

# make  x86_64_defconfig
3.配置内核

这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置:

General setup  --->

       ---->
  • Initial RAM filesystem and RAM disk (initramfs/initrd) support

        Device Drivers  --->

          
  • Block devices  --->

                   <*>   RAM block device support

                   (65536) Default RAM disk size (kbytes)
    4.编译内核

    # make
    编译成功后的内核位于:arch/x86_64/boot/bzImage


    下载buysbox源码,下载地址:

    https://busybox.net/downloads/

    我使用的版本是busybox-1.30.0

    1.解压buysbox源码

    # tar xvf busybox-1.30.0.tar.bz2
    2.配置buysbox源码

    在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。

    # make menuconfig

    Busybox Settings  --->
          Build Options  --->
                
  • Build BusyBox as a static binary (no shared libs)
    3.编译和安装

    #make && make install
    4.编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令如下:

    # mkdir etc dev mnt
    # mkdir -p proc sys tmp mnt
    # mkdir -p etc/init.d/
    # vim etc/fstab
    proc        /proc           proc         defaults        0        0
    tmpfs       /tmp            tmpfs      defaults        0        0
    sysfs       /sys            sysfs        defaults        0        0
    # vim etc/init.d/rcS
    echo -e "Welcome to tinyLinux"
    /bin/mount -a
    echo -e "Remounting the root filesystem"
    mount  -o  remount,rw  /
    mkdir -p /dev/pts
    mount -t devpts devpts /dev/pts
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    # chmod 755 etc/init.d/rcS
    # vim etc/inittab
    ::sysinit:/etc/init.d/rcS
    ::respawn:-/bin/sh
    ::askfirst:-/bin/sh
    ::ctrlaltdel:/bin/umount -a -r
    # chmod 755 etc/inittab
    # cd dev
    # mknod console c 5 1
    # mknod null c 1 3
    # mknod tty1 c 4 1
    这样一个最小的、完整的可以被内核启动的文件系统就齐活啦。


    制作根文件系统镜像文件。

    思路:

    1.先制作一个空的镜像文件;

    2.然后把此镜像文件格式化为ext3格式;

    3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;

    4.卸载该镜像文件。

    5.打成gzip包。

    #!/bin/bash
    rm -rf rootfs.ext3
    rm -rf fs
    dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
    mkfs.ext3 rootfs.ext3
    mkdir fs
    mount -o loop rootfs.ext3 ./fs
    cp -rf ./_install/* ./fs
    umount ./fs
    gzip --best -c rootfs.ext3 > rootfs.img.gz
    最终生成的文件系统镜像名字为:rootfs.img.gz

    准备好了内核和文件系统镜像,幸福的一刻马上来临了:


    通过qemu模拟器启动我们自己编译的内核和文件系统:

    # qemu-system-x86_64 \
      -kernel ./linux-4.9.229/arch/x86_64/boot/bzImage  \
      -initrd ./busybox-1.30.0/rootfs.img.gz   \
      -append "root=/dev/ram init=/linuxrc"  \
      -serial fileutput.txt
    这样一个完整的最小linux系统就起来啦:


    好了,经过以上的步骤,你可以自己编译一个内核和文件系统。有了这样的基础,你在之后就可以自由地修改linux内核代码并run起来进行验证啦。
    作者:简说linux https://www.bilibili.com/read/cv11271232/
    出处:bilibili

  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    

    Archiver|手机版|小黑屋|risc-v中文社区

    GMT+8, 2024-4-19 11:00 , Processed in 0.017048 second(s), 26 queries .

    risc-v中文社区论坛 官方网站

    Copyright © 2018-2021, risc-v open source

    快速回复 返回顶部 返回列表