電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 31|回復(fù): 0
收起左側(cè)

移植Linux:如何制作rootfs?詳細(xì)教程

[復(fù)制鏈接]

258

主題

258

帖子

1754

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1754
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-28 11:38:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊左上方藍(lán)色“一口Linux”,選擇“設(shè)為星標(biāo)
第一時(shí)間看干貨文章
?【干貨】嵌入式驅(qū)動(dòng)工程師學(xué)習(xí)路線(xiàn)?【干貨】Linux嵌入式知識(shí)點(diǎn)-思維導(dǎo)圖-免費(fèi)獲取?【就業(yè)】一個(gè)可以寫(xiě)到簡(jiǎn)歷的基于Linux物聯(lián)網(wǎng)綜合項(xiàng)目?【就業(yè)】找工作簡(jiǎn)歷模版


一、分析1. 文件系統(tǒng)簡(jiǎn)介理論上說(shuō)一個(gè)嵌入式設(shè)備如果內(nèi)核能夠運(yùn)行起來(lái),且不需要運(yùn)行用戶(hù)進(jìn)程的話(huà),是不需要文件系統(tǒng)的,文件系統(tǒng)簡(jiǎn)單的說(shuō)就是一種目錄結(jié)構(gòu),由于 linux操作系統(tǒng)的設(shè)備在系統(tǒng)中是以文件的形式存在,將這些文件進(jìn)行分類(lèi)管理以及提供和內(nèi)核交互的接口,就形成一定的目錄結(jié)構(gòu)也就是文件系統(tǒng),文件系統(tǒng)是為用戶(hù)反映系統(tǒng)的一種形式,為用戶(hù)提供一個(gè)檢測(cè)控制系統(tǒng)的接口。
根文件系統(tǒng),我認(rèn)為根文件系統(tǒng)就是一種特殊的文件系統(tǒng),那么根文件系統(tǒng)和普通的文件系統(tǒng)有什么區(qū)別呢?
由于根文件系統(tǒng)是內(nèi)核啟動(dòng)時(shí)掛在的第一個(gè)文件系統(tǒng),那么根文件系統(tǒng)就要包括Linux啟動(dòng)時(shí)所必須的目錄和關(guān)鍵性的文件;
例如Linux啟動(dòng)時(shí)都需要有init目錄下的相關(guān)文件,在 Linux掛載分區(qū)時(shí)Linux一定會(huì)找/etc/fstab這個(gè)掛載文件等,根文件系統(tǒng)中還包括了許多的應(yīng)用程序bin目錄等,任何包括這些Linux 系統(tǒng)啟動(dòng)所必須的文件都可以成為根文件系統(tǒng)。
Linux支持多種文件系統(tǒng),包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,為了對(duì)各類(lèi)文件系統(tǒng)進(jìn)行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)VFS(Virtual File System),為各類(lèi)文件系統(tǒng)提供一個(gè)統(tǒng)一的操作界面和應(yīng)用編程接口。
Linux啟動(dòng)時(shí),第一個(gè)必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會(huì)出錯(cuò)而退出啟動(dòng)。之后可以自動(dòng)或手動(dòng)掛載其他的文件系統(tǒng)。因此,一個(gè)系統(tǒng)中可以同時(shí)存在不同的文件系統(tǒng)。
不同的文件系統(tǒng)類(lèi)型有不同的特點(diǎn),因而根據(jù)存儲(chǔ)設(shè)備的硬件特性、系統(tǒng)需求等有不同的應(yīng)用場(chǎng)合。在嵌入式Linux應(yīng)用中,主要的存儲(chǔ)設(shè)備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲(chǔ)器),常用的基于存儲(chǔ)設(shè)備的文件系統(tǒng)類(lèi)型包括:jffs2, yaffs, cramfs, romfs,ramdisk, ramfs/tmpfs等。
2.    基于FLASH的文件系統(tǒng)2.1 Cramfs:Compressed ROM File System?它的速度快,效率高,其只讀的特點(diǎn)有利于保護(hù)文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性。由于以上特性,Cramfs在嵌入式系統(tǒng)中應(yīng)用廣泛。
但是它的只讀屬性同時(shí)又是它的一大缺陷,使得用戶(hù)無(wú)法對(duì)其內(nèi)容對(duì)進(jìn)行擴(kuò)充。Cramfs映像通常是放在Flash中。
2.2 jffs2?Jffs2: 日志閃存文件系統(tǒng)版本2 (Journalling Flash FileSystem v2)
?主要用于NOR型閃存,基于MTD驅(qū)動(dòng)層,特點(diǎn)是:可讀寫(xiě)的、支持?jǐn)?shù)據(jù)壓縮的、基于哈希表的日志型文件系統(tǒng),并提供了崩潰/掉電安全保護(hù),提供“寫(xiě)平衡”支持等。
?缺點(diǎn)主要是當(dāng)文件系統(tǒng)已滿(mǎn)或接近滿(mǎn)時(shí),因?yàn)槔占年P(guān)系而使jffs2的運(yùn)行速度大大放慢。jffs不適合用于NAND閃存主要是因?yàn)镹AND閃存的容量一般較大,這樣導(dǎo)致jffs為維護(hù)日志節(jié)點(diǎn)所占用的內(nèi)存空間迅速增大,另外,jffs 文件系統(tǒng)在掛載時(shí)需要掃描整個(gè)FLASH的內(nèi)容,以找出所有的日志節(jié)點(diǎn),建立文件結(jié)構(gòu),對(duì)于大容量的NAND閃存會(huì)耗費(fèi)大量時(shí)間。
2.3.yaffs:Yet Another Flash File System?yaffs/yaffs2是專(zhuān)為嵌入式系統(tǒng)使用NAND型閃存而設(shè)計(jì)的一種日志型文件系統(tǒng)。與jffs2相比,它減少了一些功能(例如不支持?jǐn)?shù)據(jù)壓縮),所以速度更快,掛載時(shí)間很短,對(duì)內(nèi)存的占用較小。另外,它還是跨平臺(tái)的文件系統(tǒng),除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自帶NAND芯片的驅(qū)動(dòng),并且為嵌入式系統(tǒng)提供了直接訪(fǎng)問(wèn)文件系統(tǒng)的API,用戶(hù)可以不使用Linux中的MTD與 VFS,直接對(duì)文件系統(tǒng)操作。當(dāng)然,yaffs也可與MTD驅(qū)動(dòng)程序配合使用。
?yaffs與yaffs2的主要區(qū)別在于,前者僅支持小頁(yè)(512 Bytes) NAND閃存,后者則可支持大頁(yè)(2KB) NAND閃存。同時(shí),yaffs2在內(nèi)存空間占用、垃圾回收速度、讀/寫(xiě)速度等方面均有大幅提升。
2.4. 網(wǎng)絡(luò)文件系統(tǒng)NFS (Network File System)NFS是由Sun開(kāi)發(fā)并發(fā)展起來(lái)的一項(xiàng)在不同機(jī)器、不同操作系統(tǒng)之間通過(guò)網(wǎng)絡(luò)共享文件的技術(shù)。
在嵌入式Linux系統(tǒng)的開(kāi)發(fā)調(diào)試階段,可以利用該技術(shù)在主機(jī)上建立基于NFS的根文件系統(tǒng),掛載到嵌入式設(shè)備,可以很方便地修改根文件系統(tǒng)的內(nèi)容。
所采用的工具:mkfs.cramfs,mkfs.jffs2,mkfs.yaffs
http://sourceforge.net/projects/cramfs/
http://sourceforge.net/projects/jffs2os/
http://sourceforge.net/projects/yaffs/
二、根文件系統(tǒng)的組成1. 根文件系統(tǒng)目錄內(nèi)容簡(jiǎn)介bin  :基本的可執(zhí)行文件opt  :添加的軟件包boot :啟動(dòng)時(shí)需要的一些文件proc :內(nèi)核及進(jìn)程信息的虛擬文件系統(tǒng)dev : 設(shè)備文件root:root用戶(hù)目錄etc: 系統(tǒng)配置文件sbin:系統(tǒng)管理的程序home : 用戶(hù)目錄tmp : 臨時(shí)文件lib : 庫(kù)文件usr : 應(yīng)用程序mnt : 掛載文件系統(tǒng)的掛載點(diǎn)var : 存放系統(tǒng)日志或一些服務(wù)程序的臨時(shí)文件2. 嵌入式環(huán)境需要移植的目錄根文件系統(tǒng)中的每一個(gè)頂級(jí)目錄都有特定的用途和目的 ,但并不是所有的目錄在嵌入式環(huán)境下都需要,我們只創(chuàng)建需要的一些目錄:
/bin /sbin  /etc /proc  /tmp  /var /dev  /mnt
Linux根文件系統(tǒng)至少應(yīng)包括以下幾項(xiàng)內(nèi)容。
基本的文件系統(tǒng)結(jié)構(gòu),包含一些必需的目錄比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。基本程序運(yùn)行所需的庫(kù)函數(shù),如glibc;镜南到y(tǒng)配置文件,比如rc.sysinit,inittab等腳本文件。必要的設(shè)備文件支持:/dev/hd*,/dev/tty*,/dev/fd0;镜膽(yīng)用程序,如sh,ls,cp,mv等。[/ol]3. 移植需要做的工作把全局配置文件放入/etc目錄下。將設(shè)備文件信息放入/dev目錄下,設(shè)備名可以作為符號(hào)鏈接定位在/dev中或/dev子目錄中的其他設(shè)備存在。操作系統(tǒng)核心定位在/或/boot,若操作系統(tǒng)核心不是作為文件系統(tǒng)的一個(gè)文件存在,不應(yīng)用它。庫(kù)存放的目錄是/lib。存放系統(tǒng)編譯后的可執(zhí)行文件、命令的目錄是/bin,/sbin,/usr。[/ol]三、 默認(rèn)預(yù)置條件1) 交叉編譯工具需要預(yù)先安裝好交叉編譯器 ,一口君安裝版本是:arm-none-linux-gnueabi-gcc 默認(rèn)在ubuntu中安裝目錄是:
/home/peng/toolchain/gcc-4.6.4/
2) tftp服務(wù)器開(kāi)發(fā)板下載內(nèi)核鏡像和設(shè)備樹(shù)需要借助tftp服務(wù)器,配置信息如下:
peng@ubuntu:~$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
服務(wù)器根目錄是**/tftpboot**
3) nfs服務(wù)器內(nèi)核啟動(dòng)后掛載文件系統(tǒng)需要通過(guò)nfs服務(wù)器,nfs服務(wù)器設(shè)置如下:
peng@ubuntu:~$ cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#  to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/source/rootfs *(rw,sync,no_subtree_check)
四、文件系統(tǒng)制作步驟1、 源碼下載我們選擇的版本是busybox-1.22.1.tar.bz2下載路徑為:
http://busybox.net/downloads/
2、 解壓源碼$ tar  xvf  busybox-1.22.1.tar.bz2
3、 進(jìn)入源碼目錄$ cd  busybox-1.22.1
4、 配置源碼選擇制作靜態(tài)庫(kù),并設(shè)置交互編譯工具鏈的前綴arm-none-linux-gnueabi-如果是其他工具鏈,按照例子填寫(xiě)即可。
$ make menuconfig
Busybox Settings --->
  Build Options --->
   
  • Build BusyBox as a static binary (no shared libs)
       [ ] Force NOMMU build
       [ ] Build with Large File Support (for accessing files > 2 GB)
       (arm-none-linux-gnueabi-) Cross Compiler prefix
       () Additional CFLAGS
    5、 編譯$ make
    6、 安裝busybox默認(rèn)安裝路徑為源碼目錄下的_install
    $ make  install
    7、 進(jìn)入安裝目錄下默認(rèn)創(chuàng)建以下4個(gè)文件或者文件夾
    $ cd  _install
    $ ls
    bin  linuxrc  sbin  usr
    8、 創(chuàng)建其他需要的目錄$ mkdir  dev  etc  mnt  proc  var  tmp  sys  root
    9、 添加庫(kù)我們安裝的交叉工具鏈中有我們所需要的可以在開(kāi)發(fā)板上使用的庫(kù), 將其拷貝到_install目錄下即可:
    $ cp  /home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/  .  -a
    修改文件權(quán)限并刪除靜態(tài)庫(kù)和共享庫(kù)文件中的符號(hào)表
    $chmod  +w  lib
    $chmod  +w  lib/*
    $ rm  lib/*.a
    $ arm-none-linux-gnueabi-strip  lib/*
    刪除不需要的庫(kù),確保所有庫(kù)大小不超過(guò)8M
    $ du  -mh   lib/
    10、 添加系統(tǒng)啟動(dòng)文件在etc下添加文件inittab,文件內(nèi)容如下:
    #this is run first except when booting in single-user mode.
    ::sysinit:/etc/init.d/rcS
    # /bin/sh invocations on selected ttys
    # start an "askfirst" shell on the console (whatever that may be)
    ::askfirst:-/bin/sh
    # stuff to do when restarting the init process
    ::restart:/sbin/init
    # stuff to do before rebooting
    ::ctrlaltdel:/sbin/reboot
    在etc下添加文件fstab,文件內(nèi)容如下:
    #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
    【注意】這里我們掛載的文件系統(tǒng)有三個(gè)proc、sysfs和tmpfs。在內(nèi)核中proc和sysfs默認(rèn)都支持,而tmpfs是沒(méi)有支持的,我們需要確保內(nèi)核有tmpfs的支持。
    修改內(nèi)核配置:
    $ make menuconfig
    File systems --->
      Pseudo filesystems --->
       
  • Virtual memory file system support (former shm fs)
       
  • Tmpfs POSIX Access Control Lists
    重新編譯內(nèi)核
    在etc下創(chuàng)建init.d目錄,并在init.d下創(chuàng)建rcS文件,rcS文件內(nèi)容為:
    #!/bin/sh
    # This is the first script called by init process
    /bin/mount  -a  掛載fstab制定的所有文件系統(tǒng)
    echo  /sbin/mdev  >  /proc/sys/kernel/hotplug
    /sbin/mdev  -s
    為rcS添加可執(zhí)行權(quán)限:
    $ chmod   +x  init.d/rcS
    在etc下添加profile文件,文件內(nèi)容為:
    #!/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
    mknod dev/console c  5  1    該文件節(jié)點(diǎn)是必須的
    重要:新制作的文件系統(tǒng)尺寸若超出8M,刪除不需要的庫(kù)文件,比如c++庫(kù)等。
    11. 測(cè)試制作完畢的根文件系統(tǒng)可以讓開(kāi)發(fā)板啟動(dòng)后通過(guò)nfs掛載到ubuntu中,
    刪除原先的/source/rootfs[/ol]$ sudo  rm  -rf  /source/rootfs
    將我們新建的根文件系統(tǒng)拷貝到/source/rootfs目錄下[/ol]$sudo  mkdir  /source/rootfs
    $ sudo  cp  _install/*   /source/rootfs   –a
    設(shè)置uboot環(huán)境變量[/ol]# setenv serverip 192.168.9.120
    # setenv ipaddr 192.168.9.233
    # setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000  –  42000000
    #setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200  init=/linuxrc  ip=192.168.9.233
    # saveenv
    重新啟動(dòng)開(kāi)發(fā)板,查看是否能夠正常掛載,功能是否正常
  • 發(fā)表回復(fù)

    本版積分規(guī)則

    關(guān)閉

    站長(zhǎng)推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表