Network File System (NFS) — протокол мережевого доступу до файлових систем, що був розроблений компанією Sun Microsystems у 1984 році. Заснований на протоколі виклику віддалених процедур (ONC RPC, Open Network Computing Remote Procedure Call). Дозволяє підключати (монтувати) віддалені файлові системи через мережу.
NFS надає клієнтам прозорий доступ до файлів і файлової системи сервера. На відміну від FTP, протокол NFS здійснює доступ тільки до тих частин файлу, до яких звернувся процес, і основна перевага його в тому, що він робить цей доступ прозорим. Це означає, що будь-який сервіс/програма клієнта, що може працювати з локальним файлом, із таким же успіхом зможе працювати і файлом, що доступний через NFS, без будь-яких модифікацій самої програми.
NFS-клієнти одержують доступ до файлів на NFS-сервері шляхом відправлення RPC-запитів на сервер.(c) Wikipedia
Процес монтування каталогу віддаленого NFS-серверу можна розбити на такі кроки:
1. На сервері та клієнті на 111 порту udp та tcp запускається RPC-сервер (представлений як rpcbind). Він завантажується разом із запуском NFS-демону.
2. Запускаються служби rpc.statd, rpc.idmapd, rpc.statd і тд., що реєструються на довільних мережевих портах.
3. Команда mount на клієнті створює запит (із вказанням ip/доменнейму, каталогу) на монтування каталогу до ядра ОС. На що ядро формує і відсилає запит на віддалений RPC-сервер, на сервер, де власне локально зберігається необхідний каталог.
4. Ядро NFS-серверу через rpcbind перевіряє наявність процеса rpc.mountd і повертає номер порту, на якому він працює (знову, використовуючи RPC-протокол), ядру клієнта, що надав запит на монтування.
5. Отримавши номер порту, mount відправляє RPC-запит на отриманий порт серверу. Надалі сервер перевіряє дозволи і надає відповідні права на запитану директорію.
6. Демон монтування rpc.mountd на NFS-сервері повертає опис запитаної директорії і на основі цих данних проходить монтування директорії. Надалі в дереві директорій вона буде представлена як звичайна директорія.
Доступ до файлу в директорії, що примонтована як NFS, відбувається через модуль ядра nfsd/nfs, котрий вже потім надсилає запит на віддалений RPC-сервер (зазвичай на порт 2049, що відповідає за роботу з NFS). Тобто для клієнтських програм, що запитують файл на віддаленому розділі не важливо, що це не локальний файл, адже всі додаткові операції виконує ядро ОС та модуль ядра nfsd/nfs.
Щоб дізнатись на яких портах працюють RPC-програми, можна виконати таку команду:
# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 54107 status
100024 1 tcp 56055 status
100003 2 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049
100003 2 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049
100021 1 udp 39802 nlockmgr
100021 4 udp 39802 nlockmgr
100021 1 tcp 32786 nlockmgr
100021 4 tcp 32786 nlockmgr
100005 1 udp 49768 mountd
100005 2 udp 43705 mountd
100005 2 tcp 54465 mountd
100005 3 tcp 35113 mountd