/dev/disk0 (/dev/sda 等) 的内容可以用作标准输入吗?

/dev/disk0 (/dev/sda 等) 的内容可以用作标准输入吗?

我正在学习文件系统。我从(Linux) 和(OS X)/dev开始,发现了一些有趣的行为。如果我运行:/dev/sd*/dev/disk*

$ 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.....
< ... >

稍微用谷歌搜索一下似乎可以将其识别为 MBR 的开始(我已经安装了 Bootcamp)。

但是,以下操作不起作用:

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

我的问题是:

  • 许多应用程序隐藏了磁盘的关键部分(例如 MBR、文件系统 inode、分区边界等)。输出是否来自xxd设备的真实低级转储?我是否可以看到设备上的每一个字节?
  • 由于/dev/disk0显然包含数据,为什么我不能将其用作标准输入流?

答案1

许多应用程序隐藏磁盘的关键部分(例如 MBR、文件系统 inode、分区边界等)。

哪些应用程序?

这不是应用程序的问题;通常是操作系统负责处理文件系统和磁盘分区。

xxd 的输出是设备的真正低级转储吗?

更像中等的级别,但确实如此。您看到的原始数据与操作系统写入的完全一样,也与操作系统读回的完全一样。前 512 个字节中通常有一个 MBR,接下来的几千字节中通常有一个 GPT,在扇区 63(旧)或 2048(新)的某个位置,您会看到第一个分区的文件系统结构。

真正的低的级别转储意味着数据作为磁盘控制器已写入:不仅仅是操作系统可读字节,还有损耗均衡数据、SMART 故障记录,或许还有加密密钥。但操作系统看不到这些数据,而且通常无法使用任何程序直接访问这些数据,只能使用专门的数据恢复硬件。

(也就是说,一些闪存设备是个例外;它们没有磁盘固件,操作系统完成所有工作 - 例如,jffs2 文件系统在操作系统级别管理闪存磨损均衡。)

我是否可以逐字节地查看设备上的所有内容?

是的,您看到的它与操作系统看到的它相同。

既然 /dev/disk0 显然包含数据,为什么我不能将其用作标准输入流?

当然可以。事实上你做过在第一个例子中将其用作流;唯一的区别是在第一个例子中xxd是调用 open("/dev/disk0"); 同时,在第二个例子中,这是由你的 shell 完成的(shbashzsh)。

但这种差异导致错误消息的原因。但这与您尝试读取磁盘无关;“权限被拒绝”的字面意思是您无法打开,/dev/disk0因为你必须是root这样做。

(这个问题已经回答了多次在这个网站上。这里这里这里这里这里, 和这里

扩展一下前面的内容,stdin/stdout 重定向是通过在启动程序之前打开文件。因此,在第一个示例中,sudo xxd /dev/disk0首先使用root 权限sudo运行。xxd /dev/disk0

但当你运行的时候sudo xxd < /dev/disk0,重定向< /dev/disk0仍然由你的无特权shell;sudo xxd尚未运行。

用于sudo sh -c "xxd < /dev/disk0"以 root 身份处理整个命令。

答案2

我不知道你的第一个问题,但根据手册页判断xxd,看起来很可能是这样。

对于 stdin 问题,您确实可以重定向/dev/disk0到接受 stdin 的程序。您看到的问题是 sudo 本身不执行重定向,因此访问/dev/disk0取决于您的常规用户的权限。

堆栈溢出这个问题选项。

答案3

对我来说,不清楚你想做什么。也许这可能对你有帮助。如果你想访问磁盘原始数据,dd 程序是正确的方法。使用 dd,你可以复制出 MBR 或整个磁盘。

你好,赖德

相关内容