当前位置: 首页 > news >正文

IMX6ULL的开机动画和U盘自动加载

上一篇博客中,我们介绍了如何构建基于 BusyBox 的根文件系统。可能还有不少读者会疑惑:构建这样一个根文件系统到底能用来做什么?

本篇文章将继续围绕 BusyBox 根文件系统展开,介绍它在嵌入式 Linux 开发中的两个实际应用:开机动画显示U 盘自动挂载

建议先阅读本文最后的总结,了解整体实现思路后,再查看前面的具体操作步骤,这样理解会更加清晰。

目录

一、开机动画显示

1、编译psplash

2、修改启动脚本 rcS

3、制作 rootfs 根文件系统

4、开机动画总结

二、U盘的加载

1、手动挂载 U 盘

2、自动挂载 U 盘

① eudev 的编译

②把 eudev 拷进 rootfs

③ 修改 fstab

④ 修改 rcS 启动 udev

⑤ 创建 udev 自动挂载规则

3、U盘挂载总结


一、开机动画显示

开机动画一般由 Logo 图片和进度条组成,可以让系统启动过程更加美观。这里我们使用psplash来实现该功能。psplash 是一个轻量级的开机动画程序,常用于嵌入式 Linux 系统。编译源码后会生成psplashpsplash-write两个工具。

其中,psplash负责显示开机画面,psplash-write负责更新进度条、显示文字或退出开机画面。

1、编译psplash

Linux 内核启动完成后,会执行第一个用户态进程,一般是/sbin/init。在 BusyBox 根文件系统中,init会读取/etc/inittab,并根据其中的配置执行启动脚本,例如:

::sysinit:/etc/init.d/rcS

因此,真正适合启动 psplash 的位置是/etc/init.d/rcS,而不是直接写在inittab中。因为 psplash 需要使用 framebuffer 设备,例如/dev/fb0,而该设备通常要等rcS中执行mdev -s后才会生成得更加可靠。

下面是我编译 psplash 源码后生成的psplashpsplash-write,并将相关文件复制到rootfs/usr/bin/目录中。这样根文件系统启动时,就可以调用这些工具来显示开机动画。

编译 PSplash ---------------- 进入源码目录: cd ~/100ask_imx6ull-sdk/DevelopmentEnvConf/psplash 如果源码是 Windows 换行,需要先转换成 Linux 换行: dos2unix configure.ac Makefile.am make-image-header.sh *.c *.h README AUTHORS COPYING ChangeLog SECURITY.md psplash.doap .gitignore 如果没有 dos2unix: sudo apt install dos2unix 生成 configure: autoreconf -fi 设置交叉编译器路径: export PATH=/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin:$PATH 配置: ./configure --host=arm-linux-gnueabihf --prefix=/usr --without-systemd 编译: make 安装到临时目录: make DESTDIR=$PWD/_install install 成功后检查: ls -l _install/usr/bin/psplash ls -l _install/usr/bin/psplash-write file _install/usr/bin/psplash file 命令应该能看到 ARM 相关信息。 回到工程目录: cd ~/100ask_imx6ull-sdk/DevelopmentEnvConf 创建目录: mkdir -p rootfs/usr/bin rootfs/etc/init.d 拷贝程序: cp psplash/_install/usr/bin/psplash rootfs/usr/bin/ cp psplash/_install/usr/bin/psplash-write rootfs/usr/bin/ 拷贝启动脚本: cp imx6ullModule/init.d/S00psplash rootfs/etc/init.d/ 添加执行权限: chmod +x rootfs/usr/bin/psplash chmod +x rootfs/usr/bin/psplash-write chmod +x rootfs/etc/init.d/S00psplash 检查: ls -l rootfs/usr/bin/psplash ls -l rootfs/usr/bin/psplash-write ls -l rootfs/etc/init.d/S00psplash

2、修改启动脚本 rcS

接下来需要修改系统启动脚本rcS。不过该脚本并不是手动编写的,而是由busybox_build_config.sh自动生成的。因此,不建议直接修改生成后的rcS文件,而应该修改busybox_build_config.sh中生成rcS的相关内容。

执行下面命令后:

sudo ./busybox_build_config.sh

该脚本会将已经编译好的 BusyBox 命令、动态库、配置文件、设备节点等内容组合成一个完整的根文件系统。因此,我们需要在该脚本中加入 psplash 相关的启动逻辑,主要修改位置如下图所示。

S00psplash脚本主要用于启动、控制和关闭 psplash 开机动画。

系统启动时,脚本会通过:

"$PSPLASH" &

在后台启动 psplash 程序,用于显示开机 Logo 和进度条。随后通过:

"$PSPLASH_WRITE" "PROGRESS 5" "$PSPLASH_WRITE" "MSG Starting system"

向 psplash 发送控制命令,设置启动进度并显示提示信息。当系统启动完成后,再通过:

"$PSPLASH_WRITE" "QUIT"

关闭开机动画界面。

#!/bin/sh PSPLASH=/usr/bin/psplash PSPLASH_WRITE=/usr/bin/psplash-write PSPLASH_FIFO=/tmp/psplash_fifo wait_psplash_fifo() { count=0 while [ $count -lt 20 ] do [ -p "$PSPLASH_FIFO" ] && return 0 sleep 0.1 count=$((count + 1)) done return 1 } start() { [ -x "$PSPLASH" ] || exit 0 "$PSPLASH" & if [ -x "$PSPLASH_WRITE" ] && wait_psplash_fifo; then "$PSPLASH_WRITE" "PROGRESS 5" > /dev/null 2>&1 "$PSPLASH_WRITE" "MSG Starting system" > /dev/null 2>&1 fi } stop() { if [ -x "$PSPLASH_WRITE" ]; then "$PSPLASH_WRITE" "QUIT" > /dev/null 2>&1 fi } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit $?

3、制作 rootfs 根文件系统

sudo tar -xjf ~/100ask_imx6ull-sdk/DevelopmentEnvConf/rootfs/rootfs.tar.bz2 \ -C /home/book/nfs_rootfs //放到板子和ubutun共享的目录中 sudo mkdir -p /home/book/tftpboot sudo cp ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/zImage \ /home/book/tftpboot/ sudo cp ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/imx6ull-14x14-angus.dtb \ /home/book/tftpboot/ ls -lh /home/book/tftpboot/zImage \ /home/book/tftpboot/imx6ull-14x14-angus.dtb setenv ip_dyn no setenv ipaddr 192.168.1.88 setenv serverip 192.168.1.66 setenv netmask 255.255.255.0 setenv nfsroot /home/book/nfs_rootfs //Net传输根文件系统 setenv image zImage setenv fdt_file imx6ull-14x14-angus.dtb setenv netargs 'setenv bootargs console=ttymxc0,115200 root=/dev/nfs rw nfsroot=${serverip}:${nfsroot},v3,tcp ip=${ipaddr}:${serverip}::${netmask}::eth0:off' run netargs printenv bootargs tftpboot 0x83000000 imx6ull-14x14-angus.dtb setenv tftpblocksize 512 setenv tftptimeout 5000 setenv tftptimeoutcountmax 20 tftpboot 0x80800000 zImage bootz 0x80800000 - 0x83000000

4、开机动画总结

总的来说,开机动画的实现就是将 psplash 集成到rootfs根文件系统中,并在busybox_build_config.sh生成的rcS启动脚本中调用 psplash。系统启动时,rcS脚本会启动 psplash,并通过psplash-write更新启动进度和提示信息,从而实现开机 Logo 和进度条显示的效果。

二、U盘的加载

当 U 盘插入开发板后,Linux 内核中的 USB 驱动会自动识别该设备,并在串口中打印类似如下信息:

usb-storage 1-1.4:1.0: USB Mass Storage device detected scsi 0:0:0:0: Direct-Access Samsung Flash Drive sd 0:0:0:0: [sda] Attached SCSI removable disk sda: sda1

其中,/dev/sda表示整个 U 盘设备,/dev/sda1表示 U 盘上的第一个分区。后续我们通常挂载的是/dev/sda1

1、手动挂载 U 盘

挂载 U 盘前,需要先确认当前内核是否支持对应的文件系统。可以执行cat /proc/filesystems查看内核已支持的文件系统类型,常见的 U 盘格式有vfatext4exfat等,其中vfat通常对应 FAT/FAT32 格式。

插入 U 盘后,执行blkid /dev/sda1查看 U 盘分区格式。如果输出中显示TYPE="vfat",说明该 U 盘为 FAT/FAT32 格式;如果显示TYPE="exfat",则说明该 U 盘为 exFAT 格式。

确认当前内核支持该文件系统后,即可创建挂载目录,并将U 盘挂载到/mnt/usb目录下。

mkdir -p /mnt/usb mount -t vfat /dev/sda1 /mnt/usb ls /mnt/usb

2、自动挂载 U 盘

如果希望系统在插入 U 盘后自动完成挂载,就需要有一个用户空间程序持续监听内核上报的设备事件。这里可以使用eudev,它是一个独立的用户空间设备管理软件包。

eudev主要提供以下组件:

/sbin/udevd /bin/udevadm /etc/udev/

其中,udevd负责在后台监听内核设备事件,udevadm用于调试和管理 udev 规则,/etc/udev/目录则用于存放设备匹配规则。通过编写对应的 udev 规则,可以在检测到 U 盘插入时自动执行挂载脚本,从而实现 U 盘自动挂载。

eudev的编译
进入源码目录: cd ~/100ask_imx6ull-sdk/DevelopmentEnvConf/eudev-3.2.14 设置交叉编译器: export PATH=/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin:$PATH 配置: ./configure \ --host=arm-linux-gnueabihf \ --prefix=/usr \ --exec-prefix= \ --bindir=/bin \ --sbindir=/sbin \ --libdir=/lib \ --libexecdir=/lib/udev \ --sysconfdir=/etc \ --with-rootprefix= \ --with-rootlibdir=/lib \ --with-rootlibexecdir=/lib/udev \ --with-rootrundir=/run \ --disable-manpages \ --disable-selinux \ --disable-kmod \ --disable-blkid \ --disable-hwdb 编译: make 安装到临时目录: make DESTDIR=$PWD/_install install 检查: ls _install/sbin/udevd ls _install/bin/udevadm ls _install/etc/udev
②把 eudev 拷进 rootfs
回到工程目录: cd ~/100ask_imx6ull-sdk/DevelopmentEnvConf 创建目录: sudo mkdir -p rootfs/sbin rootfs/bin rootfs/lib rootfs/etc 拷贝: sudo cp -av eudev-3.2.14/_install/sbin/udevd rootfs/sbin/ sudo cp -av eudev-3.2.14/_install/bin/udevadm rootfs/bin/ sudo ln -sf ../bin/udevadm rootfs/sbin/udevadm sudo cp -av eudev-3.2.14/_install/lib/* rootfs/lib/ sudo cp -av eudev-3.2.14/_install/etc/udev rootfs/etc/ 检查: ls -l rootfs/sbin/udevd ls -l rootfs/bin/udevadm ls -l rootfs/sbin/udevadm ls -l rootfs/etc/udev 检查动态库依赖: arm-linux-gnueabihf-readelf -d rootfs/sbin/udevd | grep NEEDED arm-linux-gnueabihf-readelf -d rootfs/bin/udevadm | grep NEEDED 如果只看到: libc.so.6 说明依赖比较简单,rootfs 里已有 glibc 时一般没问题。
③ 修改 fstab

fstab中增加devtmpfsdevpts,主要是为了完善系统启动后的设备文件环境,并不是直接实现 U 盘自动挂载。

其中,devtmpfs用于挂载/dev目录,让系统能够自动生成/dev/sda1这类设备节点。插入 U 盘后,后续的udevd和挂载脚本才能根据这些设备节点进行处理。devpts用于挂载/dev/pts,主要提供终端、ssh、telnet 等伪终端设备,和 U 盘自动挂载没有直接关系,但也是 rootfs 中常见的基础挂载项。

因此,devtmpfs是自动挂载 U 盘的基础条件之一;真正实现自动挂载,还需要启动udevd,并配合 udev 规则和挂载脚本。

文件: rootfs/etc/fstab 推荐内容: # device mount-point type options dump fsck order proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 devpts /dev/pts devpts defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /run tmpfs defaults 0 0 各项作用: /proc 内核和进程信息 /sys 设备信息,udev 很依赖它 /dev 设备节点,建议用 devtmpfs /dev/pts 伪终端 /tmp 临时目录 /run 运行时目录,udev 会用到 /run/udev
④ 修改 rcS 启动 udev

修改启动脚本,在系统启动时执行:

/sbin/udevd --daemon /bin/udevadm trigger /bin/udevadm settle

其中,udevd作为后台守护进程运行,用于监听内核上报的 uevent 设备事件;udevadm trigger用于主动触发已有设备的事件;udevadm settle用于等待事件处理完成。当插入 U 盘后,内核会产生 uevent 事件,udevd接收到事件后,会匹配/etc/udev/rules.d/10-usb-mount.rules规则。如果匹配到 U 盘分区设备,例如sda1,就会调用/etc/udev/scripts/usb-mount.sh sda1,完成自动挂载。

文件: rootfs/etc/init.d/rcS 如果用 udev,原来的 mdev: echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s 要换成: mkdir -p /dev /dev/pts /run mount -a /sbin/udevd --daemon /bin/udevadm trigger /bin/udevadm settle 含义: /sbin/udevd --daemon 启动 udev 后台进程 /bin/udevadm trigger 主动扫描当前已有设备 /bin/udevadm settle 等待设备事件处理完成 注意: rcS 只负责启动 udevd。 真正插 U 盘后,是后台运行的 udevd 自动处理事件。
⑤ 创建 udev 自动挂载规则
创建目录: sudo mkdir -p rootfs/mnt/usb sudo mkdir -p rootfs/etc/udev/rules.d sudo mkdir -p rootfs/etc/udev/scripts 创建规则文件: sudo vi rootfs/etc/udev/rules.d/10-usb-mount.rules 内容: KERNEL=="sd[a-z][0-9]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/scripts/usb-mount.sh %k" KERNEL=="sd[a-z][0-9]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/scripts/usb-umount.sh %k" 解释: KERNEL=="sd[a-z][0-9]*" 匹配 sda1、sdb1 这类 U 盘分区 SUBSYSTEM=="block" 匹配块设备 ACTION=="add" 插入或新增设备 ACTION=="remove" 移除设备 %k 当前内核设备名,例如 sda1 如果设备是 /dev/sda1,udev 实际执行: /etc/udev/scripts/usb-mount.sh sda1

3、U盘挂载总结

U 盘插入后,内核会先识别出块设备,例如/dev/sda1。但此时还不能直接访问 U 盘文件,需要执行挂载命令,将设备挂载到目录中:

mount -t vfat /dev/sda1 /mnt/usb

因此,自动挂载的核心就是:在 U 盘插入并生成/dev/sda1后,自动执行上述mount命令。

本方案通过udev实现自动挂载。在启动脚本中执行:

/sbin/udevd --daemon /bin/udevadm trigger /bin/udevadm settle

udevd会监听内核产生的 uevent 设备事件,并匹配/etc/udev/rules.d/下的规则。匹配成功后,再调用/etc/udev/scripts/中的脚本执行挂载命令,从而完成 U 盘自动挂载。

http://www.zskr.cn/news/1428132.html

相关文章:

  • 从MATLAB到Keras:手把手教你迁移1DCNN模型(附代码避坑)
  • 房地产AI整合落地失败率高达68%?(2024行业白皮书独家数据解密)
  • 终极指南:D2DX如何让《暗黑破坏神2》在现代PC上焕发新生
  • 智能奢侈品系统崩盘前72小时:一位CTO的紧急响应手记(含实时监控仪表盘配置模板+SLA分级协议)
  • GPU显存OOM频发,却查不到泄漏源?深度剖析PyTorch/Triton内存泄漏的8个反直觉陷阱
  • 27考研孔昱力全程班|101公共课讲义PDF
  • TigerVNC跨平台远程桌面终极指南:3分钟快速上手免费远程控制
  • AFE芯片DVC1124的I2C通信协议详解:从地址、命令到CRC的完整数据包解析
  • 基于GreenPAK HVPAK的可编程双模LED手电筒设计与CCCV充电管理
  • 数据库读写分离:从原理到实战,构建高并发系统
  • 武汉市汉阳区小王新旧货调剂商行:青山专业的制冷设备回收公司推荐几家 - LYL仔仔
  • Equalizer APO深度解析:开源音频处理引擎的技术实现与实战指南
  • Godot游戏资源解包神器:5分钟掌握PCK文件提取技巧
  • Ubuntu 20.04/22.04 下 glog 库的三种安装方式对比:apt、源码编译与 CMake 集成
  • Unity项目里实时调用海康威视摄像头画面,保姆级配置流程(附UMP插件避坑指南)
  • 2026工业罗茨风机厂家实测评测:核心指标与服务能力对比 - 奔跑123
  • 从‘相亲配对’到‘外卖派单’:匈牙利算法在生活场景中的花式应用
  • 别再硬编码密码了!Spring Boot多数据源配置加密的‘偷懒’大法:dynamic-datasource事件机制详解
  • 道路护栏网选型技术解析与合规厂家参考 - 奔跑123
  • 终极宝可梦管理方案:PKHeX插件如何让你告别手动编辑烦恼
  • STM32F103驱动SSD1306 OLED,实测I2C+DMA帧率能到多少?附完整工程源码
  • 忘记压缩包密码?3步快速找回密码的终极指南
  • 2026杭州莫干山全屋定制哪家好 综合实力与行业口碑深度对比 - 商业新知
  • 终极游戏隐身神器:Deceive让你在Riot游戏中自由掌控在线状态
  • 2026 哈尔滨品牌首饰回收 TOP6 权威排行榜,闲置变现首选 - 薛定谔的梨花猫
  • 【AI工具更新追踪黄金法则】:20年IT老兵亲授3种实时监控法,错过本周更新=落后同行3个月?
  • 基于Raspberry Pi Pico W的物联网时钟天气站:从硬件到软件的完整实践
  • 总磷水质在线自动监测仪哪个品牌值得买:基于技术实测与工程案例的行业TOP10深度评估 - 水质仪表品牌排行榜
  • 给Linux图形驱动新手的TTM与GEM入门:从‘为什么不用伙伴系统’说起
  • 2026年浙江高强度紧固件定制实测对比干货:非标螺栓/美制螺母源头工厂怎么选? - 企业名录优选推荐