什么是根文件系统?
根文件系统(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设备节点
配置文件一
文件 /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="[$USER@$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能挂载成功表示根文件系统 内容基本正确