1.文件系統(tǒng)的一般定義是
負(fù)責(zé)管理和存儲文件信息的軟件系統(tǒng)
2.文件系統(tǒng)的功能
1.負(fù)責(zé)存儲器中文件的組織和分配
2.提高對存儲器資源的利用效率
3.將文件的存取剂公、共享、和保護(hù)等功能提供給操作系統(tǒng)和用戶
4.簡化用戶對文件的各項(xiàng)操作
5.保證在多用戶環(huán)境下文件的安全性和一致性
文件系統(tǒng)是操作系統(tǒng)的重要組成部分眨攘,是實(shí)現(xiàn)文件多元化管理的必要條件。
3.虛擬文件系統(tǒng)
為了對各類文件系統(tǒng)進(jìn)行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)--VFS(Virtual File System)递惋, 為各類文件系統(tǒng)提供統(tǒng)一的操作界面和應(yīng)用編程接口。
VFS并不是一種實(shí)際的文件系統(tǒng)溢陪, 它是物理文件系統(tǒng)與服務(wù)之間的一個(gè)接口層
VFS只存在于內(nèi)存中萍虽, 不存在于任何外存空間
VFS在系統(tǒng)啟動時(shí)建立, 在系統(tǒng)關(guān)閉時(shí)消亡
4.Linux根文件系統(tǒng)標(biāo)準(zhǔn)目錄
5.使用busybox制作跟文件系統(tǒng)
0.準(zhǔn)備工具
0.0. busybox-1.29.3:或選用其他版本的 busybox,大同小異
0.1. 下載地址:http://www.busybox.net/
0.2. 交叉編譯器安裝:sudo apt-get install gcc-arm-linux-gnueabihf
1.構(gòu)建目錄結(jié)構(gòu)
1.0. 創(chuàng)建根文件系統(tǒng)目錄形真,主要包括以下目錄:
/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin
/sbin /opt /sys /media
1.1. 命令:
mkdir $HOME/rootfs
cd $HOME/rootfs
mkdir dev etc lib usr var proc tmp home root mnt bin sbin opt sys media
*rootfs目錄位置可根據(jù)自己實(shí)際需求放置杉编,只要保證路徑中國無中文字符與特殊字符即可*
2.使用busybox構(gòu)建 /bin /sbin linuxrc
2.1. 解壓busybox
tar -jxvf busybox-x.xx.x.tar.bz2
cd busybox-x.xx.x/
2.2. 使用busybox的默認(rèn)配置
make defconfig
*使用默認(rèn)配置 busybox,大部分的命令都會被選中*
make menuconfig
*如果此過程中出錯(cuò)多半是因?yàn)榧虞d庫文件失敗導(dǎo)致, 使用命令sudo apt-get install libncurses5-dev 安裝ncurses5即可*
進(jìn)入Settings ---> 找到 ---Build Options
選中Build static binary (no shared libs)
選中Cross compiler prefix咆霜,設(shè)置交叉編譯前綴為 arm-linux-gnueabihf-
向下滑動找到 ---Library Tuning
選中Username completion
選中Fancy shell prompts
選中Query cursor position from terminal
按左右鍵選中Exit退出到最后一層邓馒,選擇Save Configuration to an Alternate File保存
最后選擇Exit退出界面
2.3.make
2.4.make install
2.5.完成在 busybox 目錄下會看見 _install 目錄,里面有 bin sbin usr linuxrc 四個(gè)文件與目錄蛾坯,
將這三個(gè)目錄或文件拷到第 1 步所建的 rootfs 文件夾下光酣,
命令:cp bin sbin usr linuxrc $HOME/rootfs -rfav
*-a 的參數(shù)必不可少,因?yàn)?bin sbin 里面的命令大多是到 busybox 的動態(tài)鏈接,
如果不加-a 則拷貝過程中會自動將每個(gè)命令復(fù)制一份*
**************************************************************************
* 到這里就實(shí)現(xiàn)了跟文件系統(tǒng)的基本工作脉课,文件系統(tǒng)就可以正常使用了 *
**************************************************************************
3.構(gòu)建 /lib 目錄
進(jìn)入 /usr/arm-linux-gnueabihf/lib/ 目錄救军,將以下動態(tài)庫拷貝到$HOME/rootfs/lib 下
命令:cp *so* $HOME/rootfs/lib -av
4.構(gòu)建 /etc 目錄
4.1./etc 目錄下最重要的四個(gè)文件
inittab:用來作為 linuxrc 的配置腳本财异。
init.d/rcS:inittab 啟動的第一個(gè)腳本,一般用來掛載系統(tǒng)必需的文件系統(tǒng)唱遭,必要的設(shè)備連接戳寸,設(shè)置 IP 地址,啟動其他腳本等拷泽。默認(rèn)僅有 mount –a
fstab:執(zhí)行 mount –a 時(shí)疫鹊,按照此文件掛載文件系統(tǒng)。
profile:登陸完 shell 后自動執(zhí)行此腳本司致,一般用來配置用戶的登錄環(huán)境拆吆。
4.2.進(jìn)入根文件系統(tǒng) rootfs 的 etc 目錄,執(zhí)行如下操作:
拷貝 Busybox 目錄下 examples/bootfloopy/etc/ 下的所有文件到當(dāng)前目錄下蚌吸,以此為模板構(gòu)建我們的根文件系統(tǒng)锈拨。
命令:cd $HOME/rootfs/etc
cp -rv ../../busybox-1.29.3/examples/bootfloppy/etc/ * .
4.3.修改 inittab
inittab 的作用及格式請參考其他說明
刪除第三行代碼:tty2::askfirst:-/bin/sh
命令:vi inittab
將第三行刪除或者在本行最前面加一個(gè)#將其注釋
4.4.修改 init.d/rcS 文件
init 進(jìn)程通過 inittab 啟動的第一個(gè)進(jìn)程為此腳本,我們需要做以下修改:
命令:vi init.d/rcS 或 gedit init.d/rcS
將下列信息覆蓋到打開的文件中
#! /bin/sh
#1.根據(jù) fstab 配置文件掛載相應(yīng)的文件系統(tǒng)
/bin/mount -a
#2.配置 telnetd 服務(wù)器的時(shí)候需要以下文件夾及文件系統(tǒng)
/bin/mkdir -p /dev/pts
/bin/mkdir -p /dev/shm
/bin/mount -t devpts devpts /dev/pts
/bin/mount -t tmpfs tmpfs /dev/shm
#3.啟動需要以下文件夾
/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log
#4.在 lib 下創(chuàng)建相應(yīng)文件夾(與當(dāng)前內(nèi)核版本相同) 羹唠,為驅(qū)動模塊加載作準(zhǔn)備
if ! [ -d /lib/modules ]; then
mkdir /lib/modules
fi
if ! [ -d /lib/modules/$(uname -r) ]; then
mkdir /lib/modules/$(uname -r)
fi
#5.自動在/dev 下創(chuàng)建設(shè)備節(jié)點(diǎn)
/sbin/mdev -s
5.修改 fstab 文件奕枢,將一下內(nèi)容替換源文件fstab 中的內(nèi)容
#device mount-point type options dump fask order
proc /proc proc defaults 0 0
ramfs /var ramfs defaults 0 0
ramfs /tmp ramfs defaults 0 0
none /sys sysfs defaults 0 0
none /dev ramfs defaults 0 0
6.修改 profile,將一下內(nèi)容填寫到profile的第五行位置
#1.初始化 PATH 環(huán)境變量及動態(tài)鏈接庫路徑
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
#2.初始化主機(jī)名以及當(dāng)前工作路徑
/bin/hostname TechManZhang
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# '
6.用戶名佩微、密碼文件構(gòu)建(這步可以不做缝彬,一般開發(fā)板都不帶密碼)
拷貝虛擬機(jī)上的/etc/passwd, /etc/group, /etc/shadow 到 rootfs/etc 下。
命令:
cp /etc/passwd $HOME/rootfs/etc
cp /etc/group $HOME/rootfs/etc
cp /etc/shadow $HOME/ rootfs/etc
對以下三個(gè)文件修改哺眯,只保存與 root 相關(guān)的項(xiàng)(每個(gè)文件的第一行)只保留 passwd 第一行谷浅,為:
root:x:0:0:root:/root:/bin/sh
(而且最后改成/bin/ash,PC 使用 bash 作為默認(rèn) shell奶卓,嵌入式系統(tǒng)不支持 bash一疯,這里改為 sh 或 ash)只保留 group 第一行,為:
root:x:0:root
只保留 shadow 第一行夺姑,為:
root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::
(注意這個(gè)值不一定一樣墩邀,各人密碼不一樣,這個(gè)值也不一樣盏浙,這個(gè)的密碼是六個(gè)1:111111)這個(gè)文件在本地登錄或者 ftp眉睹、telnet 登錄時(shí)起作用打開/etc/inittab
把第二行:::respawn:-/bin/sh
改為::respawn:-/bin/login //登錄時(shí)需要用戶名、密碼驗(yàn)證
這樣废膘,以后登陸開發(fā)板時(shí)需輸入用戶名密碼竹海,同虛擬機(jī)相同
登陸后可以通過 passwd 命令修改密碼或通過 adduser 增加新用戶
至此,根文件系統(tǒng)制作完畢
6.根文件系統(tǒng)驗(yàn)證及鏡像制作
驗(yàn)證根文件系統(tǒng)主要有兩種方式:
1.通過 Nfs 啟動根文件系統(tǒng)驗(yàn)證
2.制作鏡像燒寫到開發(fā)板中驗(yàn)證
6.1.nfs 啟動根文件系統(tǒng)
網(wǎng)絡(luò)文件系統(tǒng)是 FreeBSD 支持的文件系統(tǒng)中的一種丐黄, 也被稱為 NFS斋配。 NFS允許一個(gè)系統(tǒng)在網(wǎng)絡(luò)上與他人共享目錄和文件。通過使用 NFS,用戶和程序可以像訪問本地文件一樣訪問遠(yuǎn)端系統(tǒng)上的文件许起。
在 u-boot 的配置界面按照以下格式十偶,可設(shè)置 nfs 啟動系統(tǒng)菩鲜。
模板:
setenv bootargs ‘noinitrd root=/dev/nfs nfsroot=(虛擬機(jī)路徑),rsize=1024,wsize=1024 ip=(開發(fā)板 iP):(服務(wù)器 ip):(網(wǎng)關(guān)):255.255.255.0::eth0:off init=/linuxrc console=ttySAC0园细,115200’
注:服務(wù)器 ip 一般是虛擬機(jī) ip
例子:
setenv bootargs ‘noinitrd root=/dev/nfs nfsroot=/home/zhang/MyShare/04_day/rootfs_test_2,rsize=1024,wsize=1024 ip=10.0.108.117:10.0.108.229:10.0.108.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 , 115200’
saveenv
如果想恢復(fù)本機(jī) emmc 啟動,請輸入:
setenv bootargs 'noinitrd root=/root=/dev/mmcblk0p2 rwrootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680'
saveenv
6.2.制作文件系統(tǒng)鏡像
用 make_ext4fs 制作 ext4 文件系統(tǒng)鏡像
tar xvf mkfs_ext4.tar.gz
cp make_ext4fs /bin/make_ext4fs
sudo chmod 777 $HOME/rootfs/ -R
制作 ext4 鏡像
make_ext4fs -s -l 314572800 -a root -L linux gtk.img /home/edu/rootfs