构建根文件系统

①u-boot:目的是启动内核
②内核 :目的是启动应用程序
③启动应用程序:需要构建根文件系统

内核如何启动第一个应用程序

在这里插入图片描述
1、第一个应用程序:标准输入,输出,错误

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

(void) sys_dup(0);
(void) sys_dup(0);

在这里插入图片描述在这里插入图片描述
2、

   run_init_process(xxx);  //用来启动应用程序 init = xxx 命令行参数,成功之后就不会退出了

在这里插入图片描述
在这里插入图片描述
init程序工作:

  1. 读取配置文件
  2. 解析配置文件
  3. 执行用户程序
    配置文件:包含①指定程序;②何时执行;

在这里插入图片描述

static void new_init_action(int action, const char *command, const char *cons)  //执行配置文件

new_init_action
创建一个init_action结构体,填充
把这个结构体放入init_action_list链表

struct init_action {
struct init_action *next;
int action;
pid_t pid;
char command[INIT_BUFFS_SIZE];
char terminal[CONSOLE_NAME_SIZE];

};
init进程完成的动作:
在这里插入图片描述
在这里插入图片描述
inittab配置格式:在这里插入图片描述
总结:

  1. /dev/console (如果不设定/dev/id,就跳转到/dev/null)
  2. /etc/inittab
  3. 配置文件里指定的应用程序
  4. init本身,即busybox

最小根文件系统的必须:

  1. /dev/console 或 /dev/null
  2. init (来自busybox)
  3. /etc/inittab
  4. 配置文件里指定的应用程序(inittab中指定)
  5. C库(应用程序的编写需要库函数,比如printf)
    所谓构建根文件系统,就是把以上的东西构建出来

Busybox的编译过程
最小根文件系统构建步骤:
进入安装的busybox的目录:

  1. 查看驱动文件
root@ubuntu:/tftpboot/fs_mini# ls /dev/console /dev/null -l
crw------- 1 root root 5, 1 Aug 25 13:10 /dev/console
crw-rw-rw- 1 root root 1, 3 Aug 25 13:10 /dev/null

2.创建/dev/console 和 /dev/null

root@ubuntu:/tftpboot/fs_mini# mkdir dev
root@ubuntu:/tftpboot/fs_mini# cd dev
root@ubuntu:/tftpboot/fs_mini/dev# mknod console c 5 1
root@ubuntu:/tftpboot/fs_mini/dev# mknod null c 1 3

3.添加C库

root@ubuntu:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/arm-linux/lib# cp *.so* /tftpboot/fs_mini/lib/ -d
完善根文件系统

①添加proc文件(内核提供的虚拟文件系统)

root@ubuntu:/tftpboot/fs_mini# mkdir proc

②如果不想手工挂载proc文件,需要添加配置文件在/etc/inittab

root@ubuntu:/tftpboot/fs_mini# vim etc/inittab
添加:
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS

③创建脚本文件

root@ubuntu:/tftpboot/fs_mini# mkdir etc/init.d
root@ubuntu:/tftpboot/fs_mini# vim etc/init.d/rcS
添加:
mount -t proc none /proc(用于挂载proc文件)
添加执行权限:
root@ubuntu:/tftpboot/fs_mini# chmod +x etc/init.d/rcS

          另一种方法挂载proc:

root@ubuntu:/tftpboot/fs_mini# mkdir etc/init.d
root@ubuntu:/tftpboot/fs_mini# vim etc/init.d/rcS
添加:
mount -a(用于挂载proc文件,依赖于文件fstab)
添加执行权限:
root@ubuntu:/tftpboot/fs_mini# chmod +x etc/init.d/rcS

在这里插入图片描述

root@ubuntu:/tftpboot/fs_mini# vim etc/fstab
# device   mount-point  type  options  dump  fsck  order
proc        /proc       proc  defaults   0    0

④udev自动创建/dev/设备节点,mdev是udev的简化版本
Here’s a typical code snippet from the init script:
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s

Of course, a more “full” setup would entail executing this before the previous
code snippet:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts

root@ubuntu:/tftpboot/fs_mini# vim etc/fstab
# device   mount-point  type  options  dump  fsck  order
proc        /proc       proc  defaults   0    0
sysfs       /sys        sysfs defaults   0    0
tmpfs       /dev        tmpfs defaults   0    0

root@ubuntu:/tftpboot/fs_mini# vim etc/init.d/rcS
#mount -t proc none /proc
mount -a
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s

⑤NFS
a.从flash上启动根文件系统,在用命令挂接NFS
挂接NFS:1、服务器允许那个目录可被挂接;2、单板去挂接

 root@ubuntu:/tftpboot/fs_mini# vim /etc/exports

 /tftpboot/fs_mini *(rw,sync,no_root_squash)  //挂载的NFS目录
 root@ubuntu:/tftpboot/fs_mini# /etc/init.d/nfs-kernel-server restart  //重启NFS
 root@ubuntu:/tftpboot/fs_mini# mount -t nfs 192.168.249.144:/tftpboot/fs_mini /mnt //自己挂载自己的目录,作为测试
 单板挂载:
 mkdir /mnt
 mount -t nfs -o nolock 192.168.249.144:/tftpboot/fs_mini /mnt

b.直接NFS启动
NFS启动参数:挂载IP,目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值