文件系统实验0-包含自动启动应用程序

nand flash启动:
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
nfs启动:
set bootargs noinitrd root=/dev/nfs nfsroot=111.114.154.127:/work/nfs_root/first_fs ip=111.114.154.16:111.114.154.127:111.114.154.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0


uboot:启动内核
内核:启动应用程序
            open(/dev/console,sys_dup(0),sys_dup(0))//标准输入输出错误
            run_init_process("/sbin/init");
            run_init_process("/etc/init");
            run_init_process("/bin/init");
            run_init_process("/bin/sh");
构建:根文件系统

busybox:ls cp cd

ls链接到busybox,当执行ls时实质是busybox ls

内核启动文件系统中的第一个程序init
busybox--init_main
    parse_inittab();
        file = fopen(INITTAB, "r");//INITTAB = "/etc/inittab"    /* inittab file location */
                                                                                        
        
        new_init_action
            ①创建一个init_action结构,填充
            ②把这个结构体放入init_action_list链表中
        run_actions(SYSINIT);
        run_actions(WAIT);
        run_actions(ONCE);
        while (1) {
        run_actions(RESPAWN);
        run_actions(ASKFIRST);
        wpid = wait(NULL);
        while (wpid > 0) {
            for (a = init_action_list; a; a = a->next) {
                if (a->pid == wpid){
                    a->pid = 0;        //程序不会死掉,死了后,又会被重新运行。
                    message(L_LOG, "process '%s' (pid %d) exited. "
                            "Scheduling it for restart.",
                            a->command, wpid);}}}
        
inittab格式:<id>:<runlevels>:<action>:<process>
    id-->/dev/id:用于终端  stdin,stdout,stderr;为空的话会指定为/dev/null
    runlevels:完全可忽略
    action:何时执行
    process:应用程序或脚本


busybox--init  busybox-1.7.0\examples\inittab这个文件对inittab格式有详细说明
    完成① 读取配置文件:a指定应用程序;b何时执行应用程序
        ② 解析配置文件
        ③ 执行应用程序
/
/
                制作文件系统:yffs2 jffs2 NFS                        /
/
/
一、最小文件系统:
    ①/dev/console 、 /dev/null  
            ==> 用mknod创建,例:mknod 名字 文件类型 主设备号 次设备号
            
    ②init=>busybox。init本身,即busybox
            
    ③配置文件/etc/inittab指定的应用程序
            ==>创建/etc/inittab文件,内容是:console::askfirst:-/bin/sh
    ④c库
            ==> cp *.so* 第一个文件系统目录/lib -d :-d表示保持链接关系,负责链接文件的内容会复制被链接的文件,库会很大
            
    配置、编译busybox可或得:②、③项
    :解压;读readme文件、install文件
    a编译为动态的
    b设置编译交叉编译工具链;在makefile中设置:CROSS-COMPILE
        最新版的busybox可在make menuconfig中配置交叉编译项
    ********************************************************
    *************应用手册上有详解***************************
    ********************************************************
    c将编译好的文件安装到将要编译成文件系统的文件夹中
    
    最后:制作映像文件
    书上是yaffs1:对小页的nand flash用,每一页512字节。
    工具:自己编译--生成工具--拷贝工具--制作
    tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
    cd utils/
    make
    mkyaffs2image

********************************************************
*************应用手册上有详解***************************
********************************************************
二、改进
    用ps命令发现没有/proc目录,创建/proc
    有了/proc文件后,必须挂载一个虚拟文件系统[收集内核的信息]
    mount proc none /proc
    在ps出现一些内核信息。

修改:
①:
/etc/inittab文件内容是:
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS

rcS脚本内容,修改权限:
mount proc none /proc
②:
mount -a:
是根据/etc/fstab中的内容来挂载文件系统
    /etc/fstab内容:
    #device   mount-piont   type  options  dump  fsck  order
     proc      /proc        proc   defaults 0      0
    
cat /proc/mounts:查看当前挂载的文件系统

三、改进
udev-->自动创建设备节点:/dev/设备节点
简化版本:mdev
①创建sys目录:mkdir sys
②/etc/fstab
/etc/fstab内容:
    #device   mount-piont   type  options  dump  fsck  order
     proc      /proc        proc   defaults 0      0
     sysfs     /sys         sysfs  defaults 0      0
     tmpfs     /dev         tmpfs  defaults 0      0
     tmpfs     /tmp         tmpfs  defaults 0      0
③/etc/init.d/rcS
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hutplug
/*/proc/sys/kernel/hutplug会指向/sbin/mdev*/
mdev -s
/*创建内核现有的一些设备节点*/

四、jffs2一般用在nor flash上,现将它用在nand flash上。
     压缩的系统
参考完全开发手册
./config --share      --prefix=/urs
         编译动态度   安装在/urs目录
mkfs.jffs2 -n -s 2048   -e  128KiB -d first_fs -o first_fs.jffs2
               一页大小 一块大小       目录          输出
                        可擦除
设置文件系统参数,uboot传入的:
bootagrs=... rootfstype=jffs2 ....

五、制作NFS文件系统
a.从nand flash上启动文件系统,再用命令挂接NFS
        要挂接NFS文件系统,NFS文件系统是在linux服务器上
        linux服务器允许这个目录可被别人挂接
                如何做到的:nfs服务;配置文件/etc/exports
                                                                        内容:
                                                                        linux服务器目录 *(rw,snyc,no_root_squash)
                                                        重启nfs服务
                                                        /etc/init.d/nfs restart
                                                        试验:自己挂接自己
                                                        mount -t nfs 192.168.1.127:/目录 /mnt
                                                        
        单板去挂接
            在单板上创建/mnt目录 mkdir mnt
            mount -t nfs -o nolock 192.168.1.127:/linux服务器中的目录 /mnt
b.单板直接从NFS启动
    bootargs=noinitrd root=/dev/mtdblock3 init=linuxrc consoles=ttySAC0
    修改命令行参数:  
    参考:nfsroot文件                                                                                                                子网掩码                    
set    bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.127:/linux服务器nfs配置项中设置的目录 ip=192.168.1.11:192.168.1.127:192.168.1.1:255.255.255.0::eth0:off init=linuxrc consoles=ttySAC0
[]表示这个参数可以省略;<>表示这个参数可以省略。                                                                         网关因为是同一个网段的,所以可以随便设
NFS启动参数:
① 服务器ip
②目录
③单板ip



NFS:可从单板挂接到linux服务器
         也可从linux服务器挂接到单板

启动网卡
ifconfig eth0 up

/
/



附件:

void new_init_action(int action, const char *command, const char *cons)
<id>:<runlevels>:<action>:<process>
# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
#                                  restart, ctrlaltdel, and shutdown.
#define INIT_SCRIPT  "/etc/init.d/rcS"    /* Default sysinit script. */
从默认的new_init_action反推出一个inittab
        /* Reboot on Ctrl-Alt-Del */
        new_init_action(CTRLALTDEL, "reboot", "");
        /* Umount all filesystems on halt/reboot */
        new_init_action(SHUTDOWN, "umount -a -r", "");
        /* Swapoff on halt/reboot */
        if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
        /* Prepare to restart init when a HUP is received */
        new_init_action(RESTART, "init", "");
        /* Askfirst shell on tty1-4 */
        new_init_action(ASKFIRST, bb_default_login_shell, "");
        new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
        new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
        new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
        /* sysinit */
        new_init_action(SYSINIT, INIT_SCRIPT, "");
inittab:
        ::ctrlaltdel:reboot
        ::shutdown:umount -a -r
        ::shutdown:swapoff -a
        ::restart:init
        tty2::askfirst:-/bin/sh
        tty3::askfirst:-/bin/sh
        tty4::askfirst:-/bin/sh
        ::sysinit:/etc/init.d/rcS
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值