fsutil файл createnew на windows vs dd на linux
Как заголовок, мне интересно, как fsutil в Windows может так быстро создать действительно большой файл. Действительно ли он выделяет реальный кластер для этого файла или просто записывает метаданные файла? Рассмотрим две команды ниже:
fsutil file createnew testFile <1Tb>
dd if=/dev/zero of=testFile bs=1024M count=1024
Поэтому я создаю файл размером 1 Тб, проблема с fsutil, файл почти сразу создается, но с dd на его завершение ушло более 1 часа. Поэтому, я думаю, что fsutil записывает только метаданные в заголовок файла, реальный файловый кластер будет расширяться при необходимости. Я думаю правильно?
1 ответ
Из документации Microsoft
createnew Создает файл с указанным именем и размером, с содержимым, состоящим из нулей.
отсюда вы можете сказать, что в файле должны быть все нули ([...] с содержимым, состоящим из нулей)
но если это правда
[...]the file is nearly created immediately[...]
Я думаю, что вы правы: возможно, fsutil создает файл с байтами, помеченными как свободные во время выполнения, но не записывает эти байты
Когда вы используете дд, как это
dd if=/dev/zero of=testFile bs=1024M count=1024
вы на самом деле пишете, "побайтово", нули в каждом байте нового файла
Вы можете сделать это:
fsutil file createnew testFile_fsutil <1Tb> #(on Windows)
dd if=/dev/zero of=testFile_dd bs=1024M count=1024 #(on Linux)
и затем вы можете увидеть содержимое testFile_fsutil на любом гекседиторе и найти ненулевые байты или, точнее, в Linux, которые вы можете сделать ( 1099511627776 байт = 1 тэбибайт):
cmp --bytes=1099511627776 testFile_fsutil testFile_dd
или же
cmp --bytes=1099511627776 testFile_fsutil /dev/zero
или даже используя хэши:
dd if=/dev/zero bs=1024M count=1024 | sha1sum
вернуть
fea475204f4ad1348f21fad930a7c721a2858971
так,
dd if=testFile_fsutil bs=1024M count=1024 | sha1sum
должен вернуть то же самое.
Примечание: чтобы доказать свою точку зрения намного быстрее, вы можете использовать гораздо меньший файл для тестирования.