Linux上电自动挂载SD卡和文件系统的修改 - ZYNQ7021学习

时间:2024-04-02 18:26:18

参照黑金例程在ZYNQ开发板上移植好Linux系统后,默认是没有加载SD卡的。因此每次断电后,在Linux上的配置信息全部丢失,每次上电后都要重复配置,非常的不方便,经过死皮烂脸的求问和网上查资料之后,终于实现了这个功能,在这里分享一下我通过新建petalinux的开机自启 App 的方法,实现在ZYNQ7021开发板跑的Linux上开机自动挂载SD的过程。

手动挂载SD卡

要挂在SD卡,第一件事是查找SD在板子上的Linux里对应的设备描述符。通过以下几步查找:

  1. 通过 #fdisk -l 命令确认板子上的linux系统是否识别SD卡,可以看到存在SD卡且有 mmcblk0p1 和 mmcblk0p2 两个分区      
    Linux上电自动挂载SD卡和文件系统的修改 - ZYNQ7021学习

  2. 确保SD卡驱动正常。通过 cat /proc/partitions 命令,结果如下图所示,存在与 mmcblk0p1 和 mmcblk0p2相应的分区,可以正常挂载,如果没有,则在移植内核时,选择 device deivers-》mmc/sd card support ->Samsung s3c sd/mmc 
    card interface support。     
    Linux上电自动挂载SD卡和文件系统的修改 - ZYNQ7021学习           

  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