日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞頭條 >> 嵌入式ROOTFS transplantation
新聞資訊
NEWS INFORMATION

嵌入式ROOTFS transplantation

發(fā)布時間:2019-05-22

作一個嵌入式Linux rootfs,并且實(shí)現(xiàn) web 服務(wù)

1. 文件系統(tǒng)簡介

•理論上說一個嵌入式設(shè)備如果內(nèi)核能夠運(yùn)行起來,且不需要運(yùn)行用戶進(jìn)程的話,是不需要文件系統(tǒng)的,文件系統(tǒng)簡單的說就是一種目錄結(jié)構(gòu),由于 linux操作系統(tǒng)的設(shè)備在系統(tǒng)中是以文件的形式存在,將這些文件進(jìn)行分類管理以及提供和內(nèi)核交互的接口,就形成一定的目錄結(jié)構(gòu)也就是文件系統(tǒng),文件系統(tǒng)是為用戶反映系統(tǒng)的一種形式,為用戶提供一個檢測控制系統(tǒng)的接口。
•根文件系統(tǒng),我認(rèn)為根文件系統(tǒng)就是一種特殊的文件系統(tǒng),那么根文件系統(tǒng)和普通的文件系統(tǒng)有什么區(qū)別呢?由于根文件系統(tǒng)是內(nèi)核啟動時掛在的第一個文件系統(tǒng),那么根文件系統(tǒng)就要包括Linux啟動時所必須的目錄和關(guān)鍵性的文件,例如Linux啟動時都需要有init目錄下的相關(guān)文件,在 Linux掛載分區(qū)時Linux一定會找/etc/fstab這個掛載文件等,根文件系統(tǒng)中還包括了許多的應(yīng)用程序bin目錄等,任何包括這些Linux 系統(tǒng)啟動所必須的文件都可以成為根文件系統(tǒng)。
Linux支持多種文件系統(tǒng),包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,為了對各類文件系統(tǒng)進(jìn)行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)VFS(Virtual File System),為各類文件系統(tǒng)提供一個統(tǒng)一的操作界面和應(yīng)用編程接口。
Linux啟動時,第一個必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動。之后可以自動或手動掛載其他的文件系統(tǒng)。因此,一個系統(tǒng)中可以同時存在不同的文件系統(tǒng)。不同的文件系統(tǒng)類型有不同的特點(diǎn),因而根據(jù)存儲設(shè)備的硬件特性、系統(tǒng)需求等有不同的應(yīng)用場合。在嵌入式Linux應(yīng)用中,主要的存儲設(shè)備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設(shè)備的文件系統(tǒng)類型包括: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)用廣泛。但是它的只讀屬性同時又是它的一大缺陷,使得用戶無法對其內(nèi)容對進(jìn)擴(kuò)充。Cramfs映像通常是放在Flash中。
 
2.2 jffs2
Jffs2: 日志閃存文件系統(tǒng)版本2 (Journalling Flash FileSystem v2)

•主要用于NOR型閃存,基于MTD驅(qū)動層,特點(diǎn)是:可讀寫的、支持?jǐn)?shù)據(jù)壓縮的、基于哈希表的日志型文件系統(tǒng),并提供了崩潰/掉電安全保護(hù),提供“寫平衡”支持等。

•缺點(diǎn)主要是當(dāng)文件系統(tǒng)已滿或接近滿時,因?yàn)槔占年P(guān)系而使jffs2的運(yùn)行速度大大放慢。jffs不適合用于NAND閃存主要是因?yàn)?span lang="EN-US">NAND閃存的容量一般較大,這樣導(dǎo)致jffs為維護(hù)日志節(jié)點(diǎn)所占用的內(nèi)存空間迅速增大,另外,jffs 文件系統(tǒng)在掛載時需要掃描整個FLASH的內(nèi)容,以找出所有的日志節(jié)點(diǎn),建立文件結(jié)構(gòu),對于大容量的NAND閃存會耗費(fèi)大量時間。

 

2.3.yaffs:Yet Another Flash File System 

 

yaffs/yaffs2是專為嵌入式系統(tǒng)使用NAND型閃存而設(shè)計的一種日志型文件系統(tǒng)。與jffs2相比,它減少了一些功能(例如不支持?jǐn)?shù)據(jù)壓縮),所以速度更快,掛載時間很短,對內(nèi)存的占用較小。另外,它還是跨平臺的文件系統(tǒng),除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自帶NAND芯片的驅(qū)動,并且為嵌入式系統(tǒng)提供了直接訪問文件系統(tǒng)的API,用戶可以不使用Linux中的MTD與 VFS,直接對文件系統(tǒng)操作。當(dāng)然,yaffs也可與MTD驅(qū)動程序配合使用。
yaffs與yaffs2的主要區(qū)別在于,前者僅支持小頁(512 Bytes) NAND閃存,后者則可支持大頁(2KB) NAND閃存。同時,yaffs2在內(nèi)存空間占用、垃圾回收速度、讀/寫速度等方面均有大幅提升。
 
2.4. 網(wǎng)絡(luò)文件系統(tǒng)NFS (Network File System)
NFS是由Sun開發(fā)并發(fā)展起來的一項(xiàng)在不同機(jī)器、不同操作系統(tǒng)之間通過網(wǎng)絡(luò)共享文件的技術(shù)。
•在嵌入式Linux系統(tǒng)的開發(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/
3.根文件系統(tǒng)的組成
目錄  內(nèi)容
Bin  :基本的可執(zhí)行文件
Opt  :添加的軟件包
Boot :啟動時需要的一些文件
Proc :內(nèi)核及進(jìn)程信息的虛擬文件系統(tǒng)
Dev : 設(shè)備文件
 
Root:root用戶目錄
Etc: 系統(tǒng)配置文件
Sbin:系統(tǒng)管理的程序
Home : 用戶目錄
Tmp : 臨時文件
Lib : 庫文件
Usr : 應(yīng)用程序
Mnt : 掛載文件系統(tǒng)的掛載點(diǎn)
Var : 存放系統(tǒng)日志或一些服務(wù)程序的臨時文件
•根文件系統(tǒng)中的每一個頂級目錄都有特定的用途和目的 
•但并不是所有的目錄在嵌入式環(huán)境下都需要,
•我們只創(chuàng)建需要的一些目錄:
/bin /sbin /etc /proc /tmp /var /dev /mnt
Linux的根文件系統(tǒng)至少應(yīng)包括以下幾項(xiàng)內(nèi)容。
1.基本的文件系統(tǒng)結(jié)構(gòu),包含一些必需的目錄比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。
2.基本程序運(yùn)行所需的庫函數(shù),如Glibc/uClibc。
3.基本的系統(tǒng)配置文件,比如rc.sysinit,inittab等腳本文件。
4.必要的設(shè)備文件支持:/dev/hd*,/dev/tty*,/dev/fd0。
5.基本的應(yīng)用程序,如sh,ls,cp,mv等。
1.把全局配置文件放入/etc目錄下。
2.將設(shè)備文件信息放入/dev目錄下,設(shè)備名可以作為符號鏈接定位在/dev中或/dev子目錄中的其他設(shè)備存在。
3.操作系統(tǒng)核心定位在/或/boot,若操作系統(tǒng)核心不是作為文件系統(tǒng)的一個文件存在,不應(yīng)用它。
4.庫存放的目錄是/lib。
5.存放系統(tǒng)編譯后的可執(zhí)行文件、命令的目錄是/bin,/sbin,/usr。
 
4. 定制文件系統(tǒng) ,基于 ELDK,busybox
•安裝ELDK:
#mount –o loop arm-2008-11-24.iso /mnt
#/mnt/install –d /opt/eldk
#mkdir rootfs ;假定以下內(nèi)容都是在 rootfs 目錄下:
4.1自定義文件系統(tǒng)
•目錄bin
-------->用busybox編譯,下面說明
•目錄sbin
-------->用busybox編譯,下面說明
•目錄usr
-------->建立bin sbin兩個空目錄 
•目錄var
-------->建立log空目錄 
•目錄etc
------->可以把/opt /eldk/arm下或者s3c2410_recover
•的etc 拷貝過來修改,怎么修改下面說明,需要包括:
inittab
rc.local -> rc.d/rc.local
rc.sysinit -> rc.d/rc.sysinit
目錄dev
------->這里不能直接從/opt/eldk/下 拷貝
•       應(yīng)當(dāng)如下制作否則系統(tǒng)啟動是會說明找不到設(shè)備文件console之類
•      cd /  rootfs/dev
      /mnt/ELDK_MAKEDEV  //ELDK_MAKEDEV從 ELDK ISO 文件里copy出來
•這樣在目錄dev 節(jié)點(diǎn)文件就出現(xiàn)了
•目錄lib
------->如果是采用靜態(tài)編譯,這里就空著;
•如果采用動態(tài)編譯 ,
s3c2410_recover\lib
•或 /usr/local/arm/3.4.1/arm-linux/lib
•或/opt/eldk/arm/lib copy 過來,再裁減lib 庫
•目錄 proc
------->空著但必須有這目錄
4.2.etc/下文件內(nèi)容修改
4.2.1 etc/rc.d/rc.sysinit
•這里你還可以按自己的要求修改
4.2.2 etc/rc.d/rc.local
•以后要啟動的程序你可以加在這里
=============================================================
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
#touch /var/lock/subsys/local
=======================================
4.2.3 etc/inittab
init啟動后會首先執(zhí)行這個文件
===========================================================•#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#

【1】文件系統(tǒng)

 掛載文件系統(tǒng)
  mount  -t     vfat                               /dev/mmcblk1p1    /mnt
  掛載         指定需要掛載的文件系統(tǒng)的類型       設(shè)備節(jié)點(diǎn)(文件)  掛載點(diǎn)(文件系統(tǒng)掛載到rootfs的地方)
  

【2】內(nèi)核調(diào)試

 1)點(diǎn)燈是用 GPIO 作為輸出,觀察程序運(yùn)行階段和狀態(tài)的方法
 
 2)printk
   內(nèi)核解壓后
   信息輸出顯示是在 console 初始化之后


   printascii
   console初始化前


   printk打印級別:數(shù)字越低,級別越高
   
  1. #define KERN_EMERG "<0>" /* system is unusable */
  2.  #define LERT "<1>” /* action must be taken immediately */
  3.  #define KERN_CKERN_ARIT "<2>" /* critical conditions */
  4.  #define KERN_ERR "<3>" /* error conditions */
  5.  #define KERN_WARNING "<4>" /* warning conditions */
  6.  #define KERN_NOTICE "<5>" /* normal but significant condition */
  7.  #define KERN_INFO "<6>" /* informational */
  8.  #define KERN_DEBUG "<7>" /* debug-level messages




   ubuntu系統(tǒng):
   
   通過proc在運(yùn)行時查看和修改日志級別
   cat /proc/sys/kernel/printk
    4 4 1 7
    echo “7 4 1 7” >/proc/sys/kernel/printk
    cat /proc/sys/kernel/printk
    7 4 1 7
 3)OOPS
    pc寄存器保存內(nèi)核崩潰時,運(yùn)行的地址

                                                       定位                  系統(tǒng)崩潰時的地址
linux@ubuntu:~/work/day_2/linux-3.14-fs4412$ arm-none-linux-gnueabi-addr2line 0xc0278e1c       
-e vmlinux               -f
指定定位鏡像文件     指定出錯的文件以及行號
 
    dm9000_probe
    /home/linux/work/day_2/linux-3.14-fs4412/drivers/net/ethernet/davicom/dm9000.c:1414

4)調(diào)試信息
  調(diào)試信息一般顯示在兩個地方 :終端、log日志
 
  klogd進(jìn)程:執(zhí)行系統(tǒng)調(diào)用,去訪問內(nèi)核的打印消息
  syslog進(jìn)程:記錄非內(nèi)核打印的消息
 
 
  void openlog(const char *ident, int option, int facility);
  功能:打開日志
  參數(shù):ident  日志的標(biāo)志
        option     LOG_PID        Include PID with each message.  打印的消息附加上進(jìn)程ID

                       LOG_CONS       Write directly to system console if there is an error while sending to system logger.
                                                  把消息顯示到log日志
        facility   表示的是消息出自于什么類型的進(jìn)程
        LOG_DAEMON     system daemons without separate facility value
        void syslog(int priority, const char *format, ...);
        功能:將消息顯示到日志中
        參數(shù):priority  級別
                         LOG_WARNING    warning conditio
                         LOG_NOTICE     normal, but significant, condition

                         LOG_INFO       informational message

                         LOG_DEBUG      debug-level message


  void closelog(void);
  功能:關(guān)閉日志
 
  查看日志消息: var/log/syslog日志
 

【3】文件系統(tǒng)

 文件系統(tǒng):文件存儲的格式
 文件系統(tǒng)的類型:
 磁盤文件系統(tǒng):駐留在磁盤上的文件系統(tǒng)
 FAT16、FAT32、NTFS、EXT2、EXT3、EXT4 
 網(wǎng)絡(luò)文件系統(tǒng):可以遠(yuǎn)程訪問的文件系統(tǒng)
 nfs(network filesystem)
 內(nèi)存文件系統(tǒng):存在內(nèi)存上的文件系統(tǒng)
 tmpfs
 只讀文件系統(tǒng):
 cramfs
 
 根文件系統(tǒng)(root  filesystem)是存放運(yùn)行、維護(hù)系統(tǒng)所必須的各種工具軟件、庫文件、腳本、
            配置文件和其他特殊文件的地方,也可以安裝各種軟件包。


 根文件系統(tǒng)是內(nèi)核運(yùn)行之后,加載的第一個文件系統(tǒng),是其他文件系統(tǒng)的根,可用來掛載其他類型的文件系統(tǒng),也可視其為特殊的文件系統(tǒng)
 必須存在,不存在內(nèi)核無法運(yùn)行
  
 文件系統(tǒng)的目錄結(jié)構(gòu):
        /etc  存放內(nèi)核所需要的配置文件(啟動文件)
====================================================================
        /bin: 普通用戶和root用戶都能執(zhí)行的基本程序
               ping, mknod, mount, tar, grep, gzip, etc
        /sbin: root用戶能執(zhí)行的基本程序
               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, sendmail
        ====================================================================
        /proc  掛載proc文件系統(tǒng),記錄進(jìn)程的信息
/sys   掛載sysfs文件系統(tǒng),記錄內(nèi)核所需的特殊文件,設(shè)備,總線等信息
/mnt   臨時掛載點(diǎn),掛載其他文件系統(tǒng)使用
/tmp   臨時掛載點(diǎn),掛載其他文件系統(tǒng)使用
====================================================================
        /dev   設(shè)備節(jié)點(diǎn)(文件)


【4】根文件系統(tǒng)的制作

 1)make
    生成bin sbin usr/bin usr/sbin linuxrc

 2)mkdir  dev  etc  mnt  proc  var  tmp  sys  root 


 3)/etc
    inittab  fstab  init.d/rcS  profile 

inittab   
 |
 |
fstab
 |
 |
init.d ---- rcS
 |
 |
profile
 
    1)initab  內(nèi)核在加載rootfs的時候,解析該文件
  1.  ::sysinit:/etc/init.d/rcS 文件系統(tǒng)中運(yùn)行第一個腳本
  2.  :askfirst:-/bin/sh 指定腳本的類型
  3.  ::restart:/sbin/init 文件系統(tǒng)運(yùn)行的第一個進(jìn)程(sbin/init) init=/linuxrc 守護(hù)進(jìn)程
  4.  開啟當(dāng)前的shell環(huán)境,服務(wù)其他進(jìn)程,打開其他進(jìn)程
  5.  ::ctrlaltdel:/sbin/reboot reboot系統(tǒng)重啟


 
2)init.d/rcS
  1.  #!/bin/sh
  2.  # This is the first script called by init process
  3.  /bin/mount -a 執(zhí)行掛載,與之匹配的是fstab中設(shè)置好的掛載點(diǎn)
  4.  echo /sbin/mdev > /proc/sys/kernel/hotplug 生效熱插拔機(jī)制
  5.  /sbin/mdev -s




3)fstab  設(shè)置不同的文件系統(tǒng)的掛載點(diǎn)
      #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


    4)申明庫文件,以及進(jìn)程的路徑
     export HOSTNAME=farsight
     export USER=root


     PATH=/bin:/sbin:/usr/bin:/usr/sbin
     LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

沙坪坝区| 玛纳斯县| 墨脱县| 鄂温| 康保县| 芜湖市| 哈尔滨市| 许昌县| 扎鲁特旗| 九台市| 泾阳县| 平果县| 海安县| 安康市| 青浦区| 略阳县| 滁州市| 甘肃省| 双鸭山市| 万山特区| 肇东市| 湖南省| 封开县| 聂荣县| 香港| 凤山县| 盐山县| 抚远县| 广德县| 邵武市| 额济纳旗| 云霄县| 巴林左旗| 新安县| 武夷山市| 大冶市| 丰城市| 北辰区| 九龙县| 荔浦县| 青海省|