LINUX.ORG.RU
решено ФорумAdmin

Как соотносится смещение в dd и ddrescue?

 ,


0

2

Команда ddrescue отработала около 1к прогонов, данные изредка продолжают добываться из HDD. Любопытства ради я решил проверить ошибку, которую выдаст dd при чтении сбойной области.

Получил смещение:

# grep '[-]$' sdb.map | head -n1
0xB6AB9000  0x00001000  -

Попытался прочитать хотя бы 1 байт:

# dd if=/dev/sdb bs=1b iseek=$((0xB6AB9000)) count=1
dd: /dev/sdb: cannot skip: Invalid argument

Почему аргумент инвалид?

man dd читает @yars068:

N и КОЛИЧЕСТВО_БАЙТОВ могут сопровождаться следующими суффиксами-множителями: c=1, w=2, b=512, kB=1000, K=1024, MB=10001000, M=10241024, xM=M, GB=100010001000, G=102410241024 и так далее для суффиксов T, P, E, Z, Y, R, Q. Также можно использовать двоичные приставки: KiB=K, MiB=M и так далее. Если N заканчивается на «B», будет осуществляться подсчёт байтов, а не блоков

А если серьёзно, то dd не принимает 16-ричные числа.

yars068 ★★★★★
()
Ответ на: комментарий от yars068

Ну он и переводит число в десятичное через bash-арифметику.

А вот зачем он 'b' поставил, действительно непонятно, но, видимо, dd он изучал из альтерантивных источников. И 1b и iseek — явная ерись.

mky ★★★★★
()
Ответ на: комментарий от mky

1b – это будет 512, согласно ману, синтаксис корректный. Но в нём не сказано, что он принимает шестнадцатеричные, хоть с префиксом 0x, хоть просто число. А перевести можно так:

echo "obase=10; ibase=16; B6AB9000" | bc
3064696832
yars068 ★★★★★
()
Ответ на: комментарий от mky

И 1b и iseek — явная ерись.

Согласно ману, iseek эквивалентно skip. Вполне нормально он написал, только bs можно было и не указывать явно – по умолчанию размер блока 512 байт. Надо было после вычисления указать B, похоже; в этом случае dd оперировал бы байтами, а не блоками.

yars068 ★★★★★
()
Ответ на: комментарий от mky

А вот зачем он ‘b’ поставил, действительно непонятно

Для однозначности, чтобы не гадать, что там находится по дефолту. Можно пересчитать на bs=512 или bs=4k, но проблема не исчезнет.

dd он изучал из альтерантивных источников. И 1b и iseek — явная ерись.

man dd, источник каноничен. Смысловое значение iseek/oseek проще запомнить в привязке if/of, нежели их классические синонимы skip/seek.

$ dd --version
dd (coreutils) 9.1
newbie24
() автор топика
Ответ на: комментарий от yars068

Надо было после вычисления указать B, похоже; в этом случае dd оперировал бы байтами, а не блоками.

Точно. Я хотел однозначности, и вписал байты. Но забыл про регистр. Кажется, проблема именно в этом.

newbie24
() автор топика
Ответ на: комментарий от newbie24

Я хотел однозначности, и вписал байты. Но забыл про регистр. Кажется, проблема именно в этом.

Так и было. Всем спасибо за помощь в преодолении тупняка.

newbie24
() автор топика
Ответ на: комментарий от newbie24

Нет, регистр тут ни при чём. Я имел в виду, что команда должна была иметь такой вид:

dd if=/dev/sdb bs=1b iseek=$((0xB6AB9000))B count=1

Хотя, конечно, можно было и просто bs=1 :)

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 1)
dd --version
dd (coreutils) 9.7
Copyright © 2025 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <https://gnu.org/licenses/gpl.html>.
Это свободное ПО: вы можете изменять и распространять его.
Нет НИКАКИХ ГАРАНТИЙ в пределах действующего законодательства.

Авторы программы: Поль Рубин (Paul Rubin), Дэвид Маккензи (David MacKenzie) и Стюарт Кемп (Stuart Kemp).
yars068 ★★★★★
()
Ответ на: комментарий от yars068

Хм…

$ man dd | egrep 'seek=|GNU coreutils 9'
       seek=N (or oseek=N) skip N obs-sized output blocks
       skip=N (or iseek=N) skip N ibs-sized input blocks
GNU coreutils 9.1

Насколько вижу, размер должен быть указан в количестве блоков. Но dd не ругается на суффиксы в iseek/oseek. Как до этого можно догадаться?

newbie24
() автор топика
Ответ на: комментарий от newbie24
 N и КОЛИЧЕСТВО_БАЙТОВ могут сопровождаться следующими суффиксами-множителями: c=1,  w=2,
       b=512,    kB=1000,   K=1024,   MB=1000*1000,   M=1024*1024,   xM=M,   GB=1000*1000*1000,
       G=1024*1024*1024 и так далее для суффиксов T, P, E, Z, Y, R, Q. Также можно использовать
       двоичные приставки: KiB=K, MiB=M и  так  далее.  Если  N  заканчивается  на  «B»,  будет
       осуществляться подсчёт байтов, а не блоков.


dd --version                                                            
dd (coreutils) 9.7
ALiEN175
()
Последнее исправление: ALiEN175 (всего исправлений: 1)
Ответ на: комментарий от ALiEN175

Если N заканчивается на «B», будет осуществляться подсчёт байтов, а не блоков.

Вот где собака зарыта!

Ещё раз всем спасибо. Теперь я не только преодолел свой тупняк с регистром, но и узнал что-то совершенно новое про dd.

newbie24
() автор топика
Ответ на: комментарий от newbie24

Каноничный источник — бумажная книга, и там нет никаких суффиксов и никаких iseek. Писали бы без суффиксов и всё бы сработало. А ещё могли чуть-чуть напрячься, запустить команду под strace, увидить, что там ваш dd делает:

lseek(0, 1569124777984, SEEK_CUR) = -1 EINVAL (Invalid argument)

Прочитать man lseek, узрить там:

EINVAL ... file offset would be negative, or beyond the end of a seekable device.

mky ★★★★★
()