自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

細(xì)說(shuō)嵌入式Linux文件系統(tǒng)的制作方法

運(yùn)維 系統(tǒng)運(yùn)維
對(duì)于一個(gè)Linux系統(tǒng)的管理員來(lái)說(shuō),熟練的掌握文件系統(tǒng)是在重要不過(guò)的了。但是對(duì)于新入門(mén)的人來(lái)說(shuō),抽象的含義理解起來(lái)還是有些困難。下文就向大家詳細(xì)的介紹如何掌握嵌入式Linux文件系統(tǒng)的制作方法。

說(shuō)到Linux文件系統(tǒng)對(duì)于剛剛接觸Linux的初學(xué)者來(lái)說(shuō)還是有些生疏,其實(shí)理解了他的定義并且掌握他的使用方法并不是什么難事。在下文中大家就會(huì)詳細(xì)的了解到什么是Linux文件系統(tǒng),并且可以學(xué)會(huì)嵌入式Linux文件系統(tǒng)的制作方法。

一、什么是文件系統(tǒng) (Filesystem)

文件系統(tǒng)是包括在一個(gè)磁盤(pán)(包括光盤(pán)、軟盤(pán)、閃盤(pán)及其它存儲(chǔ)設(shè)備)或分區(qū)的目錄結(jié)構(gòu);一個(gè)可應(yīng)用的磁盤(pán)設(shè)備可以包含一個(gè)或多個(gè)文件系統(tǒng);如果您想進(jìn)入一個(gè)文件系統(tǒng),首先您要做的是掛載(mount)文件系統(tǒng);為了掛載(mount)文件系統(tǒng),您必須指定一個(gè)掛載點(diǎn)。

二、主要嵌入式采用的文件系統(tǒng)

Linux 中,rootfs 是必不可少的。PC 上主要實(shí)現(xiàn)有 ramdisk 和直接掛載 HD(Harddisk,硬盤(pán)) 上的根文件系統(tǒng);嵌入式中一般不從 HD 啟動(dòng),而是從 Flash 啟動(dòng),最簡(jiǎn)單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍復(fù)雜的就是 直接從Flash 讀取的 Cramfs,更復(fù)雜的是在 Flash 上分區(qū),并構(gòu)建 JFFS2 等文件系統(tǒng)。

RAMDisk 將制作好的 rootfs 壓縮后寫(xiě)入 Flash,啟動(dòng)的時(shí)候由 Bootloader load 到RAM,解壓縮,然后掛載到 /。這種方法操作簡(jiǎn)單,但是在 RAM 中的文件系統(tǒng)不是壓縮的,因此需要占用許多嵌入式系統(tǒng)中稀有資源 RAM。

ramdisk 就是用內(nèi)存空間來(lái)模擬出硬盤(pán)分區(qū),ramdisk通常使用磁盤(pán)文件系統(tǒng)的壓縮存放在flash中,在系統(tǒng)初始化時(shí),解壓縮到SDRAM并掛載根文件系統(tǒng), 在linux系統(tǒng)中,ramdisk有二種,一種就是可以格式化并加載,在linux內(nèi)核2.0/2.2就已經(jīng)支持,其不足之處是大小固定;另一種是 2.4的內(nèi)核才支持,通過(guò),ramfs來(lái)實(shí)現(xiàn),他不能被格式化,但用起來(lái)方便,其大小隨所需要的空間增加或減少,是目前l(fā)inux常用的ramdisk技術(shù).

initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大簡(jiǎn)化了 Linux 的啟動(dòng)過(guò)程,附合 Linux 的基本哲學(xué):Keep it simple, stupid(KISS). 不過(guò)cpio-initrd 作為新的格式,還沒(méi)有經(jīng)過(guò)廣泛測(cè)試,嵌入式 Linux 中主要采用的還是 image-initrd。

Cramfs 是 Linus 寫(xiě)的很簡(jiǎn)單的文件系統(tǒng),有很好的壓縮綠,也可以直接從 Flash 上運(yùn)行,不須 load 到 RAM 中,因此節(jié)約了 RAM。但是 Cramfs 是只讀的,對(duì)于需要運(yùn)行時(shí)修改的目錄(如: /etc, /var, /tmp)多有不便,因此,一般將這些目錄做成ramfs 等可寫(xiě)的 fs。

SquashFS 是對(duì) Cramfs 的增強(qiáng)。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有優(yōu)勢(shì)。不過(guò),據(jù)開(kāi)發(fā)者介紹,在性能上可能不如 Cramfs。這也是一種新方法,在嵌入式系統(tǒng)采用之前,需要經(jīng)過(guò)更多的測(cè)試

三、建一個(gè)包含所有文件的目錄

1。建一個(gè)目錄rootfs 用來(lái)裝文件系統(tǒng)

2。mkdir bin dev etc lib proc sbin tmp usr var

3. ln -fs bin/busybox linuxrc(使用busybox)

4. 到系統(tǒng) /dev 把所有的device打一個(gè)包,拷貝到 dev下面(最省事的做法);或者使用mknod來(lái)自己建所需要的device,我自己用的如下:

 

  1. crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console  
  2. crw-rw-rw- 1 root root 5, 64 2006-02-24 13:12 cua0  
  3. crw-rw-rw- 1 root root 63, 0 2006-02-24 13:12 dk0  
  4. crw-rw-rw- 1 root root 63, 1 2006-02-24 13:12 dk1  
  5. drwxr-xr-x 2 root root 4096 2006-02-24 13:12 flash  
  6. brw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 hda  
  7. crw-rw-rw- 1 root root 36, 10 2006-02-24 13:12 ipsec  
  8. crw-rw-rw- 1 root root 241, 0 2006-02-24 13:12 ixNpe  
  9. crw-rw-rw- 1 root root 1, 2 2006-02-24 13:12 kmem  
  10. crw-rw-rw- 1 root root 126, 0 2006-02-24 13:12 ledman  
  11. lrwxrwxrwx 1 root root 16 2007-09-19 14:08 log -> /tmp/var/log/log  
  12. crw-rw-rw- 1 root root 1, 1 2006-02-24 13:12 mem  
  13. crw-rw-rw- 1 root root 90, 0 2006-02-24 13:12 mtd0  
  14. brw-rw-rw- 1 root root 31, 0 2006-02-24 13:12 mtdblock0  
  15. brw-rw-rw- 1 root root 31, 1 2006-02-24 13:12 mtdblock1  
  16. brw-rw-rw- 1 root root 31, 2 2006-02-24 13:12 mtdblock2  
  17. brw-rw-rw- 1 root root 31, 3 2006-02-24 13:12 mtdblock3  
  18. brw-rw-rw- 1 root root 31, 4 2006-02-24 13:12 mtdblock4  
  19. brw-rw-rw- 1 root root 31, 5 2006-02-24 13:12 mtdblock5  
  20. brw-rw-rw- 1 root root 31, 6 2006-02-24 13:12 mtdblock6  
  21. crw-rw-rw- 1 root root 90, 1 2006-02-24 13:12 mtdr0  
  22. crw-rw-rw- 1 root root 1, 3 2006-02-24 13:12 null  
  23. crw-rw-rw- 1 root root 108, 0 2006-02-24 13:12 ppp  
  24. crw-r--r-- 1 root root 5, 2 2006-03-29 15:56 ptmx  
  25. drwxr-xr-x 2 root root 4096 2006-03-29 15:56 pts  
  26. crw-rw-rw- 1 root root 2, 0 2006-02-24 13:12 ptyp0  
  27. brw-rw-rw- 1 root root 1, 0 2006-02-24 13:12 ram0  
  28. crw-rw-rw- 1 root root 1, 8 2006-02-24 13:12 random  
  29. crw-rw-rw- 1 root root 5, 0 2006-02-24 13:12 tty  
  30. crw-rw-rw- 1 root root 4, 0 2006-02-24 13:12 tty0  
  31. crw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 ttyp0  
  32. crw-rw-rw- 1 root root 4, 64 2006-02-24 13:12 ttyS0  
  33. crw-rw-rw- 1 root root 1, 9 2006-02-24 13:12 urandom  
  34. crw-rw-rw- 1 root root 1, 5 2006-02-24 13:12 zero 

 

舉例: mknod console c 5 1 這樣 crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console

5。將編譯好的busybox拷貝到/bin下面,除了busybox外,所有其他的命令都是他的link

ash chgrp clear dd echo fgrep gzip ip ls modprobe mv ping pwd sed stty tar true zcat busybox chmod cp df egrep grep hostname kill mkdir more netstat ping2file rm sh sync tftp umount cat chown date dmesg false gunzip ifconfig ln mknod mount pidof ps rmdir sleep sysinfo touch uname

所有的命令你可以在busybox下面用make menuconfig來(lái)增減

6。同樣/sbin下面也是busybox的link

halt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon#p#

7。同樣/usr/bin下面也是busybox的link

basename dirname env free id logger reset tail tr tty uptime which xargs

awk cut du expr head killall mkfifo sort test traceroute uniq wc whoami yes

上面幾乎是最全的link,各個(gè)看官可以酌情刪減,不過(guò)link也不占什么空間!

8。同樣/usr/sbin下面放著所有編譯完的可執(zhí)行文件,具體就不多說(shuō)了

9。非常重要之/lib,務(wù)必重視

找到你編譯環(huán)境的target目錄,把需要的lib文件先用strip壓縮(非target目錄下的,而已編譯環(huán)境提供的strip),先把最基本的libc, ld等等,必須同樣做跟target/lib里面一樣的link。

然后根據(jù)特定的應(yīng)用加相應(yīng)的lib,不要把不用的加進(jìn)去,lib比較占空間。

10。在/etc下面加上需要的配置文件,最最重要的是rcS

 

  1. #!/bin/sh  
  2. export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/scripts  
  3. UTC=yes 
  4. mount -n -t proc proc /proc  
  5. mount -n -t ramfs ramfs /tmp  
  6. mount -n -t devpts devpts /dev/pts  
  7. # build var directories  
  8. /bin/mkdir -m 0777 /tmp/var  
  9. /bin/mkdir -m 0777 /var/lock  
  10. /bin/mkdir -m 0777 /var/log  
  11. /bin/mkdir -m 0777 /var/run  
  12. /bin/mkdir -m 0777 /var/tmp  
  13. #/bin/mkdir -m 0777 /tmp/etc  
  14. #/bin/cp -a /usr/etc//etc  
  15. #/bin/cp -a /usr/dev//dev/  
  16. # loads the NPE ethernet modules into the kernel.  
  17. insmod /lib/modules/2.6.13.2/intel/ixp400.ko  
  18. # Firmware code for NPE Engine.  
  19. cat /etc/IxNpeMicrocode.dat > /dev/ixNpe  
  20. insmod /lib/modules/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500 
  21. insmod /lib/modules/led.ko  
  22. insmod /lib/modules/push_button.ko 

 

下面的具體應(yīng)用沒(méi)有再舉例加上了,這個(gè)是系統(tǒng)init必須的。

其他的情況類似如此了,下面里面給了一個(gè)lunksys的GPL項(xiàng)目的target。

四、生成一個(gè)ramdisk

 

  1. #!/bin/sh  
  2. MODULE_NAME=ramdisk 
  3. RAMPATH=`pwd`  
  4. TMPPATH=${RAMPATH}/tmp  
  5. SOURCE=${RAMPATH}/../target  
  6. if [ ! -d ${TMPPATH} ]  
  7. then  
  8. mkdir ${TMPPATH}  
  9. fi  
  10. if [ `whoami` != 'root' ]  
  11. then {  
  12. echo "You should run the shell as root, Please rerun as a root."  
  13. echo "Aborting."  
  14. exit 1  
  15. }  
  16. fi  
  17. # Clear in tmp path  
  18. rm -rf ${TMPPATH}/tmpmnt  
  19. rm -rf ${TMPPATH}/ramrootfs  
  20. mkdir ${TMPPATH}/tmpmnt  
  21. # Clear the old ramdisk  
  22. rm -f ${RAMPATH}/$MODULE_NAME  
  23. # Make a temp file which size is suitable  
  24. dd if=/dev/zero of=${TMPPATH}/ramrootfs bs=1k count=6144 
  25. # Create a ext2 filesystem  
  26. mke2fs -F -m 0 -i 2000 ${TMPPATH}/ramrootfs  
  27. # Mount it to tmpmnt/  
  28. mount -o loop -t ext2 ${TMPPATH}/ramrootfs ${TMPPATH}/tmpmnt  
  29. # Copy everything from kernel to this.  
  30. cd ${TMPPATH}/tmpmnt  
  31. echo ${SOURCE}  
  32. cp -av ${SOURCE}/.  
  33. cd ${TMPPATH}  
  34. # Unmount it the ext2 filesystem  
  35. umount ${TMPPATH}/tmpmnt  
  36. cat ${TMPPATH}/ramrootfs | gzip -9 > /${RAMPATH}/ramdisk  
  37. echo Copying ramdisk image to ${RAMPATH}  
  38. sync 

 

這里給出一個(gè)自動(dòng)生成腳本!

五、生成一個(gè)cramfs

找到cramfs的toolchain。/mkcramfs -r $(FS1_DIR) $(FS_NAME).1

六、生成一個(gè)mksquashfs

找到squashfs的toolchain。/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI

做文件系統(tǒng)最困難和最可能出問(wèn)題的地方是在/lib庫(kù)和/dev方面,請(qǐng)大家多注意這兩方面。 

【編輯推薦】

  1. 6月第3周系統(tǒng)升級(jí)錄:ZFS與Linux文件系統(tǒng)的變革
  2. inotify監(jiān)控Linux文件系統(tǒng)的必備利器
  3. 四大Linux文件系統(tǒng)在2.6.34內(nèi)核下的基準(zhǔn)測(cè)試
  4. Linux文件系統(tǒng)組織結(jié)構(gòu)簡(jiǎn)說(shuō)分析結(jié)構(gòu)
責(zé)任編輯:張浩 來(lái)源: 賽迪網(wǎng)
相關(guān)推薦

2010-01-21 09:15:05

Linux嵌入式文件系

2009-04-20 21:20:32

Linux文件系統(tǒng)存儲(chǔ)機(jī)制

2014-09-02 09:45:57

Linux

2009-08-27 10:28:04

2022-01-03 23:33:40

Linux組件系統(tǒng)

2020-07-03 07:00:00

Linux組件

2021-12-19 22:34:45

Linux容器系統(tǒng)

2009-06-26 16:05:04

嵌入式Linux

2012-07-30 14:13:11

Linux 2.6內(nèi)核嵌入式

2011-01-14 13:13:23

嵌入式Linux開(kāi)發(fā)

2011-01-06 15:11:09

嵌入式linux

2011-04-25 10:25:43

OpenEmbedde嵌入式Linux

2017-12-21 10:43:44

Linux嵌入式終端

2009-04-11 15:22:24

Linux 2.6內(nèi)核應(yīng)用

2020-06-15 07:00:00

Linux嵌入式系統(tǒng)

2009-12-24 17:21:38

嵌入式Linux

2022-01-04 22:19:38

Linux開(kāi)發(fā)嵌入式

2009-12-09 10:12:28

嵌入式Linux

2011-03-17 17:36:01

iptables嵌入式Linux

2009-12-17 10:33:05

嵌入式Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)