Apache에 의해 마운트된 장치는 shell, mtab 또는 proc/mounts에 표시되지 않습니다.

Apache에 의해 마운트된 장치는 shell, mtab 또는 proc/mounts에 표시되지 않습니다.

Centos 6에서 Centos 8로 제품을 업데이트하는 중이며 Apache를 통해 볼륨을 마운트할 때 이상한 동작을 발견했습니다.

웹 페이지는 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");

?>

웹페이지 출력:

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 프로세스 내에서 직접 사용할 수는 없습니다.

관련 정보