Многие приложения скрывают критические разделы дисков (например, MBR, inode файловой системы, границы разделов и т.д.).
Какие приложения?
Это не вещь приложения; обычно это операционная система, которая имеет дело с файловыми системами и разделами диска.
Является ли вывод из xxd настоящим низкоуровневым дампом устройства?
Больше похоже на средний уровень, но да. Вы видите необработанные данные в точности так, как их записала ОС, и именно так, как ОС будет их считывать. Обычно в первых 512 байтах есть MBR, часто - GPT в следующие несколько килобайт, и где-то в секторе 63 (старый) или 2048 (новый) вы увидите структуры файловой системы 1-го раздела.
Истинный низкоуровневый дамп будет означать данные в том виде, в котором они были записаны контроллером диска : не только считываемые ОС байты, но и данные выравнивания износа, записи ошибок SMART, возможно, ключи шифрования. Но он невидим для ОС, и вы, как правило, не можете получить к нему прямой доступ с помощью какой-либо программы - только с помощью специального оборудования для восстановления данных.
(Тем не менее, некоторые флэш-устройства являются исключением; у них нет встроенного программного обеспечения диска, ОС делает все, например, файловая система jffs2 управляет выравниванием износа флэш-памяти на уровне ОС.)
Я вижу все побайтово на устройстве?
Да, вы видите это так же, как операционная система.
Поскольку /dev /disk0 содержит данные, почему я не могу использовать их в качестве потока stdin?
Конечно вы можете. На самом деле вы действительно использовали его в качестве потока в первом примере; единственное отличие состоит в том, что в первом примере xxd
был тем, кто вызывал open("/dev/disk0"); тем временем во втором примере, который был сделан вашей оболочкой (sh
, bash
, zsh
).
Но это различие является причиной сообщения об ошибке. Но это не имеет ничего общего с тем, что вы пытаетесь прочитать диск; "Отказано в доступе " буквально означает, что вы не можете открыть /dev/disk0
потому что для этого вы должны быть пользователем root .
(На этот сайт много раз отвечали. Здесь, здесь, здесь, здесь, здесь и здесь.)
Чтобы расширить предыдущее, перенаправление stdin/stdout происходит, когда оболочка открывает файл перед запуском программы. Итак, в вашем первом примере sudo xxd /dev/disk0
сначала использует sudo
для запуска xxd /dev/disk0
с привилегиями root.
Но когда вы запускаете sudo xxd < /dev/disk0
, перенаправление < /dev/disk0
все еще обрабатывается вашей непривилегированной оболочкой; sudo xxd
еще не запущен.
Используйте sudo sh -c "xxd < /dev/disk0"
чтобы вся команда была обработана как root.