zoukankan      html  css  js  c++  java
  • 制作根文件系统的经验

    《嵌入式linux应用开发完全手册 第17章》

    farsight大纲ppt 根文件系统制作》

    1.首先要知道各个文件和文件夹及其意义。

    1.1 必要的文件和文件夹:

    至少要在/bin, /dev, /etc, /lib, /sbin, /usr/bin, /usr/sbin这几个目录里面填入原始的应用程、库和初始化脚本,才能使系统跑起来。

    sys,proc,tmp, mnt是空的,没必要往里面塞东西,系统启动后,内核会在里面放系统文件。

    |-- bin
    |-- dev
    |   |-- console
    |   `-- null
    |-- etc
    |   |-- fstab
    |   |-- init.d
    |   `-- inittab
    |-- lib
    |-- linuxrc -> bin/busybox
    |-- mnt
    |-- proc
    |-- root
    |-- sbin
    |-- sys
    |-- tmp

    `-- usr
        |-- bin
        `-- sbin

    1.2.科学地规划程序文件目录:

    /bin: 普通用户和root用户都能执行的基本程序。

    /sbin: oot用户都能执行的基本程序。

    /usr/bin: 更多非必需的用户程序。

    /usr/sbin: 更多非必需的root工具程序。

    1.3. 库文件的放置:

    /lib: 系统和基本命令需要的动态库

    /usr/lib:所有的其他库

    /usr/lib/xxx: 一些工具包的私有库,如/usr/lib/perl5

    2.启动过程

    内核启动的最后一步就是启动init进程,代码在init/main.c文件中。

    static int noinline init_post(void)

    {

        if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
            printk(KERN_WARNING "Warning: unable to open an initial console. ");
      ...

        if (ramdisk_execute_command) {
            run_init_process(ramdisk_execute_command);
            printk(KERN_WARNING "Failed to execute %s ",
                    ramdisk_execute_command);
        }

        run_init_process("/sbin/init"); //run_init_process一旦发现并执行了init,就不会再执行下面的几个init文件了。如果没有发现,就继续在下一个地方寻找init,依次类推。
        run_init_process("/etc/init");
        run_init_process("/bin/init");
        run_init_process("/bin/sh");

        panic("No init found.  Try passing init= option to kernel.");

    }

    2.1 init程序执行的几个阶段:  (farsight 《根文件系统制作》 )

    a, 设置init信号句柄

    b, 初始化consoles

    c, 解析inittab, 若不存在这是用默认值。

    # /etc/inittab
    ::sysinit:/etc/init.d/rcS
    s3c2410_serial0::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r

    d, 运行系统初始化脚本/etc/init.d/rcS

    这里可以做很多事情:重新挂载根文件系统挂载附加的文件系统,初始化并启动网络接口,启动一些系统守护进程和应用程序等。

     

    # vi /etc/init.d/rcS
    #
    !/bin/sh ifconfig eth0 192.168.2.111 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s

     

    mount -a 是自动挂载 /etc/fstab 里面的东西。

    # cat /etc/fstab 
    # device mount
    -point type options dump fsck order proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0

     

    e, 运行inittab中所有action为wait的命令

    f, 运行inittab中所有action为once的命令

    g, 循环运行inittab所有action为respawn, askfirst的命令。

    3. 如何部署lib中的动态库文件:

    3.1 找出需要的库文件: arm-linux-readelf -a "your exe file" | grep "Shared"

    [root@localhost fs_mini_mdev]# arm-linux-readelf -a bin/busybox  | grep "Shared"
     0x00000001 (NEEDED)                     Shared library: [libcrypt.so.1]
     0x00000001 (NEEDED)                     Shared library: [libm.so.6]
     0x00000001 (NEEDED)                     Shared library: [libc.so.6]

     3.2 删除库文件中的调试段等信息以缩小文件系统的大小

      cd "lib_dir" 

      arm-linux-strip *.so

  • 相关阅读:
    查询存储过程 视图调用关系
    正在执行的sql
    [BAT] BAT 顺序执行其他BAT 批处理文件可设置时间间隔(实际场景Windows下依次启动多个Tomcat服务)
    QT 实用代码片段 (持续更新)
    C# 阻塞队列 BlockingQueue<T>
    [Windows] IE版本历史
    [Windows] Windows操作系统的历史
    [C#] 使用表驱动法替代IF Else 和 Switch Case
    Bat实现IP设置切换(公司IP和家里的IP)
    Sublime Text 2 常用快捷键
  • 原文地址:https://www.cnblogs.com/mylinux/p/5782226.html
Copyright © 2011-2022 走看看