嵌入式Linux構建yaffs根文件系統
開發環境說明:
- ubuntu1404 i686
- 天嵌光盤裏的交叉編譯鏈(版本4.4.3)
- busybox-1.13.0(下載地址:https://busybox.net/downloads/)
(一)編譯busybox
解壓並進入:
tar xvf busybox-1.13.0.tar.bz2
cd busybox-1.13.0
加載默認配置:
make defconfig
打開圖形配置:
make menuconfig
使用靜態編譯並且指明交叉編譯器:
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) # 指明使用靜態編譯
(arm-linux-) Cross Compiler prefix # 指明交叉編譯器
Busybox Library Tuning --->
[*] Username completion # 控制檯顯示完整用戶名
[*] Fancy shell prompts # shell信息提示
Networking Utilities --->
[ ] ip tunnel # 關閉ip隧道,要不然編譯會出錯
編譯並安裝:
make && make install
編譯完成並安裝後在當前目錄下的_install
文件夾。
(二)構建yaffs2文件系統
創建yaffs2文件系統目錄:
mkdir yaffs2
cd yaffs2
創建文件系統所需的一級目錄:
mkdir dev etc home lib mnt opt proc root sys tmp var usr
創建必要的二級目錄:
mkdir usr/lib usr/share etc/rc.d var/lib var/lock var/run var/tmp
拷貝busybx相關文件:
cp -rf /opt/embeded/busybox-1.13.0/_install/* ./
拷貝庫文件:
cp /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* ./lib/ -a
拷貝主機etc目錄下的必要文件:
cp /etc/passwd /etc/group /etc/shadow ./etc
拷貝busybox的示例配置文件:
cp /opt/embeded/busybox-1.13.0/examples/bootfloppy/etc/* ./etc/ -rf
在etc目錄下創建用於支持熱拔插設備的節點配置文件mdev.conf
:
touch etc/mdev.conf
創建兩個設備節點文件。
①由於內核執行到mdev時還沒有構建dev目錄,如果沒有創建/dev/console就會打印警告Warning: unable to open an initial console;②內核啓動過程中會將一些垃圾信息丟棄,此時就需要/dev/null設備。
mknod dev/console c 5 1
mknod dev/null c 1 3
系統啓動過程中的必要配置文件修改:
系統啓動過程中bootloader會傳遞參數 init=/linuxrc給內核main函數,所以在文件系統掛載後第一個執行的程序是linuxrc,該文件是busybox的鏈接文件,也就說系統啓動掛載文件系統後執行的第一個程序是busybox,busybox首先解析文件/etc/inittab,這個文件指明瞭接下來要啓動哪些程序。
修改文件etc/initab:
該文件初始內容如下:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
文件內容說明:inittab文件中每一個條目用來定義一個子進程,並確定他的啓動方法。
第一條帶有sysinit字段,表示系統啓動後最先執行rcS文件並且只執行一次。
第二條帶有respawn字段,表示直接運行-/bin/sh,無需輸入用戶名和密碼
第三條帶有askfirst字段,表示init進程先輸出‘Please press Enter to actvie this console’,等待用戶輸入回車後在啓動-/bin/sh,tty2是/dev目錄下的串口設備文件,需要根據實際進行修改。
第四條表示按下快捷鍵ctrl+alt+delete時卸載所有設備
注意:第二條和第三條只能任選其一。
我們將該文件改爲:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
# ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
解析完畢inittcb文件後,接下來就是運行/etc/init.d/rcS這個腳本文件了,修改該文件如下:
#!/bin/sh
# shell命令的搜索路徑
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 運行等級是單用戶模式
runlevel=S
# 前一個等級爲N表示沒有前一個級別
prevlevel=N
# 權限位掩碼
umask 022
# 將以上設置導出到環境中
export PATH runlevel prevlevel
# 指明瞭在shell中的提示符:[root@tq2440/]#
/bin/hostname tq2440
# 將文件/etc/fstab中指明的文件系統掛載到對應掛載點上
mount -a
# 如果目錄pts不存在則創建
mkdir -p /dev/pts
# 從內存掛載一個虛擬的文件系統,作用是可以瞭解目前遠程虛擬終端(telnet,ssh等)的基本情況
mount -t devpts devpts /dev/pts
# 使用mdev處理內核的熱拔插事件
echo /sbin/mdev > /proc/sys/kernel/hotplug
# 建立dev目錄,掃描/sys/class和/sys/block下所有塊設備目錄,如果在掃描到設備文件含有dev且文件中包含的時設備號,利用這些信息在/dev目錄下創建設備節點文件
mdev -s
# 更新環境變量
source /etc/profile
修改/etc/mdev.conf文件內容如下:
sd[a-z]*[0-9] 0:0 0660 @(mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/udisk)
sd[a-z]*[0-9] 0:0 0660 *(umount /mnt/udisk)
mmcblk[0-9]*p[0-9] 0:0 0660 @(mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/sd)
mmcblk[0-9]*p[0-9] 0:0 0660 *(umount /mnt/sd)
修改/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
修改/etc/profle文件內容如下:
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile... "
# 這條命令的意思是設置core文件大小爲0,輸出信息以及錯誤信息都不輸出在顯示器上。
#ulimit -S -c 0 > /dev/null 2>&1
# 獲取用戶名
USER="`id -un`"
# 登陸顯示名
LOGNAME=$USER
# 在shell下的顯示格式[root@tq2440 /]#
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "
# 加載環境變量
PATH=$PATH
# 主機名
HOSTNAME=`/bin/hostname`
# 導出到環境變量
export USER LOGNAME PS1 PATH
echo "Done"
echo
在用戶登陸時系統會在/etc下尋找三個文件:passwd、shadow、group用來匹配相關信息。
修改/etc/passwd
,只保留root、daemon和bin這三行:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
修改/etc/shadow
,只保留root、daemon和bin這三行:
root:$6$EfJ5aZ0U$7GfeBkv0vfZj2pIQhoxc1HEpObTI2IA0jo57DJLIQkCNMkIsxbCKSXlr5Utnyp58uN70i.dN41J7kQb/fXsck/:17850:0:99999:7:::
daemon:*:16273:0:99999:7:::
bin:*:16273:0:99999:7:::
修改/etc/group
,只保留root、daemon和bin這三行:
root:x:0:
daemon:x:1:
bin:x:2:
到此根文件系統yaffs2製作完畢!
使用如下命令創建文件系統鏡像:
mkyaffs2image yaffs2 yaffs2.bin
然後下載到NAND存放文件系統所在的分區就可以了。