История изменений
Исправление i-rinat, (текущая версия) :
conv=sync,noerror
Это такой способ получить кривой дамп.
Dd читает исходные данные блоками фиксированного размера. В твоём случае ты запрашиваешь размер в 64 * 1024
байт. Читает он вызовом read()
, который может вернуть как 64 * 1024
байт, так и меньше. Если он возвращает меньше, то dd просто считает, что read()
вернул 64 * 1024
байт. Перед чтением dd зануляет внутренний буфер, поэтому всё выглядит как дополнение прочитанных данных NULями до 64 * 1024
байт.
Есть несколько причин, по которым read()
может вернуть меньше данных, чем запрашивалось. Я знаю две: «файл кончился» и «ядро решило прервать вызов». Если окончание файла ещё можно предсказать, то вот что там у ядра случится предсказать вряд ли выйдет. Если подобное произойдёт, то в выходной файл из-за conv=sync
уйдёт полный блок, а вот во входном файле смещение будет меньше блока. В итоге у тебя весь образ съедет на сколько-то байт.
А, и ещё conv=sync округлит размер выходного файла вверх до ближайшего множителя размера блока. Из входного файла в 6 байт будет сделан файл в 65536 байт. То есть с conv=sync
ты ещё и информацию о размере файла частично теряешь. Это уже гарантированно, каждый раз.
Исправление i-rinat, :
conv=sync,noerror
Это такой способ получить кривой дамп.
Dd читает исходные данные блоками фиксированного размера. В твоём случае ты запрашиваешь размер в 64 * 1024
байт. Читает он вызовом read()
, который может вернуть как 64 * 1024
байт, так и меньше. Если он возвращает меньше, то dd просто считает, что read()
вернул 64 * 1024
байт. Перед чтением dd зануляет внутренний буфер, поэтому всё выглядит как дополнение прочитанных данных NULями до 64 * 1024
байт.
Есть несколько причин, по которым read()
может вернуть меньше данных, чем запрашивалось. Я знаю две: «файл кончился» и «ядро решило прервать вызов». Если окончание файла ещё можно предсказать, то вот что там у ядра случится предсказать вряд ли выйдет. Если подобное произойдёт, то в выходной файл из-за conv=sync
уйдёт полный блок, а вот во входном файле смещение будет меньше блока. В итоге у тебя весь образ съедет на сколько байт.
А, и ещё conv=sync округлит размер выходного файла вверх до ближайшего множителя размера блока. Из входного файла в 6 байт будет сделан файл в 65536 байт. То есть с conv=sync
ты ещё и информацию о размере файла частично теряешь. Это уже гарантированно, каждый раз.
Исходная версия i-rinat, :
conv=sync,noerror
Это такой способ получить кривой дамп.
Dd читает исходные данные блоками фиксированного размера. В твоём случае ты запрашиваешь размер в 64 * 1024
байт. Читает он вызовом read()
, который может вернуть как 64 * 1024
байт, так и меньше. Если он возвращает меньше, то dd просто считает, что read()
вернул 64 * 1024
байт. Перед чтением dd зануляет внутренний буфер, поэтому всё выглядит как дополнение прочитанных данных NULями до 64 * 1024
байт.
Есть несколько причин, по которым read()
может вернуть меньше данных, чем запрашивалось. Я знаю две: «файл кончился» и «ядро решило прервать вызов». Если окончание файла ещё можно предсказать, то вот что там у ядра случится предсказать вряд ли выйдет. Если подобное произойдёт, то в выходной файл из-за conv=sync
уйдёт полный блок, а вот во входном файле смещение будет меньше блока. В итоге у тебя весь образ съедет на сколько байт.