Поддерживает ли NFS и SMB разреженные файлы?
Этот вопрос ранее задавался при переполнении стека, но хорошие люди там рекомендовали вместо этого попробовать сообщество.
Я исследую разреженные файлы в отношении различных файловых систем и пытаюсь найти что-то конкретное, в котором говорится, что разреженные файлы поддерживаются сетевыми файловыми системами (NFS) или блоком сообщений сервера (SMB).
Я понимаю, что SMB широко используется в Windows и что согласно этой записи сервер SMB может поддерживать разреженный файл, даже если основная файловая система этого не делает. Однако, если я прав, файловая система, которая не поддерживает разреженные файлы, просто заполнит "дыры" нулями, и это может привести к проблемам с производительностью.
Что касается NFS, я не смог ничего узнать об использовании NFS, поддерживающей разреженные файлы.
Следовательно, мои вопросы,
Поддерживаются ли разреженные файлы в NFS и SMB?
2 ответа
NFS: имеет частичную поддержку разреженных файлов. По сути, он поддерживает создание разреженного файла, но при чтении файл расширяется и включает нули. Это означает, что, хотя вы можете создать разреженный файл через NFS, при чтении того же самого файла данные в транзитной сети будут содержать любые нули, найденные в исходном файле. Простой тест покажет это поведение:
cd /mnt/nfs
truncate test.img -s 1G
ls -lh test.img
-rw-р - r--. 1 root root 1.0G 26 октября 11:29 test.img
du -hs test.img
0 test.img
Как видите, файл test.img имеет размер на диске 0 байт. Тем не менее, читая его обратно, используя dd if=test.img of=/dev/null bs=1M iflag=direct
шоу
1024+0 записей в
1024+0 записей
Скопировано 1073741824 байта (1,1 ГБ), 10,2269 с, 105 МБ / с
Понятно, что при передаче разреженного файла он расширяется и включает все нули.
NFSv4.2 будет расширена за счет включения специальной обработки для сетевой передачи разреженных файлов. Другими словами, с NFSv4.2 выше dd
будет завершено почти мгновенно.
SMB: он работает так же, как NFS, по крайней мере в моих тестовых средах, используя сервер Samba v3.6.x с CIFS v1 и клиент Linux с использованием mount.cifs. Может под виндой ведёт себя по другому...
NFS
Да, NFS 4.2 полностью поддерживает разреженные файлы (см. Этот канонический документ и эту презентацию).
До NFS 4.2 модель клиент / сервер NFS поддерживала разреженные файлы в том смысле, что API поддерживал все файловые операции POSIX. Это означало, что запись разреженных файлов на сервер, который поддерживал разреженные файлы в резервной файловой системе, приводила к созданию разреженного файла (а не к хранению большого количества нулей). Но чтение файла приведет к передаче множества нулей для разреженного элемента. IE ответ "частично".
NFS 4.2 добавляет возможность для клиента "видеть" дыры в файлах, и поэтому серверу не нужно передавать все эти нули. Из удостоверения личности:
1.4.3. Sparse Files
Sparse files are ones which have unallocated or uninitialized data
blocks as holes in the file. Such holes are typically transferred as
0s during I/O. READ_PLUS (see Section 15.10) allows a server to send
back to the client metadata describing the hole and DEALLOCATE (see
Section 15.4) allows the client to punch holes into a file. In
addition, SEEK (see Section 15.11) is provided to scan for the next
hole or data from a given location.
Несмотря на то, что спецификация поддерживает разреженные файлы, ленивый разработчик может избежать реализации поддержки разреженных файлов на клиенте или сервере.
SMB
Я меньше знаю о SMB, но считаю, что он также поддерживает разреженные файлы, если установлен соответствующий бит возможностей FS. Смотрите здесь для получения дополнительной информации.