Сетевое хранилище в домашней локальной сети перестало быть экзотикой - сегодня это стандартная часть инфраструктуры, куда сваливаются фото, бэкапы, медиатека и образы виртуальных машин. Два протокола делят между собой почти всю долю установок: NFS версии 3 и 4, а также CIFS, то есть реализацию SMB в ядре Linux. Казалось бы, разница лишь в наборе букв в строке монтирования, но на практике выбор определяет, как будут вести себя права доступа, как пройдут мелкие файлы через сеть и придётся ли бороться с "зависшими" точками монтирования после перезагрузки сервера. Разберём оба варианта без маркетинговой обёртки, опираясь на реальные конфигурации, выводы dmesg и замеры скорости на обычном гигабитном оборудовании.
Архитектура протоколов и их место в ядре Linux
NFS изначально проектировался для UNIX-систем и работает по модели "клиент - сервер" с разделением на stateless (версия 3) и stateful (версия 4) режимы. В третьей версии сервер не хранит состояние открытых файлов - каждый запрос самодостаточен, что упрощает восстановление после сбоя, но требует дополнительного порта для rpcbind и сопутствующих служб rpc.statd, rpc.mountd. Четвёртая версия переносит всё в один порт 2049, добавляет делегирование, компрессию и обязательную аутентификацию через RPCSEC_GSS с поддержкой Kerberos. В ядре Linux клиентская часть реализована модулем nfs, серверная - nfsd, а пользовательская утилита управления экспортами - пакет nfs-kernel-server.
CIFS (Common Internet File System) - это диалект SMB, который Microsoft развивала десятилетия. В Linux клиент встроен в ядро как модуль cifs.ko, пользовательские утилиты монтирования и управления кэшем находятся в пакете cifs-utils. Протокол изначально ориентирован на Windows, поэтому несет с собой модель безопасности на основе SID, ACL и обязательной аутентификации уже на этапе подключения. Версии SMB 1.0 давно объявлены устаревшими и опасными, современные системы используют SMB 2.1, 3.0 и 3.1.1 с шифрованием, подписями и мультиканальностью. В ядре 6.x поддержка SMB 3.1.1 включена по умолчанию, но для работы шифрования нужен сбор с CONFIG_CIFS_ENCRYPTION.
Главное архитектурное различие: NFS передаёт файловые дескрипторы и атрибуты в формате, родном для POSIX, а CIFS отображает Windows-семантику на Linux VFS. Это порождает всю цепочку различий в поведении - от обработки символических ссылок до наследования прав при создании файлов.
Настройка серверной стороны экспортов и шар
Для NFS сервер настраивается через /etc/exports. Типичная запись для домашней директории:
/mnt/storage 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
Опция sync заставляет сервер подтверждать запись только после сброса на диск - безопаснее для данных, но медленнее. no_root_squash оставляет UID 0 от клиента как root на сервере, полезно для бэкапов от имени суперпользователя, но требует доверия к клиентам. no_subtree_check отключает проверку вложенности при экспорте подкаталогов, снижая нагрузку на CPU. После изменений применяется командой exportfs -ra. Фоновая служба nfs-server управляется через systemd, порты фиксируются в /etc/nfs.conf секцией [mountd] и [statd], чтобы пробить фаервол.
На стороне CIFS конфигурация находится в /etc/samba/smb.conf. Минимальная рабочая шара для дома:
[storage]
path = /mnt/storage
browseable = yes
read only = no
force create mode = 0660
force directory mode = 0770
valid users = @smbgroup
veto files = /*.tmp/*.bak/Thumbs.db/
Параметры force create mode и force directory mode задают маску прав для новых файлов и каталогов независимо от umask клиента. valid users ограничивает доступ группой, пользователи добавляются через smbpasswd -a. Служба smbd и nmbd (для NetBIOS) запускаются как отдельные юниты systemd. Для работы SMB 3.1.1 с шифрованием добавляют в глобальную секцию:
server min protocol = SMB2_10
server max protocol = SMB3_11
smb encrypt = required
Монтирование на клиенте через fstab, systemd и опции производительности
В /etc/fstab запись для NFS версии 4 с современными опциями:
192.168.1.10:/mnt/storage /mnt/net-nfs nfs4 rw,vers=4.2,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,x-systemd.automount 0 0
Ключевые параметры: vers=4.2 фиксирует версию протокола, избегая негоциирования при каждом монтировании; rsize и wsize в 1 Мбайт максимально используют окно TCP; hard делает клиент вечно ждать восстановления сервера вместо возврата ошибки приложению; timeo=600 (60 секунд в децисекундах) и retrans=2 задают таймауты повторов. Опция _netdev говорит systemd ждать поднятия сети, а x-systemd.automount откладывает монтирование до первого обращения - система грузится быстрее, а точка не висит мёртвым грузом.
Для CIFS запись в fstab выглядит иначе:
//192.168.1.10/storage /mnt/net-cifs cifs rw,vers=3.1.1,uid=1000,gid=1000,forceuid,forcegid,file_mode=0660,dir_mode=0770,iocharset=utf8,_netdev,x-systemd.automount,credentials=/etc/samba/creds 0 0
Файл /etc/samba/creds содержит: