在 x86 Linux 修改 ARM Linux 的 Root File System (RFS)

要做到在 X86 Linux 系統上,修改 ARM Linux 系統的 RFS (例如在 RFS 上新增安裝或移除軟體),則需要在 X86 Linux 系統上,模擬執行 ARM Linux 系統。
要在 X86 Linux 系統模擬執行 ARM Linux 系統,則需要依賴 QEMU(Quick Emulator) 工具,並搭配 chroot 指令來完成。

先安裝 QEMU 模擬器:
$ sudo apt-get update
$ sudo apt-get install qemu-user-static

接下來的步驟為:
1、掛載 ARM Linux RFS,並進行檔案複製。
2、切換到 ARM Linux RFS 環境。
3、修改 ARM Linux RFS。
4、切換回 x86 Linux 環境。
5、建立空的 RFS image。
6、將修改過 ARM Linux RFS 複製到新建立的 RFS image。
7、修復並縮小 RFS image,完成。
(5-7、可以簡化為:將修改過 ARM Linux RFS 直接製作為 RFS image。)
8、檢查檔案格式,並燒錄。

 

 

1、掛載 ARM Linux RFS,並進行檔案複製
將原本的 ARM RFS image(rfs.img) 掛載到 資料夾(RFS_mount/):
$ mkdir RFS RFS_mount
$ sudo mount rfs.img RFS_mount

複製資料夾(RFS_mount/) 的全部內容 到 資料夾(RFS/) 後,御除掛載資料夾(RFS_mount/):
$ sudo cp -rfp RFS_mount/* RFS/
$ sudo umount RFS_mount/

cp 指令的選項:
-R, -r, --recursive: copy directories recursively.
-f, --force: if an existing destination file cannot be opened, remove it and try again.
-p: same as --preserve=mode,ownership,timestamps.,也就是保留檔案的使用模式、owner、及時間標記。
--preserve[=ATTR_LIST]: preserve the specified attributes (default: mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all

 

2、切換到 ARM Linux RFS 環境
借用目前 X86 Linux 系統的 /proc/, /sys/ 及 dev/ 到 ARM Linux 的 RFS 資料夾(RFS/) :
$ sudo mount -t proc /proc RFS/proc
$ sudo mount -t sysfs /sys RFS/sys
$ sudo mount -o bind /dev RFS/dev

執行 chroot 指令來切換到 ARM Linux 的 RFS 環境:
$ sudo chroot RFS/

mount 指令的選項:
-t, --types fstype: The argument following the -t is used to indicate the filesystem type.,也就是指令掛載的類型。
-o, --options opts: Use the specified mount options.,也就是以 opts 來執行 mount 的動作,以 bind 來說,就是為了能夠實現掛載資料夾到另一個資料夾的功能。

chroot 指令的功能是可以切換到另一個 RFS 環境下,執行指令或是啟動互動式 shell 介面:
chroot - run command or interactive shell with special root directory

 

/dev、/proc、/sys 這三個資料夾都是只存在於記憶體上的,在開機時,才一一建立。

/dev 是一個裝置(device)檔案,在 Linux 系統上,任何裝置與周邊設備都是以檔案(設備節點)的型態存在於 /dev 當中的。
只要透過存取 /dev 底下的某個檔案,就等於存取某個裝置,例如查看 dev/video8 設備節點的主次設備號:
ls -l /dev/video8
比較重要的檔案有 /dev/null、/dev/zero、/dev/tty、/dev/loop*、/dev/sd* 等。

/proc 是一個特別的動態資料夾,用以維護系統訊息和狀態,套件括正在執行的程序(processes)的訊息,是一個虛擬檔案系統(virtual filesystem)。
裡面的資料都是在記憶體當中,例如系統核心、行程資訊(process)、周邊裝置的狀態及網路狀態等等。
比較重要的檔案有 /proc/devices、/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/ioports、/proc/net/* 等。

/sys 是一個 系統(system)檔案,主要也是記錄核心與系統硬體資訊較相關的資訊。
包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。
/sys/dev                block,char 主次設備號
/sys/bus/xxx (各種總線)      device,driver註冊到不同的總線:platform、i2c、usb...
                        (uevent:driver、device 匹對的名字)
/sys/devices (源頭)      記錄系統所有的設備 (struct devices)
/sys/class/<類名>/xxx    分類查看驅動信息

 

3、修改 ARM Linux RFS
以安裝 qtcreator 來舉例,在 ARM Linux 的 RFS 環境下,執行以下指令:
# apt-get update
# apt-get install build-essential
# apt-get install qtcreator
# apt-get install qtbase5-dev
# qmake -v

 

4、切換回 x86 Linux 環境
執行 exit 指令退出 ARM Linux 環境:
# exit

復原 ARM Linux RFS 資料夾(RFS/) 的環境,umount 資料夾內的 /proc/, /sys/ 及 dev/ :
$ sudo umount RFS/proc
$ sudo umount RFS/sys
$ sudo umount RFS/dev

 

5、建立空的 RFS image
執行 dd 指令來製作新的 RFS image(rfs_new.img),下例的 image 容量為 4096 MB,實際依 RFS/ 的大小來決定。:
dd if=/dev/zero of=rfs_new.img bs=1M count=4096

執行 mkfs.ext4 指令將 image(rfs_new.img) 轉換為 ext4 檔案系統格式:
mkfs.ext4 rfs_new.img

 

6、將修改過 ARM Linux RFS 複製到新建立的 RFS image
將新的 RFS image(rfs_new.img) 掛載到 資料夾(RFS_mount/):
sudo mount  rfs_new.img RFS_mount

將 資料夾(RFS/) 的全部內容 到 資料夾(RFS_mount/):
sudo cp -rfp RFS/* RFS_mount/

御除掛載資料夾(RFS_mount/):
$ sudo umount RFS_mount/

 

7、修復並縮小 RFS image
執行 e2fsck 指令來檢查RFS image(rfs_new.img):
e2fsck -f -p rfs_new.img

執行 resize2fs 指令來調整 RFS image(rfs_new.img) 的容量為最小,以加快傳送及燒錄速度:
resize2fs -M rfs_new.img

e2fsck 指令的選項:
-f: Force checking even if the file system seems clean.
-p: Automatically repair ("preen") the file system.

resize2fs 指令的選項:
-M: Shrink the file system to minimize its size as much as possible, given the files stored in the file system.

 

第 5、6、7 步驟可以整合為一個步驟,也就是,將修改過 ARM Linux RFS 直接製作為 RFS image
查看修改過的 ARM Linux RFS 的容量:
$ sudo du -sh -m RFS/
   2430     RFS/

執行 dd 指令來製作新的 RFS image(rfs_new.img),image 容量依 ARM Linux RFS 的容量來判斷,為 2430 MB + 300 MB = 2730 MB:
dd if=/dev/zero of=rfs_new.img bs=1M count=0 seek=2730

在製作為 RFS image 時,直接指定修改過的 ARM Linux RFS:
$ sudo mkfs.ext4 -d RFS rfs_new.img

du 指令的選項:
-s, --summarize: display only a total for each argument
-h, --human-readable: print sizes in human readable format (e.g., 1K 234M 2G)
-m: like --block-size=1M

dd 指令的選項:
seek=N: skip N obs-sized blocks at start of output

 

8、檢查檔案格式,並燒錄
可以以 file 指令來查看檔案格式:
$ file rfs_new.img
rootfs.img: Linux rev 1.0 ext4 filesystem data, UUID=adfdf259-8b8d-466c-8ef1-08ac874fdeb1 (extents) (64bit) (large files) (huge files)

如果裝置有支援雙系統的話,也可以在該裝置上以 dd 指令直接燒錄(以 mmcblk0p6 為 output 磁區):
$ sudo dd if=rfs_new.img of=/dev/mmcblk0p6 bs=4M && sync

 

 

 

Reference

RK3288 Debian/Ubuntu系统rootfs镜像定制打包

在 x86 下 chroot 到 ARM 平台的 rootfs

透過 binfmt_misc 讓 Linux 可以執行不同格式的執行檔

How to Write and Run your first Qt Program in Debian 10

 

 

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 silverwind1982 的頭像
    silverwind1982

    拾人牙慧

    silverwind1982 發表在 痞客邦 留言(0) 人氣()