當(dāng)前位置:首頁 > 學(xué)習(xí)資源 > 講師博文 > stm32mp1 linux最小根文件系統(tǒng)制作教程—(基于stm32mp157開發(fā)板實(shí)操)
有用戶反饋,關(guān)于stm32mp1,ST官方提供的系統(tǒng)太龐大,開機(jī)速度慢,占用空間大;谶@個(gè)問題,我們整理了Linux5.4.31最小根文件系統(tǒng)的鏡像及對應(yīng)教程,希望對stm32mp157開發(fā)板使用的用戶有所幫助。
1. 根文件系統(tǒng)開發(fā)實(shí)驗(yàn)
1.1 實(shí)驗(yàn)?zāi)康?/strong>
熟悉Linux 文件系統(tǒng)目錄結(jié)構(gòu),創(chuàng)建自己的文件系統(tǒng),通過NFS 方式測試。
1.2 實(shí)驗(yàn)平臺(tái)
華清遠(yuǎn)見開發(fā)環(huán)境,F(xiàn)S-MP1A平臺(tái);
1.3 實(shí)驗(yàn)步驟
1 )根文件系統(tǒng)制作
可以從http://busybox.net/downloads/網(wǎng)站下載busybox-1.29.3源碼用于制作Linux文件系統(tǒng),為了方便,已將源碼放進(jìn)了光盤。
安裝交叉編譯工具鏈。
linux@ubuntu:$ sudo apt-get install gcc-arm-linux-gnueabihf
linux@ubuntu:$ sudo apt-get install g++-arm-linux-gnueabihf
驗(yàn)證開發(fā)工具是否安裝正確,顯示版本信息如下圖所示。
linux@ubuntu:$ arm-linux-gnueabihf-gcc -v
建立源碼目錄
linux@ubuntu:$ cd ~
linux@ubuntu:$ mkdir -p fs-mp1a
【華清遠(yuǎn)見-FS-MP1A開發(fā)資料\02-程序源碼\04-Linux系統(tǒng)移植\01-官方源碼】下的busybox-1.29.3.tar.bz2拷貝至該目錄。
linux@ubuntu:$ tar xvf busybox-1.29.3.tar.bz2 //解壓源碼
linux@ubuntu:$ cd busybox-1.29.3
配置busybox 源碼:
將頂層目錄下的Makefile文件中的CROSS_COMPILE字段修改為“arm-linux-gnueabihf-”
可以使用如下命令配置源碼
linux@ubuntu:$ make menuconfig
編譯源碼:
linux@ubuntu:$ make
安裝:
busybox 默認(rèn)安裝路徑為源碼目錄下的_install
linux@ubuntu:$ make install
進(jìn)入安裝目錄:
linux@ubuntu:$ cd _install
linux@ubuntu:$ ls
bin linuxrc sbin usr
創(chuàng)建其他需要的目錄:
linux@ubuntu:$ mkdir dev etc mnt proc var tmp sys root
添加庫:
將工具鏈中的庫拷貝到_install 目錄下:
linux@ubuntu:$ cp /usr/arm-linux-gnueabihf/lib/ . -a
刪除靜態(tài)庫:
linux@ubuntu:$ rm lib/*.a
添加系統(tǒng)啟動(dòng)文件:
在etc下添加文件inittab,文件內(nèi)容如下:
注意:修改文件均為_install目錄下
etc/inittab
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
在etc下添加文件fstab,文件內(nèi)容如下:
這里我們掛載的文件系統(tǒng)有三個(gè)proc、sysfs和tmpfs。
回到創(chuàng)建的文件系統(tǒng)處,在etc下創(chuàng)建init.d目錄,并在init.d下創(chuàng)建rcS文件,rcS 文件內(nèi)容為:
etc/init.d/rcS
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
/sbin/mdev -s
為rcS 添加可執(zhí)行權(quán)限:
linux@ubuntu:$ chmod a+x init.d/rcS
在etc 下添加profile 文件,文件內(nèi)容為:
etc/profile
#!/bin/sh
export HOSTNAME=fsmp1a
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
2)NFS 測試
刪除原先的/source/rootfs:
linux@ubuntu:$ sudo rm -rf /source/rootfs
將我們新建的根文件系統(tǒng)拷貝到/source/rootfs目錄下
linux@ubuntu:$ sudo mkdir /source/rootfs
linux@ubuntu:$ sudo cp _install/* /source/rootfs -a
修改ubuntu主機(jī)中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件添加nfs啟動(dòng)選項(xiàng)
# Generic Distro Configuration file generated by OpenEmbedded
menu title Select the boot mode
MENU BACKGROUND /splash.bmp
TIMEOUT 20
DEFAULT stm32mp157a-fsmp1a-emmc
LABEL stm32mp157a-fsmp1a-emmc
KERNEL /uImage
FDT /stm32mp157a-fsmp1a.dtb
APPEND root=/dev/mmcblk2p4 rootwait rw console=ttySTM0,115200
LABEL stm32mp157a-fsmp1a-nfs
KERNEL /uImage
FDT /stm32mp157a-fsmp1a.dtb
APPEND root=/dev/nfs nfsroot=192.168.11.251:/source/rootfs ip=dhcp rootwait rw earlyprintk console=ttySTM0,115200
上述配置中共有兩個(gè)啟動(dòng)項(xiàng)分別為stm32mp157a-fsmp1a-emmc、stm32mp157a-fsmp1a-nfs。其中stm32mp157a-fsmp1a-emmc選項(xiàng)為正常啟動(dòng)配置;stm32mp157a-fsmp1a-nfs為nfs掛載方式,這里需要注意的是nfsroot=192.168.11.251部分的ip需要根據(jù)ubunut主機(jī)的實(shí)際ip填寫。
重新啟動(dòng)開發(fā)板,選擇nfs啟動(dòng)選項(xiàng)。
查看是否能夠正常掛載,功能是否正常
2. 制作根文件系統(tǒng)鏡像
上小節(jié)已經(jīng)制作好了根文件系統(tǒng),并且從NFS已經(jīng)成功啟動(dòng)。本小節(jié)將制作一個(gè)根文件系統(tǒng)鏡像用于后續(xù)的固化和燒錄。
1)制作ext4格式的文件系統(tǒng)
在ubuntu中制作一個(gè)EXT4空文件, 此處設(shè)則為300M大小,由于安裝的軟件較多時(shí),文件系統(tǒng)會(huì)很大,用戶可以根據(jù)情況自行更改。
linux@ubuntu:$ dd if=/dev/zero of= fsmp1x_rootfs.ext4 bs=300M count=1
linux@ubuntu:$ sudo mkfs.ext4 fsmp1x_rootf.ext4
2)復(fù)制文件系統(tǒng)
將上小節(jié)我們移植完成的跟文件系統(tǒng)中所的文件夾都fuubuntu18_rootfs.ext4文件掛載到臨時(shí)目錄/mnt,并拷貝文件系統(tǒng)。
linux@ubuntu:$ sudo mount -o loop fsmp1x_rootf.ext4 /mnt
如果我們已經(jīng)制作了前面的文件系統(tǒng)則直接拷貝/source/rootfs/下的文件即可
linux@ubuntu:$ sudo cp /source/rootfs/* /mnt -a
如果我們之前沒有編譯制作文件系統(tǒng)也可以將【華清遠(yuǎn)見-FS-MP1A開發(fā)資料\02-程序源碼\04-Linux系統(tǒng)移植\02-移植好的系統(tǒng)鏡像文件】下的rootfs.tar.xz文件導(dǎo)入到虛擬機(jī)中,使用我們已經(jīng)移植好的跟文件系統(tǒng)進(jìn)行制作。
linux@ubuntu:$ sudo tar -xvf rootfs.tar.xz -C /mnt
3)卸載掛載的fsmp1x_rootf.ext4文件
linux@ubuntu:$ sudo umount /mnt
此時(shí)跟文件系統(tǒng)鏡像就制作完成了?梢詫⑦@個(gè)文件導(dǎo)出到windos下燒錄到開發(fā)板中運(yùn)行。
4)修改燒錄文件
如果想要燒錄到開發(fā)板那么就需要修改,燒寫文件。這里以eMMC啟動(dòng)的trusted鏡像為例來說明。其它啟動(dòng)的修改方法也類似。
修改flashlayout_fs-mp1a-weston\trusted下的FlashLayout_sdcard_stm32mp157a-fsmp1a-trusted.tsv文件將Id為0x23的rootfs分區(qū)鏡像名由fs-mp1a-weston-openstlinux-weston-fsmp1a.ext4修改為fsmp1x_rootf.ext4。按照《STM32CubeProgrammer燒寫方式》章節(jié)進(jìn)行燒錄即可。