成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

移植Linux:如何制作Rootfs?詳細教程

系統 Linux
Linux支持多種文件系統,包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,為了對各類文件系統進行統一管理,Linux引入了虛擬文件系統VFS(Virtual File System),為各類文件系統提供一個統一的操作界面和應用編程接口。

一、分析

1. 文件系統簡介

理論上說一個嵌入式設備如果內核能夠運行起來,且不需要運行用戶進程的話,是不需要文件系統的,文件系統簡單的說就是一種目錄結構,由于 linux操作系統的設備在系統中是以文件的形式存在,將這些文件進行分類管理以及提供和內核交互的接口,就形成一定的目錄結構也就是文件系統,文件系統是為用戶反映系統的一種形式,為用戶提供一個檢測控制系統的接口。

根文件系統,我認為根文件系統就是一種特殊的文件系統,那么根文件系統和普通的文件系統有什么區別呢?

由于根文件系統是內核啟動時掛在的第一個文件系統,那么根文件系統就要包括Linux啟動時所必須的目錄和關鍵性的文件;

例如Linux啟動時都需要有init目錄下的相關文件,在 Linux掛載分區時Linux一定會找/etc/fstab這個掛載文件等,根文件系統中還包括了許多的應用程序bin目錄等,任何包括這些Linux 系統啟動所必須的文件都可以成為根文件系統。

Linux支持多種文件系統,包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,為了對各類文件系統進行統一管理,Linux引入了虛擬文件系統VFS(Virtual File System),為各類文件系統提供一個統一的操作界面和應用編程接口。

Linux啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。之后可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。

不同的文件系統類型有不同的特點,因而根據存儲設備的硬件特性、系統需求等有不同的應用場合。在嵌入式Linux應用中,主要的存儲設備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設備的文件系統類型包括:jffs2, yaffs, cramfs, romfs,ramdisk, ramfs/tmpfs等。

2.    基于FLASH的文件系統

2.1 Cramfs:Compressed ROM File System

?它的速度快,效率高,其只讀的特點有利于保護文件系統免受破壞,提高了系統的可靠性。由于以上特性,Cramfs在嵌入式系統中應用廣泛。

但是它的只讀屬性同時又是它的一大缺陷,使得用戶無法對其內容對進行擴充。Cramfs映像通常是放在Flash中。

2.2 jffs2

?Jffs2: 日志閃存文件系統版本2 (Journalling Flash FileSystem v2)

?主要用于NOR型閃存,基于MTD驅動層,特點是:可讀寫的、支持數據壓縮的、基于哈希表的日志型文件系統,并提供了崩潰/掉電安全保護,提供“寫平衡”支持等。

?缺點主要是當文件系統已滿或接近滿時,因為垃圾收集的關系而使jffs2的運行速度大大放慢。jffs不適合用于NAND閃存主要是因為NAND閃存的容量一般較大,這樣導致jffs為維護日志節點所占用的內存空間迅速增大,另外,jffs 文件系統在掛載時需要掃描整個FLASH的內容,以找出所有的日志節點,建立文件結構,對于大容量的NAND閃存會耗費大量時間。

2.3.yaffs:Yet Another Flash File System

?yaffs/yaffs2是專為嵌入式系統使用NAND型閃存而設計的一種日志型文件系統。與jffs2相比,它減少了一些功能(例如不支持數據壓縮),所以速度更快,掛載時間很短,對內存的占用較小。另外,它還是跨平臺的文件系統,除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自帶NAND芯片的驅動,并且為嵌入式系統提供了直接訪問文件系統的API,用戶可以不使用Linux中的MTD與 VFS,直接對文件系統操作。當然,yaffs也可與MTD驅動程序配合使用。

?yaffs與yaffs2的主要區別在于,前者僅支持小頁(512 Bytes) NAND閃存,后者則可支持大頁(2KB) NAND閃存。同時,yaffs2在內存空間占用、垃圾回收速度、讀/寫速度等方面均有大幅提升。

2.4. 網絡文件系統NFS (Network File System)

NFS是由Sun開發并發展起來的一項在不同機器、不同操作系統之間通過網絡共享文件的技術。

在嵌入式Linux系統的開發調試階段,可以利用該技術在主機上建立基于NFS的根文件系統,掛載到嵌入式設備,可以很方便地修改根文件系統的內容。

所采用的工具:mkfs.cramfs,mkfs.jffs2,mkfs.yaffs

http://sourceforge.net/projects/cramfs/
http://sourceforge.net/projects/jffs2os/
http://sourceforge.net/projects/yaffs/

二、根文件系統的組成

1. 根文件系統目錄內容簡介

  • bin  :基本的可執行文件
  • opt  :添加的軟件包
  • boot :啟動時需要的一些文件
  • proc :內核及進程信息的虛擬文件系統
  • dev : 設備文件
  • root:root用戶目錄
  • etc: 系統配置文件
  • sbin:系統管理的程序
  • home : 用戶目錄
  • tmp : 臨時文件
  • lib : 庫文件
  • usr : 應用程序
  • mnt : 掛載文件系統的掛載點
  • var : 存放系統日志或一些服務程序的臨時文件

2. 嵌入式環境需要移植的目錄

根文件系統中的每一個頂級目錄都有特定的用途和目的 ,但并不是所有的目錄在嵌入式環境下都需要,我們只創建需要的一些目錄:

/bin /sbin  /etc /proc  /tmp  /var /dev  /mnt

Linux根文件系統至少應包括以下幾項內容。

  1. 基本的文件系統結構,包含一些必需的目錄比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。
  2. 基本程序運行所需的庫函數,如glibc。
  3. 基本的系統配置文件,比如rc.sysinit,inittab等腳本文件。
  4. 必要的設備文件支持:/dev/hd*,/dev/tty*,/dev/fd0。
  5. 基本的應用程序,如sh,ls,cp,mv等。

3. 移植需要做的工作

  1. 把全局配置文件放入/etc目錄下。
  2. 將設備文件信息放入/dev目錄下,設備名可以作為符號鏈接定位在/dev中或/dev子目錄中的其他設備存在。
  3. 操作系統核心定位在/或/boot,若操作系統核心不是作為文件系統的一個文件存在,不應用它。
  4. 庫存放的目錄是/lib。
  5. 存放系統編譯后的可執行文件、命令的目錄是/bin,/sbin,/usr。

三、 默認預置條件

1) 交叉編譯工具

需要預先安裝好交叉編譯器 ,一口君安裝版本是:arm-none-linux-gnueabi-gcc 默認在ubuntu中安裝目錄是:

/home/peng/toolchain/gcc-4.6.4/

2) tftp服務器

開發板下載內核鏡像和設備樹需要借助tftp服務器,配置信息如下:

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"

服務器根目錄是**/tftpboot**

3) nfs服務器

內核啟動后掛載文件系統需要通過nfs服務器,nfs服務器設置如下:

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)

四、文件系統制作步驟

1、 源碼下載

我們選擇的版本是busybox-1.22.1.tar.bz2下載路徑為:

http://busybox.net/downloads/

2、 解壓源碼

$ tar  xvf  busybox-1.22.1.tar.bz2

3、 進入源碼目錄

$ cd  busybox-1.22.1

4、 配置源碼

選擇制作靜態庫,并設置交互編譯工具鏈的前綴arm-none-linux-gnueabi-如果是其他工具鏈,按照例子填寫即可。

$ 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默認安裝路徑為源碼目錄下的_install

$ make  install

7、 進入安裝目錄下

默認創建以下4個文件或者文件夾

$ cd  _install
$ ls
bin  linuxrc  sbin  usr

8、 創建其他需要的目錄

$ mkdir  dev  etc  mnt  proc  var  tmp  sys  root

9、 添加庫

我們安裝的交叉工具鏈中有我們所需要的可以在開發板上使用的庫, 將其拷貝到_install目錄下即可:

$ cp  /home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/  .  -a

修改文件權限并刪除靜態庫和共享庫文件中的符號表

$chmod  +w  lib
$chmod  +w  lib/*
$ rm  lib/*.a
$ arm-none-linux-gnueabi-strip  lib/*

刪除不需要的庫,確保所有庫大小不超過8M

$ du  -mh   lib/

10、 添加系統啟動文件

在etc下添加文件inittab,文件內容如下:

#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,文件內容如下:

#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

【注意】這里我們掛載的文件系統有三個proc、sysfs和tmpfs。在內核中proc和sysfs默認都支持,而tmpfs是沒有支持的,我們需要確保內核有tmpfs的支持。

修改內核配置:

$ make menuconfig
File systems --->
  Pseudo filesystems ---> 
   [*] Virtual memory file system support (former shm fs)
   [*] Tmpfs POSIX Access Control Lists

重新編譯內核

在etc下創建init.d目錄,并在init.d下創建rcS文件,rcS文件內容為:

#!/bin/sh
# This is the first script called by init process
/bin/mount  -a  掛載fstab制定的所有文件系統
echo  /sbin/mdev  >  /proc/sys/kernel/hotplug
/sbin/mdev  -s

為rcS添加可執行權限:

$ chmod   +x  init.d/rcS

在etc下添加profile文件,文件內容為:

#!/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    該文件節點是必須的

重要:新制作的文件系統尺寸若超出8M,刪除不需要的庫文件,比如c++庫等。

11. 測試

制作完畢的根文件系統可以讓開發板啟動后通過nfs掛載到ubuntu中,

  1. 刪除原先的/source/rootfs
$ sudo  rm  -rf  /source/rootfs
  1. 將我們新建的根文件系統拷貝到/source/rootfs目錄下
$sudo  mkdir  /source/rootfs
$ sudo  cp  _install/*   /source/rootfs   –a
  1. 設置uboot環境變量
# 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

重新啟動開發板,查看是否能夠正常掛載,功能是否正常

圖片圖片

五、制作ramdisk文件系統

通過NFS測試以后,就可以制作ramdisk文件系統了,具體如下:

1、制作一個大小為8M的鏡像文件

$ cd  ~
$ dd  if=/dev/zero  of=ramdisk  bs=1k  count=8192 (ramdsik為8M)
 If: input file
 Of: output file

2、格式化這個鏡像文件為ext2

$ mkfs.ext2  -F  ramdisk

3、在mount下面創建initrd目錄作為掛載點

$ sudo  mkdir  /mnt/initrd

4、將這個磁盤鏡像文件掛載到/mnt/initrd下

注意這里的ramdisk不能存放在rootfs目錄中

$ sudo  mount  -t  ext2   ramdisk  /mnt/initrd

5、將測試好的文件系統里的內容全部拷貝到 /mnt/initrd目錄下面

$ sudo  cp  /source/rootfs/*   /mnt/initrd  –a

如果拷貝遇到錯誤,需要再次刪除不需要的庫,比如c++庫

6、卸載/mnt/initrd

$ sudo  umount  /mnt/initrd

7、壓縮ramdisk為ramdisk.gz

$ gzip  --best  -c  ramdisk  >  ramdisk.gz

8、格式化為uboot識別的格式并拷貝到/tftpboot下

$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip  -d ramdisk.gz  ramdisk.img
$ cp  ramdisk.img  /tftpboot

9、配置內核支持RAMDISK

制作完 initrd.img.gz后,需要配置內核支持RAMDISK作為啟動文件系統

make menuconfig
File systems  --->
  <*> Second extended fs support
Device Drivers
  SCSI device support  --->
   <*> SCSI disk support
  Block devices  --->
   <*>RAM  block  device  support   
   (16)Default number of RAM disks  
   (8192) Default RAM disk size (kbytes)   (修改為8M) 
General setup  --->
  [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

重新編譯內核,復制到/tftpboot

10、在U-BOOT命令行重新設置啟動參數:

# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;tftp 43000000  ramdisk.img\;bootm 41000000 43000000 42000000
# saveenv

重新啟動開發板查看能否正常啟動。

【注意】 因為各個開發板命令會有所差異,uboot命令的設置要廠家出廠的手冊操作

責任編輯:武曉燕 來源: 一口Linux
相關推薦

2021-04-26 11:42:40

移植Linux制作rootfs嵌入式設備

2021-12-02 08:37:45

Linux MySQL Linux 系統

2023-08-30 08:51:41

NginxLinux

2023-08-31 08:56:24

2018-10-15 10:15:30

STM32Linux經驗

2015-06-18 06:18:30

京東自提點地圖

2011-07-11 17:33:25

JAVA可移植性

2011-07-22 17:41:02

java

2011-03-23 10:51:35

Finereport報表制作

2020-10-29 09:56:23

Linux靜態庫動態庫

2015-05-05 13:57:12

AndroidWindows

2010-03-05 09:24:54

Linux ntfs分

2020-09-07 11:30:47

ElasticSear索引Linux

2011-01-13 14:19:41

solarisLinux

2011-06-13 15:57:26

linux QT QTOPIA

2011-12-01 14:28:54

VPNNAT

2011-08-05 09:48:46

iPhone Interface

2010-11-25 13:45:44

2011-07-06 10:46:33

Xcode

2011-06-29 10:46:01

Qt Eembedded Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品视频一区二区三区四区 | 中文字幕在线一区 | 日韩精品一区二 | 午夜精品久久久久久久久久久久久 | 日韩有码一区 | 日本在线网站 | 日韩成人在线看 | 毛片在线免费 | 国产精品久久99 | 精品美女在线观看视频在线观看 | 亚洲iv一区二区三区 | 最新日韩av| 九九免费在线视频 | 91久久夜色 | 成年人黄色小视频 | 老牛影视av一区二区在线观看 | 一区二区三区在线免费观看 | 99久久精品一区二区成人 | 久久精品亚洲 | av黄色片在线观看 | 成人精品在线 | 99pao成人国产永久免费视频 | 亚洲乱码国产乱码精品精的特点 | 干狠狠 | 久久久在线视频 | 蜜臀网站 | 美女一级黄 | 欧美日韩专区 | 日韩欧美国产成人一区二区 | 少妇一级淫片免费播放 | av在线播放国产 | 天天操天天干天天曰 | 中文字幕免费中文 | 日韩精品免费视频 | 国产欧美一区二区三区在线看蜜臀 | 成人在线视频网址 | 免费黄色大片 | 日本欧美国产在线观看 | 亚洲国产视频一区二区 | 久久久久久黄 | 国产高清免费 |