Linux系统中,USB设备是常用外部存储方式,不管是拷贝文件、传输数据或系统备份,都需要用到U盘、移动硬盘等设备。特别是一些场景中,人工插拔并手动挂载USB设备再传输文件方式下显得效率低下。尤其是在服务器、无人值守工作站或嵌入式系统中,这种方式难以满足自动化的需求。利用Shell脚本结合Linux系统的udev机制,就可以实现USB设备的自动挂载,并在挂载完成后自动执行文件传输,大大提高工作效率。
要实现这一过程,首先要理解USB自动挂载的原理。Linux在检测到新设备插入时,会通过内核发出事件,并由udev守护进程捕获,根据预先配置的规则执行相应操作。因此,我们需要先创建合适的udev规则来识别USB设备,然后调用Shell脚本完成自动挂载及后续任务。通常可以通过查看lsusb或dmesg来获取USB设备的VID和PID,用于规则匹配。
创建udev规则时,可以在/etc/udev/rules.d目录下新建一个规则文件,例如99-usb-auto.rules,规则内容大致如下:
ACTION=="add", SUBSYSTEMS=="usb", ATTR{idVendor}=="xxxx", ATTR{idProduct}=="yyyy", RUN+="/usr/local/bin/usb_auto.sh"
其中xxxx和yyyy分别是USB设备的厂商ID和产品ID,usb_auto.sh则是我们编写的自动化脚本。这样,当符合条件的USB设备插入系统时,udev就会触发脚本的执行。
在Shell脚本中,第一步是挂载设备。一般可以通过blkid或lsblk命令查找新插入设备的分区,例如检测到设备节点为/dev/sdb1,我们就可以将其挂载到指定目录:
mount /dev/sdb1 /mnt/usb
为了避免重复挂载或挂载失败,需要在挂载前先检测挂载点是否存在,必要时提前创建目录,并判断设备是否已挂载。如果USB设备格式不是ext4而是常见的FAT32或exFAT,挂载命令中需要加上-t参数指定文件系统类型,或者直接让mount自动识别。
挂载完成后就可以执行文件传输了。假设我们需要将本地目录/home/data下的文件同步到USB设备,可以使用cp命令直接复制,也可以使用rsync进行增量传输:
rsync -av /home/data/ /mnt/usb/
这种方式不仅速度快,还能保证文件权限和时间戳信息的完整性。对于一些特殊应用,比如需要在插入USB后自动备份数据库,还可以在脚本中调用数据库导出命令,例如:
mysqldump -u root -p123456 mydb > /mnt/usb/mydb_backup.sql
这样,每次插入USB,系统都会自动完成备份并保存在U盘中,适合离线备份场景。
传输完成后,为了保证数据安全,最好在脚本中自动卸载设备:
umount /mnt/usb
如果是长时间挂载且频繁读写的情况,还可以配合sync命令确保数据完全写入磁盘。对于需要同时处理多个USB设备的情况,可以在脚本中加入循环检测,通过设备UUID来区分不同存储介质,并分配不同挂载点。
值得注意的是,udev执行的脚本必须有可执行权限,并且路径要写全,否则可能会因为权限或路径问题导致自动挂载失败。另外,由于udev执行脚本时运行环境较为精简,某些命令可能需要指定绝对路径,比如/bin/mount、/usr/bin/rsync等,以避免找不到命令的错误。
通过这种方式,我们可以将USB设备的插入、挂载、文件传输、卸载等操作完全自动化,从而减少人工干预,提高效率。在Linux服务器上,这种方法尤其适合定期采集数据、离线传输文件或做异地备份的场景。而在嵌入式设备或物联网终端中,这种自动化流程也能显著简化运维流程,让设备在无人值守状态下依然能完成数据同步和备份任务。