在Linux中打开特定块上的文件

4
为了调试目的,我想在特定预定义块上打开一个文件。例如,如果我怀疑特定块已经损坏,我希望能够在用户模式下写入和读取它,同时分区已经挂载。

有没有办法告诉Linux,“嘿!如果空闲,请在块4579上打开这个新文件”。

是的,我可以直接编辑块设备,但如果驱动器已经挂载,那可能会破坏文件系统。

欢迎提供通用答案,但即使是针对ext文件系统系列的答案也足够好了。


这将高度依赖于特定的文件系统。有些文件系统甚至没有块的概念。但是你已经标记了ext4这个问题。我非常怀疑ext4或任何类似的文件系统是否具有这样的功能。 - Celada
@Celada 他们必须要有块的概念,因为这是他们写入物理设备的基本单位,不是吗? - mikebloch
我说过,一些文件系统没有块的概念。nfs、tmpfs、虚拟文件系统、大多数fuse文件系统、jffs2(尽管该文件系统按块擦除)等等...但是我只是顺便提到了这个,因为我猜你是在问ext4特别的情况。 - Celada
@Celada,请问您能否解释一下(我对块设备还不熟悉),jffs2最终不会向底层闪存的第二个块写入4K吗?(或其他什么)。也许它会将某个块分配给多个文件,也许它根本没有文件的概念,但归根结底,它会向底层块设备(可能是一个假装是块设备的文件,但它仍然认为自己是块设备)写入4K(或块大小是多少)的数据。我错了吗? - mikebloch
1
这个问题让我想起那些想要从用户空间访问特定物理内存地址的人。唉... - paulsm4
显示剩余2条评论
1个回答

2
例如,如果我怀疑特定的块已损坏,我想从它那里读取并写入... 有没有一种方法告诉Linux,“嘿!如果它是空闲的,请在块4579上打开这个新文件”?
是的,您可以将底层块设备用作文件,并在文件上搜索该位置。 鉴于您的“调试”用例,这似乎是适当的。 请注意,对此块的写入可能会破坏以上文件系统的完整性(甚至写回刚刚读取的内容)。
否则,文件系统通常会掩盖底层设备的布局,因此没有这种机制来提示应该在哪里创建文件。

即使驱动器也不会暴露它们的真实几何形状。除了原始NAND芯片之外,所有闪存设备都会自动进行磨损平衡,因此在存储中根本没有特定位置的概念。而磁性设备可以通过ECC机制检测错误,并在操作系统层面上没有任何可见性地透明地重新映射扇区。 - Andy Ross
@Brian 我知道,但是我不想破坏我的文件系统。 - mikebloch
2
@mikebloch 我认为Brian没有责任展示LKML参考,表明该功能已被考虑并被拒绝。对于一个文件系统来说,允许外部输入其块分配决策策略是非常奇怪的事情,因此很可能以前从未讨论过。你提到的ioctls用于在事后查找文件位置和可用空间,是专门添加的解决具体用例的(例如引导加载程序的需求)。即使如此,公开这一点也是脆弱的:当涉及RAID奇偶校验或文件数据存储在inode中时,它意味着什么? - Celada
@Celada,如果文件嵌入在索引节点中-只需返回索引节点所在的块。RAID也有块,它们不映射到实际磁盘上的块,但是RAID控制器会假装自己是一个磁盘,如果它将4K存储在7821号块上,则应报告文件位于7821号块,而不管RAID控制器之后做了什么。 - mikebloch
2
@mikebloch 碎片整理软件,例如 fsck,被认为是文件系统实现的一部分,并且与特定的文件系统类型紧密相关,可能由同一团队开发。它将使用文件系统的私有接口,这些接口并不是为公共使用而设计的,也无法扩展为足够通用。例如,考虑 zfs:它是一个写时复制的文件系统,因此每次修改文件时,文件都会移动到新的块中。你期望这样吗?无论如何,对于 zfs,您必须处理比块更多的内容:您还有存储池。 - Celada
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接