Формат NTFS (mkfs) — какие области диска перезаписываются?

Формат NTFS (mkfs) — какие области диска перезаписываются?

Я случайно запустил mkfs.ntfs -Q /dev/sda(вместо /dev/sda6) на внешнем HDD на 2Tb. К счастью, в начале есть неиспользуемый раздел на 1G, а в конце еще много места:

Device     Boot      Start        End    Sectors  Size Id Type
/dev/sda1             2048    2099199    2097152    1G  b W95 FAT32
/dev/sda2  *       2099200 3739256831 3737157632  1.8T  7 HPFS/NTFS/exFAT
/dev/sda4       3739256832 3907029166  167772335   80G  5 Extended
/dev/sda5       3739258880 3751841791   12582912    6G 83 Linux
/dev/sda6       3751843840 3907029166  155185327   74G  7 HPFS/NTFS/exFAT

Безопасно /dev/sda2? Или mkfs.ntfs записывает метаданные в середину целевого пространства, в этом случае я полагаюлюбойфайл может быть поврежден без всякого предупреждения?

решение1

Безопасно /dev/sda2?

В общем: нет. Продолжайте читать, чтобы узнать, почему я так думаю.


Пример процедуры

Мой HDD на 2 ТБ имеет размер 2000398934016 байт. Цель — исследовать, что mkfs.ntfs -Qбудет с устройством такого размера.

Я создаю разреженный файл именно такого размера:

$ # the filesystem must support sparse files
$ truncate -s 2000398934016 fakesda

ls -lsподтверждает, что весь файл разреженный:

$ ls -ls fakesda
0 -rw-r--r-- 1 kamil kamil 2000398934016 Oct 31 18:48 fakesda

(первый 0рассказывает об этом). Но такжеsparsemap(что пригодится позже) делает:

$ sparsemap fakesda
HOLE 2000398934016

Я мог бы сделать mkfs.ntfs -FQ fakesda, но тогда mkfs.ntfsпредположил бы, что размер сектора составляет 512 байт. В этом примере предположим, что мой диск использует 4096 байт в качестве логического размера сектора. В таком случае я думаю, что могу использовать --sector-sizeопцию mkfs.ntfs(см. man 8 mkfs.ntfs). Но чтобы быть уверенным, что sole mkfs.ntfs -Qсделает с моим диском, я решил создать устройство loop из fakesda:

$ sudo losetup -f --show --sector-size 4096 fakesda
/dev/loop0

sparsemapговорит мне, fakesdaчто все еще полностью разреженный. Я запускаю mkfs.ntfs -Qна устройстве цикла:

$ sudo mkfs.ntfs -Q /dev/loop0

Я уничтожаю петлевое устройство и syncна всякий случай:

$ sudo losetup -d /dev/loop0
$ sync

Насколько разрежен файл сейчас?

$ sparsemap fakesda
DATA 12288
HOLE 4096
DATA 110592
HOLE 250049753088
DATA 61460480
HOLE 750088122368
DATA 67125248
HOLE 1000132341760
DATA 4096

Смотрите sparsemap -h, чтобы узнать, как это интерпретировать.

Файл интерпретируется как последовательность данных и дыр. Например, если файл содержит 8192 байта данных, за которыми следует дыра размером 4096 байт, за которой следуют 8192 байта данных, то вывод sparsemap будет следующим:

DATA 8192
HOLE 4096
DATA 8192

В моем результате каждая DATAстрока обозначает фрагмент, затронутый mkfs.ntfs.я вижуmkfs.ntfs делаетнапишите что-нибудь в середине целевого пространства.

Наконец я удаляю файл с расширением rm fakesda.


Ваш конкретный случай

Вы можете провести собственные тесты, используя точный размер (и размер сектора) вашего диска и тот же, mkfs.ntfsкоторый вы использовали. Таким образом, вы, вероятно, сможете точно определить затронутые фрагменты и сказать, к каким разделам (каким старым файловым системам) они принадлежат. Сопоставление фрагментов с конкретными файлами или метаданными в ваших старых файловых системах может оказаться непростым делом, и это уже другая проблема.

Таблица разделов, которую вы разместили, говорит мне, что размер сектора в вашем случае составляет 512 байт. Я думаю, вы можете использовать его, mkfs.ntfs -FQ fakesdaне играя с losetup. В моем примере намеренно используется другой размер сектора, таким образом ответ более общий.


Сомневаться

Если mkfs.ntfs -Qзаписывает нули в некоторую часть файла, с которым работает, и если он достаточно умен, чтобы добиться этого путем разрежения файла, то моя процедура этого не обнаружит. Честно говоря, я не знаю, делает ли это инструмент. Если делает, то вам нужно что-то большее, чем моя процедура, чтобы найтивсепораженные фрагменты.

Это несовершенство процедуры не меняет вывода: файловая система на вашем компьютере /dev/sda2могла быть частично перезаписана.

Я отмечаю , что на самом деле mkfs.ntfsне -Qпишет нулибезразрежает файл; на самом деле он разрежает весь файл. Я тестировал это с файлами намного меньше 2 ТБ, но все равно. Я могу толькоподозревать mkfs.ntfs -Qпохож и никогда не разрежает файл.


Примечания

  • Мой тестовый стенд: Debian GNU/Linux 10.

  • Мои mkfs.ntfs -Vотпечатки mkntfs v2017.3.23AR.3 (libntfs-3g).

  • Я sparsemapустановил

    sudo apt-get install python3-pip
    sudo pip3 install sparseutils
    

Связанный контент