systemd의 바인드 마운트가 systemd-tmpfiles에서 마술처럼 작동하지 않습니까?

systemd의 바인드 마운트가 systemd-tmpfiles에서 마술처럼 작동하지 않습니까?

Debian 8 컴퓨터에서 이상한 문제가 발생했습니다.

배경은 물리적 IO(디스크 깨우기/플래시 마모)를 방지하기 위해 일부 디렉터리를 tmpfs로 마운트하고 싶다는 것입니다.

어쩌면 각 디렉토리마다 별도의 tmpfs를 설치해야 할 수도 있습니다. 하지만 제가 시도한 첫 번째 작업은 /tmp/mnts.(이전 작업은 회전을 방지하기 위해 IO를 디스크에서 작은 플래시 스토리지로 이동하는 것이었으므로 동일한 패턴을 사용해 보았습니다)

그래서 부팅 시 tmpfs에 디렉터리를 만들고 싶습니다. 그것은 systemd-tmp 파일입니다. 그런 다음 /var 아래의 다양한 위치에 바인딩하여 마운트합니다.

# /etc/tmpfiles.d/tmpfs-mnts.conf snippet
# Type Path    Mode UID  GID  Age Argument
d /tmp/mnts/var-lib-icinga-spool-checkresults 0750 nagios nagios -

# /etc/fstab snippet
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/tmp/mnts/var-lib-icinga-spool-checkresults /var/lib/icinga/spool/checkresults none bind

systemd-tmpfiles --create+ mount -a잘 작동합니다. 하지만 시작 시에는 작동하지 않으므로 경쟁 조건이 발생합니다. 그러나 실패는 좀 우스꽝스럽습니다. findmnt는 소스 디렉토리가 삭제되었음을 보여줍니다.

# findmnt|grep /var/lib/icinga/spool/checkresults
└─/var/lib/icinga/spool/checkresults                     tmpfs[/mnts/var-lib-icinga-spool-checkresults//deleted] tmpfs       rw
# cd /var/lib/icinga/spool/checkresults/
# mkdir ./test
mkdir: cannot create directory ‘./test’: No such file or directory
# ls --inode /tmp/mnts
7414 var-lib-icinga-spool-checkresults
# ls --inode /var/lib/icinga/spool/
6254 checkresults

그래서 그것은 다음과 같습니다

  1. systemd-tmpfiles가 소스 디렉터리를 생성한 후 마운트가 올바르게 발생합니다.
  2. 그런 다음 systemd-tmpfiles가 소스 디렉토리를 삭제했습니다.
  3. 바인드 마운트된 소스 디렉터리를 삭제할 수 있습니다(?!)
  4. 그런 다음 systemd-tmpfiles가 두 번째로 소스 디렉터리를 생성합니다.

질문이 많은 것 같아요. 1)에 의존하여 일할 수 있습니까? 1) systemd-tmpfiles가 아닌 다른 것이 소스 디렉토리를 생성하더라도 여전히 작동합니까? 2)와 4)가 발생하는 이유는 무엇입니까? 3) 항상 이런 일이 있었나요?

답변1

systemd를 사용하는 시스템의 fstab에 정의된 바인드는 신뢰할 수 없습니다. Systemd는 fstab을 구문 분석하고 사물이 마운트되고 바인딩되는 순서를 파악하려고 시도합니다. 제 경험으로는 100% 틀릴 확률이 높습니다. 가장 좋은 방법은 모든 바인딩을 fstab 밖으로 옮기고 systemd에 대한 자체 xxx.mount 시스템 파일을 만드는 것입니다. 즉, 주문 등에 대한 통제권을 갖게 됩니다.

관련 정보