"루트 저장소 데몬"이 실행되는 파일 시스템은 어디에 있습니까? 그것은 어떻게 생겼나요?

"루트 저장소 데몬"이 실행되는 파일 시스템은 어디에 있습니까? 그것은 어떻게 생겼나요?

https://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons/

...이러한 스토리지 데몬은 initramfs에서 시작되고, 정상 작동 중에 계속 실행되며, 제어권이 initramfs로 반환된 후에만 종료되고 initramfs에 의해 종료됩니다. 따라서 개념적으로 루트 파일 시스템 저장소 유지 관리와 관련된 저장소 데몬은 일반 시스템 서비스보다 커널 스레드와 더 유사합니다. init 시스템(예: systemd)의 관점에서 이러한 서비스는 systemd가 초기화되기 전에 시작되고 systemd 이후까지 유지됩니다. 사라졌습니다.

그러나 systemd가 시작된 후에 initramfs가 제거되지 않습니까? 내 Fedora 28 시스템 어디에도 initramfs가 설치되어 있지 않습니다. [*]

"루트 저장소 데몬"이 실행되는 파일 시스템은 어디에 있습니까?

그들의 관점에서 보면 이것은 어떤 모습일까요? 예를 들어, /dev런타임 시 전체 기능에 액세스할 수 있습니까?


[*] 디렉토리가 있지만 /run/initramfs별도의 램 파일 시스템(tmpfs 마운트)은 아닙니다. 파일이 없는 몇 개의 디렉토리와 디렉토리 이름을 나열하는 하나의 파일을 rwtab제외하고는 비어 있습니다 .

$ findmnt -T /run/initramfs
TARGET SOURCE FSTYPE OPTIONS
/run   tmpfs  tmpfs  rw,nosuid,nodev,seclabel,mode=755
$ find /run/initramfs -type d
/run/initramfs
/run/initramfs/state
/run/initramfs/state/var
/run/initramfs/state/var/lib
/run/initramfs/state/var/lib/dhclient
/run/initramfs/state/etc
/run/initramfs/state/etc/sysconfig
/run/initramfs/state/etc/sysconfig/network-scripts
/run/initramfs/log
$ find /run/initramfs -not -type d
/run/initramfs/rwtab
/run/initramfs/.need_shutdown
$ cat /run/initramfs/rwtab
files /etc/sysconfig/network-scripts
files /var/lib/dhclient
$ cat /run/initramfs/.need_shutdown
$

답변1

그러나 systemd가 시작된 후에 initramfs가 제거되지 않습니까?

아니요. initramfs 파일 시스템실제로 제거할 수 없습니다..


적어도 initramfs가 를 사용하여 구현되면 systemd호출되지만 umount()플래그는 전달됩니다 MNT_DETACH. 당신은 또한 볼 수 있습니다 umount -l.

(이 모드 umount()아니요열려 있는 파일이 있으면 차단됩니다. initramfs 파일 시스템을 마운트 지점에서 "분리"하여 마운트 테이블( /proc/mounts등)에서 제거합니다. 열려 있는 모든 파일은 계속 사용할 수 있습니다. 열려있는 파일을 모두 닫은 후,그 다음에커널은 파일 시스템 마운트 해제를 완료합니다.

"루트 저장소 데몬"이 실행되는 파일 시스템은 어디에 있습니까? 그들의 관점에서 보면 이것은 어떤 모습일까요?

이것영혼"RootStorageDaemons"는 계속해서 존재함을 의미합니다.탁월한initramfs.

마운트를 분리하는 것 외에도 MNT_DETACH모든 하위 마운트도 분리합니다. 따라서 루트 저장소 데몬은 /dev 및 /proc 마운트를 포함한 중요한 API 파일 시스템을 볼 수 없습니다. 이건 정말 잔인해요:

# unshare -m
\# umount -l /
\# findmnt
findmnt: can't read /proc/mounts: No such file or directory
\# ls /dev
\#

MNT_DETACH를 사용한 후, systemdswitch_rootinitramfs에서 보다 전통적인 명령과 계속해서 일치시키고 , pass삭제initramfs에서 각 파일을 연결 해제()합니다. ( systemd함수는 rm_rf_children()실제로 이 작업을 수행합니다 rm -rf *. 평소와 같이 데몬을 실행하기 위한 실행 파일 및 라이브러리 파일을 포함하여 열려 있는 모든 파일은 계속 작동합니다. 파일에 대한 마지막 참조가 닫히면 해당 저장소가 커널에 의해 해제됩니다. ).

이것이 사실이라면 매우 흥미로울 것입니다. 루트 파일 시스템에서 파일을 여는 RootStorageDaemon의 버그에 대한 좋은 보호가 될 것입니다. 또한 /run파일 시스템의 소켓을 통해 이루어진 RPC 호출과 루트 파일 시스템에서 실행되는 데몬에 대한 종속성에 대해 부분적인 보호를 제공합니다 . 이러한 작업을 수행하면 교착 상태(순환 종속성)가 발생할 수 있습니다.


그러나사실, 루트 저장소 데몬을 보면 /proc/$PID/rootinitramfs가 아닌 기본 루트 파일 시스템을 가리킬 가능성이 높습니다. 그렇다면 왜 이런 일이 발생하며 이 상황에서 시스템은 어떻게 작동합니까?

이는 initramfs가 pivot_root()루트 파일 시스템으로 전환하는 데 사용되기 때문에 발생합니다. 마운트 테이블을 수정하는 것 외에도 현재 모든 프로세스의 pivot_root()루트 디렉터리와 현재 작업 디렉터리( /proc/$PID/root및)를 검사합니다. /proc/$PID/cwd이들 중 하나라도 이전 루트 파일 시스템(initramfs)의 루트와 일치하면 새 루트 파일 시스템으로 대체됩니다. 이는 구현 세부 사항으로 문서화되어 pivot_root()있으며 프로그램은 이에 의존해서는 안 됩니다.

<del>시스템은 전환이 가능 pivot_root()하기 때문에 작동합니다.systemd뒤쪽에initramfs에. 따라서 루트 파일 시스템에 대한 참조는 빛나는 새 initramfs에 대한 참조로 다시 대체됩니다.</del>


/run(반짝이 는 새로운 initramfs의 tmpfs가 루트 파일 시스템에서 전달 될 수도 있습니다 /run. 이는 차례로 initramfs에서 전달됩니다. 이 경우 initramfs를 닫아 RootStorageDaemon과 통신할 수 있을 것이라고 생각합니다. 데몬은 /run시작 시퀀스 중에 소켓을 엽니다.

관련 정보