最小根文件系统(未完)


本文是基于韦东山视频的学习笔记

汇总点这

根文件系统干了什么

都说bootloader的最终目的是启动内核,那么内核的最终目的又是什么呢?是启动应用程序(系统应用程序和用户应用程序)。

根文件系统就可以帮助内核启动应用程序,他有几个方法实现

  • 读取配置文件
  • 解析
  • 执行

搞个最小根文件系统

怎么搞,5步走。

  1. /dev/console
    /dev/null
  2. init -> busybox
  3. /etc/initab
  4. 配置文件指定的程序
  5. C库

1. /dev/console & /dev/null

首先创建个文件夹吧,就叫file_sys
然后直接创建这两个设备文件咯,搞定,下一步。

好吧,还远着呢。设备文件也并不是这样创建的,叶师傅。

先看看自己的本机这两个是什么东西

book@\:~/Documents/files/file_sys $ ls /dev/console dev/null -l
crw------- 1 root root 5, 1 4月  24 20:52 /dev/console
crw-r--r-- 1 root root 1, 3 5月   6 21:41 dev/null

这是个字符设备( c ),console主设备号是5、次是1,null主1次3

照样创建

mkdir dev
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3

2. init -> busybox

更改

因为是交叉编译,编译时不是直接gcc命令,所以需要更改编译命令

搜查关键词“CROSS”,得到提示如下,我们知道可以在Makefile直接改交叉编译命令。
#CROSS_COMPILE can be set on the command line
#make CROSS_COMPILE=ia64-linux-

CROSS_COMPILE	?=

改为

CROSS_COMPILE	?= arm-linux-

如何编译

在INSTALL 文件里有做介绍

The BusyBox build process is similar to the Linux kernel build:
make menuconfig # This creates a file called “.config”
make # This creates the “busybox” executable
make install # or make CONFIG_PREFIX=/path/from/root install

就三个命令

  1. make menuconfig – 编译前配置配置,配置后会生成.config,怎么配置具体可以参考韦老师的书,很具体很具体(感觉默认的配置就可以了,偷下懒不配置直接保存然后编译看看,狗头保命)
  2. make – 就是编译咯
  3. make install – 千万别直接执行这个,直接执行会把busybox装在了本机上,破坏本机的文件系统。我们要把这个install到某个文件夹,用make CONFIG_PREFIX=/path/from/root install命令

3. /etc/initab

首先创建文件etc/inittab,然后在inittab写上

mkdir etc/ && vim etc/inittab
console::askfirst:-/bin/sh	#这句话是

自动挂载虚拟文件系统proc

  • /etc/inittab里加上一句:
::sysinit:/etc/init.d/rcS #系统初始化时执行这个文件
  • /etc/init.d/rcS
#mount -t proc NONE /proc 手动挂载命令
mount-a # 这个命令自动挂载/etc/fstab里面写好的设备,而fstab又是有一定格式的,格式如下

mount-a 这个命令自动挂载/etc/fstab里面写好的设备,而fstab又是有一定格式的,格式如下

/etc/fstab:

devicemount-pointtypeoptionsdumpfsckorder
proc/procprocdefaults00

ok

mdev

目前/dev里面只有两个设备:consloe & null,这两个还是我们自己手动创建的
怎么让系统自动创建呢?用udev,但是udev复杂点,我们用简单点的mdev

找到busyboxmdev.txt,里面有教怎么搞

Mdev has two primary uses: initial population and dynamic updates. Both
require sysfs support in the kernel and have it mounted at /sys. For dynamic
updates, you also need to have hotplugging enabled in your kernel.
**
Here’s a typical code snippet from the init script:
[1] mount -t sysfs sysfs /sys #在/ect/fstab里面加入设备
[2] echo /bin/mdev > /proc/sys/kernel/hotplug #在/ect/init.d/rcS里面加入
[3] mdev -s #在/ect/init.d/rcS里面加入
**
Of course, a more “full” setup would entail executing this before the previous
code snippet:
[4] mount -t tmpfs mdev /dev #在/ect/fstab里面加入设备
[5] mkdir /dev/pts #在/ect/init.d/rcS里面加入
[6] mount -t devpts devpts /dev/pts #在/ect/fstab里面加入设备

inittab & rcS & fstab

inittab

console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS #系统初始化时执行这个文件

rcS:

#mount -t proc NONE /proc 手动挂载命令
mount -a # 这个命令自动挂载/etc/fstab里面写好的设备,而fstab又是有一定格式的,格式如下
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

fstab:

#device  mount-ponit type  options  dump fsck order
proc     /proc       proc  defaults 0    0
tmpfs    /dev        tmpfs defaults 0    0
sysfs    /sys        sysfs defaults 0    0

4. 配置文件指定的程序

先不搞,暂时没有用户程序

5. C库

找到自己交叉编译工具链的库目录,我的目录是

/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib

然后执行命令

cp /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/*.so* lib/ -d

这是复制动态库到根文件系统。
ps:cp -d:若源文件为连接文件属性,则复制连接文件属性而非文件本身。

镜像yaffs2

要烧到开发板上,就要把文件系统变成镜像文件,需要使用工具*mkyaffs2image*,这是韦老师给的工具,工具压缩包叫 *yaffs_source_util_larger_small_page_nand.tar.bz2* 需要修改才能烧写yaff2镜像,老师没深讲,那我也先用这,挖个坑,成功后查阅资料回来补。

首先加压后进入目录 *Development_util_ok/yaffs2/utils* ,然后make,编译出mkyaffs2image工具

nfs

# 需要安装NFS服务
sudo apt-get install nfs-kernel-server

# 配置文件 `/etc/exports`
sudo vim /etc/exports
/home/book/Documents/sysfile *(rw,nohide,insecure,no_subtree_check,async,no_    root_squash)

# 编辑完文件后执行
sudo /etc/init.d/nfs-kernel-server restart
sudo mount -t nfs 192.168.3.23:/home/rjm/work/filesystem /mnt

mount -t nfs -o nolock 192.168.3.23:/home/rjm/work/filesystem /mnt

# 原本的bootargs 为
# bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

# 需要改为
> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.3.24:/home/rjm/work/filesystem ip=192.168.3.17:192.168.3.24:192.168.3.1:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC0 

要启动nfs服务的对于bootargs的设置格式如下

noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值