SD卡分割槽及rootfs燒錄的一些理解和筆記
一、前言
最近在omapl138平臺移植完uboot和linux核心後,對核心掛載根檔案系統的這個過程一直是雲裡霧裡,再加上對檔案系統沒有深入的理解,就更雲裡霧裡了,因為omapl138支援MMC啟動,所以先通過使用linux下fdisk工具對SD卡進行分割槽,然後分配uboot、kernel和根檔案系統的位置,加深理解。
二、準備工作
想想Windows下的的C、D..盤,其物理磁碟實為一張物理磁碟,只不過我們使用分割槽工具把一張物理磁碟在作業系統之上分出了CDE盤,其目的也是為了方便管理,如C盤放作業系統,D盤存放遊戲,E盤..。
在嵌入式系統中也是一樣,一張SD卡也需要存放不同的資料,bootloader、kernel、環境變數、rootfs等。
我是這樣規劃SD卡資源分配的:
0~2047扇區: uboot_spl和uboot
2048~10240扇區: kernel
10241~7995391扇區 rootfs(ext3)
首先將SD卡插入SD卡槽(筆記本自帶),linux下執行
cat /proc/partitions
檢視mtd分割槽,可知mmcblk0即為SD卡,接下來將使用fdisk對SD卡進行分割槽
三、fdisk對SD卡分割槽
執行 fdisk /dev/mmcblk0
M回車檢視command
輸入 n
P
1
咦,為何2048扇區以前的扇區號不能被fdisk分割槽呢?這是個歷史原因:bios中啟動方式 legacy被efi啟動代替而褪去,(沒有完全死掉),EFI引導模式需要特殊的引導系統,它使用efi系統去引導,最早要為efi引導程式碼留出1Mb的空間,現代的分割槽工具 fdisk 隨著也這樣做了
輸入起始扇區和結束扇區,完成了新增第一個分割槽,該分割槽佔用的空間為SD卡第2048~10240扇區共4M,用來存放kernel image。繼續按照上述步驟新增第二個分割槽,新增完成後執行w儲存退出fdisk。
再次檢視dev下的裝置節點,猶記的在使用fdisk分割槽前,dev目錄下是沒有mmcblkp1和mmcblkp2的,這就說明我們剛才的分割槽成功了,不信再執行一次
cat /proc/partitions
可以看出mmcblk、mmcblkp1、mmcblkp2的主裝置號均為179,次裝置號分別為1、2、3。
四、燒錄uboot、kernel 、rootfs
- 燒錄spl uboot
dd if=u-boot-spl.ais of=/dev/mmcblk0 seek=10
dd if=u-boot.img of=/dev/mmcblk0 seek=181
將u-boot-spl.ais燒錄到SD卡第10扇區,u-boot.img燒錄至第181扇區
- 製作ext3檔案系統
Linux核心支援多種檔案系統,想象一下我們的U盤格式化時是否有選擇檔案系統這一項,是的,windows系統之所以識別出U盤中儲存的檔案,是因為windows支援U盤上的檔案系統,加入你把U盤格式化成一塊磚頭,windows就識別不出來了,只能先將其格式化成windows可識別的檔案系統後,再重新將檔案拷入U盤,繼續使用。
同理,沒有格式化的SD卡就是一塊磚,沒有檔案系統,核心是無法掛載進行檔案操作的,故我們需要先將mmcblkp2格式化為ext3檔案系統,然後將根目錄下需要的一切檔案拷貝進去,即完成了根檔案系統的製作。
mount -t ext3 /dev/mmcblk0p2 /opt/
cp /study/QemuLearn/rootfs/* /opt/ -rf
umount /opt/
至此,一張可以啟動的SD卡製作完畢