%20%E2%80%94%20%D0%BA%D0%B0%D0%BA%D0%B8%D0%B5%20%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8%20%D0%B4%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%D1%81%D1%8F%3F.png)
Я случайно запустил 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