在嵌入式Linux開(kāi)發(fā)中,文件系統(tǒng)的打包和鏡像制作是關(guān)鍵步驟。本文介紹了Linux核心板文件系統(tǒng)的打包與鏡像制作方法,適合嵌入式開(kāi)發(fā)人員快速上手。
前言
致遠(yuǎn)電子Linux核心板提供的系統(tǒng)固件里,除了鏡像文件之外,通常還會(huì)提供文件系統(tǒng)壓縮包。鏡像文件可以直接用于燒寫(xiě)到目標(biāo)板,而文件系統(tǒng)壓縮包則可以進(jìn)行部分修改,修改后重新制作鏡像文件燒寫(xiě)。
這里只講直接用編譯好的二進(jìn)制文件對(duì)文件系統(tǒng)打包的問(wèn)題。一般來(lái)說(shuō),如果自己能從源碼開(kāi)始編譯文件系統(tǒng),打包文件系統(tǒng)也不會(huì)存在什么問(wèn)題。
?rootfs打包
解開(kāi)壓縮包,可以看到通常包含如下目錄。
/bin /boot /dev /etc /home /lib /media /opt /proc /root /sbin /tmp /usr /var
對(duì)根文件系統(tǒng)進(jìn)行修改后,再次打包成鏡像文件,由于沒(méi)有了buildroot這樣的自動(dòng)化文件系統(tǒng)制作工具,這就需要特別注意:
- 打包文件系統(tǒng)時(shí)的目錄位置、權(quán)限等,要用root權(quán)限打包,普通用戶(hù)打包會(huì)出現(xiàn)錯(cuò)誤,文件系統(tǒng)不完整。不能將Linux下的tar包解壓在Windows格式的硬盤(pán)并打包。
對(duì)于文件系統(tǒng)打包位置問(wèn)題,舉個(gè)例子:
$?cd?myrootfs
$?ls
$?/bin /boot /dev /etc /home /lib /media /opt /proc /root /sbin /tmp /usr /var
$?sudo tar cvf ../myrootfs.tar * ? ?#將當(dāng)前文件系統(tǒng)全部文件打包到上一級(jí)目錄
制作UBI文件系統(tǒng)鏡像
使用UBI文件系統(tǒng)時(shí),有ubifs.img和ubi.img兩種不同鏡像。其中ubifs.img用于U-Boot下燒寫(xiě),而ubi.img鏡像則用于進(jìn)入Linux系統(tǒng)后的更新。
1. 制作ubi燒寫(xiě)鏡像
制作ubi鏡像的工具為mkfs.ubifs,有下列參數(shù):
-r:制定文件內(nèi)容的位置;
-m:頁(yè)面大小;
-e:邏輯擦除塊大??;
-p:物理擦除塊大??;
-c:最大的邏輯擦除塊數(shù)量;
-s:最小的硬件輸入輸出頁(yè)面大小,如:k9f1208為256。
特別提示,頁(yè)面大小等參數(shù)要根據(jù)內(nèi)核加載Flash分區(qū)時(shí)ubifs輸出的信息一致,否則不能啟動(dòng)系統(tǒng)。
示例:
$?sudo mkfs.ubifs -r rootfs -m 2048 -e 129024 -c 1948 -o ubifs.img
2. 制作ubifs鏡像
制作ubifs鏡像用到的工具為ubinize。例:
$?sudo ubinize -o ubi.img -m 2048 -s 512 -p 131072 ubifs.conf
ubifs.conf的內(nèi)容如下:
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=200MiB
vol_type=dynamic
vol_name=rootfs ? ? ? ? ? ? ? ?#建議與uboot創(chuàng)建的卷標(biāo)一致
vol_alignment=1
vol_flags=autoresize
進(jìn)入Linux后可通過(guò)ubiformat命令燒寫(xiě)ubi.img,例如:
#?ubiformat /dev/mtd4 -s 512 -f ubi.img
制作 Ext4文件系統(tǒng)
制作Ext4文件系統(tǒng),一般方法是先準(zhǔn)備好根文件系統(tǒng)內(nèi)容,然后創(chuàng)建一個(gè)鏡像文件,格式化成Ext4格式,然后將鏡像文件掛載到一個(gè)目錄并復(fù)制根文件系統(tǒng)的內(nèi)容到里面,之后卸載,最后進(jìn)行一些處理。
$sudo?mkdir?fs?
$sudo?dd?if=/dev/zero of=fs.img bs=1M count=4096?#創(chuàng)建初始大小的鏡像文件
$sudo?mkfs.ext4 fs.img ? ? ? ? ? ? ? ? ? ? ? ? ??#格式化鏡像文件為Ext4文件系統(tǒng)
$sudo?mount fs.img fs/ ? ? ? ? ? ? ? ? ? ? ? ? ??#掛載鏡像文件到fs目錄
$sudo?cp?-rfp myrootfs/* fs/ ? ? ? ? ? ? ? ? ? ??#復(fù)制根文件系統(tǒng)文件
$sudo?umount fs/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??#卸載
$sudo?e2fsck -p -f fs.img ? ? ? ? ? ? ? ? ? ? ? ?#檢查文件系統(tǒng)分區(qū)是否正常
$sudo?resize2fs -M fs.img <blk-size> ? ? ? ? ? ??#調(diào)整文件系統(tǒng)鏡像大小
也可以寫(xiě)成腳本將幾步操作合成一步操作,例如MX2000文件系統(tǒng)制作腳本內(nèi)容如下:
#!/bin/bash
OUTPUT_FILE=data.ext4
TARGET_DIR=./usrdata/
ROOTFS_EXT4_REV=1
ROOTFS_EXT4_LABEL="data"
ROOTFS_EXT4_SIZE=3069
ROOTFS_EXT4_SIZE_MB=${ROOTFS_EXT4_SIZE}M
ROOTFS_EXT4_INODES=0
ROOTFS_EXT4_RESBLKS=5
ROOTFS_EXT4_MKFS_OPTIONS="-O ^64bit -O ^has_journal"
dd?if=/dev/zero of=${OUTPUT_FILE}?bs=1M count=${ROOTFS_EXT4_SIZE}
mke2fs -d?${TARGET_DIR}?
? ? -r?${ROOTFS_EXT4_REV}?
? ? -N?${ROOTFS_EXT4_INODES}?
? ? -m?${ROOTFS_EXT4_RESBLKS}?
? ? -L?"${EXT4_LABEL}"?
? ??${EXT4_MKFS_OPTS}?
??${OUTPUT_FILE}