博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
制作根文件系统的经验
阅读量:5015 次
发布时间:2019-06-12

本文共 2684 字,大约阅读时间需要 8 分钟。

《嵌入式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.\n");
  ...

    if (ramdisk_execute_command) {

        run_init_process(ramdisk_execute_command);
        printk(KERN_WARNING "Failed to execute %s\n",
                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/rcSs3c2410_serial0::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -r

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

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

 

# vi /etc/init.d/rcS #!/bin/shifconfig eth0 192.168.2.111mount -amkdir /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -s

 

 

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

# cat /etc/fstab # device     mount-point    type   options        dump  fsck orderproc           /proc        proc   defaults        0     0tmpfs          /tmp         tmpfs  defaults        0     0sysfs          /sys         sysfs  defaults        0     0tmpfs          /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

 

转载于:https://www.cnblogs.com/mylinux/p/5782226.html

你可能感兴趣的文章
如何解决Provisional headers are shown问题(转)
查看>>
开发网站遇到的bug
查看>>
实现简单的接口自动化测试平台
查看>>
EXCEL工作表合并
查看>>
Prime Path
查看>>
ODAC(V9.5.15) 学习笔记(三)TOraSession(2)
查看>>
单纯形法
查看>>
SQL中的replace函数
查看>>
java中的类型安全问题-Type safety: Unchecked cast from Object to ...
查看>>
如何解决最后一个尾注引用显示与致谢混为一谈的问题-下
查看>>
Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...
查看>>
阅读之https及加密原理
查看>>
HDOJ4550 卡片游戏 随便销毁内存的代价就是wa//string类的一些用法
查看>>
css文本样式text、字体样式font
查看>>
python判断图片是否损坏
查看>>
MySQL服务启动:某些服务在未由其他服务或程序使用时将自动停止
查看>>
软件工程第四周作业 - 单元测试
查看>>
KNN与SVM对比&SVM与逻辑回归的对比
查看>>
php 现在拓展地址
查看>>
【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)...
查看>>