1

Я изучаю файловую систему /dev . Я начал с /dev/sd* (Linux) и /dev/disk* (OS X) и обнаружил интересное поведение. Если я бегу:

$ sudo xxd -l 1024 /dev/disk0

Я получаю следующий вывод:

0000000: 33c0 8ed0 bc00 7c8e c08e d8be 007c bf00  3.....|......|..
0000010: 06b9 0002 fcf3 a450 681c 06cb fbb9 0400  .......Ph.......
0000020: bdbe 0780 7e00 007c 0b0f 850e 0183 c510  ....~..|........
0000030: e2f1 cd18 8856 0055 c646 1105 c646 1000  .....V.U.F...F..
0000040: b441 bbaa 55cd 135d 720f 81fb 55aa 7509  .A..U..]r...U.u.
0000050: f7c1 0100 7403 fe46 1066 6080 7e10 0074  ....t..F.f`.~..t
0000060: 2666 6800 0000 0066 ff76 0868 0000 6800  &fh....f.v.h..h.
0000070: 7c68 0100 6810 00b4 428a 5600 8bf4 cd13  |h..h...B.V.....
< ... >

Небольшой поиск в Google, кажется, идентифицирует это как начало MBR (у меня установлен Bootcamp).

Однако следующее не работает:

$ sudo xxd -l 1000 < /dev/disk0
-bash: /dev/disk0: Permission denied

Мои вопросы:

  • Многие приложения скрывают критические разделы дисков (например, MBR, inode файловой системы, границы разделов и т.д.). Является ли вывод из xxd настоящим низкоуровневым дампом устройства? Я вижу все побайтово на устройстве?
  • Поскольку /dev/disk0 содержит данные, почему я не могу использовать их в качестве потока stdin?

3 ответа3

4

Многие приложения скрывают критические разделы дисков (например, 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.

3

Я не знаю о вашем первом вопросе, но, судя по man-странице для xxd, похоже, что так оно и есть.

Что касается вопроса о stdin, вы действительно можете перенаправить /dev/disk0 в программы, которые принимают stdin. Проблема, которую вы видите, заключается в том, что sudo не выполняет само перенаправление, поэтому доступ к /dev/disk0 основан на разрешениях вашего обычного пользователя.

См. Переполнение стека и этот вопрос для вариантов.

-2

для меня не понятно, что ты хочешь делать. Возможно, это может помочь вам. Если вы хотите получить доступ к необработанным данным на диске, программа dd - правильный путь. С помощью dd вы можете скопировать MBR или весь диск.

чао райдер

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .