为何不同进程可见挂载点不同?cron无法识别手动挂载分区
咱们先聚焦问题核心:你通过SSH远程挂载的/backup磁盘是绑定在当前SSH用户会话上下文里的,但cron运行时的环境和交互式SSH会话并不完全一致——哪怕两者都不在chroot环境中,也会出现挂载可见性的差异。下面是具体的排查和解决步骤:
1. 确认挂载的全局可见性
当你在SSH终端手动执行mount时,操作是基于当前用户会话的,但如果挂载时用了private这类隔离性选项,或者是通过用户级命名空间挂载的,就只会在当前会话可见。
先在SSH终端执行以下命令,查看挂载的具体参数:
mount | grep /backup
如果输出里包含private、slave这类会限制挂载可见范围的选项,说明挂载没有全局生效。
2. 让挂载全局生效
如果是普通的mount /dev/sdX /backup命令,理论上应该全局可见,但有时候SSH会话的环境变量和cron的不一致,导致cron执行mount时读取的信息不全。
可以在cron任务里用绝对路径调用mount来测试,比如在cron中添加:
/bin/mount | sort > /tmp/cron_mount_result.txt
然后对比SSH终端执行/bin/mount | sort的结果,看是否还缺失/backup的记录。
3. 检查cron运行用户与挂载权限
如果你的cron任务是用普通用户运行的,要确认该用户是否有访问/backup的权限,以及挂载时是否允许其他用户读取。
先查看挂载点权限:
ls -ld /backup
如果权限不足,重新挂载时可以添加明确的权限选项:
mount -t ext4 /dev/sdX /backup -o defaults,user,rw
如果是root用户的cron任务,依然看不到挂载,那大概率是环境或命名空间的问题。
4. 对比SSH与cron的环境变量
cron的默认环境变量非常精简,PATH等关键变量可能比SSH会话短很多,甚至缺少mount所在的路径。你可以分别输出两者的环境变量对比:
- 在SSH终端执行:
env > /tmp/ssh_env.txt - 在cron任务中执行:
env > /tmp/cron_env.txt
重点看PATH、LD_LIBRARY_PATH这类影响命令执行的变量,如果/bin不在cron的PATH里,就必须在cron任务中用绝对路径调用命令。
5. 排查挂载命名空间隔离
虽然你确认了sshd和cron不在chroot,但有些系统会为用户会话启用挂载命名空间,导致SSH会话里的挂载只在当前命名空间可见,而cron运行在全局命名空间。
可以分别查看两者的挂载命名空间ID:
- SSH终端执行:
ls -l /proc/self/ns/mnt - cron任务中执行:
ls -l /proc/self/ns/mnt > /tmp/cron_mnt_ns.txt
如果两者的ID不同,说明处于不同的挂载命名空间。这种情况下,你需要在全局命名空间下挂载磁盘——比如把挂载条目添加到/etc/fstab后执行mount -a,或者用systemd-mount命令完成挂载,而不是在SSH会话里手动操作。
内容的提问来源于stack exchange,提问作者Philip Couling

