0

私はすでにこれらの両方を見てきました:

しかし、私の問題は違うようです。


Linux CLI ツールを呼び出すために使用される広範なライブラリを作成しました。を中心に構築されておりproc_open、家族であり、POSIX.

私はこれを使用して、(これ/バグに遭遇するまで)すべてのCLI ツールを正常に実行しています。mountumount

今、私は、-rmmklabel、mkpart 、 -stop 、zero- superblock partprobe create 、そして最終的に/を含む RAID セットアップ ルーチンを構築していますpartedmdadmddmkfsmountumount

実際には 2 つの適切なルーチンがあり、1 つは RAID の組み立て用で、もう 1 つは分解用です。

タイトルが示すように、問題は と に依存しmountumountいます。上記の他のツールとそのコマンドは正常に実行されます。

環境

Arch Linux - Linux ストーン 3.11.6-1-ARCH #1 SMP PREEMPT Fri Oct 18 23:22:36 CEST 2013 x86_64 GNU/Linux。

Arch が動作しているsystemd- マウントに何らかの影響を与えている可能性があります。

mod_php (最新) を実行する Apache Web サーバー (最新)。Apache は として実行されhttp:httpます。

httpwheelグループに属しておりwheels、sudoers -%wheel ALL=(ALL) NOPASSWD: ALLです。完全なルート機能
の議論を開始しないでください。ユニットは NAS であり、カスタム WebOS を実行しており、イントラネット専用です。ハッキングの試みがあったとしても、システム全体が破壊される可能性が高く、それは顧客にとって健全ではありません。NAS はMobotix IP カメラのストレージであり、依存するサービスの負荷を実行し、ユニットはすでに 30 以上のオブジェクトに問題なく展開されています。つまり、はWebではなく OSを提供しています。webserverwebserver

書く前に、簡単なテストのために、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でログインしていますが、次のものが表示されません:lsblkmountmountpoint

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 が表示されます)。


CLIツールをmount使用して実行mount -lし、lsblkさらにCLIツールを使用すると、マウントポイントが表示されます。

root として TTY0 から両方のコマンドをすぐに実行すると、マウントポイントが表示されません。


再起動してすべてのマウントをリセットし (自動マウントされていない)、TTY0 からマウントして TTY0 から実行するとlsblk、マウントポイントが表示されます。

次に、lsblkCLI ツールで実行すると、マウントポイントが表示されます。

次に、umountCLI ツールを使用して実行し、コードを終了します0- アンマウントします。

CLI ツールで再度実行lsblkすると、マウントポイントが表示されません。

TTY0lsblkから実行しても、マウントポイントは表示されます。


mount/umountを CLI ツールで実行すると、sudoセッション ランナーに対して非公開でコマンドが実行されるようです。

umountTTY0 がマウントされた後に ing を実行すると、アンマウントされますが、これも非公開です。


CLI ツールから RAID をマウントした後、TTY0 でログインしてhttp実行すると、マウントポイントが表示されません。この種のものは、「セッション ランナーに対して非公開で実行する」ことを否定します。lsblksudo


IBM の資料も見つけました。

mount コマンドは、有効なユーザー ID ではなく、実際のユーザー ID を使用して、ユーザーが適切なアクセス権を持っているかどうかを判断します。システム グループのメンバーは、マウント ポイントへの書き込みアクセス権と、/etc/file systems ファイルで指定されたマウントがあれば、デバイス マウントを発行できます。root ユーザー権限を持つユーザーは、任意のマウント コマンドを発行できます


私が十分に説明し、あまり混乱しないことを願っています.


更新 (2013-10-28)

rootWeb コンテキスト外の CLI ツール、単純な PHP ファイル、およびカスタム ユーザーを使用してテストを試みました。

どちらのシナリオでも、マウントとアンマウントは成功しました。したがって、Apache がコマンドを実行しているに違いありませんが、他のコマンドが機能する理由はわかりません。

質問

問題の原因と解決方法は?

4

3 に答える 3

3

要するに、面倒は解決されました。

ディレクティブを持っていたのはApacheの対応systemdサービスでした。PrivateTmp=trueどうやら、ディレクティブは新しいファイル システムの名前空間でプロセスを実行します。


この質問は、問題をデバッグして修正しようとしているときに、インターネット上で他の多くの投稿を生み出しました。

  1. https://unix.stackexchange.com/questions/97897/sudo-mount-from-webserver-apache-by-mod-php-result-not-visible-by-root
  2. https://bbs.archlinux.org/viewtopic.php?id=172072
  3. https://unix.stackexchange.com/questions/98182/a-process-run-as-root-when-performing-mount-is-mounting-for-self-how-to-ma/98191#98191

それぞれが私がその過程で学んだことから派生しています。

mountに取り組むことについてより深い情報を得ることから始めましたEUID。すぐに、私の単純なsudo呼び出しが実際には で実行されていないことがわかりましたEUID 0sudo -i 'su' -c 'mount /dev/sdb1 /mnt/firstone'これにより、その方法について複数のクエリが発生し、その代わりに、およびその他の派生物のようなコマンド構文が生成されました。

解決策がうまくいかなかったので、さらに調べました。

にエントリを追加しようと考え始めたので/etc/fstab、多くの権限の問題が発生しました。また、sudo私の CLI ツールは、タスクに対して不完全であることが判明しました。大きな武器を持ってきましょう --DBIG_SECURITY_HOLEとしても知られている Apache をコンパイルして、Apache を として実行できるようにしrootます。

にエントリを追加してtab、マウントを試みます...そして...失敗します!

数多くのテスト、クエリなどの後、私はここper process mountに私を導き、私に次元を開きました。namespaces

さて、これですべてが説明されました - チェックはそれを/proc/<pid>/mounts検証します。

繰り返しになりますが、何度も試みましたが成功しなかったため、名前空間に関する私の新鮮な知識に基づいて質問を投稿し始めました。質問を絞り込み、より技術的になる (少なくとも私はそうだったと思います) と、最終的にユーザー hiciu が方向性、具体的には Apache のサービスを教えてくれsystemdました - PrivateTmp.

出来上がり!...明らかにsystemd、新しい名前空間を強制できます。

于 2013-10-30T12:54:32.413 に答える