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