我正在创建一个程序,它获取文件的十六进制转储,以便我可以将其传输到某个地方,并重建文件,但是十六进制转储仅包含文件内容,我还需要获取文件属性,那么我在哪里获取该文件的属性,然后将它们应用于我从该十六进制转储创建的新文件?我为此使用了 bash,但实际上并不是关于代码,而是关于在哪里找到它,尽管您可以将其与代码有关,因为显然我需要一些命令。我正在运行 Ubuntu GNOME 15.04,带有 GNOME Shell 和 GNOME 3.16。
答案1
文件属性存储在 inode 中。每个 inode 存储的属性列在POSIX Inode 规范。当我们使用ls -l
或stat
任何其他获取文件属性的程序时,都会使用stat(2)
下面的系统调用。
现在 inode 是文件系统相关的属性,它们在创建文件系统时被创建为固定数字。有一个程序dumpe2fs
可以读取文件系统的超级块ext*
,以便我们可以了解一些情况,例如:
sudo dumpe2fs -h /dev/sda1
现在我们来检查一下 inode 相关的属性:
$ sudo dumpe2fs -h /dev/sda1 | grep -i 'inode.*:'
Inode count: 9379840
Free inodes: 9297243
Inodes per group: 8192
Inode blocks per group: 512
First inode: 11
Inode size: 256
Journal inode: 8
正如您所看到的,您获得了足够的信息,例如第一个 inode、inode 大小、inode 数量等。如果您将其乘以Inode count
,Inode size
您就会得到为 inode 保留了多少。
文件复制程序(例如cp
)rsync
具有-a
(存档)选项,可以复制文件 inode 上存储的属性,因此您需要在可能使用的程序中查找这些或类似的选项。
为了保存文件的属性,然后稍后使用它,您可以检查这是来自吉尔斯的回答。
答案2
这可能不是一个完整的答案,但这是我从研究中发现的。
文件属性存储在inodes
“inode 表”中,并且通常分散在整个文件系统中。通常,要查找 inode 表的位置(至少在ext3
文件系统中),您可以运行:
sudo dumpe2fs /dev/<device> | fgrep 'Inode table'
您可以在 inode 所在的块中对原始数据进行十六进制转储(笔记我还没有尝试过这个命令!):
sudo dd if=/dev/<device> ibs=4096 skip=<inode block> count=1 | hexdump
将<device>
和替换<inode block>
为您要查看的 inode 表的块偏移量。