LINUX.ORG.RU

История изменений

Исправление 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 уйдёт полный блок, а вот во входном файле смещение будет меньше блока. В итоге у тебя весь образ съедет на сколько байт.