• 007-BSP学习笔记-手动构建rootfs(busybox)构建


    一、下载编译busybox

    //配置忽略
    //修改环境变量支持交叉编译器
    make
    make install CONFIG_PREFIX=/home/nfs/rootfs

    在这里插入图片描述
    Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从而切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的.

    二、 向根文件系统添加 lib 库

    1、将交叉编译器中的库文件拷贝到rootfs/lib目录下
    mkdir lib
    cd */gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib
    cp *so* *.a ~/home/nfs/rootfs/lib/ -d
    cd */gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
    cp *so* *.a ~/home/nfs/rootfs/lib/ -d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2、将交叉编译器中的库文件拷贝到rootfs/usr/lib目录下
    cd */gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/
    usr/lib
    cp *so* *.a ~/home/nfs/rootfs/usr/lib/ -d
    
    • 1
    • 2
    • 3
    cd rootfs //进入根文件系统目录
    du ./lib ./usr/lib/ -sh //查看 lib 和 usr/lib 这两个目录的大小
    
    • 1
    • 2
    3、创建其他文件夹

    在根文件系统中创建其他文件夹,如 dev、 proc、 mnt、 sys、 tmp 和 root 等

    三、rootfs测试

    1、nfs挂载测试

    修改uboot 里面的 bootargs 环境变量会设置“root”的值

    root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
    
    • 1

    :服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP地址,比如我的 Ubuntu 主机 IP 地址为 192.168.1.250。
    : 根文件系统的存放路径,比如我的就是/home/zuozhongkai/linux/nfs/rootfs。
    : NFS 的其他可选选项,一般不设置。
    : 客户端 IP 地址,也就是我们开发板的 IP 地址, Linux 内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为192.168.1.251。
    : 服务器 IP 地址,前面已经说了。
    : 网关地址,我的就是 192.168.1.1。
    :子网掩码,我的就是 255.255.255.0。
    :客户机的名字,一般不设置,此值可以空着。
    : 设备名,也就是网卡名,一般是 eth0, eth1….,正点原子的 I.MX6U-ALPHA 开发板的 ENET2 为 eth0, ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。这里我们使用 ENET2,所以网卡名就是 eth0。
    : 自动配置,一般不使用,所以设置为 off。
    : DNS0 服务器 IP 地址,不使用。
    : DNS1 服务器 IP 地址,不使用。

    例:

    setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:
    /home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:
    255.255.255.0::eth0:off' //设置 bootargs
    saveenv //保存环境变量
    boot //启动内核
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四、完善rootfs

    1、创建/etc/init.d/rcS
    1 #!/bin/sh
    2 
    3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
    4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
    5 export PATH LD_LIBRARY_PATH
    6 
    7 mount -a //使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定,所以一会还要创建/etc/fstab 文件。
    8 mkdir /dev/pts
    9 mount -t devpts devpts /dev/pts
    10
    11 echo /sbin/mdev > /proc/sys/kernel/hotplug //使用 mdev 来管理热插拔设备,通过这两行, Linux 内核就可以在/dev 目录下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的 docs/mdev.txt文档。
    12 mdev -s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    2、创建/etc/fstab 文件
    1 #     
    2 proc /proc proc defaults 0 0
    3 tmpfs /tmp tmpfs defaults 0 0
    4 sysfs /sys sysfs defaults 0 0
    
    • 1
    • 2
    • 3
    • 4

    :要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
    :挂载点。
    :文件系统类型,比如 ext2、 ext3、 proc、 romfs、 tmpfs 等等。
    :挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults,也就是默认选项, defaults 包含了 rw、 suid、 dev、 exec、 auto、 nouser 和 async。
    :为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
    :磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。

    3、创建/etc/inittab 文件

    inittab 的详细内容可以参考 busybox 下的文件 examples/inittab

    1 #:::
    2 ::sysinit:/etc/init.d/rcS
    3 console::askfirst:-/bin/sh
    4 ::restart:/sbin/init
    5 ::ctrlaltdel:/sbin/reboot
    6 ::shutdown:/bin/umount -a -r
    7 ::shutdown:/sbin/swapoff -a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    :每个指令的标识符,不能重复。但是对于 busybox 的 init 来说, 有着特殊意义。对于 busybox 而言用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控制 tty。

    :动作,用于指定可能用到的动作。 busybox 支持的动作如表 38.4.3.1 所示:

    : 具体的动作,比如程序、脚本或命令等。

    动作描述
    sysinit在系统初始化的时候 process 才会执行一次。
    respawn当 process 终止以后马上启动一个新的。
    askfirst和 respawn 类似,在运行 process 之前在控制台上显示“Please press Enter to activatethis console.”。只要用户按下“Enter”键以后才会执行 process。
    wait告诉 init,要等待相应的进程执行完以后才能继续执行。
    once仅执行一次,而且不会等待 process 执行完成。
    restart当 init 重启的时候才会执行 procee。
    ctrlaltdel当按下 ctrl+alt+del 组合键才会执行 process。
    shutdown关机的时候执行 process
  • 相关阅读:
    pensieve运行的经验
    springMvc55-自定义异常
    再也不用担心窗体变形了
    STM32F1与STM32CubeIDE编程实例-WS2812B全彩LED驱动(基于SPI+DMA)
    分析Java中 CharSequence源码
    重磅!!!监控分布式NVIDIA-GPU状态
    Ajax和jQuery详细笔记
    【图神经网络】GNN的目前进展
    Linux安装JDK最新版
    外卖项目09---Redis了解
  • 原文地址:https://blog.csdn.net/qq_38292379/article/details/127670444