根文件系統製作
什麼是根文件系統?
• 根文件系統(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="[$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能掛載成功表示根文件系統 內容基本正確
製作需要的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 |