Эта проблема присуща dd
.Если желаемое место поиска не имеет подходящего значения (достаточно велико для хорошей производительности, но достаточно мало, чтобы использовать его в качестве размера буфера), то вы застряли.Это происходит в других случаях, когда желаемым местом поиска является большое простое число.
В этом конкретном случае, как указывало Марк Манн , у вас до есть хорошие варианты:2469396480 - это 2355 блоков размером 1048576 или 1024 блока размером 2411520 и т. Д. Но это не общий ответ.
Чтобы сделать это в общем, вам нужно использовать что-то отличное от dd
.К счастью, задача dd
очень проста, и все, что вам нужно, это следующее (в псевдокоде ... Я не очень много делал на Perl)
if = open("/dev/ram1", "r")
of = open("/dev/sdb1", "r+")
seek(of, 2469396480)
loop until you have copied the amount of data you want {
chunk = read(if, min(chunksize, remaining_bytes_to_copy))
write(of, chunk)
}
Похоже, источникВаша копия - это некий виртуальный диск.Если вам действительно нужна кричащая производительность, вы можете попробовать другой метод, кроме чтения фрагментов в буфер и записи буфера в выходной файл.Например, вы можете mmap()
исходный файл и write()
непосредственно с сопоставленного адреса.ОС может (или не может) оптимизировать одну из операций копирования из ОЗУ в ОЗУ.Обратите внимание, что такие методы будут менее переносимы и с меньшей вероятностью будут доступны на языках высокого уровня, таких как Perl.