Yocto開發筆記之《根文件系統裁剪》(QQ交流群:519230208)


開了一個交流群,歡迎愛好者和開發者一起交流,轉載請注明出處。

QQ群:519230208,為避免廣告騷擾,申請時請注明 “開發者” 字樣

========================================================

占盤大戶一目了然

# du -sh                                   // 查看當前目錄大小

root@imx6ulevk:/# du -sh // 總共原始大小
616M
root@imx6ulevk:/opt# du -sh 170M . root@imx6ulevk:/usr# du -sh 337M . root@imx6ulevk:/boot# ls vmlinux-3.14.38-6UL_ga+ge4944a5 zImage zImage-3.14.38-6UL_ga+ge4944a5 root@imx6ulevk:/boot# du -sh 21M . root@imx6ulevk:/var# ls backups cache lib local lock log run spool tmp volatile root@imx6ulevk:/var# du -sh 23M . root@imx6ulevk:/unit_tests# du -sh 44M .

 

我編譯的是 fsl-image-gui,用以下方式找到bb文件

find -name "*fsl-image-gui*.bb"
./sources/meta-fsl-bsp-release/imx/meta-sdk/recipes-fsl/images/fsl-image-gui.bb

 

打開bb文件,找到一下內容,並嘗試刪減

IMAGE_INSTALL += " \
    ${X11_IMAGE_INSTALL} \
    ${X11_IMAGE_INSTALL_GRAPHICS} \
    ${DFB_IMAGE_INSTALL} \
    ${WAYLAND_IMAGE_INSTALL} \
    ${MM_IMAGE_INSTALL} \
    packagegroup-fsl-tools-bluetooth \
    packagegroup-fsl-tools-gpu \
    packagegroup-fsl-tools-gpu-external \
    packagegroup-fsl-tools-testapps \
    packagegroup-fsl-tools-benchmark \
    "
export IMAGE_BASENAME = "fsl-image-gui"


Change to ========>>

IMAGE_INSTALL += " \
    packagegroup-fsl-tools-bluetooth \
    "
export IMAGE_BASENAME = "fsl-image-gui"

 

少了200M多

-rw-r--r-- 1 xuerui xuerui 844M 12月 30 12:27 fsl-image-gui-imx6ulevk-20151230030257.rootfs.sdcard
-rw-r--r-- 1 xuerui xuerui 624M  1月 25 15:55 fsl-image-gui-imx6ulevk-20160125075030.rootfs.sdcard

 

以下內容來源於百度文庫,沒注明出處,侵權請告知

一、編譯內核
得到bzImage
二、定制文件系統
1、創建ramdisk虛擬空間,用來放置文件系統
命令 # mke2fs –m 0 –I 2000 /dev/ram0
注釋:mke2fs將會自動判斷設備容量的大小並相應的配置自身,-m 0參數防止它給root保留空間,這樣會騰出更多有用的空間。
2、掛載剛才創建的虛擬盤,我這里掛載在/mnt/floppy目錄下
命令 # mount –t ext2 /dev/ram0 /mnt/floppy
3、創建文件系統必須目錄
命令 # cd /mnt/floppy
# mkdir dev proc etc bin sbin lib mnt usr
4、確定/dev目錄下我們需要的設備文件
方案一、把現有/dev目錄中所有設備文件拷貝過來,然后刪除不必要的設備文件(不推薦使用)
命令:# cp –dpR /dev /mnt/floppy/dev
注釋:該命令會拷貝整個設備目錄但不拷貝文件內容,同時dpR開關保證連接文件仍然不變,不會拷貝連接指向原來文件,而且屬性不變。如果沒有SCSI設備,刪除所有以sd開頭的設備文件,如果不使用串口設備,刪除所有以cua開頭的文件,然后保留一些必要的設備文件。
方案二、只拷貝必要的設備文件:
console —— 控制台設備
tty* —— 由控制台管理的虛擬終端
ram —— 虛擬內存盤設備(以后我們的系統將運行在虛擬盤中)
null —— 空設備,非常有用的字符設備文件,送入這個設備的所有東西將被忽略。如果將任何程序的輸出結果重定向到/dev/null,則看不到任何輸出信息,因此腳本中常用它來消除本該顯示在屏幕上的其他信息
zero —— 零設備,只會得到空的內容,有時為了提高壓縮率,需要對某空間全零填充時需要使用該設備
inintrd —— 特殊的字符設備,被用來從用戶空間向系統內核發送切換運行級別的信息,屬於一個虛擬字符設備。 
fd 0 —— 軟盤設備
hd 0 —— 硬盤設備(該項不是必須,如果您想掛載硬盤,請選擇該項)
命令:# cp –dpR /dev/console /mnt/floppy/dev
# cp –dpR /dev/tty* /mnt/floppy/dev
# cp –dpR /dev/ram /mnt/floppy/dev
注釋:如果要使用多個虛擬盤,可以相應的將ram1,ram2,……等拷貝過來
# cp –dpR /dev/null /mnt/floppy/dev
# cp –dpR /dev/zero /mnt/floppy/dev
# cp –dpR /dev/initrd /mnt/floppy/dev
6、 確定/etc目錄中所需要的系統配置文件
a) rc.d/* —— 系統啟動所需要的腳本
b) fstab —— 列出要登陸的文件系統,
c) inittab —— 包含啟動過程參數
先直接拷貝系統/etc目錄下的以上配置文件
命令 # cp –R /dev/rc.d/* /mnt/floppy/dev/
# cp /dev/fstab /mnt/floppy/dev/
# cp /dev/inittab /mnt/floppy/dev/
然后修改啟動配置腳本,用vi或者kwrite等文本編輯工具打開/dev/rc.d/rc文件
# cd /mnt/floppy/dev/rc.d/
# vi rc
修改rc文件為以下內容:
#!/bin/sh
bin/mount -av 
/bin/host name fallso
修改fstab文件內容為以下內容:
/dev/ram0 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /prco proc defaults
修改inittab文件內容:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
7、 確定/bin是和/sbin目錄包含的命令文件
a) ls ——文件目錄陳列,相當於dos的dir
b) mv —— 
c) cat —— 
d) init —— 
e) mingetty ——
f) login —— 登陸命令
g) mount —— 掛載設備命令
h) umount —— 卸載設備命令
命令:# cp /bin/ls /mnt/floppy/bin
# cp /bin/cat /mnt/floppy/bin
# cp /bin/mv /mnt/floppy/bin
# cp /bin/login /mnt/floppy/bin
# cp /bin/mount /mnt/floppy/bin
# cp /bin/umount /mnt/floppy/bin
# cp /sbin/init /mnt/floppy/bin
# cp /sbin/mingetty /mnt/floppy/bin
8、 確定/lib目錄下所需要的共享函數庫,如果缺少必要的函數庫,系統會自動停止啟動或出現一些錯誤信息提示。
a) 列出所有程序需要使用的libc庫
命令:# cd /bin
# ls –l /lib/libc* 
-rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so* 
lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*
拷貝箭頭右邊所指文件
如 cp –dpR /lib/libc-2.1.so* /mnt/floppy/lib
b)察看每一個程序所使用的函數庫
命令:# ldd /sbin/mke2fs
libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000) 
libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) 
libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) 
libc.so.6 => /lib/libc.so.6 (0x4002c000) 
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
拷貝箭頭右邊的函數庫
如cp –dpR/lib/ld-linux.so.2 /mnt/floppy/lib
9、 關於其他目錄,以下目錄在軟盤版linux中完全可以為空
a) /proc是一個虛擬的文件系統,用來傳輸資料給核心程序的目錄,可以觀察這些特殊的文件在內存中運行的信息;
b) /usr目錄下包含系統運行的所有程序,用戶經常用到的一些數據和一些配置數據,該文件系統為只讀,以減少系統癱瘓的危險性
c) /mnt 掛載其他設備的臨時目錄
10、卸載虛擬盤,拷貝、壓縮文件系統
命令:# umount /mnt/floppy
# dd if=/dev/ram0 bs=1k |gzip –v9>roofs.gz
注釋:壓縮后在/root下得到一個壓縮的根文件系統,檢查它是否超過了1.44M,如果超過還得從頭再來。

三、 引導程序
裁剪后所得內核大小為850KB,壓縮后文件系統大小為1.2M,二者之和大於1.44M,顯然超過了軟盤容量,所以本軟盤版linux采用兩張軟盤,第一張盤放置內核及啟動引導程序,第二張盤放置壓縮的文件系統。系統啟動過程如下:
由於linux內核無法自己引導,故在系統啟動時需要引導器來加載系統內核。通常的我們使用LILO,即the LInux LOader。
微機加電后,基於x86 CPU構架的特性,CPU將去檢測執行地址為FFFF0處存儲的跳轉指令,跳轉到較低的地址。接着BIOS就會做一系列的檢查操作。這一過程即POST(Power On Self Test)。最后BIOS結束自檢,接着讀取第一個啟動設備的啟動信息。一般的是從硬盤啟動,但本系統基於軟盤,因此,BIOS將從軟盤的啟動扇區讀取系統啟動信息,這里即為LILO的引導部分內容,並將控制權交給LILO。
LILO接管系統后將完成信息的顯示、操作系統的選擇(對多系統共存而言,在這里直接運行軟盤上的Linux)、內核啟動參數的傳遞,然后加載/etc/lilo.conf中對應的內核映像文件,最后將控制權交給加載到系統中的內核映像。
當軟盤上的Linux的內核被LILO加載到內存后,開始掌握控制權。由於Linux的內核是壓縮存儲的,所以首先進行的是自解壓操作。然后內核將開始檢測系統硬件,並配置相應的驅動程序,同時在系統控制台上輸出相應結果信息。接下來內核將掛載並檢測根文件系統。若掛載成功,內核將在系統后台啟動系統的第一個進程init進程。至此,內核加載過程結束。
接下來由init進程根據/etc/inittab中的信息完成Linux系統的初始化操作。本系統裁剪掉了許多不必要的服務,故而只進行下列初始化操作。
init停止在console,按inittab指示打開一個shell或者開getty+login這樣用戶就可以看到輸入用戶名的提示符,至此進入系統操作,完成整個系統引導過程。
創建軟盤版linux引導程序的步驟如下:
1、 在第一張軟盤上標記:系統引導及內核,然后插入軟驅,執行命令
a) # mke2fs –N 24 –m 0 /dev/fd0
注釋:將軟盤格式化為具有24個信息節點、ext2類型的文件系統
b) # mount –o dev /dev/fd0 /mnt
注釋:掛載軟盤到/mnt目錄
c) # mkdir /mnt/boot
注釋:創建啟動盤的boot目錄
d) # mkdri /mnt/dev
注釋:創建啟動盤的dev目錄
e) # cp –R /dev/null /mnt/dev
注釋:拷貝空設備到軟盤
f) # cp –R /dev/fd0 /mnt/dev
注釋:拷貝軟盤設備到目標系統的/dev目錄下
g) # cp /boot/boot.b /mnt/boot
注釋:拷貝啟動映像文件到目標系統/dev目錄下
h) # cp /boot/bzImage /mnt/boot
注釋:拷貝內核到目標系統的/boot目錄下
i) # rdev –r /mnt/bzImage 49152li
2、 創建修改lilo.conf文件
a) # cp /etc/lilo.conf /mnt
b) 打開lilo.conf,修改為以下內容:
boot=/dev/fd0
install=/boot/boot.b
map=/boot/map
read-write
backup=/dev/null
compact
image=/bzImage
label=Linux
root=/dev/fd0
3、 將引導裝入程序復制到軟盤
命令:# lilo –v C lilo.conf –r /mnt
4、 卸載第一張軟盤
命令:# umount /mnt
5、 將第二張軟盤標記為:文件系統。插入軟驅,拷貝壓縮后的文件系統
a) # mke2fs –i8192 –m 0 /dev/fd0
注釋:-i8192表示每8192位創建一個信息節點
b) # mount /dev/fd0 /mnt
注釋:掛載軟盤到/mnt目錄
c) # cp /root/rootfs.gz /mnt
注釋:拷貝文件系統到軟盤
d) # umount /mnt
注釋:卸載軟盤
6、 重新啟動電腦,進入bios設置“first boot device”為“boot from floppy disk”。測試軟盤版linux系統是否能夠運行。
將1號軟盤插入軟驅,重新啟動電腦,看到屏幕上出現“lilo loading linux”,然后是一大堆的系統硬件初始化信息,引導內核后,最后看到以下提示VFS:Insert root floppy disk to be loaded into RAM disk an press ENTER
[見圖一]
插入第二張軟盤:裝載文件系統
[見圖二]
不知何故,我在插入第二張軟盤后,看到如下提示:
RAMDISK:Ext2 filesystem found at block0
RAMDISK:Loading 1440 block[1disk]into ram disk done
VFS Mounted root(ext2 filesystem)
Freeing unused kernel memory:84K freed
Warining:unable to open an initial console
Kernel panic:No init found .Try passing init=option to kernel
7、 將軟盤插在其他機器的軟驅中,測試軟盤版linux系統是否具有移植性。



呼~。。今天忙了一天,光裁剪根文件系統了。
一個1G多的文件系統,被我剪剪剪 ,成了30M了,但是還是嫌大,最理想是10M以內。
但是我真覺得沒法再剪了。



bin/的東西,比較重要,只刪了些不常見的命令、
lib/有很多gcc的庫,也得小心刪減,一裁了不該裁的,系統就起不來了。。
usr/東西特別多
usr/bin/,usr/lib/,可以刪掉絕大部分,留下幾個用到的就可以了
usr/share/里好多東西,刪刪刪,使勁刪,基本都刪光了。
root/modules/里,很多需要加載的.ko模塊,也可以刪,只剩下core,sys,os的幾個.ko。
var/里面也可以刪很多東西,留下一個var/log/dmesg和var/run/utmp。
dev/里的東西也可以刪,只要留下console和ttySA0就可以了。
etc/也可以刪一些不重要的腳本。



就這樣,只剩下了一個恐龍骨架~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM