我正在学习文件系统。我从(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 完成的(sh
,bash
,zsh
)。
但这种差异是导致错误消息的原因。但这与您尝试读取磁盘无关;“权限被拒绝”的字面意思是您无法打开,/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
答案3
对我来说,不清楚你想做什么。也许这可能对你有帮助。如果你想访问磁盘原始数据,dd 程序是正确的方法。使用 dd,你可以复制出 MBR 或整个磁盘。
你好,赖德