Centos 6からCentos 8に製品を更新していますが、Apacheを介してボリュームをマウントするときに奇妙な動作を発見しました。
Webページは、apache / phpを介してパーティションをマウント/マウント解除するためのUIフロントエンドを提供します。ただし、apache / phpを介してインストールされたデバイスは、シェルに「インストール済み」と表示されません。
たとえば、このアプレットを使用してCentosインストーラを含むUSBスティックをインストールすると、デバイスがインストールおよび削除されたことを示し、内容を一覧表示できます。
<?php
function runCmd($cmd)
{
print "$cmd<br />\n";
exec($cmd, $lines);
foreach($lines as $l)
{
print "$l<br />\n";
}
print "<br />\n";
}
runCmd("mount | grep /dev/sd");
runCmd("/usr/bin/sudo -n umount /mnt/usb");
runCmd("mount | grep /dev/sd");
runCmd("/usr/bin/sudo -n /usr/bin/mount /dev/sdb1 /mnt/usb 2>&1");
runCmd("mount | grep /dev/sd");
runCmd("grep sd /etc/mtab");
runCmd("grep sd /proc/mounts");
runCmd("ls /mnt/usb");
?>
Webページ出力:
mount | grep /dev/sd
/dev/sda1 on /boot type ext4 (rw,relatime)
/dev/sdb1 on /mnt/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
/usr/bin/sudo -n umount /mnt/usb
mount | grep /dev/sd
/dev/sda1 on /boot type ext4 (rw,relatime)
/usr/bin/sudo -n /usr/bin/mount /dev/sdb1 /mnt/usb 2>&1
mount | grep /dev/sd
/dev/sda1 on /boot type ext4 (rw,relatime)
/dev/sdb1 on /mnt/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
grep sd /etc/mtab
/dev/sda1 /boot ext4 rw,relatime 0 0
/dev/sdb1 /mnt/usb vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro 0 0
grep sd /proc/mounts
/dev/sda1 /boot ext4 rw,relatime 0 0
/dev/sdb1 /mnt/usb vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro 0 0
ls /mnt/usb
BaseOS
TRANS.TBL
Torque_Kernel
images
ldlinux.c32
ldlinux.sys
...
ただし、シェルにはデバイスがインストールされたことを示す内容はありません。
# grep sd /etc/mtab
/dev/sda1 /boot ext4 rw,relatime 0 0
# grep sd /proc/mounts
/dev/sda1 /boot ext4 rw,relatime 0 0
# mount | grep sd
/dev/sda1 on /boot type ext4 (rw,relatime)
# ls /mnt/usb
#
わかりません…新しいシェルにログインしても何も変わりません。
- Centos 8カーネル4.18.0-147.el8.x86_64
- SELinuxが無効になっています。
- PHP 7.2.11
私を編集する
より多くの発見:
- Apacheを介してマウントされたボリュームは、コマンド(またはコマンドを介して)がApacheでも実行されている場合
/proc/mount
にのみ/etc/mtab
表示されmount
ます。 - シェルにマウントされたボリュームは、シェルまたはhttpdを介して実行されたのと同じコマンドに表示されます。
編集2
Philip Coulingの情報によると、php-fpm
次のように実行されているようです。
$ ps aux | grep php
root 1292 0.0 0.2 240252 22512 ? Ss Jul02 0:04 php-fpm: master process (/etc/php-fpm.conf)
apache 1484 0.0 0.2 255256 17648 ? S Jul02 0:14 php-fpm: pool www
apache 1485 0.0 0.2 255256 17656 ? S Jul02 0:14 php-fpm: pool www
apache 1486 0.0 0.2 255256 17716 ? S Jul02 0:14 php-fpm: pool www
apache 1487 0.0 0.2 255256 17660 ? S Jul02 0:14 php-fpm: pool www
apache 1488 0.0 0.2 255256 17648 ? S Jul02 0:14 php-fpm: pool www
apache 3113 0.0 0.2 255268 17748 ? S Jul02 0:14 php-fpm: pool www
apache 6214 0.0 0.2 255256 17752 ? S Jul02 0:14 php-fpm: pool www
apache 8697 0.0 0.2 255256 17692 ? S Jul02 0:13 php-fpm: pool www
何も面白く/etc/php-fpm.conf
ない/etc/php-fpm.conf.d/*
答え1
jsbillingsによると、Apache(およびPHP)がマウントされた名前空間内で実行されているように聞こえます。
PHPを独自のサーバーとして実行してみることができます。PHP-FPM。これはyum経由で利用可能で、この機能設定に関するオンラインチュートリアルがたくさんあります。 注Centosのphp-fpm yumパッケージもマウントネームスペースにあるかどうかわからないため、これが機能することを保証することはできません。
あるいは、インストールネームスペースに入れずにPHPを実行する方法が見つからない場合や、望ましくない場合は、「breakout」ネームスペースを使用できます。エルンスル。このコマンドを使用すると、異なるプロセスのマウント名前空間内で別のコマンドを実行できます。
コマンドラインは、ルートプロセス(pid 1)と同じ名前空間で実行する必要があります。したがって、コマンドラインの名前空間でコマンドを実行するのは簡単なはずです。
function runCmd($cmd)
{
print "$cmd<br />\n";
exec("nsenter -mt 1 $cmd", $lines);
foreach($lines as $l)
{
print "$l<br />\n";
}
print "<br />\n";
}
メモ: このようにインストールすると、新しいインストールはコマンドラインから使用できますが、PHPプロセス内で直接使用することはできません。