Этот вопрос ранее задавался при переполнении стека, но хорошие люди рекомендовали мне вместо этого попробовать сообщество здесь.
Я изучаю разреженные файлы в отношении различных файловых систем и пытаюсь найти что-то конкретное, в котором говорится, что разреженные файлы поддерживаются сетевыми файловыми системами (NFS) или блоком сообщений сервера (SMB).
Я понимаю, что SMB широко используется в Windows и что в соответствии с этим вход, сервер SMB может поддерживать разреженный файл, даже если его файловая система не поддерживает. Однако, если я прав, файловая система, которая не поддерживает разреженные файлы, просто заполнит «дыры» нулями, что может привести к проблемам с производительностью.
Что касается NFS, я не смог ничего узнать об использовании NFS, поддерживающего разреженные файлы.
Следовательно, мои вопросы:
Поддерживаются ли разреженные файлы в NFS и SMB?
NFS: частично поддерживает разреженные файлы. По сути, он поддерживает создание разреженного файла, но при чтении файл расширяется за счет нулей. Это означает, что, хотя вы можете создать разреженный файл через NFS, при обратном чтении того же самого файла передаваемые сетевые данные будут включать любые нули, обнаруженные в исходном файле. Простой тест показывает это поведение:
cd /mnt/nfs
truncate test.img -s 1G
ls -lh test.img
-rw-r - 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 4.2 полностью поддерживает разреженные файлы (см. этот канонический документ и эта презентация).
До NFS 4.2 модель клиент / сервер NFS поддерживала разреженные файлы в том смысле, что API поддерживал все операции с файлами POSIX. Это означало, что запись разреженных файлов на сервере, который поддерживал разреженные файлы в резервной файловой системе, приводила к созданию разреженного файла (а не к сохранению большого количества нулей). Но чтение файла приведет к передаче большого количества нулей для разреженного элемента. Т.е. ответ - «частично».
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, но считаю, что он поддерживает и разреженные файлы, если установлен соответствующий бит возможности FS. Видеть Вот для получения дополнительной информации.