在 Unix 文件系统中,目录只是具有特殊目录结构的特殊文件,其中包含子文件名、文件名大小和 inode 引用号。
除此之外的实际文件元数据通常存储在 inode 本身中。
我的问题是。如何以原始形式而不是解释形式读取实际的特殊目录结构。
是的,我知道您可以使用 ls 来查看那里的文件。那不是我要找的。
答案1
简单的答案是,您想要做的是使用 、 或 等命令读取cat .
目录cat /etc
文件cat mydir
。当然,由于这是“原始”数据,因此您需要使用更适合以人性化方式显示非 ASCII 数据的程序;例如,hexdump
或od
。
不幸的是,正如所讨论的目录何时停止作为文件读取?,过去二十年左右发布的大多数 Unix 版本都不允许这样做。所以你的问题的答案可能是“找到一个仍然允许读取目录的 Unix 版本”。 AIX、大多数版本的 BSD 以及除最新版本之外的所有 Solaris 都可能符合资格。找到一个允许它的 Linux 可能需要使用时间机器。
答案2
该结构完全取决于所使用的特定文件系统,读取它的唯一方法是直接从磁盘读取(即 /dev/sda1 ),并自己解释文件系统。
答案3
我知道这是一个老问题,但我正在寻找有关目录结构的信息并发现了这个。
要获取目录文件中的原始数据,您可以使用debugfs
.例如:
sudo debugfs /dev/sda1
您可以照常使用ls
、cd
、 等,或者cat
目录。这不是很可读,所以你可以使用:
dump / dumproot
dumproot
这将在您调用的位置创建一个名为debugfs
.要获取它的原始内容,您可以使用xxd
.例如:
xxd dumproot | head -n2
00000000: 0200 0000 0c00 0102 2e00 0000 0200 0000 ................
00000010: 0c00 0202 2e2e 0000 0b00 0000 1400 0a02 ................
这显示了我的目录的.
和条目,它们的索引节点号都是 2,即开头的 02000000。对于较大的索引节点编号,您可以在小尾数法的条目开头看到它们。 是十六进制 2e,所以在那里也可见。我不太确定“0c00 0102”代表什么,或者如何指定条目的结尾。当我发现这个线程时,这就是我正在寻找的东西。..
/
.
答案4
文件系统为 inode 提供的几乎所有信息都可以通过统计数据命令。这可以看作是文件和目录的索引节点的原始信息。
stat FILE
可以找到很多关于Linux中inode的信息这里
如果您想检查文件系统的一般创建过程,请尝试以下操作:
- 创建一个约100kB的空文件
- 使用所需的文件系统格式化文件
- 备份这个原始文件
- 安装为循环设备
- 创建一些目录和文件
- 使用 hexdiff 或 hexeditor 分析你的 coice 的变化
作为 root 执行以下操作:
mkdir mountpoint
dd if=/dev/zero of=file_s.img bs=50k count=2
mkfs.ext2 file_s.img
cp file_s.img file_s_orig.img
mount -o loop file_s.img mountpoint
bless file_s.img