我已经看过这两个:
但是,我的问题似乎有所不同。
我已经构建了一个用于调用 Linux CLI 工具的扩展库。它是围绕proc_open
,它是家庭和POSIX
。
我正在使用它成功执行所有(直到我遇到这个mount
/umount
错误)CLI 工具。
现在,我正在构建一个 RAID 设置例程,其中涉及partprobe
, parted
-rm , mklabel , mkpart , -stop , zero - superblock , create ,和最终/ 。mdadm
dd
mkfs
mount
umount
实际上有两种优雅的例程,一种用于组装RAID,另一种用于拆卸。
正如标题所说,问题在于mount
和umount
。上面列出的其他工具及其命令成功执行。
环境
Arch Linux - Linux stone 3.11.6-1-ARCH #1 SMP PREEMPT Fri Oct 18 23:22:36 CEST 2013 x86_64 GNU/Linux.
拱门正在运行systemd
- 可能是以某种方式影响安装。
运行 mod_php(最新)的 Apache Web 服务器(最新)。Apache 以http:http
.
http
在wheel
组中,并且wheels
是 sudoers - %wheel ALL=(ALL) NOPASSWD: ALL
。
请不要开始讨论webserver
完整的根功能- 该单元是 NAS,它运行自定义 WebOS,并且仅用于 Intranet。即使有黑客攻击 - 这些很可能会破坏整个系统,这对客户来说是不健康的。NAS 是Mobotix IP 摄像机的存储,它运行大量相关服务,并且这些单元已经部署在 30 多个对象中,没有任何问题。简而言之,webserver
它不是服务于网络,而是服务于操作系统。
在写作之前,为了快速测试,我http
明确地向 sudoers 添加了 - http ALL=(ALL) NOPASSWD: ALL
- 没有用。
问题
在 RAID 组装过程中运行的最后一个命令是mount /dev/md/stone\:supershare /mnt/supershare
,它返回退出代码为0
.
执行后续挂载会导致:
mount: /dev/md127 is already mounted or /mnt/supershare busy
/dev/md127 is already mounted on /mnt/supershare
退出代码为32
. 因此,阵列安装在某处。
执行umount /dev/md/stone\:supershare
上述操作后mount
,返回退出代码为0
。执行后续umount
结果:
umount: /dev/md/stone:supershare: not mounted
上面的命令是使用 sudo 自动运行的。
因此,它已成功安装并已成功卸载,但是...我root
以 TTY0 身份登录,lsblk
在执行mount
操作后运行,但是,我没有看到mountpoint
:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 55.9G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part [SWAP]
├─sda3 8:3 0 12G 0 part /
└─sda4 8:4 0 16.6G 0 part /home
sdb 8:16 0 931.5G 0 disk
└─sdb1 8:17 0 899M 0 part
└─md127 9:127 0 1.8G 0 raid0
sdc 8:32 0 931.5G 0 disk
└─sdc1 8:33 0 899M 0 part
└─md127 9:127 0 1.8G 0 raid0
从 TTY0尝试相同的mount
命令会成功挂载它(之后显示 lsblk)。
如果我mount
使用我的 CLI 工具,然后运行mount -l
并lsblk
使用 CLI 工具,安装点是可见的。
以 root 身份从 TTY0 立即运行这两个命令,不显示挂载点。
重新启动,重置所有挂载(不是自动挂载),然后从 TTY0 挂载并lsblk
从 TTY0 运行显示挂载点。
然后,lsblk
使用 CLI 工具运行,显示挂载点。
然后,umount
使用 CLI 工具运行,退出代码0
- 卸载。
再次使用 CLI 工具运行lsblk
,不显示挂载点。
从 TTY0运行lsblk
,仍然显示挂载点。
看来,当mount
/umount
使用我的 CLI 工具运行时,它会私下为sudo
会话运行器执行命令。
umount
在 TTY0 安装后,确实卸载它,但再次 - 私下。
从 TTY0 登录http
并在从 CLI 工具挂载 RAID 后运行lsblk
,挂载点不显示。这种否定“为sudo
会话运行者私下执行”。
我还在IBM中找到了一份材料:
mount 命令使用真实用户 ID 而非有效用户 ID来确定用户是否具有适当的访问权限。系统组成员可以发出设备挂载,前提是他们对挂载点和 /etc/file systems 文件中指定的那些挂载具有写访问权。具有 root 用户权限的用户可以发出任何挂载命令。
我希望我已经解释得足够好并且不会太混乱,我也希望你们能够在这里帮助我解决这个问题。
更新 (2013-10-28)
我尝试在 Web 上下文之外使用 CLI 工具进行测试,这是一个简单的 PHP 文件,我使用它root
和自定义用户执行。
在这两种情况下,安装和卸载都是成功的。因此,它必须与 Apache 执行命令有关,但是,我不明白为什么其他命令会起作用。
问题
是什么导致了这个问题,我该如何克服它?