根檔案系統製作(二)

2022-06-19 02:06:14 字數 3781 閱讀 8321

在前面已經把根檔案系統所需要的檔案、目錄全部都製作好了,接下來討論如何把它移植到嵌入式系統開發板上。

下面仍以碩數公司的s3c2416核心板為例來進行討論,通過使用製作好的mtd.utils工具來對根檔案系統進行移植。

首先參考前面的方法,使用sd卡把開發板啟動起來,啟動完成後執行「cd /opt/mtd-utils」進入該目錄,可以看到該目錄下就有製作好的mtd.utils工具。使用sd卡啟動起來後的根檔案系統是基於ramdisk的,它並沒有使用nandflash,所以完全可以使用mtd.utils工具來直接在nandflash上製作ubifs格式的根檔案系統,下面就來討論一下製作方法。

為了方便操作,可先把前面製作好的根檔案系統打成乙個包,在虛擬機器下進入到根目錄,然後執行「tar -zcvf rootfs.tar.gz /rootfs」,其中rootfs.tar.gz是要生成的打包檔案,「/rootfs」是根檔案系統所在的目錄。完成後就會在根目錄下生成rootfs.tar.gz檔案,把這個檔案拷貝到用於啟動開發板的sd卡上,就可以進行移植了。接著使用這張sd卡把開發板上的linux啟動進來,然後進入到/opt/mtd-utils目錄下,按以下步驟進行操作。

首先執行「./flash_eraseall /dev/mtd2」,把根檔案系統所在分割槽的內容全部擦除掉。其中,flash_eraseall是mtd-utils目錄下的乙個可執行程式,「/dev/mtd2」指的就是根檔案系統所在的分割槽(mtd0為uboot分割槽、mtd1為kernel分割槽)。然後執行「./ubiattach /dev/ubi_ctrl -m 2」,同樣ubiattach也是乙個可執行程式,它用於鏈結mtd裝置(mtd裝置描述原始flash裝置)到ubi並且建立相應的ubi裝置(相反的程式是ubidetach)。其中「/dev/ubi_ctrl」是乙個裝置節點檔案,如果沒有可執行「mknod /dev/ubi_ctrl c 10 63」來建立它,「-m 2」是指attach的是mtd2分割槽。ubiattach執行完後的效果如下圖所示。

完成後接著執行「./ubimkvol /dev/ubi0 -n rootfs -s 100mib」,同樣ubimkvol也是乙個可執行程式,它用於建立乙個卷(相反的程式是ubirmvol),卷才是終端使用者掛載檔案系統的地方,其中「/dev/ubi0」也是乙個裝置節點,它是在執行上一步ubiattach時被建立出來的,「-n」是後面跟的是此卷的名稱,「-s」後面跟的是大小。ubimkvol執行完後的效果如下圖所示。

完成後就可以執行掛載命令了。先執行「mkdir -p /tmp/nand」建立乙個掛載點,然後執行「mount -t ubifs /dev/ubi0_0 /tmp/nand」進行掛載,其中「/dev/ubi0_0」是乙個裝置節點,它是在執行上一步ubimkvol時被建立出來的,「-t ubifs」是指掛載的檔案系統為ubifs形式,掛載完後的效果如下圖所示。

至此,操作/tmp/nand目錄就是操作根檔案系統分割槽mtd2了,這就方便多了,下一步只需要把前面製作好的根檔案系統拷貝過來即可。

執行「cd /mnt/sd」進入到sd卡的目錄,確認一下rootfs.tar.gz檔案存在(若沒有內容可能需要重新掛載下sd卡),然後執行「tar -zxvf rootfs.tar.gz -c /tmp/nand」,「-c」是指把根檔案系統解壓到後面的「/tmp/nand」目錄下。完畢後就可進入到「/tmp/nand」目錄下檢視一下,可見多了乙個rootfs的目錄,這就是解壓後的目錄,進入該目錄就可以看到前面製作的根檔案系統的目錄和檔案了。當然,製作好的根檔案系統rootfs目錄也可以通過nfs方式進行拷貝,這樣就省去了打包和解壓的過程,只不過在拷貝時要加上引數「-d」,以避免在拷貝過程中busybox的鏈結檔案被破壞。

完成後還需要把根檔案系統移動一下,因為前面在掛載ubi0_0(ubifs卷)時是掛載到「/tmp/nand」目錄下的,而目前在nand目錄下還多出了乙個rootfs的目錄,所以需要執行一下命令「mv /tmp/nand/rootfs/* ../」,把rootfs下的所有檔案和目錄都移動到nand目錄下(即rootfs分割槽下),然後再執行「rm -fr /tmp/nand/rootfs」把rootfs目錄刪除。最後執行「sync」命令同步一下nandflash即可。

上述全部完成後,可執行「umount /tmp/nand」命令進行反掛載,然後執行「poweroff」關機命令,完成後給開發板斷電,去除sd卡並跳線到nandflash啟動,隨後給開發板上電。可看到啟動完成後,開發板就進入到了console介面,且從中可以看到,基於ubifs的根檔案系統已經掛載成功了。插入一張sd卡,然後再拔出,再插入乙個u盤,然後再拔出,從顯示中可以看出,都實現了外儲存器的自動掛載和反掛載,執行ls命令,可看到整個完整的根檔案目錄,如下圖所示。

至此,整個基於ubifs的根檔案系統移植完畢。

當然,除了直接在nandflash上製作根檔案系統之外,也可能通過映像燒寫的方式來製作ubifs格式的根檔案系統,這同樣需要借助mtd-utils工具來實現。下面就來討論一下這種方法。

要製作根檔案系統映像,需要mkfs.ubifs和ubinize兩個工具,其中mkfs.ubifs是用來將某個資料夾製作為ubifs映像檔案的,製作出的映像可在u-boot下使用「ubi write」命令燒寫到nandflash上。但是,一般的u-boot都不具備這個命令,因此還需要使用ubinize這個工具來把剛才生成的ubifs映像檔案轉換成為通用的、可直接燒寫在nandflash上的格式(帶有ubi檔案系統映象卷標)。下面就具體來看。

首先使用mkfs.ubifs工具將根檔案系統目錄rootfs製作成ubifs映像,執行以下命令:

mkfs.ubifs -r /rootfs -m 2048 -e 126976 -c 992 -o ubifs.img

以上命令將/rootfs目錄內容製作成ubifs形式的映像檔案,檔名為ubifs.img。其中,引數「-r」指定了根檔案系統所在的目錄,引數「-m」指定了最小i/o操作的大小,也就是nandflash中乙個頁(page)的大小,引數「-e」指定了邏輯擦除快的大小,引數「-c」指定了最大的邏輯塊號,引數「-o」指定輸出檔案的名稱。

接下來使用ubinize工具把剛才生成的ubifs.img映像檔案轉換成為通用的flash燒寫格式,執行以下命令:

ubinize -o ubi.img -m 2048 -p 128kib -s 512 -o 2048 ubinize.cfg

上述命令中的ubinize.cfg是乙個配置檔案,其內容如下:

[ubifs]

mode=ubi

image=ubifs.img

vol_id=0

vol_size=100mib

vol_type=dynamic

vol_alignment=1

vol_name=rootfs

vol_flags=autoresize

該檔案指明了要轉換檔案的名稱及其他一些配置引數。其生成的ubifs形式的根檔案系統映像ubi.img就可在u-boot下使用通用的「nand write」命令來進行燒寫了。

在以上操作中要說明兩點:一是兩個工具命令mkfs.ubifs和ubinize都是mtd-utils下的可執行程式,但由於此時是在虛擬機器下使用,所以在製作該命令時不要進行交叉編譯,否則mkfs.ubifs和ubinize只能執行在arm開發板系統下;二是命令使用中涉及到的引數要根據開發板所使用的nandflash來具體確定。如果弄不清楚,還是推薦使用前面直接在nandflash上建立根檔案系統的形式進行移植。

最小根檔案系統製作

一 移植busybox make menuconfig busybox settings build options build busybox as a static binary no shared libs 是否編譯成靜態庫,在這裡我沒選,使用動態庫 busybox library tunin...

最小根檔案系統製作

一 移植busybox 所謂製作根檔案系統,就是建立各種目錄,並且在裡面建立各種檔案。對於建立乙個最下根檔案系統,只需要在 dev目錄下建立必要的裝置節點 在 etc目錄下建立一些配置檔案就可以了,如果busybox使用動態鏈結庫,那還要在 lib目錄下包含庫檔案。busybox支援uclibc庫和...

Linux根檔案系統製作

本文介紹如何構linux根檔案系統,適用於arm32開發板。1 建立根目錄rootfs,這個目錄就是要移植到mini2440開發板的目錄 mkdir rootfs 2 進入rootfs並建立目錄bin dev etc usr lib sbin proc usr bin usr sbin usr li...