浅析linux下文件系统的裁剪

文件系统格式:squanshfs、ext2、cpio、iso、yaffs2、jffs2

压缩格式:gzip、lzma

nfs启动:

    1. 从flash上启动根文件系统,再用命令直接挂在NFS

        1) 启动nfs服务,修改nfs服务文件/etc/export文件,允许服务器哪个目录可以被挂接,添加

            服务器目录 *(rw,sync,no_root_squash)

        2) 启动单板后,进入系统进行挂接,执行

            mount -t nfs -o nolock 服务器ip:文件夹路径 单板路径(例如/mnt)

       

    2. 直接从NFS启动参数

        1) 参考Documentation/nfsroot.txt文件

        2) 修改命令中的bootargs下的root=/dev/nfs nfsroot=服务器ip:路径 ip=单板ip:服务器ip:网关:子网:网卡eth0

   

裁剪脚本:make_image.sh

    env_init()  ---source环境、定义变量

    unpackage_initrd() ---解压文件系统

    build_image() ---定制化修改文件系统:dtc使用dts制作dtb文件、mkimage或mkheader给zImage加头、修改initrd

    package_initrd() ---打包文件系统:

        initrd.cpio.gz文件系统解压:

            gunzip initrd.cpio.gz

            cpio -idmv < initrd.cpio

        initrd.cpio.gz文件系统压缩:

            find ./* | cpio -H newc -o > initrd.cpio

            gzip initrd.cpio

        */

        initrd.cpio.lzma文件系统解压:

            #file initrd.cpio.lzma 查看文件系统,如果uboot头需要去头

            dd if=initrd.cpio.lzma of=initrd-dd.cpio.lzma bs=1 skip=4

            mkdir initrd

            cd initrd

            lzma -d ../initrd-dd.cpio.lzma

            cpio -id < ../initrd-dd.cpio

        initrd.cpio.gz文件系统压缩:

            find . | cpio -H newc - o | lzma -c > ../initrd.cpio.lzma

       

       

       

uboot:启动内核

内核:启动应用程序

    start_kernel

        setup_arch              //解析u-boot传入的启动参数

        setup_command_line      //解析u-boot传入的启动参数

        parse_early_param

            do_early_param

                从__setup_start到__setup_end, 调用early函数

        unknown_bootoption

            obsolete_checksetup

                从__setup_start到__setup_end, 调用early函数

        rest_init

            kernel_init

                prepare_namespace

                    mount_root      //挂接根文件系统

                init_post

                    //执行应用程序

                    //内核启动第一个应用程序

                    open(/dev/console)   //终端,即stdin(0)

                    sys_dup(0)           //复制第一个文件,即stdout(1)  

                    sys_dup(0)           //复制第一个文件,即stderr(2)

                    if (execute_command) {  //uboot命令行参数, 传给内核的:即init=linuxrc存在

                        run_init_process(execute_command);  //这个程序是死循环,如果不挂掉,是不会往下执行的

                    }

                    run_init_process("/sbin/init");

                    run_init_process("/etc/init");

                    run_init_process("/bin/init");

                    run_init_process("/bin/sh");

根文件系统:应用程序位于根文件系统中

       

           

最小根文件系统所需文件:

    1. /dev/console

        /dev/null

    2. init ---> 由busybox提供

    3. /etc/inittab(读取配置文件)

    4. 配置文件指定的应用程序

    5. 应用程序所需的函数提供者-->C库(glibc)



 

内核启动第一个应用程序就是init

init进程: ①读取配置文件 ②解析配置文件 ③执行(用户程序)

    bosybox下的init_main

    init_main

        parse_inittab

            file = fopen(INITTAB, "r"); //打开配置文件/etc/initab

            new_init_action     //①创建一个init_atcion结构,填充 ②把这个结构放入init_action_list链表

        run_actions(SYSINIT);

            waitfor(a, 0);      //执行应用程序,等待它执行完毕

                run(a);         //创建process子进程

                waitpid(runpid, &status, 0);    //等待它结束

            delete_init_action(a);  //在init_action_list链表里删除

        run_actions(WAIT);

            waitfor(a, 0);      //执行应用程序,等待它执行完毕

                run(a);         //创建process子进程

                waitpid(runpid, &status, 0);    //等待它结束

            delete_init_action(a);  //在init_action_list链表里删除

        run_actions(ONCE);

            run(a);         //创建process子进程

            delete_init_action(a);  //在init_action_list链表里删除

        while (1) {

            run_action(RESPAWN);

                if (a->pid == 0) {

                    a->pid = run(a);

                }

            run_action(ASKFIRST);

                if (a->pid == 0) {

                    a->pid = run(a);

                                打印:Please press Enter to activate this console

                                等待回车

                                创建子进程

                }

            wpid = wait(NULL);      //等待子进程退出

            while (wpid > 0) {      

                a->pid = 0;         //退出后,就设置pid = 0

            }

        }  

               

   

可以从默认的new_init_action反推出默认的配置文件:

# inittab格式:

# <id>:<runlevels>:<action>:<process>

# id -> /dev/id, 用作终端:stdin, stdout, stderr

# runlevels :可忽略

# action :执行时机

# <action> : Valid actions include: sysinit, respawn, askfirst, wait, once,

#                                   restart, ctrlaltdel, and shutdown

# process : 应用程序或脚本

   

#fstab格式:

#<file system> <mount point> <type>  <options> <dump> <pass>

#file system:要挂载的文件系统

#mount point:挂载点;对于swap分区,这里写none

#type:文件系统类型

#option:属性设置,一般写defaults

#dump:是否备份,一般写0(不备份)

#pass:是否使用fsck来检查硬盘,一般写0(不检查)

#当执行mount -a时,busybox就会去读取并解析/etc/fstab文件

mount命令格式:

    mount [-t vfstype] [-o options] device dir

    #device:挂载的设备

    #dir:挂载的目录

   

执行ps -aux命令时,需要创建proc目录以及挂载对应的proc文件系统

1. 修改/etc/fstab,添加

    proc    /proc   proc    defaults    0   0  

2. 修改/etc/init.d/rcS,添加

    mount -a        //会根据/etc/fstab指示,挂载里面的文件系统

   

使用busybox中的mdev,自动在/dev下创建内核设备结点步骤:

1. 修改/etc/fstab,添加

    sysfs   /sys    sysfs   defaults    0   0

    tmpfs   /dev    tmpfs   defaults    0   0

2. 修改/etc/init.d/rcS,添加

    mount -a

    mkdir /dev/pts

    mount -t devpts devpts /dev/pts

    echo /sbin/mdev > /proc/sys/kernel/hotplug  //hotplug热拔插,当加载驱动时,内核就会调用hotplug,进而调用mdev,创建设备结点

    mdev -s     //把内核原先有的设备结点,创建出来

   

   

   

   

   

   

   

   

   

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值