文件系统格式:squanshfs、ext2、cpio、iso、yaffs2、jffs2
压缩格式:gzip、lzma
nfs启动:
1. 从flash上启动根文件系统,再用命令直接挂在NFS
1) 启动nfs服务,修改nfs服务文件/etc/export文件,允许服务器哪个目录可以被挂接,添加
服务器目录 *(rw,sync,no_root_squash)
2) 启动单板后,进入系统进行挂接,执行
mount -t nfs -o nolock 服务器ip:文件夹路径 单板路径(例如/mnt)
2. 直接从NFS启动参数
1) 参考Documentation/nfsroot.txt文件
2) 修改命令中的bootargs下的root=/dev/nfs nfsroot=服务器ip:路径 ip=单板ip:服务器ip:网关:子网:网卡eth0
裁剪脚本:make_image.sh
env_init() ---source环境、定义变量
unpackage_initrd() ---解压文件系统
build_image() ---定制化修改文件系统:dtc使用dts制作dtb文件、mkimage或mkheader给zImage加头、修改initrd
package_initrd() ---打包文件系统:
initrd.cpio.gz文件系统解压:
gunzip initrd.cpio.gz
cpio -idmv < initrd.cpio
initrd.cpio.gz文件系统压缩:
find ./* | cpio -H newc -o > initrd.cpio
gzip initrd.cpio
*/
initrd.cpio.lzma文件系统解压:
#file initrd.cpio.lzma 查看文件系统,如果uboot头需要去头
dd if=initrd.cpio.lzma of=initrd-dd.cpio.lzma bs=1 skip=4
mkdir initrd
cd initrd
lzma -d ../initrd-dd.cpio.lzma
cpio -id < ../initrd-dd.cpio
initrd.cpio.gz文件系统压缩:
find . | cpio -H newc - o | lzma -c > ../initrd.cpio.lzma
uboot:启动内核
内核:启动应用程序
start_kernel
setup_arch //解析u-boot传入的启动参数
setup_command_line //解析u-boot传入的启动参数
parse_early_param
do_early_param
从__setup_start到__setup_end, 调用early函数
unknown_bootoption
obsolete_checksetup
从__setup_start到__setup_end, 调用early函数
rest_init
kernel_init
prepare_namespace
mount_root //挂接根文件系统
init_post
//执行应用程序
//内核启动第一个应用程序
open(/dev/console) //终端,即stdin(0)
sys_dup(0) //复制第一个文件,即stdout(1)
sys_dup(0) //复制第一个文件,即stderr(2)
if (execute_command) { //uboot命令行参数, 传给内核的:即init=linuxrc存在
run_init_process(execute_command); //这个程序是死循环,如果不挂掉,是不会往下执行的
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
根文件系统:应用程序位于根文件系统中
最小根文件系统所需文件:
1. /dev/console
/dev/null
2. init ---> 由busybox提供
3. /etc/inittab(读取配置文件)
4. 配置文件指定的应用程序
5. 应用程序所需的函数提供者-->C库(glibc)
内核启动第一个应用程序就是init
init进程: ①读取配置文件 ②解析配置文件 ③执行(用户程序)
bosybox下的init_main
init_main
parse_inittab
file = fopen(INITTAB, "r"); //打开配置文件/etc/initab
new_init_action //①创建一个init_atcion结构,填充 ②把这个结构放入init_action_list链表
run_actions(SYSINIT);
waitfor(a, 0); //执行应用程序,等待它执行完毕
run(a); //创建process子进程
waitpid(runpid, &status, 0); //等待它结束
delete_init_action(a); //在init_action_list链表里删除
run_actions(WAIT);
waitfor(a, 0); //执行应用程序,等待它执行完毕
run(a); //创建process子进程
waitpid(runpid, &status, 0); //等待它结束
delete_init_action(a); //在init_action_list链表里删除
run_actions(ONCE);
run(a); //创建process子进程
delete_init_action(a); //在init_action_list链表里删除
while (1) {
run_action(RESPAWN);
if (a->pid == 0) {
a->pid = run(a);
}
run_action(ASKFIRST);
if (a->pid == 0) {
a->pid = run(a);
打印:Please press Enter to activate this console
等待回车
创建子进程
}
wpid = wait(NULL); //等待子进程退出
while (wpid > 0) {
a->pid = 0; //退出后,就设置pid = 0
}
}
可以从默认的new_init_action反推出默认的配置文件:
# inittab格式:
# <id>:<runlevels>:<action>:<process>
# id -> /dev/id, 用作终端:stdin, stdout, stderr
# runlevels :可忽略
# action :执行时机
# <action> : Valid actions include: sysinit, respawn, askfirst, wait, once,
# restart, ctrlaltdel, and shutdown
# process : 应用程序或脚本
#fstab格式:
#<file system> <mount point> <type> <options> <dump> <pass>
#file system:要挂载的文件系统
#mount point:挂载点;对于swap分区,这里写none
#type:文件系统类型
#option:属性设置,一般写defaults
#dump:是否备份,一般写0(不备份)
#pass:是否使用fsck来检查硬盘,一般写0(不检查)
#当执行mount -a时,busybox就会去读取并解析/etc/fstab文件
mount命令格式:
mount [-t vfstype] [-o options] device dir
#device:挂载的设备
#dir:挂载的目录
执行ps -aux命令时,需要创建proc目录以及挂载对应的proc文件系统
1. 修改/etc/fstab,添加
proc /proc proc defaults 0 0
2. 修改/etc/init.d/rcS,添加
mount -a //会根据/etc/fstab指示,挂载里面的文件系统
使用busybox中的mdev,自动在/dev下创建内核设备结点步骤:
1. 修改/etc/fstab,添加
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2. 修改/etc/init.d/rcS,添加
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug //hotplug热拔插,当加载驱动时,内核就会调用hotplug,进而调用mdev,创建设备结点
mdev -s //把内核原先有的设备结点,创建出来