当前位置: 首页 > news >正文

制作根文件系统的经验

《嵌入式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/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

 

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

相关文章:

  • SharePoint UserProfileService 接口列表 注解
  • Liferay 6.2 改造系列之二十二:如何发布WAR包
  • 关于投资那些事
  • FreeRTOS下的串口编程
  • YII2.0邮箱发送
  • 格式是否正确输入年、月、日判断
  • Learn GIT
  • Redis常用命令入门4:集合类型
  • 工作反思
  • 特殊数列的求和
  • wireshark 导出所有filter出来的包
  • TWRP基于omnirom 6.0.1编译教程
  • Django知识(二)
  • C高级 框架开发中红黑树结构
  • FOJ 2181 快来买肉松饼
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【前端学习】-粗谈选择器
  • 08.Android之View事件问题
  • bootstrap创建登录注册页面
  • css布局,左右固定中间自适应实现
  • Fastjson的基本使用方法大全
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java2019面试题北京
  • Java读取Properties文件的六种方法
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PAT A1092
  • pdf文件如何在线转换为jpg图片
  • PhantomJS 安装
  • PHP面试之三:MySQL数据库
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 十年未变!安全,谁之责?(下)
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • elasticsearch-head插件安装
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (07)Hive——窗口函数详解
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net Web窗口页属性
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET导入Excel数据
  • .Net环境下的缓存技术介绍
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .sh