目录
本文是基于韦东山视频的学习笔记
根文件系统干了什么
都说bootloader的最终目的是启动内核,那么内核的最终目的又是什么呢?是启动应用程序(系统应用程序和用户应用程序)。
根文件系统就可以帮助内核启动应用程序,他有几个方法实现
- 读取配置文件
- 解析
- 执行
搞个最小根文件系统
怎么搞,5步走。
- /dev/console
/dev/null - init -> busybox
- /etc/initab
- 配置文件指定的程序
- 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
就三个命令
make menuconfig
– 编译前配置配置,配置后会生成.config,怎么配置具体可以参考韦老师的书,很具体很具体(感觉默认的配置就可以了,偷下懒不配置直接保存然后编译看看,狗头保命)make
– 就是编译咯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:
device | mount-point | type | options | dump | fsck | order |
---|---|---|---|---|---|---|
proc | /proc | proc | defaults | 0 | 0 |
ok
mdev
目前/dev里面只有两个设备:consloe & null
,这两个还是我们自己手动创建的
怎么让系统自动创建呢?用udev,但是udev复杂点,我们用简单点的mdev
找到busybox
的mdev.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>