1、概述
文件系統就是管理外存上數據的邏輯結構,是存儲、組織計算機文件和數據的一種方法,更嚴格地說,是一套實現了數據的存儲、分級組織、訪問和獲取等操作的抽象數據類型(Abstract data type),通過它來訪問、查找文件和數據很容易。外存數據在硬盤就是具體位置,用代碼表述的話就是起始地址,但是看著不直觀,操作也不方便,有文件系統弄出文件及目錄的概念來翻譯轉換這些數據區域操作更方便。打個比方:一本書中就好比文件系統,目錄及內容就是被文件系統管理的正文,有了目錄,讀寫查找書的內容才方便。
hello.txt ---文件系統 翻譯--->扇區0 扇區1 ....(扇區或是塊都描述大小的單位是xxx字節,32位系統一般是4K)
Linux管理分區的是目錄掛的形式,就是通過目錄來讀寫分區。根文件系統就是內核啟動好後掛載的第一個文件系統,掛在位置是'/',就是根目錄。
2、制作過程
制作文件系統得分為兩個方面來講:內容和格式。
(1)、文件系統內容
A、系統命令及軟件
/bin/*、/sbin/*、/usr/bin/*、/usr/sbin/*、/linuxrc
上述命令怎麼來呢?一般使用開源的busybox編譯出來,步驟如下:
(a)、下載源碼
BusyBox各版本下載:http://www.linuxidc.com/Linux/2011-08/40704.htm
(b)、修改頂層目錄下的Makefile
解壓後,如果默認編譯出來的是x86系統下的命令,如果要編譯arm平台下的命令,就得交叉編譯。修改Makefile指定交叉編譯工具鏈和體系平台,或是通過Make menuconfig中的選項來指定。
修改Makefile的示例:
CROSS_COMPILE ?= arm-linux-
...
ARCH ?= arm
make menuconfig示例:
$ make menuconfig
Busybox Settings --->
(arm-linux-) Cross Compiler prefix
上述方法選一即可。
(c)、選配命令
$ make menuconfig
Busybox Settings --->
[ ] Build BusyBox as a static binary (no shared libs) --->busybox使用共享庫
Installation Options --->
(./_install) BusyBox installation prefix --->busybox編譯出來的命令安裝路徑
其他大多是關於命令的選項,可以根據需求來選擇
(d)、編譯安裝
$ make
$ make install
完成後就會在源碼目錄下出現一個新目錄_install,裡面就是命令。
B、共享庫
共享庫來自於交叉編譯工具鏈,一般在交叉編譯工具鏈目錄的arm-xxx目錄下找,把需要的共享庫*.so.*拷貝到_install目錄下的lib目錄下。
C、腳本及配置文件
在_install目錄下創建一個etc目錄,用於編寫存放腳本和配置文件。
內核初始化好後會加載系統的第一個進程init守護進程,該進程需要讀/etc/inittab文件
inittab示例內容如下:
#是注釋
#指定初始化腳本
::sysinit:/etc/init.d/rcS
#指定終端
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
根據inittab的配置就需要etc/init.d/rcS
etc/init.d/rcS示例如下:
#掛載/etc/fstab指定的設備
mount -a
#支持熱插拔設備
#根文件系統會自動生成設備文件
/bin/mount -t tmpfs mdev /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
根據etc/init.d/rcS初始化腳本的內容,就需要etc/fstab
etc/fstab示例內容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
var /dev tmpfs defaults 0 0
系統配置文件profile,一般用來指定環境變量,終端提示符等
profile示例內容如下:
USER="root"
LOGNAME=$USER
PS1='[root@\h\W]\# '
PATH=/sbin:/bin:$PATH
准備空目錄
/dev --->設備文件所在目錄,etc/init.d/rcS中的mdev自動生成
/sys --->設備信息所在目錄,運行時驅動自動導出
/proc --->設備信息所在目錄,運行時內核自動導出
/tmp --->臨時文件所在目錄
/var --->日志文件所在目錄
這樣文件系統的基本內容就出來。