【Linux基础】根文件系统制作

来源:互联网 发布:java split分割字符串 编辑:程序博客网 时间:2024/06/18 17:13
3.1、建立工作目录
设定工作目录为/root/build_rootfs/, 该目录主要用来编译busybox,bash等制造根文件系统的软件,Linux入门培训下载或拷贝光盘源码busybox,bash 到该目录;
mkdir /root/build_rootfs
3.2、建立根目录
该目录就是我们要移植到目标板上的目录,对于嵌入式的文件系统,根目录下必要的目录包括bin,dev,etc,usr,lib,sbin,proc,sys,tmp;这里设定根目录是/root/rootfs;busybox、bash编译之后,安装到该目录下;
mkdir /root/rootfs
mkdir /root/rootfs/{bin,dev,etc,usr,lib,sbin,proc,sys,tmp}
mkdir /root/rootfs/usr/{bin,sbin,lib}
创建节点
以root用户在/root/rootfs/dev目录执行,创建节点(如果使用mdev设备管理工具可忽略此步骤)
mknod -m 666 null c 1 3
mknod -m 600 console c 5 1
3.3、拷贝动态链接库
交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的lib目录下;我们在移植应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上,这里我们用到的交叉工具链的路径是/usr/local/arm/4.1.2/,所以链接库的目录是/usr/local/arm/4.1.2/arm-linux/lib
#进入链接库目录
cd /usr/local/arm/4.1.2/arm-linux/lib
#编写一个shell文件,用于copy实际的共享链接库;主修订版本的符合链接;动态连接器及其符号链接到目标板根目录下的lib(/root/rootfs/lib)。
vi cp.sh
#内容如下:
for file in libc libcrypt libdl libm libpthread libresolv libutil libthread_db
do
cp $file*.so /work/rootfs/lib
cp -d $file.so.* /work/rootfs/lib
done
cp -d ld*.so* /work/rootfs/lib
cp -d libstdc++.so* /work/rootfs/lib
cp -d libz.so* /work/rootfs/lib
cp -d libjpeg.so* /work/rootfs/lib
cp -d libgcc_s* /work/rootfs/lib
#保存退出
#第一个cp命令会复制实际的C语言入门共享库
#第二个cp命令会复制符合链接本身
#第三个cp命令会复制动态连接器及其符合链接
#执行刚编写的shell。
source cp.sh
#这样就把链接库复制到/root/rootfs/lib目录下。
#接着我们还要缩小复制过来的链接库的体积,如下:
arm-linux-strip -s /root/rootfs/lib/lib*
3.4、交叉编译busybox
Bosybox是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox可以自动生成根文件系统所需的bin、sbin、usr目录和linuxrc文件。
busybox的源码可以从http://www.busybox.net/downloads/下载,这里我们下载一个1.16.0版本的源码。
我们在配置busybox的时候是基于默认配置之上来配置的;
先make defconfig就是把busybox配置成默认,
然后再make menuconfig来配置busybox。
说明:我们在配置一个源代码包之前,可以先阅读源码包目录下的README和INSTALL文件以及Makefile的注释部分,也可以到http://www.busybox.net网站以获取帮助。
#解压
tar jxvf busybox-1.16.0.tar.bz2
mv busybox-1.16.0 busybox
cd busybox
#修改Makefile,找到Makefile中的ARCH,CROSS_COMPILE环境变量,将其按以下赋值:
vi Makefile
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/4.1.2/bin/arm-linux-
#配置busybox
make defconfig
make menuconfig
#配置时,我们基于默认配置,再配置它为静态编译,安装时不要/usr路径,指定一个安装路径,
#如下:
Busybox Settings --->
Build Options --->
  • Build BusyBox as a static binary (no shared libs)
  • Installation Options --->
  • Don't use /usr
  • (/root/rootfs) BusyBox installation prefix
    输入"/root/rootfs",指定安装路径为/root/rootfs
    #保存退出,编译安装;
    make && make install
    #安装完成后,busybox会在安装目录上安装linuxrc文件,用户可以根据自身需要进行跟换该文件。
    3.5、交叉编译bash
    Bash是一个交互程序,其源码可以从ftp://ftp.gnu.org/gnu/bash/下载;
    步骤如下:
    cd /root/build_rootfs
    解压源码;
    tar zxvf bash-4.0.tar.gz
    cd bash-4.0
    export PATH=/usr/local/arm/4.1.2/bin:$PATH(若该环境变量已经设置成功,可以忽略此步骤)
    ./configure --host=arm-linux
    make
    arm-linux-strip -s bash
    编译的结果得到bash程序,将其拷贝到根目录下;
    cp bash /root/rootfs/bin
    3.6、建立系统配置文件
    3.6.1、 /root/rootfs/etc/inittab文件
    首先inittab文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。
    vi /root/rootfs/etc/inittab
    添加如下内容
    #first: run the system script file
    ::sysinit:/etc/init.d/rcS
    #second:run the local script file
    ::once:/etc/rc.local
    #third run the bash shell prosecc
    ::respawn:/bin/bash
    #restart init process
    ::restart:/sbin/init
    #umount all file system
    ::shutdown:/bin/umount -a -r
    上面的这个inittab文件决定的启动流程是:
    1 执行“/etc/init.d/rcS”脚本;
    2 执行“/etc/rc.local”脚本;
    3 执行“/bin/bash”交互程序,进入交换界面;
    3.6.2、/root/rootfs/etc/fstab 文件
    该配置文件为目标系统所支持挂载的文件系统类型列表(可参考PC主机上的配置)
    vi /root/rootfs/etc/fstab
    添加如下内容
    #device mount-point type option dump fsck order
    proc /proc proc defaults 0 0
    none /tmp ramfs defaults 0 0
    sysfs /sys sysfs defaults 0 0
    mdev /dev ramfs defaults 0 0
    3.6.3、/root/rootfs/etc/init.d/rcS文件
    该配置文件主要是挂载跟配置文件系统,建立必要的设备文件或其符号连接;
    mkdir /root/rootfs/etc/init.d
    vi /root/rootfs/etc/init.d/rcS
    内容如下:
    #!/bin/sh
    export PATH=/sbin:/bin:/usr/sbin:/usr/bin
    echo "----------munt all----------------"
    mount -a #实现对/etc/fstab 文件中各文件系统的挂载
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s #使用mdev工具对设备进行动态管理
    MDEV
    mdev是busybox自带的一个简化版的udev,适合于嵌入式C语言教程的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件
    mdev的正常使用需要创建/root/rootfs/etc/mdev.conf文件(可以为空文件,但必须存在,在/root/rootfs/etc/下执行“touch mdev.conf ”指令可创建),同时MDEV会改写/dev和/sys两个目录,必须保证这两个目录存在且是可写的(一般会用到sysfs,tmpfs。所以要重新编译内核)。
    执行mdev -s:
    以‘-s’为参数调用位于/sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。
    热插拔事件:
    由于启动时运行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有 “dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
    3.6.4、etc/rc.local文件
    该配置文件主要是配置IP地址;
    vi /root/rootfs/etc/rc.local
    内容如下:
    #!/bin/sh
    # set ip
    /sbin/ifconfig lo 127.0.0.1 up
    /sbin/ifconfig eth0 172.22.60.223 netmask 255.255.0.0 up
    /sbin/route add default gw 172.22.60.1 eth0
    3.6.5、在文件系统目录的根路径下添加.bashrc文件
    文件系统最后启动的是bash交换程序,进入交换界面;
    bash程序的启动会读取根目录下的.bashrc脚本文件;
    vi /root/rootfs/.bashrc
    .bashrc文件参考:
    #!/bin/bash
    # set env
    export PATH=/bin:/sbin:/usr/bin
    export LD_LIBRARY_PATH=/lib:/usr/lib
    /usr/bin/hello &
    3.7、添加一个用户程序
    进入工作目录
    cd /root/build_rootfs/
    编辑源文件
    vi hello.c
    内容如下
    #include <stdio.h>
    main()
    {
    printf(“welcome to my rootfs\n”);
    }
    保存退出;
    交叉编译
    arm-linux-gcc hello.c -o hello
    复制到目标板的根目录
    mv hello /root/rootfs/usr/bin
    注意:完成添加上述的配置文件后,需要将其属性修改为可执行,利用chmod指令修改。
    chmod 777 /root/rootfs/.bashrc
    chmod 777 /root/rootfs/etc/rc.local
    chmod 777 /root/rootfs/etc/inittab
    chmod 777 /root/rootfs/etc/mdev.conf
    chmod 777 /root/rootfs/etc/fstab
    chmod 777 /root/rootfs/etc/init.d/rcS
    至此,C语言视频教程文件系统的搭建基本完成,随后利用不同的文件系统镜像制作工具对文件系统目录进行打包压缩成相应类型的镜像即可,下面我们来做JFFS2文件系统
    本文专注于Linux入门:http://www.weicedu.com/thread-275851-1-1.html