ddrescue, «размер на диске» меньше общего размера, что может повлиять на производительность при записи в NTFS

629
GabrielB

Предыстория в моем предыдущем вопросе и мой собственный ответ на него .

В какой-то момент я создал два частичных изображения ddrescue: один файл в файловой системе NTFS, а другой - в ext4.

Я заметил довольно рано в процессе, что «размер на диске» для обоих изображений был намного меньше, чем общий размер, указывая (если я не ошибаюсь), что эти файлы были записаны как «разреженные», то есть, что пустой данные фактически не были распределены по соответствующим томам, учитывались только те данные, которые уже были спасены. Но я ни разу не использовал -Sпереключатель в моих ddrescueкомандах, который указывает, что выходной файл должен быть записан как «разреженный».

Примечание: -Rвначале я использовал переключатель («реверс»), предполагая, что он сразу выделит весь размер входного жесткого диска (идея заключалась в том, что это приведет к «более чистому» выводу, записав все данные последовательно на принимающем разделе, чтобы сохранить целостность файла образа, даже если что-то пойдет не так с файловой системой, и мне придется восстановить восстановление…); он действительно увеличил отображаемый размер файла до 931,5 ГБ, но на самом деле «размер на диске» был увеличен только на тот небольшой объем данных, который был скопирован на этом этапе.

Таким образом, главный вопрос будет: как объяснить эту редкость? Почему ddrescueкопия не является последовательной по умолчанию?

Затем, поскольку у меня было два частичных изображения, каждое из которых содержало некоторые действительные данные, отсутствующие в другом, я сделал следующее:

  • Я попытался скопировать спасенные области из второго изображения в разделе ext4, отсутствующего в первом изображении, в это первое изображение в разделе NTFS, которое должно было быть очень быстрым, так как оба изображения были на одном здоровом жестком диске емкостью 2 ТБ (Seagate). ST2000DX001 с максимальной скоростью записи, близкой к 200 МБ / с). Но оказалось, что это было очень медленно: всего 660 КБ / с.
  • Поэтому я остановился и сделал обратное: я ddrescueскопировал спасенные области из первого изображения (в NTFS), отсутствующего во втором изображении, во второе изображение (в ext4). И теперь я получил скорость копирования 43000 КБ / с или 43 МБ / с, что было значительно выше и ближе к нормальной скорости копирования на том же жестком диске этого класса и емкости.

Второй вопрос: может ли это странное поведение быть связано с проблемой производительности, с которой я столкнулся при записи в NTFS? Известно ли, что драйвер NTFS в Linux имеет проблемы с большими «разреженными» файлами?

0
Ваш вопрос был почти текстовой стеной со всей предысторией, которая не очень важна, потому что без нее можно понять текущую проблему (и если кому-то это интересно, он все равно может перейти по данной ссылке). Я сделал тело вопроса короче, легче для чтения. Я думаю, что это должно быть два отдельных вопроса: (1) о разреженности, (2) о поведении NTFS, вероятно, из-за разреженности. Пока нет ответов, которые касаются обеих проблем, вы можете сократить этот вопрос, чтобы охватить одну тему и задать другой вопрос о другой. ИМО, это было бы правильно. Kamil Maciorowski 6 лет назад 0
Что ж, я пытался применить ваши предложения, но кажется, что оно никогда не бывает достаточно формальным, и я весьма озадачен строгостью правил размещения на этом, в противном случае, отличном сайте (возможно, вы скажете мне, что он превосходен только потому, что он строгий!: ^ р). Я имею в виду, что уже не так просто четко сформулировать такие технические вопросы на примерно хорошем английском языке (что, я думаю, я до сих пор делал довольно хорошо), может быть обескураживающим, что потом придется потеряться в, казалось бы, бесконечном редактировании, чтобы соответствовать определенному стандарт, который, после определенного момента, не улучшит качество / ясность значительно. GabrielB 6 лет назад 0
Здесь вы предлагаете мне задать два отдельных вопроса, но для меня это один и тот же вопрос, поскольку я даже не уверен, правильно ли я использую терминологию и верны ли мои интерпретации / предположения даже отдаленно. Я просто пытаюсь как можно больше восстановить неисправный жесткий диск с помощью инструмента ddrescue. Я почти ничего не знаю о «редкости», я обнаружил эту концепцию совсем недавно, я не уверен, как она работает на логическом уровне и как она переводится, когда речь идет о реальных данных, записанных на устройстве хранения, я не мог не могу сказать наверняка, если то, что я наблюдал, действительно связано с разреженностью. GabrielB 6 лет назад 0
(1) Я прошу прощения, если вы нашли мои замечания пугающими. (2) Я просто случайный парень в Интернете, вы можете меня игнорировать. (3) Тем не менее, у меня есть некоторый опыт на этом сайте, чтобы сказать, какие вопросы привлекают хорошие ответы. (4) Этот вопрос имеет потенциал, но раньше он был ужасно длинным, я потратил свое время, чтобы сделать его более читабельным. Если бы я думал, что это недостаточно формально, я бы проголосовал против, но я этого не сделал. Kamil Maciorowski 6 лет назад 0
(5) Мне кажется, что вы упускаете главное: вопрос хорош, если он (то есть ответы на него) может помочь другим пользователям с подобными проблемами. Если вы помните об этом, вы, естественно, будете стремиться разделить ваши конкретные сложные случаи на вопросы, на которые можно ответить отдельно (возможно, в некоторой степени зависимо). В своем предыдущем вопросе (и ответе) вы пытались охватить * ваш конкретный сложный случай * в одном месте, задавая дополнительные вопросы, и я посоветовал вам задать их отдельно. Сейчас вы делаете что-то подобное, но это не лучшая стратегия. Kamil Maciorowski 6 лет назад 0
(6) В частности: в своем ответе на предыдущий вопрос вы заметили, что у вас есть разреженные файлы в NTFS * и * ext4. Это говорит о том, что ваш главный вопрос здесь не имеет ничего общего с NTFS. Ответ на вопрос "почему файлы были редкими?" явно не зависит от того, что вы будете делать с ними дальше. Также "известно, что драйвер NTFS для Linux имеет проблемы с большими разреженными файлами?" вероятно, есть ответ, который не зависит от того, почему эти файлы были созданы разреженными. Вот почему я думаю, что должно быть два отдельных вопроса (но заметьте, я не сильно изменил ваш вопрос, это ваше решение). Kamil Maciorowski 6 лет назад 0
(7) Я думал о том, чтобы исследовать поведение `ddrescue`, но чтобы опубликовать здесь хороший ответ, я должен также изучить, как Linux работает с разреженными файлами в NTFS. Я представляю пользователей, которые могут ответить на часть о NTFS, но они ограничивают себя, потому что они не знают о `ddrescue`. Разделив эти вопросы, вы увеличите свои шансы на получение хороших ответов и сможете сделать их полезными для других пользователей. Kamil Maciorowski 6 лет назад 0
«и я весьма озадачен строгостью правил размещения на этом, в противном случае, отличном веб-сайте» - этот веб-сайт, посвященный совершенству, становится возможным благодаря тем правилам, которые позволяют вам находить ответы на превосходные вопросы на отличные вопросы других людей и, надеюсь, улучшая Качество этого вопроса получите отличный ответ на свой вопрос. Без этих правил количество шума сделало бы невозможным поиск вопросов с качественными ответами. Ramhound 6 лет назад 1
@KamilMaciorowski & Ramhound: Я внимательно прочитал ваши комментарии и постараюсь применить эти принципы в следующий раз, когда создам вопрос. В этом случае, тем не менее, я думаю, что это должно быть полезным, поскольку оно связано с ddrescue и восстановлением данных, которые кажутся довольно популярными темами по уважительным (или плохим) причинам. Я мог бы еще создать еще один вопрос относительно того, как Linux работает с NTFS, следуя вашему совету. GabrielB 6 лет назад 0

2 ответа на вопрос

1
Kamil Maciorowski

Этот ответ исследует поведение ddrescueдля решения основного вопроса. Если вы не заинтересованы в процедуре тестирования, то можете перейти к моим выводам и интерпретации ближе к концу.

Testbed

$ uname -a Linux foo 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux  $ cat /etc/issue Ubuntu 14.04.5 LTS \n \l  $ ddrescue -V GNU ddrescue 1.17 … 

Файловая система btrfs; это не должно иметь значения, если оно поддерживает разреженные файлы.

тестирование

Сначала я получил 8 МБ случайных данных:

dd if=/dev/urandom of=random.chunk bs=1M count=8 

Затем я сделал это петлевое устройство и вспомнил его название:

loopdev=`sudo losetup -f --show random.chunk` 

Затем я создал еще одно устройство, которое состояло из

  • кусок 0: не читается, 1 МиБ
  • кусок 1: нули, 2 МиБ
  • кусок 2: не читается, 4 МиБ
  • кусок 3: данные от random.chunk, 8 МиБ
  • кусок 4: не читается, 16 МиБ

Код ( здесь используется синтаксис документа ):

sudo dmsetup create mydevice << EOF 0 2048 error 2048 4096 zero 6144 8192 error 14336 16384 linear $loopdev 0 30720 32768 error EOF 

Я подтвердил, gdisk -l /dev/mapper/mydeviceчто общий размер составляет 31 МиБ, как и должно быть.

Фактическое чтение выполняется с помощью:

ddrescue /dev/mapper/mydevice normal.raw normal.log ddrescue -R /dev/mapper/mydevice normalR.raw normalR.log ddrescue -S /dev/mapper/mydevice sparse.raw sparse.log ddrescue -RS /dev/mapper/mydevice sparseR.raw sparseR.log 

И результаты ls -hls *.rawявляются

 10M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 normal.raw 10M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 normalR.raw 8.0M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 sparse.raw 8.0M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 sparseR.raw 

Чтобы быть уверенным, я подтвердил, cmpчто все четыре файла идентичны, когда вы читаете их. Четыре файла журнала содержали одну и ту же карту ошибочных и исправных секторов.

Заметить, что

  • 15 МиБ означает, что последний кусок отсутствует;
  • 10 MiB обозначает кусок 1 и кусок 3;
  • 8 MiB указывает только блок 3.

очищающий

sudo dmsetup remove mydevice sudo losetup -d $loopdev unset loopdev rm random.chunk normal.raw normal.log normalR.raw normalR.log sparse.raw sparse.log sparseR.raw sparseR.log 

Выводы

  • Когда дело доходит до размера файла, не имеет значения, читаете ли вы в reverse ( -R) или нет.
  • Непонятный кусок в самом конце входного файла не влияет на общий размер выходного файла.
  • Непонятные фрагменты, которые вносят вклад в общий размер файла, всегда редки (если целевая файловая система поддерживает это, конечно).
  • -SОпция влияет только на блоки нулей, которые были фактически считанных из входного файла.

интерпретация

Выше были факты. Этот раздел больше похож на мое мнение.

Похоже, ddrescueпытается сохранить ваше дисковое пространство всякий раз, когда он может сделать это без дополнительной работы. При использовании -Sинструмента необходимо выполнить некоторые вычисления, чтобы проверить, является ли данный блок данных всеми нулями. Если есть ошибка чтения, ему не нужно ничего вычислять, это может сделать фрагмент разреженным в выходном файле без затрат.

Решение

Вы написали:

используя -Rпереключатель («реверс») вначале, полагая, что он сразу выделит весь размер входного жесткого диска

Мы только что увидели, что это ложное предположение. На самом деле вы описали, что -pделает. ddrescue -pпредварительно выделит место на диске для выходного файла. Когда я делал это во время моих тестов, выходной файл имел 31 МБ и не был разреженным (даже с -S).

Я был бы заинтересован в процедуре тестирования, но я совершенно потерян в деталях здесь! : ^ p (Совершенно новичок в Linux, едва знаком с синтаксисом, достаточным для запуска ddrescue и нескольких других связанных с ним инструментов.) Я сам провел более простой тест (см. мой ответ), который, кажется, подтверждает ваши выводы и мои предыдущие наблюдения. Что касается параметра -p, я сначала попробовал его, но, как я объяснил, он оказался очень длинным процессом, так как кажется, что он фактически записывает на выходе полностью пустой файл (в данном случае 1 ТБ) вместо простого выделения его размера, что должно / могло (?) быть сделано мгновенно. GabrielB 6 лет назад 0
@GabrielB Как насчет `fallocate -l filename` заранее? Моему `ddrescue` или` fallocate 'требуется около двух секунд, чтобы выделить 70+ ГиБ, поэтому 1 ТБ не должен занимать много времени. Я работаю на btrfs, хотя, не могу проверить ext4 в данный момент. Kamil Maciorowski 6 лет назад 0
Я начал весь процесс с раздела NTFS (до перехода на ext4, как объяснялось в первом вопросе), и именно тогда я попробовал ключ -P. Так что мы можем кое-что здесь ... Если предварительное выделение большого тома в разделе ext4 также выполняется в считанные секунды, это будет означать, что текущая поддержка NTFS в Linux не позволяет выполнять такого рода работать так же эффективно, как и с родной файловой системой Linux (кстати, я никогда не слышал о btrfs). Но может ли это объяснить такое серьезное замедление? GabrielB 6 лет назад 0
0
GabrielB

Я сделал другой тест самостоятельно.

- Я создал простой шаблон ddrescue log / map файл, содержащий это:

0x00000000 0x100000 ? 0x100000 0x3FE00000 + 0x3FF00000 0x100000 ? 

(Это означает: в пределах одного ГБ данных, первый и последний МБ не были опробованы, остальные считаются «спасенными».)

- Я запустил ddrescue с этим файлом журнала / карты, используя эту команду (с восстановленным образом из восстановления этого жесткого диска емкостью 1 ТБ в качестве входа, обрезав вывод в 1 ГБ):

ddrescue -s 1073741824 [rescued_image_file] [test1GB] [test1GB.log] 

Полученный файл [test1GB] имеет общий размер 1 ГБ, как и ожидалось, но «размер на диске» 2 МБ, что означает, что были выделены только данные, которые были фактически скопированы (первый и последний МБ).

- Затем я запустил ddrescue с этим файлом объемом 1 ГБ в качестве входных данных, на этот раз без шаблона, сначала без, а затем с ключом -S («редкие записи»).

ddrescue [test1GB] [test1GB-NS] [test1GB-NS.log] ddrescue -S [test1GB] [test1GB-S] [test1GB-S.log] 

И кажется, что:

  • [test1GB-NS] (не разреженный) имеет «размер на диске» 1 ГБ - поэтому весь файл был выделен и скопирован, даже пустые сектора; в то время как...
  • [test1GB-S] (sparse) имеет «размер на диске» всего 1,2 МБ или 1114112 байт - это означает, что пустые сектора не были выделены, даже те, которые содержатся в первом и последнем МБ.

Я думал, что «разреженность» была концепцией «все или ничего», так же как и сжатие файлов, но, очевидно, существует такая вещь, как «частично разреженный» файл, и действительно, ddrescue, похоже, экономит место таким образом - что не является обязательно преимущество (и может действительно повлиять на производительность); должен быть переключатель, позволяющий распределять полный размер выходного файла «на лету» (в отличие от предварительного выделения, которое может быть очень длинным, если ввод большой), так же, как это делается (очевидно) при прямой записи на устройство или раздел.

Похожие вопросы