嵌入式Linux根文件系統制作_第1頁
嵌入式Linux根文件系統制作_第2頁
嵌入式Linux根文件系統制作_第3頁
嵌入式Linux根文件系統制作_第4頁
嵌入式Linux根文件系統制作_第5頁
已閱讀5頁,還剩44頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1嵌入式Linux根文件系統制作AllrightsreservedBUAAAllrightsreserved;Theinformationcontainedinthisdocumentissubjecttochangewithoutnotice;內容提綱根文件系統主要目錄結構基本的根文件系統上存放的內容制作一個基本的根文件系統的方法根文件系統鏡像的使用34根文件系統(Rootfilesystem)是存放運行、維護系統所必須的各種工具軟件、庫文件、腳本、配置文件和其他特殊文件的地方,也可以安裝各種軟件包。什么是根文件系統根文件系統主要目錄結構5目錄內容/bin可執行程序/dev塊、字符設備節點文件/etc主要配置文件和初始化執行文件/lib

基本的庫文件,如:C庫,和內核模塊(modules)/mnt掛載點,臨時掛載文件系統用/opt附加的軟件包/proc虛擬文件系統,用于內核和進程通訊/sbin基本的系統管理程序/tmp臨時文件目錄/usr更多的用戶程序,包括Xserver/sys虛擬文件系統sysfs掛載點/var可變信息儲存,如log等文件系統層次結構標準文件系統層次結構標準【FilesystemHierarchyStandard(FHS)】Linux和UNIX的文件系統是一個以“/“為根的階層式的樹狀文件結構,/因此被稱為根目錄。在早期的UNIX系統中,各個廠家各自定義了自己的UNIX系統的文件系統構成,比較混亂。為了避免在Linux也產生同樣的問題,在Linux面世不久,就開始了對Linux文件系統進行標準化的活動,于1994年推出了名為FSSTND(FilesystemStandard)的Linux文件系統層次結構標準。FHS標準使得眾多的Linux發布包有了可以遵循的標準,使得軟件和用戶可以預測已經安裝了的文件和目錄的位置。它定義了如下的內容。

定義了文件系統中每個區域的用途

定義了所需要的最小構成的文件和目錄提高軟件的可移植性/fhs/6程序文件的放置

程序文件目錄/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,sendmail7定制應用程序配置基本的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等等配置用戶自己的應用桌面管理器等等8庫文件的放置

/lib:boot系統和運行基本命令時需要的動態庫文件/usr/lib:所有的其他庫/usr/lib/xxx:一些工具包的私有庫如:/usr/lib/perl59定制庫文件配置基本的glibc庫(動態庫)僅保留使用到的庫可以用ldd查看應用程序用到的動態庫$arm-linux-lddrootfs/bin/busybox$arm-linux-readelf-arootfs/bin/busybox|grep“SharedLibrary”復制相應的庫到自己的根文件系統$cp-a*.sorootfs/lib/Strip復制到根文件系統下的動態庫:$arm-linux-strip./lib/*.so10安裝內核模塊(驅動)通過makeInstall_modules安裝模塊到rootfs相應目錄修改內核源碼Makefile并安裝模塊$exportINSTALL_MOD_PATH=<your_rootfs>/$makemodules$makemodules_install內核源碼中的模塊將被安裝到your_rootfs上<your_rootfs>/lib/modules/<kernel_vesion>/可以將內核中的模塊安裝到知道目錄,然后在將其復制到your_rootfs上$cp–a/tmp/lib/modules/<kernel_vesion>./lib/modules/11Linux設備文件Linux系統中所有的對象(包括設備)都是以文件的形式體現的Linux系統中,所有的設備文件(如:設備節點),通常放到/dev下嵌入式系統中只需要創建必須的設備節點即可12字符設備舉例Ls–l/dev/“c”指明該設備節點是字符設備crw-rw----1rootuucp4,64Feb232004/dev/ttyS0crw--w----1jdoetty136,1Feb232004/dev/pts/1crw--------1rootroot13,32Feb232004/dev/input/mouse0crw-rw-rw1rootroot1,3Feb232004/dev/null典型設備keyboards,mice,parallelport,IrDA,Bluetoothport,consoles,terminals,sound,video...13塊設備舉例

“b”指明該設備節點是塊設備(ls-l)brw-rw---1rootdisk3,1Feb232004hda1brw-rw---1jdoefloppy2,0Feb232004fd0brw-rw---1rootdisk7,0Feb232004loop0brw-rw---1rootdisk1,1Feb232004ram1brw-------1rootroot8,1Feb232004sda1典型塊設備磁盤,ramdisk,SD,U盤等等14設備的主版本號次版本號Linux系統是通過主設備號和次設備號來區分設備的主設備號:(major)內核用來區分哪類設備次設備號:(minor)區分某類設備中的哪個設備內核中的相關文檔Documentation/devices.txt15創建設備節點設備文件不能在加載驅動程序時自動創建,要通過指令創建創建設備文件的一邊語法:$mknod/dev/<device>[c|b]<major><minor>例如:$mknod/dev/ttyS0c464$mknod/dev/hda1b3116基本的設備節點17名稱描述MajorMinormem物理內存訪問設備11nullNull設備13zero從該設備讀取將得到零15random非確定隨機數發生設備18tty0當前的虛擬終端設備40tty1第一個虛擬終端設備41ttyS0第一個串口設備464tty當前的TTY設備50console系統console設備51使用不同的文件目錄層次結構?FHS規定了制定根文件系統的規則通常大多少應用程序和發布依賴這些規則,但這些規則不是內核強制的在嵌入式Linux系統中,你可以構建一個完全不同的根目錄層次結構相應的AP配置需要適當調整一個極端的做法是構建嵌入式Linux系統時root文件系統,但不推薦這么做1819Linux系統的引導過程BootloaderinitKernel.bootshellmingettyinittabloginrc/etc/init.d/rcSinit程序通過命令行知道init=/linuxrc/sbin/init是默認的第一個用戶空間程序啟動系統服務程序,自動運行的程序等(sshd,Xserver...)嵌入式linux系統使用busybox的init程序20/linuxrc用來初始化系統的一個簡單的啟動腳步程序通過內核命令行產生init指定init=/linuxrc通常用在initrds上或一個簡單的系統中通常是nashorbusyboxsh腳步這個腳步可以執行多種任務:加載驅動設置網絡掛載文件系統切換到一個新的根文件系統...21創建根文件系統采用Busybox創建基本命令創建基本的目錄/lib/etc/var/tmp/dev/sys/proc等添加Glibc基本動態庫創建基本的設備節點創建啟動腳步(/linuxrc)添加啟動配置和腳步程序/etc/inittab/etc/fstab/etc/init.d/rcS測試根文件系統制作根文件系統鏡像22BusyBox項目構建系統命令BusyBox項目是由BrucePerensin在1996創建的/BusyBox是在GNUGPL許可協議下發行的開源軟件享有“嵌入式Linux的瑞士軍刀”美譽,ErikAndersen先生維護;Busybox是一個UNIX系統工具集,它將很多普通的UNIX工具集成到一個很小的可執行文件中,為普通用戶提供大多數常用的命令;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,etc23安裝BusyBoxBusyBox可以編譯成一個靜態可執行程序,也可以使用glibc或者uClibc編譯成一個使用動態庫的可執行程序編譯Busybox步驟下載代碼,解壓代碼配置Busybox$cd$PRJROOT/busybox-1.00-pre10/$makemenuconfig

主要配置有哪些命令等交叉編譯和安裝2425和配置Linux內核選項一樣,在Busybox源碼根目錄中輸入makemenuconfig命令:配置Busybox26GeneralConfiguration通用選項BuildOptions 和編譯相關的選項=> BuildBusyBoxasastaticbinary(nosharedlibs) //靜態編譯BuildwithLargeFileSupport(foraccessingfiles>2GB) //大文件支持DoyouwanttobuildBusyBoxwithaCrossCompiler? //交叉編譯

AnyextraCFLAGSoptionsforthecompiler?" //CFLAGS選項

Compileallsourcesatonce DebuggingOptions 和調試相關的選項InstallationOptions Busybox的安裝信息

=> Don'tuse/usr //不使用usr目錄

Appletslinks //程序鏈接方式

BusyBoxinstallationprefix

//安裝路徑

部分選項的含義27myhost:/embedded/Busybox#makemyhost:/embedded/Busybox#makeinstallmyhost:/embedded/Busybox#filebusyboxbusybox:ELF32-bitLSBexecutable,ARM,version1(ARM),forGNU/Linux2.4.3,staticallylinked,forGNU/Linux2.4.3,strippedmyhost:/embedded/Busybox#cd_install(默認安裝路徑)編譯并安裝Busybox文件系統的制作方法-1:根文件系統在主機上的目錄為/home/work/myroofs。在此目錄下使用mkdir命令建立dev,etc,home,lib,mnt,proc,root,sys,tmp目錄。創建etc目錄下的文件在/home/work/myrootfs/etc目錄下存放各種配置文件。這些文件都是可選的,它們依賴于系統中所擁有的應用程序,依賴于這些程序是否需要配置文件。創建etc/inittab文件

init進程根據/etc/inittab文件來創建其他子進程,比如調用腳本文件配置ip地址、掛接其他文件系統,最后啟動shell等。文件系統的制作方法-2:創建etc/init.d/rcS文件

rcS文件是一個腳本文件,借助啟動腳本可以設置各種程序開機后自動運行,也可進行其他系統設置,這有點類似于Windows系統中的Autobat自動批處理文件。創建的文件內容如下(實際內容可能與此不完全一致):注意最后還要改變它的屬性使它能夠執行,執行chmod+xetc/init.d/rcS命令。創建etc/fstab文件

fstab文件描述系統中各種文件系統的信息,應用程序讀取這個文件,然后根據其內容進行自動掛載的工作。文件中各字段的意義如下:1)device:要掛接的設備,/dev/mtdblockl;2)mount-point:掛接點;3)type:文件系統類型;4)opt-ions:掛接參數,以逗號隔開;5)dump和fsckorder:用來決定控制dump、fsck程序的行為。文件系統的制作方法-3:用戶和組文件的創建

在etc目錄下增加passwd和group兩個文件。首先增加passwd文件,passwd一共由7個字段組成,6個冒號將其隔開。其含義分別為:1)用戶名;2)是否有加密口令,x表示有,不填表示無,采用MD5、DES加密;3)用戶ID;4)組ID;5)注釋字段;6)登錄目錄;7)所使用的shell程序。構建dev目錄

從Linux-2.6.18開始,負責舊版本的設備管理系統devfs已被廢除,但新版本的udev是一個基于用戶空間的設備管理系統。在內核啟動時并不能自動創建設備節點,固需手動創建console和null兩個啟動過程必須的設備節點。將采用busybox中內置的mdev,一個簡化的udev版本。

#mknoddev/consoleC51

#mknoddev/nullC13如果不創建這兩個設備文件,在文件系統啟動時會出現錯誤信息,不能初始化控制臺。安裝glibc庫

在開發板上需要加載器和動態庫,執行如下幾個命令:

$mkdir-p/home/work/rootby/lib

$cd/home/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib

$cp*.SO*/home/work/rootby/lib-dBusyBox的init程序(1)BusyBoxinit實現了init的大部分程序Runlevel是不支持的BusyBoxinit執行的幾個階段:1.設置init信號句柄2.初始化console(s)3.解析inittab文件,/etc/inittab如果/etc/inittab不存在,BusyBox使用缺省值:詳細內容參考BusyBox相關文檔31BusyBox的init程序(2)4.運行系統初始化腳步(BusyBoxuse/etc/init.d/rcS作為缺省)在這里你可以做的工作:重新以rw

模式掛載根文件系統掛載附加的文件系統初始化并啟動網絡接口啟動系統守護進程5.運行inittab中所有action為wait

的命令6.運行inittab

中所有action為once的命令7.循環運行:1)運行inittab中所有action為respawned

的命令2)運行inittab中所有action為askfirst的命令32BusyBoxinit支持的inittab文件格式BusyBoxinit程序解析/etc/inittab文件.如果/etc/inittab不存在,則用缺省值BusyBoxinit支持的inittab格式id:runlevels:action:processidID意義對BusyBoxinit和SystemVinit是不同的此處ID指明程序的控制tty如果程序不需要交互,則ID為空runlevelsBusyBoxinit不支持runlevel,將被忽略process將執行的命令和命令的命令行參數action動作類型,見下表.33BusyBoxinittab文件Actions定義34Action類型描述sysinitprovideinitwiththepathtotheinitializationscriptrespawn程序終止后重新執行askfirst同respawn,程序執行前會詢問,要求按ENTER鍵waitinit等待執行的程序結束后再繼續執行once只運行程序一次,并且不等待程序運行完就繼續執行ctrlaltdel當按下Ctrl-Alt-Delete組合鍵時執行的程序shutdown系統關機時執行的程序restart系統重新啟動時執行的程序,通常是init程序BusyBoxinittab文件樣例/etc/inittab#thisisrunfirstexceptwhenbootinginsingle-usermode.::sysinit:/etc/init.d/rcS#/bin/shinvocationsonselectedttys#Startan"askfirst"shellontheconsole(whateverthatmaybe)::askfirst:-/bin/sh#Stufftodowhenrestartingtheinitprocess::restart:/sbin/init#Stufftodobeforerebooting::ctrlaltdel:/sbin/reboot35/etc/init.d/rcS文件樣例/etc/init.d/rcS文件內容#!/bin/sh#Thisisthefirstscriptcalledbyinitprocess/bin/mount-aexec/usr/etc/rc.local36/etc/fstab樣例none/procprocdefaults00tmpfs/dev/shmtmpfsdefaults0037創建設備節點樣例/usr/etc/rc.local#!/bin/sh#adduserspecifiedscriptcd/devln-s/dev/fb/0fb0ln-svc/0tty0ln-svc/1tty1ln-svc/2tty2mknod–m660mtd0c900mknod–m660mtd1c902mknod–m660mtd2c904mknod–m660mtd3c906mknod–m660mtdblock0b310mknod–m660mtdblock1b311mknod–m660mtdblock2b312mknod–m660mtdblock3b31338部署基本動態庫文件#arm-linux-readelf-a“yourbinary”|grep“Shared”比如:~$arm-softfloat-linux-gnu-readelf-abusybox|grep"Shared"0x00000001(NEEDED)Sharedlibrary:[libm.so.6]0x00000001(NEEDED)Sharedlibrary:[libc.so.6]加載器:ld.linux.so.2#cdrootfs/lib刪除所又無用的目錄和靜態庫(所有的目錄和.a文件)?然后剝除庫文件中的調試段等信息,從而減小庫的體積。運行:#arm-softfloat-linux-gnu-strip*.so通過NFS測試做好的根文件系統如果你的系統支持網絡,可以通過nfs測試做好的根文件系統備份原NFSroot掛載目標NFSroot到新做號的根文件系統目錄40文件系統特性41FilesystemWritePersistentPowerdownreliabilityCompressionLivesinRAMCRAMFSNoN/AN/AYesNoJFFS2YesYesYesYesNoJFFSYesYesYesNoNoExt2overNFTLYesYesNoNoNoExt3overNFTLYesYesYesNoNoExt2overRAMdiskYesNoNoNoYes所謂制作文件系統映像文件,就是將一個目錄下的所有內容按照一定的格式存放到一個文件中,這個文件可以直接燒寫到存儲設備上去。在yaffs源碼中有個utils目錄,里面有mkyaffsimage和mkyaffs2image的源代碼,前者可制作yaffs映像文件,后者制作yaffs2映像文件,將下載的yaffs2解壓出來在目錄/Development下有兩個文件夾:yaffs和yaffs2,進入yaffs2/utils目錄,此目錄下有3個文件。利用makyaffs2image工具,執行#mkyaffsimage2myrootfs/yaffs2.img命令可生成文件系統映像文件。執行#gzip-9yaffs2.img最終生成嵌入式Linux根文件系統的映像文件為yaffs2-.img.gz。至此,整個根文件系統就制作完成,最后可以通過上面制作的pyaffs2.img.gz啟動整個系統。制作文件系統鏡像文件系統選擇原則RAMdisk系統閃存比較小,但RAM相對充足CRAMFSifyoursystemhasslightlymoreflash,orifyouwouldrathersaveasmuchRAMaspossiblefortheactualapplicationrunningonyourtargetJFFS2ifyouneedtobeabletochangeanyportionofyourfilesystematanytime.supportonNORorN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論