콘솔에 액세스하지 않고도 파일을 해독하고, 포함된 파일 시스템을 마운트하고, systemd 서비스를 시작할 수 있는 로컬 웹 사이트를 만들려고 합니다. 그러면 시작된 서비스는 마운트된 파일 시스템 내의 파일을 사용합니다. 웹 서버는 현재 cgi를 통해 내 Python 코드를 실행하여 해당 파일 시스템을 해독하고 마운트하는 간단한 웹 사이트를 제공합니다. www-data 사용자가 Python에서 호출하는 특정 명령을 실행할 수 있도록 sudoers 파일에 예외를 만들었습니다.
이 웹사이트( 호출 cryptsetup luksOpen
)를 사용하여 파일을 해독하면 해독된 장치가 예상대로 나타납니다.
> file /dev/mapper/service-volume
/dev/mapper/service-volume: symbolic link to ../dm-0
그러나 내 Python 코드가 이를 마운트하려고 하면 service-volume
Apache 작업자 프로세스 내에서만 마운트되며 내 셸이나 다른 프로세스에서는 사용할 수 없습니다(XXX는 Apache 작업자 프로세스의 PID입니다).
> mountpoint /mnt/service-folder
/mnt/service-folder is not a mountpoint
> cat /proc/XXX/mounts
...
/dev/mapper/service-volume /mnt/service-folder ext4 rw,relatime 0 0
실행되는 마운트 작업은 sudo /bin/mount /dev/mapper/service-volume /mnt/service-folder
pythons subprocess.run()을 사용하여 수행됩니다.
그래서 제 질문은 이렇습니다. 거기서 무슨 일이 일어나고 있나요? 이것은 네임스페이스/cgroups 마법인가요? 그리고 아파치 자체가 아닌 다른 서비스/프로세스에 대해 이 폴더를 어떻게 마운트할 수 있습니까?
추가 정보:
존재 service-folder
합니다(마운트된 파일 시스템 없이):
> ls -la /mnt/service-folder
total 8
drwxr-xr-x 2 root root 4096 Jan 23 21:25 .
drwxr-xr-x 4 root root 4096 Jan 23 21:25 ..