You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用磁盘分区Bash脚本提示设备忙无法执行操作问题求助

排查思路

  1. 确认sudo权限实际生效情况
    在分区脚本开头添加代码输出当前执行用户和权限:
    whoami >> /tmp/partition_debug.log
    id >> /tmp/partition_debug.log
    
    运行脚本后检查日志,确认PHP调用时脚本确实以root权限运行。重点排查sudoers配置是否存在Defaults requiretty限制,该配置会导致非交互式的PHP调用无法正常获取sudo权限。
  2. 排查自动挂载服务占用
    Debian默认运行的udisks2服务会监听块设备变更事件,在分区修改后自动尝试挂载新分区,导致设备被占用。命令行执行时触发的udisks2策略与web调用时的polkit规则不同,就会出现命令行正常、PHP调用失败的情况。
  3. 排查隐藏设备占用
    fuser默认不会展示内核态的占用,在脚本umount操作后、修改分区表前添加以下命令排查占用:
    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
    
    排查是否存在swap分区、设备映射(LVM/加密卷/raid成员)等隐藏占用。

可行解决方案

  1. 临时关闭自动挂载服务
    在分区脚本开头添加停止udisks2服务的命令,操作完成后再重启服务:
    # 脚本开头添加
    systemctl stop udisks2
    sleep 2
    
    # 脚本末尾(挂载完成后)添加
    systemctl start udisks2
    
  2. 替换分区表刷新命令
    将partprobe替换为兼容性更好的kpartx命令,强制刷新内核分区表:
    # 删除旧分区映射
    kpartx -d /dev/sda
    # 刷新分区表
    kpartx -u /dev/sda
    
  3. 修复sudo配置
    在sudoers文件中添加以下配置,确保web用户可以无tty正常调用sudo:
    Defaults:www-data !requiretty
    www-data ALL=(ALL) NOPASSWD: /usr/share/test/partition.sh
    
  4. 强制格式化(可选,仅测试用)
    如果确认设备无其他占用,可以给mkfs.ext4添加-f -f参数强制忽略内核占用提示:
    /sbin/mkfs.ext4 -F -F /dev/sda1
    

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:45:04