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