내 홈 네트워크에는 두 개의 서버가 있습니다.
- 리눅스 서버. (현재 systemd를 사용하여 데비안을 실행하고 있지만 여기에는 데비안과 관련된 것이 없다고 생각합니다.)
- NAS 서버. (네트워크 연결 스토리지.)
정전 후 두 서버의 전원이 동시에 켜집니다. 하지만,Linux 서버는 NAS 서버보다 빠르게 시작됩니다.. Linux 서버가 네트워크에 액세스할 수 있고 CIFS 공유를 마운트하려고 시도하지만 NAS 서버가 아직 준비되지 않았기 때문에 실패합니다.
NAS 서버를 시작하는 데 오랜 시간이 걸리는 경우에도 Linux 서버가 자동으로 CIFS 마운트를 마운트하도록 만드는 방법은 무엇입니까? (얼마나? 가정하자커플분. )
현재 구성
Linux 서버에는 다음 줄 /etc/fstab
(익명)이 있습니다.
//192.168.XX.XX/Foobar /mnt/Foobar cifs credentials=/etc/fstab-cifs-credentials,rw,uid=1000,gid=1000,nobrl 0 0
또한 실행 중이며 systemd
네트워크 sudo systemctl show mnt-Foobar.mount
종속성이 자동으로 구성되었음을 보여줍니다.
…
Wants=network-online.target
After=system.slice network.target systemd-journald.socket network-online.target remote-fs-pre.target -.mount
…
journalctl
또는 다음에 의해 표시되는 오류 메시지 sudo systemctl status mnt-Foobar.mount
:
mount[544]: mount error(113): could not connect to 192.168.XX.XXUnable to find suitable address.
수동으로 트리거하거나 NAS 서버가 시작된 후 Linux 서버를 다시 시작하면 마운트가 제대로 작동합니다.
뭐가 필요하세요
완전히 포기하기 전에 각 시도 사이에 약간의 지연을 두고 설치를 몇 번 다시 시도할 수 있는 솔루션이 필요합니다.
또는 지속적으로 설치를 다시 시도하는 솔루션입니다.
또는 서버가 아직 준비되지 않았더라도 서버가 결국 준비될 것이라고 믿고 마운트가 성공했다고 간주하는 솔루션입니다. (서버가 준비되지 않은 경우 몇 분 동안 모든 액세스가 차단됩니다.)
또는 네트워크 파일 시스템을 마운트하기 전에 고정된 임의 지연을 도입하는 솔루션입니다.
보너스: 서비스 종속성
NAS에 저장된 파일을 사용하는 일부 Docker 서비스가 있습니다. 이 유형의 Docker 서비스에는 /mnt/Foobar
Docker 컨테이너에서 볼륨으로의 매핑이 있습니다. 따라서 모든 CIFS 마운트가 준비된 후에 docker 서비스를 시작해야 합니다.
이러한 서비스 종속성을 설정하는 것은 또 다른 질문의 주제입니다. 그러나 이 문제에 대한 해결책은 Docker 시작 종속성과 잘 작동해야 합니다.
해결책
현재 해결 방법은 Linux 서버에 수동으로 SSH를 연결한 다음 재부팅하거나 공유를 수동으로 마운트하는 것입니다. (그리고 수동으로 도커 서비스를 다시 시작하십시오.) 확실히 이상적이지 않으며 너무 많은 서버 관리가 필요합니다.
답변1
다음과 같이 fstab에 "x-systemd.automount"를 추가하세요.
//192.168.XX.XX/Foobar /mnt/Foobar cifs credentials=/etc/fstab-cifs-credentials,rw,uid=1000,gid=1000,nobrl,x-systemd.automount 0 0
Systemd가 모든 것을 처리해 드립니다.
답변2
완전히 테스트되지 않음:
$ cat /usr/local/libexec/cifs-mounter.sh
#! /bin/bash
SRV=192.168.0.111 # FQDN or IP address
while ! nc -z $SRV 445; do
sleep 10
done
mount -t cifs //$SRV/share /mnt/point
$ cat /etc/systemd/system/multi-user.target.wants/cifs-mounter.service
[Unit]
Description=CIFS mounter
After=network.target
[Service]
ExecStart=/usr/local/libexec/cifs-mounter.sh
KillMode=process
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
답변3
간단히 말해서:x-systemd.automount
설치 옵션에 추가하려면 다음을 따르십시오.Zardoz89의 답변.
이제 너무 일찍 시작하여 도커 컨테이너를 (다시) 시작하지 못하는 다른 문제가 있습니다. 그러나 그것은 또 다른 질문입니다.
공식 문서는 다음 위치에 있습니다.man systemd.mount.이 문서는 SUSE 지원에서 제공됩니다.매우 도움이 됩니다.
_netdev
옵션이 있지만 다음과 _netdev
같은 이유로 필요하지 않습니다.
일반적으로 파일 시스템 유형은 마운트가 "네트워크 마운트"인지 여부, 즉 네트워크를 사용할 수 있게 된 후에만 시작해야 하는지 여부를 결정하는 데 사용됩니다. 이 옵션을 사용하면 이 감지가 무시되고 설치에 네트워크가 필요함을 지정합니다.
실제로 설치된 두 장치 systemctl show mnt-Foobar.mount
(이 옵션이 있는 장치와 없는 장치)의 출력을 비교했는데 매우 유사했습니다. 구체적으로 , After
, RequiredBy
및 RequiresMountsFor
는 동일 Requires
합니다 Wants
(그러나 순서는 다르지만 순서는 중요하지 않음).
x-systemd.automount
다음과 같은Zardoz89의 답변x-systemd.automount
, 마운트 지점에 추가하려고 했습니다 .
systemctl list-automounts
재부팅한 후 또는 를 보면 감지되었는지 확인할 수 있습니다 systemctl list-units '*mount*'
.
이러한 디렉터리에 있는 항목에 액세스하려고 하면 오류가 반환됩니다.
$ tree
.
└── Foobar [error opening dir]
$ ls -R
.:
Foobar
ls: cannot open directory './Foobar': No such device
다행히 서버에서 공유 폴더를 사용할 수 있게 되면 디렉터리가 다시 작동하기 시작합니다.
도커 실패
이러한 공유 폴더의 볼륨을 사용하는 Docker 컨테이너는 이러한 볼륨을 사용할 수 있게 된 후에도 여전히 시작되지 않고 다운된 상태로 유지됩니다. 어쩌면 내가 좀 더할 수도 있겠지건강검진이 문제를 해결하세요. 아니면 사용해 보지만 어쨌든 그것은 다른 질문입니다.
서비스 종속성
각 서비스에 대해 체계화된 단위가 있는 경우 다음을 수행할 수 있습니다./etc/fstab
파일에서 직접 마운트 지점 종속성을 선언하세요., 다음 옵션 중 하나 이상을 추가하여:
x-systemd.after=
x-systemd.before=
x-systemd.required-by=
x-systemd.wanted-by=
각 항목의 의미가 설명되어 있습니다.남자 시스템 유닛.
x-systemd.device-timeout 및 x-systemd.mount-timeout(나에게는 작동하지 않음)
이를 사용하지 않으려는 경우 x-systemd.automount
다음을 사용하여 이러한 장치 마운트에 대한 시간 제한을 선언하고 늘릴 수 있습니다.
x-systemd.device-timeout=
x-systemd.mount-timeout=
s
시간은 또는 min
(또는 h
어떤 ms
이유로든) 에 지정 될 수 있습니다 .
그러나 사용하려고 하면 작동하지 않습니다. 15분의 시간 제한이 있음에도 불구하고 이러한 마운트 지점은 재부팅 후에도 여전히 실패를 표시합니다. 따라서 이것들은 효과가 없거나, 내가 그들에 대해 충분히 알지 못하기 때문에 나에게 효과가 없습니다.
이는 서비스가 적절한 순간에만 시작되도록 시스템 종속성과 결합될 수 있습니다.