1,根文件系统基本概念
1.1,什么是根文件系统?
1.2,根文件系统主要目录结构
1.3,程序文件的放置
程序文件目录
/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
1.4,定制应用程序
cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr, find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod等等
1.5,库文件的放置
/lib: 系统和运行基本命令时需要的动态库文件
/usr/lib:所有的其他库
/usr/lib/xxx: 一些工具包的私有库
如:/usr/lib/perl5
2,Linux 设备文件
/dev
下2.1,举例
2.1.1,字符设备举例
ls –l /dev/
“c” 指明该设备节点是字符设备
crw-rw---- 1 root uucp 4, 64 Feb 23 2004 /dev/ttyS0 //4表示主设备号,64表示次设备号
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...
2.1.2,块设备举例
“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盘等等
2.2,设备的主设备号次设备号
2.3,创建设备节点
$ mknod /dev/ [c|b]
$ mknod /dev/ttySAC0 c 4 64
$ mknod /dev/hda1 b 3 1
2.3.1,基本的设备节点
2.4,Linux系统的引导过程
3,制作根文件系统
3.1,文件系统制作步骤
/lib /etc /var /tmp /dev /sys /proc
等/etc/inittab /etc/fstab /etc/init.d/rcS
3.1.1,BusyBox项目构建系统命令
3.1.2,BusyBox工具安装
linux@linux:~$ cp /mnt/hgfs/Linuxsharexiaomei/busybox-1.22.1.tar.bz2 .
linux@linux:~$ tar -vxf busybox-1.22.1.tar.bz2
linux@linux:~$ cd busybox-1.22.1/
3.2,制作根文件系统的内容
$ 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设备节点
3.2.1,测试
看新的根文件系统能否正常挂载到开发板
linux@linux:~/busybox-1.22.1$ mv /nfs/rootfs /nfs/rootfs.ok 把原有的根文件系统备份一下
linux@linux:~/busybox-1.22.1$ sudo cp -rf _install /nfs/rootfs 把新的根文件系统拷贝过去(改名rootfs)
3.3,配置文件一
3.3.1,文件 /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
3.3.2,文件 /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 //让脚本自动运行你的程序
3.4,配置文件二
3.4.1,文件 /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
3.4.2,文件 /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
3.5,测试rootfs内容正确性
$ cd /nfs
$ mkdir rootfs
$ cp _install/* rootfs –a
$ chmod 777 /nfs/rootfs/
NFS能挂载成功表示根文件系统 内容基本正确
3.6,制作需要的rootfs类型的格式
3.6.1,不同根文件系统详解
3.6.1.1,nfs rootfs
是网络文件文件系统,通过网线远程挂载一个文件系统,文件系统在远程的电脑上。最大的好处是同步,主要用于开发调试
3.6.1.2,CRAMFS
只读,不能写。安全性高,某些区域的数据不能改,就可以定义为CRAMFS。
3.6.1.3,JFFS2和YAFFS2
可读,可写,针对都是flash。JFFS2在小型应用系统用的比较多。JFFS2有一个特点:是一个日志文件系统,用的过程中可以随时掉电。YAFFS2只能针对Nand flash,手机中用的最多的是Nand flash,文件系统就是YAFFS2
3.6.1.4,EXT2 over RAM disk
把一块内存虚拟成为一个磁盘。内存只能按地址空间像一个buffer一样访问,当应用产品内存比较大而flash比较小时,就可以按这种格式把一块内存虚拟成为一个磁盘
3.6.2,制做EXT2 over RAM disk文件系统
3.6.2.1,制作一个大小为8M的镜像
linux@linux:~$ dd if=/dev/zero of=ramdisk bs=1k count=8192
if
:(input file)输入文件/dev/zero
:是一个虚拟的设备,从这个设备中读到的数据全是0of
:(output file)输出文件bs=1k count=8192
: 单元大小是1k,数量是8k,就是8M大小3.6.2.2,格式化这个镜像为EXT2
linux@linux:~$ mkfs.ext2 -F ramdisk
3.6.2.3,在mount下面创建initrd目录作为挂载点
linux@linux:~$ sudo mkdir /mnt/initrd
3.6.2.4,将这个磁盘镜像文件挂载到/mnt/initrd下
注意这里的ramdisk不能存放在rootfs目录中
linux@linux:~$ sudo mount -t ext2 ramdisk /mnt/initrd
3.6.2.5,将我们的文件系统复制到ramdisk中
将测试好的文件系统里的内容全部拷贝到/mnt/initrd
目录下面
linux@linux:~$ sudo cp /nfs/rootfs/* /mnt/initrd/ -a
3.6.2.6,卸载initrd
linux@linux:~$ sudo umount /mnt/initrd
3.6.2.7,压缩ramdisk为ramdisk.gz并拷贝到/tftpboot下
linux@linux:~$ gzip --best -c ramdisk > ramdisk.gz
3.6.2.8,格式化为uboot识别的格式,并拷贝到/tftpboot下
linux@linux:~$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
linux@linux:~$ cp ramdisk.img /tftpboot/
3.6.2.9,配置内核支持RAMDISK
制作完ramdisk.img后,需配置内核支持RAMDISK作为启动文件系统
make menuconfig
File systems --->
<*> Second extended fs support
Device Drivers --->
SCSI device support --->
<*> SCSI disk support
[*] Block devices --->
<*> RAM block device support
(16) Default number of RAM disks
(8192) Default RAM disk size (kbytes) (修改为8M)
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
重新编译内核,复制到/tftpboot
3.6.2.10,在U-BOOT命令行重新设置启动参数
3.6.2.11,开发板上电重启,看是否成功