zoukankan      html  css  js  c++  java
  • Linux根文件系统:搭建简易的嵌入式Linux根文件系统

    (注:本文参考资料:朱有鹏嵌入式课程。本文为个人学习记录,如有错误,欢迎指正。)

    1. busybox简介

    Busybox是一个开源项目,它将众多的UNIX命令集合进一个很小的可执行程序中。Busybox中各种命令与相应的GNU工具相比,所能提供的选项比较少,但是也足够一般的应用了。Busybox按模块设计,可以很容易地加入、去除某些命令,或增减命令的某些选项。Busybox主要用于嵌入式系统。

    本文应用busybox来构建一个简易的嵌入式Linux根文件系统。目的在于通过搭建过程,了解根文件系统的工作原理。

    2. 搭建步骤

    Step1:获取busybox源码

    从busybox官网下载busybox的源码文件,本文选取的busybox版本号为:busybox-1.24.0。

    Step2:配置、编译、安装busybox

    1)修改busybox根目录下的Makefile文件,重新定义CPU架构、交叉编译工具链的前缀。

    ARCH = arm
    CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

    2)在Ubuntu终端运行“make  menuconfig”命令,进入busybox配置图形界面配置busybox。具体进行如下配置:

    Busybox Settings --->
    //配置busybox的编译过程为静态编译
    Build Options --->
    [*]Build BusyBox as a static binary(no shared libs)


    //优化busybox的shell界面
    Busybox  Library Tuning --->
    [*]vi-style line editing commands
    [*]Fancy shell prompts

    //配置busybox的安装路径
    Installation Options ("make install" behavior)  --->
     (/home/sai/rootfs-test/rootfs/myrootfs) BusyBox installation prefix

    Linux Module Utilities--->
    [ ]Simplified modutils
    [*]insmod
    [*]rmmod
    [*]lsmod
    [*]modprobe
    [*]depmod

    Linux System Utilities--->
    [*]mdev
    [*]Support /etc/mdev.conf
    [*]Support subdirs/symlinks
    [*]Support regular expressions substitutions when renaming dev
    [*]Support command execution at device addition/removal
    [*]Support loading of firmwares

    3)编译busybox,在Ubuntu终端执行“make”命令。

    4)在Ubuntu执行“make  install”命令,busybox将被安装至指定目录。安装完成后,进入安装目录,其中新增了一些子目录,/bin、/linuxrc、/sbin、/usr。

    Step3:添加inittab文件

    手工创建/etc目录,并在/etc目录下添加inittab文件。

    内核成功挂载根文件系统之后,运行根目录下的第一个用户进程linuxrc。linuxrc将解析inittab文件,运行操作系统的配置脚本,对Linux系统进行初始化。inittab文件的具体介绍详见。

    本文的inittab文件具体内容如下:

    #first:run the system script file
    ::sysinit:/etc/init.d/rcS                #系统开机或重新启动,执行rcS文件
    ::askfirst:-/bin/login                   #系统启动后,运行登录程序
    ::ctrlaltdel:-/sbin/reboot             #按下组合键“ctrl+alt+del”,重启Linux系统

    #umount all filesystem
    ::shutdown:/bin/umount -a -r     #系统关机时,卸载所有文件系统

    #restart init process
    ::restart:/sbin/init                      #重启init进程

    Step4:添加rcS脚本文件

    手工创建/etc/init.d目录,并在/etc/init.d目录下添加rcS脚本文件,该文件是系统的初始化文件。本文的rcS脚本文件具体内容如下:

    #!/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin     #初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序

    runlevel=S  #将系统设置为单用户模式
    prevlevel=N #将系统设置为单用户模式

    umask 022#指定当前用户在创建文件时的默认权限 

    export PATH runlevel prevlevel  #导出环境变量

    mount -a                 #挂载/etc/fstab文件中指定的文件系统

    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s       #生成相应的/dev目录下的设备文件

    #从/etc/sysconfig/HOSTNAME文件中读取主机名,命令行下运行hostname即可显示当前系统的主机名
    /bin/hostname -F /etc/sysconfig/HOSTNAME  

    手工创建/etc/sysconfig/HOSTNAME文件,并在其中写入主机名。

    210Linux   //自定义主机名

    Step5:添加fstab文件

    在/etc目录下添加fstab文件,该文件中指定了系统需要挂载的文件系统。本文的fstab文件内容如下:

    # /etc/fstab: static file system information.
    #
    # Use 'vol_id --uuid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    #
    # <file system>   <mount point>   <type>   <options>      <dump>      <pass>
        proc              /proc                    proc         defaults              0                0
        sysfs       /sys                      sysfs        defaults              0                0
               tmpfs                /var                      tmpfs       defaults              0                0
               tmpfs                /tmp                     tmpfs       defaults              0                0
               tmpfs                /dev                      tmpfs       defaults              0                0

    为保证挂载成功,在根目录下手工创建/proc、/sys、/var、/tmp、/dev目录。Step6:添加profile文件

    在/etc目录下添加profile文件。

    profile文件也将被linuxrc进程调用,在Linux终端命令行提示符中显示主机名。本文的profile文件内容如下:

    # Ash profile
    # vim: syntax=sh

    # No core files by default
    ulimit -S -c 0 > /dev/null 2>&1

    USER="`id -un`"
    LOGNAME=$USER
    PS1='[u@h W]# '
    PATH=$PATH

    HOSTNAME=`/bin/hostname`

    export USER LOGNAME PS1 PATH

    Step6:添加用户登录文件(passwd、shadow文件)

    passwd文件中存储的是用户的密码设置,shadow文件中存储的是加密后的密码。

    直接复制ubuntu系统中的/etc/passwd和/etc/shadow文件到当前制作的根目录下,然后再做修改即可。

    修改后passwd文件内容如下:

    root:x:0:0:root:/root:/bin/sh     #登录成功后,进入/root目录

    修改后passwd文件内容如下:

    root::17680:0:99999:7:::     #root用户密码为空

    在根目录下创建/root目录。重新启动即可使用 root 登录,登录后使用 passwd root 命令设置用户密码。

    Step7:拷贝动态链接库

    在根目录下创建lib目录,并将交叉编译工具链arm-2009q3的动态链接库拷贝至/lib目录下。
    //*so*是过滤掉非动态链接库的文件,-rdf是保证符号链接仍是符号链接
    cp  /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/*so*   ./   -rdf   
    使用“ arm-linux-strip”去掉链接库中的符号信息,缩小库的体积。

    3. 测试

    (1)挂载测试

    将所创建的根文件系统的文件夹拷贝至NFS服务器所在目录,并在uboot中设置bootargs参数。启动后即可进入Linux终端。详细步骤见。

    (2)应用程序运行测试

    编写helloword程序,并将其分别编译为一个动态链接可执行程序、静态链接可执行程序。

    arm-none-linux-gnueabi-gcc hello.c -o hello_statci -static   //静态编译

    arm-none-linux-gnueabi-gcc hello.c -o hello_dynamic         //动态编译

    将可执行程序拷贝至/root目录下,在开发板的Linux终端运行,两个程序都运行成功。

  • 相关阅读:
    iOS-触摸事件、手势识别、摇晃事件、耳机线控
    iOS-App生命周期
    Foundation框架—时间处理对象NSDate
    Kali linux渗透测试的艺术 思维导图
    数据结构_二叉树遍历
    数据结构_数值转换
    <转载>Mac下,使用sshpass让iterm2支持多ssh登录信息保存
    <转载>iTerm2使用技巧
    Maven打包编译找不到com.sun.crypto.provider.SunJCE类
    MySQL自动设置create_time和update_time
  • 原文地址:https://www.cnblogs.com/linfeng-learning/p/9285544.html
Copyright © 2011-2022 走看看