1. 程式人生 > >Linux上電自動掛載SD卡和檔案系統的修改

Linux上電自動掛載SD卡和檔案系統的修改

參照黑金例程在ZYNQ開發板上移植好Linux系統後,預設是沒有載入SD卡的。因此每次斷電後,在Linux上的配置資訊全部丟失,每次上電後都要重複配置,非常的不方便,經過死皮爛臉的求問和網上查資料之後,終於實現了這個功能,在這裡分享一下我通過新建petalinux的開機自啟 App 的方法,實現在ZYNQ7021開發板跑的Linux上開機自動掛載SD的過程。

手動掛載SD卡

要掛在SD卡,第一件事是查詢SD在板子上的Linux裡對應的裝置描述符。通過以下幾步查詢:

  1. 通過 #fdisk -l 命令確認板子上的linux系統是否識別SD卡,可以看到存在SD卡且有 mmcblk0p1 和 mmcblk0p2 兩個分割槽      

  2. 確保SD卡驅動正常。通過 cat /proc/partitions 命令,結果如下圖所示,存在與 mmcblk0p1 和 mmcblk0p2相應的分割槽,可以正常掛載,如果沒有,則在移植核心時,選擇 device deivers-》mmc/sd card support ->Samsung s3c sd/mmc 
    card interface support。     
               

  3. 掛載SD卡。一般習慣掛載到 /mnt 這個資料夾,當然也可以自己新建一個資料夾,然後再掛載到自己的資料夾上
            mount /dev/mmcblk0p1 /mnt    // 掛載SD卡
            umount /mnt                             // 解除安裝SD卡

Linux 上電掛載SD卡

在網上,我查閱了很多的部落格,都是說直接修改路徑 /etc/init.d/ 下的rcS檔案,在檔案中新增 “mount /dev/mmcblk0p1 /mnt” 或者 “mount -t vfat /dev/mmcblk0p1 /mnt”。但是黑金官方教程裡,ZYNQ移植的petalinux並不能這樣實現,因為教程裡預設載入的檔案系統並不是移植在SD卡上EXT分割槽裡的檔案系統,而是ramdisk (即壓縮在uImage中)裡的一個非常小的檔案系統。所以通過修改SD中某一檔案來實現上電自啟功能是行不通的。重點來了,死皮爛臉磨來的,分享給大家:在petalinux下做一個自己的App,在配置petalinux的檔案系統時,這個App將自己寫的指令碼檔案複製到檔案系統中。

首先是建立一個上電後自動執行的小App,新增或者修改需要開機執行的指令碼,然後在移植系統的時候勾選上之前建立的App,剩餘移植步驟與黑金教程中一樣,移植完成後就可以重新上電檢視一下自己的自啟效果了。具體步驟如下:

  1. 新建一個petalinux的App,我是運用的是petalinux的應用程式模板。

  2. 修改Makefile中的“install:”的目標,使用$(TARGETINST)將預構建的應用程式或指令碼安裝到目標檔案系統的主機中,並參考“install:”目標的註釋修改,基本上不怎麼修改,如果是更改了名字,則替換了名字就行。
    修改開機自啟指令碼 startUp.sh如下:實現開機將SD的兩個分割槽分別掛載到FAT和EXT4資料夾中。

    
    #!/bin/sh
    mkdir FAT
    mount /dev/mmcblk0p1 FAT
    mkdir EXT4
    mount /dev/mmcblk0p2 EXT4
    

    修改Makefile如下:不做解釋,看不懂,只是稍作修改能用

    
    clean:
    .PHONY: install image
    install:
            # Please add commands below the comments to install data to target file system.
            # Use $(TARGETINST) to copy data into the target
            # E.g. there is data/startUp in the current directory, and I want to
            # copy it into the target "/" directory:
            #$(TARGETINST) -d data/startUp /startUp
            $(TARGETINST) -d -p 0755 startUp.sh /etc/init.d/startUp.sh
            $(TARGETINST) -s /etc/init.d/startUp.sh /etc/rc5.d/S98startUp.sh
    
    help:
            @echo ""
            @echo "Quick reference for various supported build targets for $(INSTANCE)."
            @echo "----------------------------------------------------"
            @echo "  all                    build $(INSTANCE) and install to rootfs host copy"
            @echo "  install                install built objects to rootfs host copy"
  3. 將修改好的App資料夾複製到自己的petalinux工程(教程裡的移植工程)的相同目錄中,例如將模板
    “ax7021_eth/components/apps” 中的 startUp 資料夾複製到 “uart_emio/ax7021_multi_eth_emio/components/apps”中,apps資料夾可能需要自己建立。 

  4. 在構建應用程式之前,需要通過執行以下命令從 PetaLinux menuconfig 啟用應用程式:“petalinux-config -c rootfs”,將會在“Applications --->”子選單中看到自己新建的應用程式。

  5. 將預構建的應用程式或指令碼安裝到主機上的目標檔案系統中,只需執行 “petalinux-build -c rootfs/startUp” 命令即可。

  6. 最後,需要重建 PetaLinux 引導映像,以便使用更新的目標檔案系統、更新映像,執行以下命令:“petalinux-build -x package”,或者也可以從配置petalinux開始,輸入命令 “petalinux-build”,或者完整的重新移植一次。

孃的,終於整理完了,真不容易,關於這個自動掛載SD卡的部落格,早在前面的文章中也提到過的,但是一直沒時間更新,今天差不多花了一天時間,先是查資料,然後重複了一遍這個過程,成功了之後才來這裡整理這個過程。本來想直接給一個petalinux的應用程式模板的下載連結的,結果發現最高只能五個積分。很難受,我沒打算讓人下載,但是這個分數也太對不起我的勞動成果了,我先平復一下心情先,心情好了再上傳!

其他的開機自啟App,也可以通過這個方式移植到 Linux 中去,運用好上述提到的petalinux模板,能滿足一些基本的自啟服務要求了。

最後這個分享一個比較專業的自動掛載指令碼

#!/bin/sh
#
if [ ! -d "/emmc1" ]
	then
		mkdir /emmc1
fi

if [ ! -d "/emmc2" ]
	then
		mkdir /emmc2
fi

if [ ! -d "/emmc3" ]
	then
		mkdir /emmc3
fi
umount /dev/mmcblk1p1
umount /dev/mmcblk1p2
umount /dev/mmcblk1p3

mount /dev/mmcblk1p1 /emmc1
mount /dev/mmcblk1p2 /emmc2
mount /dev/mmcblk1p3 /emmc3