linux製作根
⑴ 什麼時候要重新製作linux的根文件系統謝謝
首先要理解什麼是根文件系統,如果你不是做應用開發如嵌入式等等話,就不需要修改。
1. 根文件系統
文件系統是包括在一個磁碟(包括光碟、軟盤、閃盤及其它存儲設備)或分區的目錄結構;一個可應用的磁碟設備可以包含一個或多個文件系統;如果您想進入一個文件系統,首先您要做的是掛載(mount)文件系統;為了掛載(mount)文件系統,您必須指定一個掛載點。
註:對於我們應用開發來說,購買開發板的時候,廠家會提供好現成的根文件系統和BootLoader等,如果需要,我們可以改變其中的命令而無需從頭開始製作一個新的根文件系統。不過這兒的製作過程可以讓我們更深一點理解Linux的文件系統。
2.主要的根文件系統
* Linux 中,rootfs 是必不可少的。PC 上主要實現有 ramdisk 和直接掛載 HD(Harddisk,硬碟) 上的根文件系統;嵌入式中一般不從 HD 啟動,而是從 Flash 啟動,最簡單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍復雜的就是 直接從Flash 讀取的 Cramfs,更復雜的是在 Flash 上分區,並構建 JFFS2 等文件系統。
* RAMDisk 將製作好的 rootfs 壓縮後寫入 Flash,啟動的時候由 Bootloader load 到RAM,解壓縮,然後掛載到 /。這種方法操作簡單,但是在 RAM 中的文件系統不是壓縮的,因此需要佔用許多嵌入式系統中稀有資源 RAM。
ramdisk 就是用內存空間來模擬出硬碟分區,ramdisk通常使用磁碟文件系統的壓縮存放在flash中,在系統初始化時,解壓縮到SDRAM並掛載根文件系統, 在linux系統中,ramdisk有二種,一種就是可以格式化並載入,在linux內核2.0/2.2就已經支持,其不足之處是大小固定;另一種是 2.4的內核才支持,通過,ramfs來實現,他不能被格式化,但用起來方便,其大小隨所需要的空間增加或減少,是目前linux常用的ramdisk技術.
* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大簡化了 Linux 的啟動過程,附合 Linux 的基本哲學:Keep it simple, stupid(KISS). 不過cpio-initrd 作為新的格式,還沒有經過廣泛測試,嵌入式 Linux 中主要採用的還是 image-initrd。
* Cramfs 是 Linus 寫的很簡單的文件系統,有很好的壓縮綠,也可以直接從 Flash 上運行,不須 load 到 RAM 中,因此節約了 RAM。但是 Cramfs 是只讀的,對於需要運行時修改的目錄(如: /etc, /var, /tmp)多有不便,因此,一般將這些目錄做成ramfs 等可寫的 fs。
* SquashFS 是對 Cramfs 的增強。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有優勢。不過,據開發者介紹,在性能上可能不如 Cramfs。這也是一種新方法,在嵌入式系統採用之前,需要經過更多的測試。
3.Ramdisk製作
RAMDisk的製作方法如下:
(1) 在PC機的Linux操作系統環境下,生成可以虛擬成塊設備的文件,假設文件名為init.img。
$ dd if=/dev/zero of=init.img bs=4096 count=1024
其中bs*count為塊設備大小(單位:位元組),生成init.img文件以後,還必須對該文件進行格式化。
$ mke2fs –m0 –F init.img
(2) 新建一個文件夾ram,並將init.img掛接到ram目錄。
$ mkdir ram
$ mount init.img ram/ -o loop
這時,讀寫ram目錄,等效於讀寫init.img文件。用戶可以將根文系統所需的文件寫入到ram目錄中。往ram目錄寫完文件以後,還需要使用umount ram命令卸載init.img,才能將已寫入的文件保存到init.img中。
(3)添加完畢,需要umount ram
4. Cramfs製作
CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任職時,所參與開發的文件系統。它是針對Linux內核2.4之後的版本所設計的一種新型只讀文件系統,採用了 zlib 壓縮,壓縮比一般可以達到1:2,但仍可以作到高效的隨機讀取,Linux系統中,通常把不需要經常修改的目錄壓縮存放,並在系統引導的時候再將壓縮文件解開。因為Cramfs不會影響系統的讀取文件的速度,而且是一個高度壓縮的文件系統。因此非常廣泛應用於嵌入式系統中。
在嵌入式的環境之下,內存和外存資源都需要節約使用。如果使用RAMDISK方式來使用文件系統,那麼在系統運行之後,首先要把Flash上的映像文件解壓縮到內存中,構造起RAMDISK環境,才可以開始運行程序。但是它也有很致命的弱點。在正常情況下,同樣的代碼不僅在Flash中占據了空間(以壓縮後的形式存在),而且還在內存中佔用了更大的空間(以解壓縮之後的形式存在),這違背了嵌入式環境下盡量節省資源的要求。
使用CramFS文件系統就是一種解決這個問題的方式。CramFS是一個壓縮格式的文件系統,它並不需要一次性地將文件系統中的所有內容都解壓縮到內存之中,而只是在系統需要訪問某個位置的數據的時候,馬上計算出該數據在CramFS中的位置,將它實時地解壓縮到內存之中,然後通過對內存的訪問來獲取文件系統中需要讀取的數據。CramFS中的解壓縮以及解壓縮之後的內存中數據存放位置都是由CramFS文件系統本身進行維護的,用戶並不需要了解具體的實現過程,因此這種方式增強了透明度,對開發人員來說,既方便,又節省了存儲空間。
但是Cramfs也有其缺點:延遲、小於16MB、不支持寫,只支持PAGE_CREATE_SIZE=4096的內核。
製作的命令:(root文件夾中存放著文件系統)
#mkcramfs root cramfs.img
5. 其他根文件系統的製作
製作yaffs文件系統: mkyaffsimage myroots myroots.img
製作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI
6. BusyBox編譯以及移植(根文件系統內命令的製作移植)
建立目標板空根目錄文件夾及根目錄下的文件夾:
[root@190 friendly-arm]# mkdir myroots
[root@190 friendly-arm]#pwd
/friendly-arm/myroots
[root@190 friendly-arm]#cd myroots
[root@190 myroots]# mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var
[root@190 myroots]# mkdir etc/init.d
進入etc/init.d目錄下,建立一個腳本文件,並命名為rcS,用gedit打開,添加如下內容:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
創建 dev 中的節點
如果使用「linux 2.6.xx」的內核,應該事先創建節點「console」、「null」。否則在系統啟動時內容會提示以下錯誤:
Warning: unable to open an initial console.Kernel panic - not syncing: Attempted to kill init!
創建節點的命令如下:
# mknod dev/console c 5 1# mknod dev/null c 1 3
移植Busybox:
進入到壓縮文件存放的目錄下,並解壓。然後進入解壓後的busybox目錄文件夾,隨後配置busybox 。
[root@190 busybox-1.2.0]# make menuconfig
由於每個版本的配置選項組織有所不同。不管怎樣,我們注意以下選項就行了:
1) Support for devfs
2) Build BusyBox as a static binary ( no shared libs ) //將busybox編譯成靜態鏈接
3) Do you want to build busybox with a Cross Compile?
(/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compile prefix //指定交叉編譯器
4) init
5) Support reading an inittab file //支持init讀取/etc/inittab 配置文件
6) (X) ash選中ash //建立的rcS腳本才能執行
7)ash
8)cp cat ls mkdir mv //可執行命令工具的選擇,自己看著辦吧,需要用到的就選上
9) mount
10) umount
11) Support loopback mounts
12) Support for the old /etc/mtab file
13) insmod
14) Support version 2.2.x to 2.4.x Linux kernels
15) Support version 2.6.x Linux kernels
16) vi
17)don』t use user
以上內容必須選上,其他可按默認值;如果要支持其他功能,如網路支持等,可按需選擇,英語不是很爛的話,這些都沒有問題。
配置好之後,保存退出。然後對其編譯和安裝到剛才建立的根文件系統目錄下:
[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install
安裝好之後,將相應的二進制文件拷貝到根文件系統相應的目錄下:
* 拷貝一些管理員控製程序到/sbin目錄下,最重要的就是要包含一個init命令;
* 拷貝應用程序運行時所需要的庫到/lib,庫文件可以從PC機上的交叉編譯工具安裝目錄下拷貝,如libc-2.2.2.so、libcryt- 2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,為部分相應庫建立快捷方式,提供一些應用程序按快捷方式名稱調用。
⑵ linux怎樣在根目錄下創建文件夾
操作步驟如下所示:
一、進入linux系統並終端,輸入命令」cd/「,然後按回車鍵來到根目錄。
⑶ 如何利用busybox製作根文件系統
選定 busybox-1.9.2.tar.bz2 這個版本, 以靜態方式編譯, 即生成的 busybox 不需要共享庫的支持就能運行。這樣做我們就不需要布署程序庫了。缺點是自己寫的 arm-linux 程序在這個根文件系統中是不能運行的,因為缺少共享程序庫的支持。不過不用擔心,通過在目標機里以掛接 NFS 的方式, 將宿主機的 arm-linux-gcc 編譯器的庫文件掛到 arm-linux 的 /lib 下, 就可完美的運行我們自己的程序了。
現在開始製作靜態鏈接庫的根文件系統。
1、准備根文件系統
首先准備製作工具BusyBox1.9.2。
准備交叉編譯工具arm-linux-gcc 3.3.2。
在機器上建立rootfs的文件夾
#mkdir rootfs
在rootfs中建立linux系統中典型的文件夾
#cd rootfs
#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc
#mkdir usr/lib usr/bin
#pwd
/home/su/rootfs
2、解壓源碼包
#tar xjf busybox-1.9.2.tar.bz2
#cd busybox-1.9.2
3、修改 Makefile,
#vi Makefile
將Makefile中的
CROSS_COMPILE ?=
改為
CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-
注:這個版本的 busybox 用 3.4.1 的 arm-linux-gcc 編譯有些問題, 用 3.3.2 版則可順利編譯。
4、定製 busybox
選擇busybox下全部的可執行程序
#make defconfig
進到配置選項
#make menuconfig
設置靜態編譯方式
Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)
Busybox Settings ---> Install Options ---> 中輸入建立根文件系統的文件所在的路徑/home/su/rootfs。
其它的默認。
確保 [*] Build BusyBox as a static binary (no shared libs) 被選中,保存退出
5、執行 make 編譯
#make
編譯出錯, 信息如下:
applets/applets.c:15:2: warning: #warning Static linking against glibc proces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1
按照提示,修改文件 applets/applets.c 第 21 行, 將
#error Aborting compilation.
注釋掉:
執行 make 重新編譯
#make
編譯通過, busybox 被生成了, 然後執行
#make install
busybox 就被安裝到指定的路徑下了/home/su/rootfs,這時可發現rootfs下多了個liunxrc的文件,bin、sbin下也多了很多文件。用ls –l命令查看其中的一個文件,可發現其是鏈接到busybox的一個連接符,所以我們之後在目標機上運行的命令大多都會調用busybox這個文件的。
若之前忘了指定路徑,默認生成到臨時目錄busybox-1.9.2/_install 下了。
6、編寫配置/etc下的初始化程序(可省略)
最簡單的做法是把busybox-1.9.2/examples/bootfloppy/etc下的全部文件拷到目標文件的etc目錄下
#cd /home/su/busybox-1.9.2/examples/bootfloppy/etc
#cp –rf * /home/su/rootfs/etc
也可自己寫這些文件。
7、把rootfs做成鏡像
#mkcramfs rootfs rootfs.cramfs
8、把rootfs.cramfs燒寫到目標機中。
9、運行目標機
這時會遇到一個錯誤信息:
Can』t open tty2
Can』t open tty3
Can』t open tty4
解決辦法:把/rootfs/etc/ inittab 文件的第三行「tty2::askfirst:-bin/sh」刪除掉。
返回到第7步重做。
現實中,動態編譯的方法更適合工程的需要,所以一般是採用動態的方法編譯根文件系統的。若選擇動態編譯的辦法,大體方法還是一樣的,存在一些不同之處是:
不同之處之一是:
進到配置選項
#make menuconfig
選擇動態方式
Busybox Settings ---> Build Options ---> [*] Build Shared libbusybox
不同之處之二是:
上面靜態編譯出現的出錯信息不會出現了,所以不需對程序做任何修改,但還是必須用arm-linux-gcc 3.3.2編譯,否則還是會有麻煩。
不同之處之三是(最大的不同之處):
編譯完成後,需進到rootfs目錄的lib中,往裡面添加一些庫文件
#cd /home/su/rootfs/lib
這里有點麻煩,我怎麼知道需要什麼庫文件的支持呢?
最簡單的辦法是把arm-linux-gcc 3.3.2下的整個lib庫拷進來,簡單省事。但是這么做存在一個問題,做出的根文件系統非常大。
另一個辦法是:
#cd /home/su/rootfs/bin
#arm-linux-readelf busybox | grep shared
這樣就可以顯示出系統運行起來需要什麼庫文件,再把相應的庫文件拷到/home/su/rootfs/lib下。一般而言,系統庫用到兩個:動態鏈接器ld-linux.so和c函數庫Glibc,Glibc包括:
ld-linux:動態鏈接庫,必需
libc: 標准c函數庫,必需
libm: 數學庫,一般需要
libdl: 用於動態裝載共享庫,較少用到
libcrypt: 加密附加庫,需要認證的程序用到,較少用
libpthread: POSIX線程庫,一般需要
如果需要某個函數庫,我們可以將這些庫和對應的符號鏈接拷到目標根文件系統的/lib目錄下。簡單起見,應該使用-d選項或-a選項調用cp命令,這樣可保留完整的符號鏈接信息。
例:
#cp –a libc.so.6 /home/su/rootfs/lib/
為了減少運行時庫的大小,我們應該使用交叉編譯版本即arm-linux-gcc 3.3.2的strip工具來處理根文件系統的庫文件,把二進制文件中的包含的符號表和調試信息刪除掉。
例:
#arm-linux-strip /home/su/rootfs/lib/*.so
注意:
使用busybox做文件系統時,運行make命令,系統會馬上顯示:
沒有/dev/null這個文件
但是還是能最終編譯出根文件系統,問題出在重啟linux系統,機器進不去了。提示出錯,信息如下:
/etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 200:/dev/null: read-only file system
.
.
.
***An error occured ring the file system check.
***Dropping you to a shell;the system will reboot
***when you leave the shell
Give root password for maintenance
(or type Control-D to continue):
解決辦法:
按提示輸入root用戶的密碼,回車,可看到
(Repair filesystem)1#:
依次輸入命令:
(Repair filesystem)1# mount -n -o remount,rw /
(Repair filesystem)1# rm -f /dev/null
(Repair filesystem)1# mknod -m 0666 /dev/null c 1 3
(Repair filesystem)1# reboot
問題解決。
⑷ Linux 根文件系統製作
用grub 4 dos裡面的grldr引導其實是最方便的
把grldr直接放到C:
在windows的引導菜單里加入C:\grldr="GRUB"
重啟進入grub就可以用來引導linux了
不過要有一定的基礎
至於安裝時要不要解壓ISO這個要看用的是什麼LINUX了
susu是要解壓的
RH類, den類就不用了
你用的那個是怎樣的就不知道了, 不過要引導linux的ISO(安裝文件),當然要用引導器解釋磁碟的方法輸入地址啦
在grub里就是 hda* hdb*
進入內核就是 /dev/hda* /dev/hdb* /dev/sda*等等類似的地址啦
不過不知道你看不看得明白上面的東東呢