Іноді мережеві шари потрібні ще до входу в систему: бекапи, медіа, home-директорії. Але якщо мережа ще не готова — система може підвисати при завантаженні. Я покажу, як безпечно та розумно автоматично монтувати SMB і NFS у Linux, використовуючи systemd-автомаунти та autofs, з тайм-аутами, перевірками доступності й навіть fallback. Підійде і для робочих станцій, і для вашого сервер Linux.

Готуємо систему: пакети, точки монтування та креденшели

Нижче — команди для термінал Linux. Встановіть утиліти для SMB/NFS, створіть точки монтування та файл із обліковими даними (для SMB). Це базові кроки перед будь-якою автоматизація задач.

# Debian/Ubuntu
sudo apt update
sudo apt install -y cifs-utils nfs-common autofs

# RHEL/CentOS/Fedora
sudo dnf install -y cifs-utils nfs-utils autofs

# Точки монтування
sudo mkdir -p /mnt/smb-share /mnt/nfs-data

# Креденшели для SMB
sudo install -m 600 /dev/null /etc/samba/creds-smb
sudo sh -c 'cat >/etc/samba/creds-smb <<EOF
username=YOUR_USER
password=YOUR_PASSWORD
domain=YOUR_DOMAIN_OR_WORKGROUP
EOF'

Монтування через systemd + fstab: автомаунт, тайм-аути і перевірка мережі

Найбезпечніший спосіб уникнути зависань — не монтувати одразу при boot, а використовувати automount. Тоді система створить очікувач, а реальний монтаж станеться при першому доступі до каталогу. Додамо тайм-аути та залежність від готовності мережі (мережеві налаштування).

SMB (CIFS) через fstab із automount

Додайте рядок у /etc/fstab (noauto + x-systemd.automount + _netdev + idle-timeout + nofail):

//fileserver01/Share   /mnt/smb-share   cifs   noauto,x-systemd.automount,_netdev,vers=3.0,credentials=/etc/samba/creds-smb,uid=1000,gid=1000,iocharset=utf8,dir_mode=0775,file_mode=0664,x-systemd.idle-timeout=60s,x-systemd.requires=network-online.target,nofail   0  0

Пояснення коротко: noauto не монтує одразу; x-systemd.automount вмикає automount; _netdev каже systemd чекати мережу; idle-timeout відмонтовує після простою; nofail дозволяє системі продовжити завантаження, навіть якщо сервер недоступний.

NFSv4 через fstab із automount

nfs01.example.lan:/export/data   /mnt/nfs-data   nfs   noauto,x-systemd.automount,_netdev,nfsvers=4.2,hard,timeo=600,retrans=2,x-systemd.idle-timeout=60s,x-systemd.requires=network-online.target,nofail   0  0

Для NFS: hard для надійності, timeo=600 (~60с) і retrans=2 — контроль повторів. За бажанням зменшуйте timeo, якщо потрібен швидкий відкат.

Вмикаємо очікування мережі

Щоб автомаунт чекав робочий інтернет/лан, вкажіть службі коли мережа точно "онлайн". Оберіть ваш стек:

# Для NetworkManager
sudo systemctl enable --now NetworkManager-wait-online.service

# Для systemd-networkd
sudo systemctl enable --now systemd-networkd-wait-online.service

Перевірка

# Перечитати fstab (не обов'язково, але ок)
sudo systemctl daemon-reload

# Автомаунт-юнити мають з'явитися
systemctl list-units --type=automount

# Перший доступ викличе монтаж
ls -l /mnt/smb-share
ls -l /mnt/nfs-data

# Переконайтеся
mount | egrep 'cifs|nfs'

Альтернативні способи і fallback

Окремі .mount/.automount юніти systemd

Більше контролю дають юніти в /etc/systemd/system. Спочатку згенеруємо ім'я файла для точки монтування:

systemd-escape -p --suffix=mount "/mnt/smb-share"   # виведе: mnt-smb\x2dshare.mount

Приклад /etc/systemd/system/mnt-smb\x2dshare.mount:

[Unit]
Description=SMB Share (/mnt/smb-share)
After=network-online.target
Wants=network-online.target

[Mount]
What=//fileserver01/Share
Where=/mnt/smb-share
Type=cifs
Options=vers=3.0,credentials=/etc/samba/creds-smb,uid=1000,gid=1000,iocharset=utf8,dir_mode=0775,file_mode=0664

[Install]
WantedBy=multi-user.target

І автомаунт /etc/systemd/system/mnt-smb\x2dshare.automount:

[Unit]
Description=Automount for /mnt/smb-share

[Automount]
Where=/mnt/smb-share
TimeoutIdleSec=60

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mnt-smb\x2dshare.automount

autofs із тайм-аутом простою

autofs сам монтує/відмонтовує каталоги на вимогу. Зручно для ноутбуків і середовищ зі змінною доступністю мережі.

# master-правила
sudo sh -c 'cat >/etc/auto.master.d/storage.autofs <<EOF
/-  /etc/auto.storage  --timeout=120  --ghost
EOF'

# карта автомаунтів
sudo sh -c 'cat >/etc/auto.storage <<EOF
/mnt/smb-share  -fstype=cifs,vers=3.0,credentials=/etc/samba/creds-smb,uid=1000,gid=1000,iocharset=utf8  ://fileserver01/Share
/mnt/nfs-data   -fstype=nfs4,nfsvers=4.2,hard,timeo=600,retrans=2                nfs01.example.lan:/export/data
EOF'

sudo systemctl enable --now autofs
# Доступ викликає монтаж
ls -l /mnt/smb-share

Fallback/відмовостійкість

  • NFS: вбудований реплікований експорт. Вкажіть кілька серверів комою — клієнт спробує наступний, якщо перший недоступний:
nfsA.example.lan,nfsB.example.lan:/export/data  /mnt/nfs-data  nfs4  noauto,x-systemd.automount,_netdev,hard,timeo=600,retrans=2,nofail  0 0
  • SMB: найкраща практика — DFS referrals (AD/Samba з msdfs), тоді клієнт монтує єдину адресу, а сервер перенаправляє на доступний бекенд.
  • Простий скриптовий fallback для SMB (якщо DFS немає):
sudo tee /usr/local/sbin/mount-smb-fallback.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
hosts=(fileserver01 fileserver02)
share=Share
mnt=/mnt/smb-share
cred=/etc/samba/creds-smb
for h in "${hosts[@]}"; do
  if timeout 3 getent hosts "$h" >/dev/null 2>&1 && timeout 3 nc -z -w2 "$h" 445; then
    mountpoint -q "$mnt" || sudo mount -t cifs "//$h/$share" "$mnt" -o "vers=3.0,credentials=$cred,uid=1000,gid=1000,iocharset=utf8"
    exit $?
  fi
done
exit 1
EOF
sudo chmod +x /usr/local/sbin/mount-smb-fallback.sh

# Опційно: запускати на boot після мережі
sudo tee /etc/systemd/system/smb-fallback.service >/dev/null <<'EOF'
[Unit]
Description=Mount SMB share with simple fallback
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/mount-smb-fallback.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now smb-fallback.service

Для скрипта потрібен nc (netcat). Якщо немає — встановіть: sudo apt install netcat-openbsd або sudo dnf install nmap-ncat.

GUI-спосіб (GNOME/KDE)

Шукаєте спосіб без редагування конфігів? У GNOME відкрийте "Disks" → виберіть диск/меню → "Edit Mount Options..." і ввімкніть "Mount at system startup" (для NFS). Для SMB зручніше додати запис у fstab, а потім перевірити в Disks. У файловому менеджері (Nautilus/Dolphin) можна підключатися до smb:// або nfs:// через "Інші місця"/"Add Network Folder" — це зручно, але такі підключення не завжди монтуються до файлової системи ядра та не гарантовані при boot.

FAQ

Система зависає на boot через мережеві монти

Увімкніть noauto,x-systemd.automount,_netdev і nofail у fstab, додайте очікування мережі (wait-online). Також встановіть розумні idle-timeout і timeo для NFS.

SMB монтується, але права дивні

Задайте uid/gid і file_mode/dir_mode. Якщо сервер керує ACL, інколи допомагає опція noperm (обережно, безпека!).

NFS: stale file handle або довгі зависання

Це буває після рестарту сервера. Для критичних застосунків використовуйте hard + timeo/retrans. Якщо потрібен швидкий відкат — зменшіть timeo або розгляньте autofs.

Імена хостів не резолвляться

Перевірте DNS/hosts, при потребі увімкніть mDNS або WINS (winbind). Тест: getent hosts fileserver01.

Які порти відкрити у firewall?

SMB: TCP 445. NFSv4: TCP/UDP 2049 (і, за потреби, rpcbind 111). На firewalld: sudo firewall-cmd --add-service=samba --permanent && sudo firewall-cmd --add-service=nfs --permanent && sudo firewall-cmd --reload.

Яка версія SMB/NFS безпечна?

SMB: щонайменше vers=2.1, краще 3.0/3.1.1. NFS: використовуйте v4.x, якщо сервер підтримує.

Як делікатно відмонтувати, якщо ресурс зник?

Спробуйте sudo umount -f /mnt/... або зупиніть автомаунт-юнит: sudo systemctl stop mnt-...\.automount. Логи: journalctl -u mnt-... -b.

Порада від Kernelka

Для ноутів і нестабільних Wi‑Fi мереж обирайте autofs або systemd-automount — вони рятують від зависань і економлять батарейку завдяки idle-timeout. А ще зручно дебажити через journalctl -u і systemd-analyze verify — логи завжди скажуть правду 😉

Підсумок

  • Використовуйте automount (systemd або autofs), щоб не блокувати завантаження системи 😊
  • Додавайте _netdev, nofail і розумні тайм-аути (idle-timeout, timeo/retrans).
  • Перевіряйте готовність мережі через wait-online та коректні мережеві налаштування.
  • Для NFS — вбудований fallback через перелік серверів; для SMB — DFS або скриптовий резерв.
  • Захищайте креденшели (chmod 600) і тестуйте через термінал Linux перед продом.