Python调用mount挂载USB磁盘为只读的问题排查求助
udev事件触发时机过早,文件系统未完全就绪
即便手动增加了等待时间,udev仍可能在设备节点创建后就触发事件,但此时磁盘的分区表、文件系统可能还在后台初始化完成中。手动在命令行执行时,你是等磁盘状态稳定后操作的,因此不会出现问题。可以尝试监听add事件之后的change事件,或者用blkid轮询设备,直到能读取到文件系统信息再执行挂载操作。挂载环境与权限差异
即使脚本和命令行用同一用户运行,udev上下文的环境变量(如PATH)、权限约束可能不同。检查挂载点目录权限:ls -ld /some/path/usb,确保运行脚本的用户拥有读写权限;同时确认脚本运行的UID是否为root(部分系统限制非root用户挂载磁盘)。文件系统存在只读标记
若磁盘曾异常卸载,文件系统可能被标记为只读(如ext系列的dirty bit)。命令行挂载时系统会自动触发修复,但脚本挂载可能未触发该逻辑。可在挂载前先执行fsck -n {device.device_node}检查文件系统错误,确认后添加修复步骤,或挂载时显式使用-o rw,errors=remount-ro参数。命令参数解析的shell转义问题
使用os.system拼接命令时,若device.device_node包含特殊字符(虽USB设备节点少见,但存在风险),会导致命令解析异常。建议改用subprocess.run的列表传参方式,避免shell转义问题:import subprocess subprocess.run(['mount', '-o', 'rw', device.device_node, '/some/path/usb'], check=True)系统自动挂载服务冲突
系统自带的udisks2等自动挂载服务可能与你的脚本抢占挂载权。当udisks2先完成挂载,后续脚本的挂载操作会默认以只读模式执行。可通过systemctl status udisks2检查服务状态,临时停止后测试,或在udev规则中配置排除目标设备,阻止系统自动挂载服务处理。磁盘硬件/驱动层面异常
查看dmesg或journalctl系统日志,排查挂载时是否存在硬件报错(如USB供电不稳定、磁盘IO错误)。这类问题可能导致脚本挂载瞬间磁盘进入只读保护模式,但手动操作时状态已恢复。
内容的提问来源于stack exchange,提问作者Thugmek

