Можно ли использовать содержимое / dev / disk0 (/ dev / sda и т. Д.) В качестве стандартного ввода?

809
Ephemera

Я изучаю /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?
1

3 ответа на вопрос

4
grawity

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

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

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

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

-2
ryder

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

чао райдер