一.根文件系统基本概念
1. 尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具,linux中一切皆文件
2. 什么是根文件系统??
- 根文件系统(root filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。(类似于仓库)
3. 根文件系统主要目录结构:
目录 | 内容 |
/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)
/lib: 系统和运行基本命令时需要的动态库文件
/usr/lib:所有的其他库
/usr/lib/xxx: 一些工具包的私有库
二.linux设备文件
- Linux 系统中所有的对象(包括设备)都是以文件的形式体现的
- Linux系统中,所有的设备文件(如:设备节点),通常放到 /dev下
- 嵌入式系统中只需要创建必须的设备节点即可
1. 我们通过串口助手,设备正常启动,我们通过指令查看打印信息。
ls –l /dev/ “c” 指明该设备节点是字符设备(键盘,串口等属于字符设备)
crw-rw---- 1 root uucp 4, 64 Feb 23 2004 /dev/ttyS0
b” 指明该设备节点是块设备 (ls -l)(磁盘,sd卡,u盘属于块设备。)
brw-rw--- 1 root disk 3, 1 Feb 23 2004 hda1
2.主次设备号
- Linux系统是通过主设备号和次设备号来区分设备的
- 主设备号: (major)
内核用来区分哪类设备
- 次设备号: (minor)
区分某类设备中的哪个设备
- 内核中的相关文档 Documentation/devices.txt
3.创建设备节点
- 设备文件不能在加载驱动程序时自动创建,要通过指令创建
- 创建设备文件的一般语法:
- $ mknod /dev/<device> [c|b] <major> <minor>
- 例如:
- $ mknod /dev/ttySAC0 c 4 64
- $ mknod /dev/hda1 b 3 1
4.基本的设备节点
三.根文件系统的制作
1. 制作根文件系统的内容
1.源码下载
我们选择的版本是busybox-1.22.1.tar.bz2下载路径为:
2.将busybox-1.22.1.tar.bz2拷贝到ubuntu的目录下并解压
$ tar -xvf busybox-1.22.1.tar.bz2
3.进入源码目录
$ cd busybox-1.22.1
4.配置源码(添加编译工具链)
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)(NEW)
[ ] Force NOMMU build(NEW)
[ ] Build with Large File Support (for accessing files > 2 GB)
(arm-none-linux-gnueabi-) Cross Compiler prefix(NEW)
() Additional CFLAGS(NEW)
完成配置后保存退出
5.编译
$ make
6.安装
busybox默认安装路径为源码顶层目录下的_install
$ make _install
7.进入安装目录下
$ cd _install
$ ls
bin linuxrc sbin usr
8.创建其他需要的目录
$ mkdir dev etc mnt proc var tmp sys root
9.添加库
- 将工具链中的库拷贝到_install目录下
$ cp /home/linux/Desktop/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/ . -a
查看下库占用的大小 du -mh lib/
占用太多了,需要进一步裁剪
- 删除静态库
$ sudo rm lib/ * .a
- 删除共享库文件中的符号表(需要在root用户下)
$ sudo su
$ arm-none-linux-gnueabi-strip lib/*
$ exit
- 查看库的大小应不超过4M
$ du -mh lib/
10.添加系统启动文件
在etc下创建一个文件inittab,文件内容如下:(vim inittab)
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
在etc下添加文件fstab,文件内容如下:(vim 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
这里我们挂载的文件系统有三个proc、sysfs和tmpfs。在内核中proc和sysfs默认都支 持,而tmpfs是没有支持的,我们需要在内核中添加tmpfs的支持
修改linux内核配置:
$ make menuconfig
File systems --->
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新编译内核
$ make uImage
将新编译的内核拷贝到/tftp下
$ cp arch/arm/boot/uImage /tftpboot
在etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
为rcS添加可执行权限:
$ chmod +x init.d/rcS
在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
重要:新制作的根文件系统尺寸不能8M
2. 测试rootfs内容正确性
首先我们通过板卡boot,pri指令查看一下启动设置。
1、删除原先的/nfs/rootfs
$ sudo rm -rf /nfs/rootfs
2、将我们新建的根文件系统拷贝到/source/rootfs目录下
$sudo mkdir /nfs/rootfs
$ sudo cp _install/* /nfs/rootfs –a
3、设置uboot环境变量
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 – 42000000
#setenv bootargs root=/dev/nfs nfsroot=192.168.2.129: /nfs/rootfs rw clk_ignore_unused console=ttySAC2,115200 /init=/linuxrc ip=192.168.2.99
# saveenv
注意服务器NFS服务是可用的,不然会挂接不成功。
再开始测试过程中出现了无法挂载成功的情况,检查了nfs服务,检查了设置的nfs路径都没有问题,最后发现为clk_ignore_unused这句没加上导致的,这一句应该和三星4412内核的设置有关。
重新启动开发板,查看是否能够正常挂载,功能是否正常
3.制作需要的文件系统类型
nfs主要用于开发调试
RAM disk 内存虚拟成磁盘,内存比较大,flash比较小的场合。
CRAMFS 只读的,适用于安全性较高的场合。
JFFS2
YAFFS2 手机,大数据存储
EXT2 磁盘,硬盘
nfs有问题的情况下利用ram disk来先验证程序,
制作ramdisk文件系统了,具体如下:
1、制作一个大小为8M的镜像文件
$ cd ~
$ dd if=/dev/zero of=ramdisk bs=1k count=8192 (ramdisk为8M)
2、格式化这个镜像文件为ext2
$ mkfs.ext2 -F ramdisk
3、在mount下面创建initrd目录作为挂载点
$ sudo mkdir /mnt/initrd
4、将这个磁盘镜像文件挂载到/mnt/initrd下
注意这里的ramdisk不能存放在rootfs目录中
$ sudo mount -t ext2 ramdisk /mnt/initrd
5、将我们的文件系统复制到ramdisk中
将测试好的文件系统里的内容全部拷贝到 /mnt/initrd目录下面
$ sudo cp /source/rootfs/* /mnt/initrd –a
6、卸载initrd
$ sudo umount /mnt/initrd
7、压缩ramdisk为ramdisk.gz并拷贝到/tftpboot下
$ gzip --best -c ramdisk > ramdisk.gz
8、格式化为uboot识别的格式
$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
$ cp ramdisk.img /tftpboot
9、配置linux内核支持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
10、在U-BOOT命令行重新设置启动参数:
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;tftp 43000000 ramdisk.img\;bootm 41000000 43000000 42000000
# saveenv
重新启动开发板查看能否正常启动