日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

详解制作根文件系统

發布時間:2025/3/15 windows 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解制作根文件系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、FHS(Filesystem Hierarchy Standard)標準介紹

當我們在linux下輸入ls? / 的時候,見到的目錄結構以及這些目錄下的內容都大同小異,這是因為所有的linux發行版在對根文件系統布局上都遵循FHS標準的建議規定。

該標準規定了根目錄下各個子目錄的名稱及其存放的內容:

目錄名 存放的內容
/bin 必備的用戶命令,例如ls、cp等
/sbin 必備的系統管理員命令,例如ifconfig、reboot等
/dev 設備文件,例如mtdblock0、tty1等
/etc 系統配置文件,包括啟動文件,例如inittab等
/lib 必要的鏈接庫,例如C鏈接庫、內核模塊
/home 普通用戶主目錄
/root root用戶主目錄
/usr/bin 非必備的用戶程序,例如find、du等
/usr/sbin 非必備的管理員程序,例如chroot、inetd等
/usr/lib 庫文件
/var 守護程序和工具程序所存放的可變,例如日志文件
/proc 用來提供內核與進程信息的虛擬文件系統,由內核自動生成目錄下的內容
/sys 用來提供內核與設備信息的虛擬文件系統,由內核自動生成目錄下的內容
/mnt 文件系統掛接點,用于臨時安裝文件系統
/tmp 臨時性的文件,重啟后將自動清除

?

制作根文件系統就是要建立以上的目錄,并在其中建立完整目錄內容。其過程大體包括:

  • 編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄
  • 利用交叉編譯工具鏈,構建/lib目錄
  • 手工構建/etc目錄
  • 手工構建最簡化的/dev目錄
  • 創建其它空目錄
  • 配置系統自動生成/proc目錄
  • 利用udev構建完整的/dev目錄
  • 制作根文件系統的jffs2映像文件

下面就來詳細介紹這個過程。

二、編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄

這些目錄下存儲的主要是常用命令的二進制文件。如果要自己編寫這幾百個常用命令的源程序,my god, 這簡直是一個噩夢!好在我們有嵌入式Linux系統的瑞士軍刀——busybox,事情就簡單很多。

1、從http://www.busybox.net/?下載busybox-1.7.0.tar.bz2

2、tar xjvf busybox-1.7.0.tar.bz2解包

3、修改Makefile文件

175 ARCH??????????? ?= arm
176 CROSS_COMPILE?? ?= arm-linux-

4、make menuconfig配置busybox

busybox配置主要分兩部分。

第一部分是Busybox Settings,主要編譯和安裝busybox的一些選項。這里主要需要配置:

1)、Build Options -- Build BusyBox as a static binary (no shared libs),表示編譯busybox時,是否靜態鏈接C庫。我們選擇動態鏈接C庫。

2)、Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安裝busybox時,將各個命令安裝為指向busybox的軟鏈接還是硬鏈接。我們選擇軟鏈接。

3)、Installation Options -- (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安裝位置。我們選擇/work/nfs_root/fs_mini3

4)Busybox Library Tuning。保留Command line editing以支持命令行編輯;保留History size以支持記憶歷史命令;選中Tab completion和Username completion以支持命令自動補全

第二部分是Applets,他將busybox的支持的幾百個命令分門別類。我們只要在各個門類下選擇想要的命令即可。這里我們基本保持默認設置。

1)選中Networking Utilities -- httpd下的Enable -u <user> option,以啟用http服務器的功能allows the server to run as a specific user

5、編譯busybox

make

6、安裝busybox

make install

安裝完成后,可以看到在/work/nfs_root/fs_mini3目錄下生成了binsbinusr/binusr/sbin目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接,而busybox本身的大小不到800K:

dennis@dennis-desktop:/work/nfs_root/fs_mini3$ ls
bin? linuxrc? sbin? usr
dennis@dennis-desktop:/work/nfs_root/fs_mini3$? ls -l bin
total 740
lrwxrwxrwx 1 dennis dennis????? 7 2010-04-03 23:57 addgroup -> busybox
lrwxrwxrwx 1 dennis dennis????? 7 2010-04-03 23:57 adduser -> busybox
lrwxrwxrwx 1 dennis dennis????? 7 2010-04-03 23:57 ash -> busybox
-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busybox
lrwxrwxrwx 1 dennis dennis????? 7 2010-04-03 23:57 cat –> busybox

而普通PC機上的ls命令就有差不多80K的大小:

dennis@dennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls
-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/ls

busybox以它嬌小的身軀容納了數以百計的命令代碼,實在是讓人佩服不已,其不愧嵌入式系統瑞士軍刀之美譽。據說,busybox的作者身患絕癥,這更讓人欽佩GNU開源軟件的作者們。

三、利用交叉編譯工具鏈,構建/lib目錄

光 有應用程序(命令)是不夠的,因為應用程序本身需要使用C庫的庫函數,因此還必需制作for ARM的C庫,并將其放置于/lib目錄。my god,要自己寫C庫的源代碼嗎?不用!還記得交叉編譯工具鏈的3個組成部分嗎?交叉編譯器、for ARM的C庫和二進制工具。哈哈,for ARM的C庫是現成的,我們只需要拷貝過來就可以了。遺憾的是:整個C庫目錄下的文件總大小有26M。而我們根文件系統所在分區不過區區16M而已,根本 放不下。怎么辦呢?

dennis@dennis-desktop:/work/nfs_root/fs_mini3$ du -s --si /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
26M???? /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib

需要C庫目錄下所有的文件嗎?no,absolutely no! 讓我們來分析一下glibc庫目錄下內容的組成。該目錄下的子目錄和文件共分8類:

  • 目標文件,如crtn.o,用于gcc鏈接可執行文件
  • libtool庫文件(.la),在鏈接庫文件時這些文件會被用到,比如他們列出了當前庫文件所依賴的其它庫文件,程序運行時無需這些文件
  • gconv目錄,里面是各種鏈接腳本,在編譯應用程序時,他們用于指定程序的運行地址,各段的位置等
  • 靜態庫文件(.a),例如libm.a,libc.a
  • 動態庫文件 (.so、.so.[0-9]*)
  • 動態鏈接庫加載器ld-2.3.6.so、ld-linux.so.2
  • 其它目錄及文件

很顯然,第1、2、3、4、7類文件和目錄是不需要拷貝的。

由于動態鏈接的應用程序本身并不含有它所調用的C庫函數的代碼,因此執行時需要動態鏈接庫加載器來為它加載相應的C庫文件,所以第6類文件是需要拷貝的。

除此之外,第5類文件當然要拷貝。但第5類文件的大小也相當大。

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c --si *.so*

7.2M??? total

需要全部拷貝嗎?非也,非也!其實,需要哪些庫完全取決于要運行的應用程序使用了哪些庫函數。如果我們只制作最簡單的系統,那么我們只需要運行busybox這一個應用程序即可。通過執行

dennis@dennis-desktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep 'Shared'
0x00000001 (NEEDED)???????????????????? Shared library: [libcrypt.so.1]
0x00000001 (NEEDED)???????????????????? Shared library: [libm.so.6]
0x00000001 (NEEDED)???????????????????? Shared library: [libc.so.6]

可知:busybox只用到了3個庫:通用C庫(libc)、數學庫(libm)、加密庫(libcrypt),因此我們只需要拷貝這3個庫的庫文件即可。但是每個庫都有4個文件,4個文件都要拷貝嗎?當然不是。

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt[.-]*
-rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so
-rw-r--r-- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.a
lrwxrwxrwx 1 dennis dennis??? 13 2008-12-22 15:38 libcrypt.so -> libcrypt.so.1
lrwxrwxrwx 1 dennis dennis??? 17 2008-12-22 15:38 libcrypt.so.1 -> libcrypt-2.3.6.so
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm[.-]*
-rwxr-xr-x 1 dennis dennis? 779096 2008-01-22 05:31 libm-2.3.6.so
-rw-r--r-- 1 dennis dennis 1134282 2008-01-22 05:32 libm.a
lrwxrwxrwx 1 dennis dennis?????? 9 2008-12-22 15:38 libm.so -> libm.so.6
lrwxrwxrwx 1 dennis dennis????? 13 2008-12-22 15:38 libm.so.6 -> libm-2.3.6.so
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc[.-]*
-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so
-rw-r--r-- 1 dennis dennis 2768280 2008-01-22 05:31 libc.a
-rw-r--r-- 1 dennis dennis???? 195 2008-01-22 05:34 libc.so
lrwxrwxrwx 1 dennis dennis????? 13 2008-12-22 15:38 libc.so.6 -> libc-2.3.6.so

4個文件中的.a文件是靜態庫文件,是不需要拷貝的。另外3個文件是:

  • 實際的共享鏈接庫:libLIBRARY_NAME-GLIBC_VERSION.so。當然需要拷貝。
  • 主修訂版本的符號鏈接,指向實際的共享鏈接庫:libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦鏈接了特定的鏈接庫,將會參用該符號鏈接。程序啟動時,加載器在加載程序前,會檢索該文件。所以需要拷貝。
  • 與版本無關的符號鏈接,指向主修訂版本的符號連接(libc.so是唯一的例外,他是一個鏈接命令行:libLIBRARY_NAME.so,是為編譯程序時提供一個通用條目)。這些文件在程序被編譯時會被用到,但在程序運行時不會被用到,所以不必拷貝它。

關于共享庫的2個符號鏈接的作用的特別說明:

當 我們使用gcc??? hello.c??? -o??? hello??? -lm編譯程序時,gcc會根據-lm的指示,加頭(lib)添尾(.so)得到libm.so,從而沿著與版本無關的符號鏈接(libm.so -> libm.so.6)找到libm.so.6并記錄在案(hello的ELF頭中),表示hello需要使用libm.so.6這個庫文件所代表的數學庫 中的庫函數。而當hello被執行的時候,動態鏈接庫加載器會從hello的ELF頭中找到libm.so.6這個記錄,然后沿著主修訂版本的符號鏈接 (libm.so.6 -> libm-2.3.6.so)找到實際的共享鏈接庫libm-2.3.6.so,從而將其與hello作動態鏈接。可見,與版本無關的符號鏈接是供編譯器 使用的,主修訂版本的符號鏈接是供動態鏈接庫加載器使用的,而實際的共享鏈接庫則是供應用程序使用的。

通過以上分析,我們只需要拷貝3個庫(每個庫各1個主修訂版本的符號鏈接和1個實際的共享鏈接庫)以及動態鏈接庫加載器(1個符號鏈接和1個實體文件)。步驟如下:

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp? libcrypt-* /work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libcrypt.so.* /work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp? libm-* /work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libm.so.* /work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp? libc-* /work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libc.so.* /work/nfs_root/fs_mini3/lib

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l ld-* /work/nfs_root/fs_mini3/lib

四、手工構建/etc目錄

/etc 目錄存放的是系統程序的主配置文件,因此需要哪些配置文件取決于要運行哪些系統程序。即使最小的系統也一定會運行1號用戶進程init,所以我們至少要手 工編寫init的主配置文件inittab。busybox的inittab文件的語法、語義與傳統的SYSV的inittab有所不同。

inittab 文件中每個條目用來定義一個需要init啟動的子進程,并確定它的啟動方式,格式 為<id>:<runlevel>:<action>:<process>。例 如:ttySAC0::askfirst:-/bin/sh

  • <id>表示子進程要使用的控制臺,若省略則使用與init進程一樣的控制臺
  • <runlevel>表示運行級別,busybox init程序這個字段沒有意義
  • <action>表示init進程如何控制這個子進程
    • sysinit:系統啟動后最先執行,只執行一次,init進程等待它結束后才繼續執行其它動作
    • wait:系統執行完sysinit條目后執行,只執行一次,init進程等待它結束后才繼續執行其它動作
    • once:系統執行完wait條目后執行,只執行一次,init進程不等待它結束
    • respawn:啟動完once進程后,init進程監測發現子進程退出時,重新啟動它
    • askfirst:啟動完respawn進程后,與respawn類似,不過init進程先輸出” Please press Enter to activate this console“,等用戶輸入回車后才啟動子進程
    • shutdown:當系統關機時
    • restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init進程接收到SIGUP信號時執行,先重新讀取、解析/etc/inittab文件,再執行restart程序
    • ctrlaltdel:按下ctrl+alt+del鍵時執行,不過在串口控制臺中無法輸入它
  • <process>表示進程對應的二進制文件。如果前面有-號,表示該程序是“可以與用戶進行交互的”

我們制作最簡單的/etc/inittab文件,其內容如下:

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r

制作最簡單的腳本程序文件/etc/init.d/rcS,其內容如下:

#!/bin/sh
ifconfig eth0 192.168.2.17

修改shell腳本文件/etc/init.d/rcS的權限,以使其可被執行:

# chmod a+x /etc/init.d/rcS

五、手工構建最簡化的/dev目錄

在linux機器上,執行ls??? /dev可看到幾百個設備文件,我需要手工創建它們嗎?maybe,我只需要手工創建幾個設備文件!我怎么知道我應該創建哪幾個設備文件呢?管它呢,先看看開發板上可愛的linux的反應再說。

啟動Linux操作系統,顯示:

VFS: Mounted root (nfs filesystem).
Freeing init memory: 112K
Warning: unable to open an initial console.

這說明,內核已經成功掛載根文件系統,但卻未能成功啟動第1個用戶進程init。通過錯誤消息“unable to open an initial console”搜索內核源代碼,找到init/main.c文件。

748 static int noinline init_post(void)
749 {
750???????? free_initmem();
751???????? unlock_kernel();
752???????? mark_rodata_ro();
753???????? system_state = SYSTEM_RUNNING;
754???????? numa_default_policy();
755?
756???????? if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
757???????????????? printk(KERN_WARNING "Warning: unable to open an initial console.\n");
758?
759???????? (void) sys_dup(0);
760???????? (void) sys_dup(0);
761?
762???????? if (ramdisk_execute_command) {
763???????????????? run_init_process(ramdisk_execute_command);
764???????????????? printk(KERN_WARNING "Failed to execute %s\n",
765???????????????????????????????? ramdisk_execute_command);
766???????? }
767?
768???????? /*
769????????? * We try each of these until one succeeds.
770????????? *
771????????? * The Bourne shell can be used instead of init if we are
772????????? * trying to recover a really broken machine.
773????????? */
774???????? if (execute_command) {
775???????????????? run_init_process(execute_command);
776???????????????? printk(KERN_WARNING "Failed to execute %s.? Attempting "
777???????????????????????????????????????? "defaults...\n", execute_command);
778???????? }
779???????? run_init_process("/sbin/init");
780???????? run_init_process("/etc/init");
781???????? run_init_process("/bin/init");
782???????? run_init_process("/bin/sh");
783?
784???????? panic("No init found.? Try passing init= option to kernel.");
785 }

顯然,內核錯誤是由175行不能打開/dev/console所致。通過查看已經安裝好的linux機器的/dev/console設備文件,可知其是字符設備文件,主設備號為5,次設備號為1:

dennis@dennis-desktop:/work/nfs_root/fs_mini3/etc$ ls -l /dev/console
crw------- 1 root root 5, 1 2010-04-08 08:40 /dev/console

因此,我們使用下面的命令創建它:

dennis@dennis-desktop:/work/nfs_root/fs_mini3/dev$?sudo mknod console c 5 1

還需要創建其它設備文件嗎?只有天知道!再看看linux的反應。

VFS: Mounted root (nfs filesystem).
Freeing init memory: 112K
init: can't open '/dev/null': No such file or directory

這次我們有經驗了,如法炮制,創建/dev/null設備文件:

dennis@dennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod null c 1 3

再次重啟開發板上的linux,顯示

VFS: Mounted root (nfs filesystem).
Freeing init memory: 112K
init started: BusyBox v1.7.0 (2010-04-03 23:53:55 CST)
starting pid 229, tty '': '/etc/init.d/rcS'

Please press Enter to activate this console.
starting pid 231, tty '': '/bin/sh'
#

哈哈,我們成功了,終于可以K歌去了。

六、創建其它空目錄

K完歌回來,繼續戰斗。

dennis@dennis-desktop:/work/nfs_root/fs_mini3$ mkdir home root proc sys tmp mnt var

再次重啟動開發板上的linux。咦,似乎有些問題。

VFS: Mounted root (nfs filesystem).
Freeing init memory: 112K
init started: BusyBox v1.7.0 (2010-04-03 23:53:55 CST)
starting pid 229, tty '': '/etc/init.d/rcS'

Please press Enter to activate this console.
starting pid 231, tty '': '/bin/sh'
# ps
PID? Uid??????? VSZ Stat Command
#

ps竟然看不到任何進程的存在!讓我想想。對了,ps的機制是通過查看/proc中的內容來獲得進程信息的。那么,目前/proc里有哪些內容呢?

# ls /proc
#

竟然空空如野!這可如何是好?

七、配置系統自動生成/proc目錄

其實/proc是用來提供內核與進程信息的虛擬文件系統,由內核自動生成目錄下的內容。不過需要我們設置一下,將/etc/init.d/rcS修改為:

#!/bin/sh
ifconfig eth0 192.168.2.17
mount -t proc none /proc

對 于mount -t proc none /proc 的解釋:通常情況下mount命令應該寫為mount –t ext2 /dev/hdb1 /proc。但由于現在掛載的/proc是虛擬文件系統,它不與任何物理硬盤分區相對應,因此在表示物理硬盤分區的位置用占位符none來表示。

重啟開發板上的linux,顯示成功了:

Please press Enter to activate this console.
starting pid 232, tty '': '/bin/sh'
# ps
PID? Uid??????? VSZ Stat Command
1 0????????? 3088 S?? init
2 0?????????????? SW< [kthreadd]
3 0?????????????? SWN [ksoftirqd/0]
4 0?????????????? SW< [events/0]
5 0?????????????? SW< [khelper]
41 0?????????????? SW< [kblockd/0]
42 0?????????????? SW< [ksuspend_usbd]
45 0?????????????? SW< [khubd]
47 0?????????????? SW< [kseriod]
59 0?????????????? SW? [pdflush]
60 0?????????????? SW? [pdflush]
61 0?????????????? SW< [kswapd0]
62 0?????????????? SW< [aio/0]
177 0?????????????? SW< [mtdblockd]
226 0?????????????? SW< [rpciod/0]
232 0????????? 3092 S?? -sh
233 0????????? 3092 R?? ps
#

八、利用udev構建完整的/dev目錄

高興地插入U盤,內核顯示識別到了U盤:

# usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: not running at top speed; connect to a high speed hub
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi 0:0:0:0: Direct-Access???? Teclast? CoolFlash??????? 0.00 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] 12560384 512-byte hardware sectors (6431 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 12560384 512-byte hardware sectors (6431 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1
sd 0:0:0:0: [sda] Attached SCSI removable disk

但當要使用的時候,卻找不到設備文件:

# mount /dev/sda1 /mnt
mount: mounting /dev/sda1 on /mnt failed: No such file or directory
# ls /dev/sda1
ls: /dev/sda1: No such file or directory

/dev目錄下只有可憐巴巴的2個設備文件。

# ls /dev
console? null

在linux機器上,執行ls??? /dev可看到幾百個設備文件,難道要我揉著酸疼的眼睛查看這幾百個設備文件的主、次設備號,然后再手工使用mknod命令來生成這幾百個設備文件嗎?那你不如殺了我算了!其實構建/dev目錄有3種方法:

  • 創建靜態設備文件:需要使用mknod命令事先創建很多設備文件,麻煩大了
  • 使用devfs:使用上存在一些問題,在2.6.13后已被廢棄
  • 使用udev(user dev),我們采用該方法

udev 的原理是:操作系統啟動的時候將識別到的所有設備的信息自動導出到/sys目錄,然后用戶態的應用程序udev根據/sys中的設備信息,自動在/dev 目錄下創建所有正確的設備文件。因此我們要做的就是:配置自動生成/sys目錄下的內容并調用mdev(mdev是busybox中對udev的簡化實 現)。

# ls /sys
# mount -t sysfs none /sys
# ls /sys
block???? class???? firmware? kernel??? power
bus?????? devices?? fs??????? module
# ls /dev
console? null
# mdev -s
# ls -l dev | wc -l
140

# ls /dev/sda*
/dev/sda?? /dev/sda1

可是,當我們將U盤拔出后,發現/dev/sda1并不自動消失;手工刪除/dev/sda1后,再重新插入U盤,/dev/sda1也不會自動生成。我們需進行如下操作,以使系統能夠實現即插即用:

# echo /sbin/mdev > /proc/sys/kernel/hotplug

將上述工作放到rcS中:
#!/bin/sh
ifconfig eth0 192.168.2.17
mount -t proc none /proc
mount -t sysfs none /sys
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

九、使用tmpfs掛載/dev、/tmp、/var目錄

似乎我們的根文件系統已經相當完善了。但仔細想一想Nand flash的擦寫壽命是有限的這個事實,我們就應該明白,我們應該將/dev、/tmp、/var三個目錄掛載為tmpfs文件系統。修改rcS如下:

#!/bin/sh
ifconfig eth0 192.168.2.17
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /dev
mount -t tmpfs none /var
mount -t tmpfs none /tmp
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

十、制作根文件系統的jffs2映像文件

根文件系統已經制作完畢,最后一個步驟是將其打包為jffs2映像文件,以供bootloader將其燒錄到nand flash上。這只需要執行命令:

dennis@dennis-desktop:/work/nfs_root$ mkfs.jffs2 -n -s 512 -e 16KiB -d fs_mini3 -o fs_mini3.jffs2

這其中:

  • -n表示不要在每個擦除塊上都加上清除標記
  • -s 512指明一頁大小為512字節
  • -e 16KiB指明一個擦除塊大小為16KB
  • -d fs_mini3指明要打包的目錄
  • -o fs_mini3.jffs2指明最終的映像文件名

但由于jffs2映像文件制作工具程序mkfs.jffs2 尚未安裝,另外該程序需要用到zlib庫,因此我們必須先安裝它們:

安裝zlib(編譯MTD設備工具包需要它)

  • tar xzvf zlib-1.2.3.tar.gz
  • cd zlib-1.2.3
  • ./configure –shared –prefix=/usr
  • make
  • sudo make install

安裝MTD工具包(其中含有jffs2映像文件制作工具)

  • tar xjvf mtd-utils-05.07.23.tar.bz2
  • cd mtd-utils-05.07.23/util
  • make
  • sudo make install

哇塞,終于寫完了。可以睡覺去喏!!!

轉自:http://scyz.spaces.live.com/blog/cns!B627F5D454891288!436.entry

總結

以上是生活随笔為你收集整理的详解制作根文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 这里只有精品6 | 夜夜天天干 | 亚洲伦理一区二区 | 91红桃视频 | 久久九九综合 | 狠狠狠狠狠干 | 日本少妇大战黑人 | 亚洲成人午夜电影 | 一级特黄aaa | 蜜桃成熟时李丽珍在线观看 | 91人人干| 伦hdwww日本bbw另类 | 欧美日韩精品在线观看视频 | 国产一级精品毛片 | 国产精品第6页 | 日韩国产欧美在线视频 | 日韩中文字幕高清 | 激情综合五月婷婷 | www插插插 | 色狠狠综合网 | 日本老师巨大bbw丰满 | 黄色片18 | 黄色一级黄色片 | 亚洲九九爱 | 国语一区 | 日本少妇bbwbbw精品 | 好了av在线 | 日本精品网站 | 色婷婷av一区二区三区之红樱桃 | 魔性诱惑 | 天天色天天插 | 亚洲涩涩涩 | 国产专区视频 | 欧美黄色高清视频 | 夜夜狠狠| 妖精视频在线观看免费 | 麻豆疯狂做受xxxx高潮视频 | 97人妻精品一区二区三区免 | 久久激情影院 | 亚洲天堂手机 | 性欧美巨大 | 99在线精品观看 | 高清乱码免费看污 | 日本视频免费 | 加勒比久久综合 | 免费看av软件 | 国产又黄又大又粗视频 | 欧美日韩三级视频 | 六月丁香婷婷网 | 日韩av一 | 亚洲乱轮| 天天射狠狠干 | 久久中文字幕人妻熟av女蜜柚m | 久久艹这里只有精品 | 婷婷成人在线 | 国产精品资源网 | 国产伦精品一区二区三区视频网站 | 国产夫妻自拍av | 国产精品中文字幕在线观看 | 波多野结衣女同 | 国产精品久久综合青草亚洲AV | 中文不卡av| 成人看片在线 | 亚洲老妇色熟女老太 | 久久久久久久久久免费视频 | 欧美www在线观看 | 九九九在线视频 | 97人妻精品一区二区三区免 | 美女精品久久 | 成人午夜免费在线观看 | 女十八毛片 | 日韩一区二区三 | 亚洲综合在线观看视频 | 91看片免费看 | 成人看片在线观看 | 91玉足脚交白嫩脚丫 | 国内一区二区三区 | 韩国不卡av | 黄黄的视频在线观看 | 亚洲女优在线 | 国产性猛交xxxx免费看久久 | 天天躁狠狠躁 | 亚洲偷 | 男人的天堂av网站 | 欧美色图13p| 亚洲av无码一区东京热久久 | 特级西西人体4444xxxx | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | av永久免费在线观看 | 伊人精品视频在线观看 | 久久成年视频 | 99视频精品在线 | 色爱视频 | 嫩草亚洲 | 久久一二| aa片在线观看视频在线播放 | 久久久久久久精 | 欧美日韩tv| 亚洲免费观看在线 |