PHP调用磁盘分区Bash脚本提示设备忙无法执行操作问题求助
排查思路
- 确认sudo权限实际生效情况
在分区脚本开头添加代码输出当前执行用户和权限:
运行脚本后检查日志,确认PHP调用时脚本确实以root权限运行。重点排查sudoers配置是否存在whoami >> /tmp/partition_debug.log id >> /tmp/partition_debug.logDefaults requiretty限制,该配置会导致非交互式的PHP调用无法正常获取sudo权限。 - 排查自动挂载服务占用
Debian默认运行的udisks2服务会监听块设备变更事件,在分区修改后自动尝试挂载新分区,导致设备被占用。命令行执行时触发的udisks2策略与web调用时的polkit规则不同,就会出现命令行正常、PHP调用失败的情况。 - 排查隐藏设备占用
fuser默认不会展示内核态的占用,在脚本umount操作后、修改分区表前添加以下命令排查占用:
排查是否存在swap分区、设备映射(LVM/加密卷/raid成员)等隐藏占用。lsof /dev/sda* >> /tmp/partition_debug.log lsblk /dev/sda >> /tmp/partition_debug.log swapoff /dev/sda* 2>/dev/null dmsetup info /dev/sda 2>/dev/null >> /tmp/partition_debug.log
可行解决方案
- 临时关闭自动挂载服务
在分区脚本开头添加停止udisks2服务的命令,操作完成后再重启服务:# 脚本开头添加 systemctl stop udisks2 sleep 2 # 脚本末尾(挂载完成后)添加 systemctl start udisks2 - 替换分区表刷新命令
将partprobe替换为兼容性更好的kpartx命令,强制刷新内核分区表:# 删除旧分区映射 kpartx -d /dev/sda # 刷新分区表 kpartx -u /dev/sda - 修复sudo配置
在sudoers文件中添加以下配置,确保web用户可以无tty正常调用sudo:Defaults:www-data !requiretty www-data ALL=(ALL) NOPASSWD: /usr/share/test/partition.sh - 强制格式化(可选,仅测试用)
如果确认设备无其他占用,可以给mkfs.ext4添加-f -f参数强制忽略内核占用提示:/sbin/mkfs.ext4 -F -F /dev/sda1
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

