物联网之系统移植五(根文件系统制作)
根文件系统制作
什么是根文件系统?
• 根文件系统(root filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。
根文件系统主要目录结构:
目录 |
内容 |
/bin |
可执行程序 |
/dev |
块、字符设备节点文件 |
/etc |
主要配置文件和初始化执行文件 |
/lib |
基本的库文件, 茹:C 库,和内核模块(modules) |
/mnt |
挂载点,临时挂载文件系统用 |
/opt |
附加的软件包 |
/proc |
虚拟文件系统,用于内核和进程通讯 |
/sbin |
基本的系统管理程序 |
/tmp |
临时文件目录 |
/usr |
更多的用户程序,包括X server |
/sys |
虚拟文件系统 sysfs 挂载点 |
/var |
可变信息储存,如log等 |
程序文件的放置:
• 程序文件目录
– /bin: 普通用户和root用户都能执行的基本程序
• ping, mknod, mount, tar, grep, gzip, etc
– /sbin: root用户能执行的基本程序
• int, insmod, route, mkfs, rmmod, ifconfig
– /usr/bin: 更多非必须的用户程序
• autorun, bibtex, latex, biff, ftp, wc, whereis, whoami
– /usr/sbin: 更多非必须的root工具程序
• automount, httpd, in.telnetd, in.talkd, sendmail
定制应用程序:
• 配置基本的linux命令(嵌入式linux通过busybox制作)
– cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr, find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod等等
• 配置用户自己的应用
– 桌面管理器等等
库文件的放置 :
• /lib: 系统和运行基本命令时需要的动态库文件
• /usr/lib:所有的其他库
• /usr/lib/xxx: 一些工具包的私有库
– 如:/usr/lib/perl5
Linux 设备文件:
• Linux 系统中所有的对象(包括设备)都是以文件的形式体现的
• Linux系统中,所有的设备文件(如:设备节点),通常放到 /dev下
• 嵌入式系统中只需要创建必须的设备节点即可
字符设备举例:
• ls –l /dev/ “c” 指明该设备节点是字符设备
– crw-rw---- 1 root uucp 4, 64 Feb 23 2004 /dev/ttyS0
– crw--w---- 1 jdoe tty 136, 1 Feb 23 2004 /dev/pts/1
– crw-------- 1 root root 13, 32 Feb 23 2004 /dev/input/mouse0
– crw-rw-rw 1 root root 1, 3 Feb 23 2004 /dev/null
• 典型设备
– keyboards, mice, parallel port, IrDA, Bluetooth port, consoles, terminals, sound, video...
块设备举例:
“b” 指明该设备节点是块设备 (ls -l)
– brw-rw--- 1 root disk 3, 1 Feb 23 2004 hda1
– brw-rw--- 1 jdoe floppy 2, 0 Feb 23 2004 fd0
– brw-rw--- 1 root disk 7, 0 Feb 23 2004 loop0
– brw-rw--- 1 root disk 1, 1 Feb 23 2004 ram1
– brw------- 1 root root 8, 1 Feb 23 2004 sda1
• 典型块设备
– 磁盘, ramdisk,SD,U盘等等
设备的主设备号次设备号:
• Linux系统是通过主设备号和次设备号来区分设备的
• 主设备号: (major)
– 内核用来区分哪类设备
• 次设备号: (minor)
– 区分某类设备中的哪个设备
• 内核中的相关文档 Documentation/devices.txt
创建设备节点:
• 设备文件不能在加载驱动程序时自动创建,要通过指令创建
• 创建设备文件的一般语法:
– $ mknod /dev/<device> [c|b] <major> <minor>
• 例如:
– $ mknod /dev/ttySAC0 c 4 64
– $ mknod /dev/hda1 b 3 1
基本的设备节点:
名称 |
描述 |
Major |
Minor |
mem |
物理内存访问设备 |
1 |
1 |
null |
Null 设备 |
1 |
3 |
zero |
从该设备读取将得到零 |
1 |
5 |
random |
非确定随机数发生设备 |
1 |
8 |
tty0 |
当前的虚拟终端设备 |
4 |
0 |
tty1 |
第一个虚拟终端设备 |
4 |
1 |
ttySAC0 |
第一个串口设备 |
4 |
64 |
tty |
当前的 TTY 设备 |
5 |
0 |
console |
系统console设备 |
5 |
1 |
Linux系统的引导过程 :
BusyBox项目构建系统命令:
• BusyBox 项目是由Bruce Perens in 在1996创建的
– http://www.busybox.net/
– BusyBox 是在 GNU GPL 许可协议下发行的开源软件
• 享有“嵌入式Linux的瑞士军刀”美誉,Erik Andersen先生维护;
• Busybox是一个UNIX系统工具集,它将很多普通的UNIX工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令;
BusyBox常用于制作linux命令 主要指令包括
– cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr, find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod, etc
文件系统制作步骤:
• 制作根文件系统的内容
采用Busybox创建基本命令
创建基本的目录 /lib /etc /var /tmp /dev /sys /proc等
添加glibc基本动态库
创建基本的设备节点
添加启动配置和脚本程序 /etc/inittab /etc/fstab /etc/init.d/rcS
• 测试rootfs内容正确性
• 制作需要的rootfs类型的格式
制作根文件系统的内容:
$ tar xvf busybox-1.22.1.tar.bz2
$ cd busybox-1.22.1
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
(arm-none-linux-gnueabi-) Cross Compiler prefix 注意 一定要指定交叉编译工具
$ make
$ file busybox 确认编译生成的是 ARM 平台的(显示为ELF 32-bit LSB executable, ARM)
$ make install 安装(默认安装路径为_install)
$ cd _install
$ ls
bin linuxrc sbin usr
$ mkdir dev etc mnt proc var tmp sys root 创建需要的目录
$ cp ~/store/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/ . -a 注意是lib/
$ du -mh lib 查看lib库的大小
$ rm lib/*.a 裁剪,删除掉静态库文件
$ arm-none-linux-gnueabi-strip lib 裁剪掉调试信息 not recognized 有些库是不能strip的 忽略掉
$ sudo rm lib/libstdc++* 删除不需要的库,确保所有库大小不超过4M
$ du -mh lib 查看lib库的大小 可能 显示3.4M lib (这里确保小于 8M)
$ cp /nfs/rootfs/etc -rf . 拷入成熟的参考配置
$sudo mknod dev/console c 5 1 必须要有 console设备节点
将制作的跟文件系统复制到nfs下:
配置文件一:
• 文件 /etc/inittab
#this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS 指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh 指定初始的控制台(启动后进入# 状态)
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
• 文件 /etc/init.d/rcS(启动脚本)
#!/bin/sh
# This is the first script called by init process
/bin/mount -a mount all stuff from /etc/fstab
/etc/init.d/rc.local 扩展子脚本
echo /sbin/mdev > /proc/sys/kernel/hotplug 设置系统的hotplug程序为mdev
/sbin/mdev -s
./app.exe //让脚本自动运行你的程序
配置文件二:
• 文件 /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
• 文件 /etc/profile
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[[email protected]$HOSTNAME \W]\# " 终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
测试rootfs内容正确性:
$ cd /nfs
$ mkdir rootfs
$ cp _install/* rootfs –a
$ chmod 777 /nfs/rootfs/
NFS能挂载成功表示根文件系统 内容基本正确
制作需要的rootfs类型的格式:
Filesystem |
Write |
Persistent |
Compressed |
Media |
Lives in RAM |
nfs rootffs |
Yes |
No |
No |
RAM |
Yes |
EXT2 over RAM disk |
Yes |
No |
No |
RAM |
Yes |
CRAMFS |
No |
N/A |
Yes |
Nor/Nand |
No |
JFFS2 |
Yes |
Yes |
Yes |
Nor/Nand |
No |
YAFFS2 |
Yes |
Yes |
Yes |
Nand |
No |
EXT2/EXT3 |
Yes |
Yes |
No |
disk |
No |