시스템화 : 다른 장치 REALLY가 시작된 후 장치 시작


20

내 특별한 경우에는 완전히 시작한 remote-fs후에 장치 를 시작하고 싶습니다 glusterfs.

내 시스템 파일 :

glusterfs 목표:

node04:/usr/lib/systemd/system # cat glusterfsd.service 
[Unit]
Description=GlusterFS brick processes (stopping only)
After=network.target glusterd.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
ExecStop=/bin/sh -c "/bin/killall --wait glusterfsd || /bin/true"
ExecReload=/bin/sh -c "/bin/killall -HUP glusterfsd || /bin/true"

[Install]
WantedBy=multi-user.target

remote-fs 목표:

node04:/usr/lib/systemd/system # cat remote-fs.target 
[Unit]
Description=Remote File Systems
Documentation=man:systemd.special(7)
Requires=glusterfsd.service
After=glusterfsd.service remote-fs-pre.target
DefaultDependencies=no
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target

모든 Gluster 데몬이 성공적으로 시작되고 NFS를 통해 Gluster 파일 시스템을 마운트하려고하지만 Gluster의 NFS 공유는 glusterfs.service시작한 직후가 아니라 몇 초 후에 준비 되므로 일반적으로 지시문 과 remote-fs관련하여 마운트 할 수 없습니다 .RequiresAfter

로그를 보자 :

Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS, a clustered file-system server.
Apr 14 16:16:22 node04 systemd[1]: Starting GlusterFS brick processes (stopping only)...
Apr 14 16:16:22 node04 systemd[1]: Starting Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Reached target Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Mounting /stor...

여기서 모든 것이 정상입니다. 원격 파일 시스템 (/ stor)은 단위 파일에 따라 glusterfs가 시작된 후에 마운트되는 것처럼 보입니다 ...하지만 다음 줄은 다음과 같습니다.

//...skipped.....
Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS brick processes (stopping only).

뭐? GlusterFS는이 순간에만 준비되었습니다! 그리고 우리는 본다 :

//...skipped.....
Apr 14 16:16:23 node04 mount[2960]: mount.nfs: mounting node04:/stor failed, reason given by server: No such file or directory
Apr 14 16:16:23 node04 systemd[1]: stor.mount mount process exited, code=exited status=32
Apr 14 16:16:23 node04 systemd[1]: Failed to mount /stor.
Apr 14 16:16:23 node04 systemd[1]: Dependency failed for Remote File Systems.
Apr 14 16:16:23 node04 systemd[1]: Unit stor.mount entered failed state.

systemd가 스토리지 마운트를 시도 할 때 NFS 서버가 준비되지 않아 마운트에 실패했습니다.

시스템 부팅 프로세스의 비 결정적 특성으로 인해 부팅시이 파일 시스템을 마운트하는 경우가 있습니다 (약 10 개 중 1 개).

onboot 마운트에 실패한 경우 서버에 로그인하여 / stor 디렉토리를 수동으로 마운트 할 수 있으므로 Gluster의 NFS 서비스가 제대로 작동하는 것 같습니다.

어떻게 시작 remote-fsglusterfsd, 즉 후 Started GlusterFS brick processes로그에 선이 나타납니다?

remote-fs는 가장 최근의 목표 중 하나 인 것 같습니다. 따라서 실제로는 필요하지 않은 다른 "해결 방법"목표 이후에 시작할 수 없습니다 remote-fs.


5
glusterfs가 준비 될 때까지 차단할 명령을 실행 하는 ExecStartPre=<command>속성을 Unit 섹션에 추가 할 수 있습니까 glusterfsd.service? 이로 인해 glusterfsd.service성공을 표시하고을 (를) 활성화 하지 못할 수 있습니다 remotefs.target.
벤 캠벨

2
나는 당신의 glusterfsd.service단위 파일에 정말로 혼란 스럽습니다 . 실제로 어떤 서비스를 시작하는 것, 실제로하지 않습니다 죽이고 모든 glusterfsd프로세스를. 다른 gluster 관련 장치 파일이 있습니까?
GregL

당신은 또한 stor.mount장치를 보여줄 수 있습니까 ?
Brian Redbeard

답변:


3

다음 명령으로 시스템 부팅 순서를 분석 할 수 있습니다. SVG 지원 웹 브라우저를 사용하여 출력 파일을보십시오.

systemd-analyze plot > test.svg

이 플로팅은 마지막 부팅 타이밍 통계를 제공하여 문제에 대한보다 명확한 관점을 제공합니다.

mount명령 을 추가하여 NFS 마운트 문제를 해결 했습니다 /etc/rc.local. 그러나 확실하지 않습니다. 빠른 수정을 시도해 볼 가치가있는 통합 된 통합으로 작동합니까? systemd를 rc.local로 실행하려면 다음 조건을 만족해야합니다.

# grep Condition /usr/lib/systemd/system/rc-local.service
ConditionFileIsExecutable=/etc/rc.d/rc.local

1

이미 다른 사람들이 제안한대로; 실제로 'glusterfsd'에 대한 종속성인지 확실하지 않습니다. 예를 들어 'node4'를 해결하고 NFS 공유를 성공적으로 마운트하기 위해 성공해야하는 DNS 조회와 같은 일반적인 지연이 아닙니다.

대부분의 설정에서 로컬 유효성 확인 분석기를 사용하므로 DNS에 의존하는 다른 서비스를 성공적으로 시작하기 전에 사용 가능해야하기 때문에이 지연이 발생했습니다.

이에 대한 해결책은 기본적으로 특정 종속성의 가용성이 성공 (종료 0) 또는 시간 초과 시도 (종료 1)까지 반복적으로 특정 종속성의 가용성을 테스트하는 'ExecStartPre'스크립트를 사용하는 것입니다.

가능하면 기본 systemd lib 디렉토리 외부에서 사용자 정의해야합니다. 패키지 파일을 변경하면 다음에 제공되는 업데이트에서 파일을 덮어 쓰게됩니다.


0

어쩌면 이것을 remote-fs대상에 추가 할 수 있습니다 .

[Unit]
...
ConditionPathExists=/stor

0

아마 어떤 투표가 도움이 될 수 있습니다. 이것은 시스템과 무관합니다. 예를 들어 mysql -e ';'mysql에 유용한 것을하기 전에 루프에서 사용 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.