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

在Linux中打开特定块上的文件,linux,filesystems,ext4,Linux,Filesystems,Ext4,出于调试目的,我想打开特定预定义块上的文件。例如,如果我怀疑某个特定的块被损坏,我想从中写入和读取,我更愿意在安装分区的同时以用户模式执行 有没有办法告诉Linux,“嘿!如果这个新文件是免费的,请在4579块上打开它” 是的,我可以直接编辑块设备,但是如果安装了驱动器,这可能会破坏文件系统 通用的答案是受欢迎的,但即使是ext文件系统系列的答案也足够好了 例如,如果我怀疑某个特定的块被损坏,我想从中进行写入和读取 ... 有没有办法告诉Linux,“嘿!如果这个新文件是免费的,请在4579块上

出于调试目的,我想打开特定预定义块上的文件。例如,如果我怀疑某个特定的块被损坏,我想从中写入和读取,我更愿意在安装分区的同时以用户模式执行

有没有办法告诉Linux,“嘿!如果这个新文件是免费的,请在4579块上打开它”

是的,我可以直接编辑块设备,但是如果安装了驱动器,这可能会破坏文件系统

通用的答案是受欢迎的,但即使是ext文件系统系列的答案也足够好了

例如,如果我怀疑某个特定的块被损坏,我想从中进行写入和读取 ... 有没有办法告诉Linux,“嘿!如果这个新文件是免费的,请在4579块上打开它”

是的,您可以将底层块设备用作文件,并查找文件上的该位置。考虑到您的“调试”用例,这似乎是合适的。请注意,写入此块可能会破坏上述文件系统的完整性(甚至写回刚读取的内容)


否则,不会,文件系统被设计为隐藏设备布局背后的真实几何图形,因此没有这样的机制来提示应该在何处创建文件。

这在很大程度上取决于使用的特定文件系统。有些文件系统甚至没有块的概念。但是你已经把问题标记为ext4。我非常怀疑ext4或任何其他类似的文件系统是否有这样的功能。@Celada他们必须有块的概念,因为这是他们写入物理设备的基本单元,不是吗?我说过一些文件系统没有块的概念。nfs、tmpfs、虚拟文件系统、大多数fuse文件系统、jffs2(尽管它是按块擦除的)等等。。。但我只是说,顺便说一句,因为我知道你是专门问ext4的。@Celada,你能解释一下(我是块设备新手),jffs2最终不会在底层闪存的第二个块中写入4K吗?(或其他)。也许它会将某个块分配给许多文件,也许它根本没有文件的概念,但在一天结束时,它会将4K(或任何块大小)的数据写入底层块设备(可能是一个假装为块设备的文件,但它仍然会认为它是块设备)。我错了吗?这个问题让我想起了那些想从用户空间访问特定物理内存地址的人。唉…连硬盘都没有露出它们的真实几何图形。当然,除了原始NAND芯片之外,所有闪存设备都会自动进行损耗均衡,因此根本不知道存储中的具体位置。磁性设备可以通过ECC机制检测错误,并在操作系统级别上透明地重新映射扇区,而无需任何可见性。@AndyRoss在该级别上我不关心它,我只想获得操作系统使用的相同块级访问权限。@Brian我知道,但是,我不想破坏我的文件系统。@mikebloch我不认为Brian有责任显示LKML引用,说明该功能已被考虑并拒绝。对于文件系统来说,允许外部输入到其块分配决策策略中是一件非常奇怪的事情,因此很可能以前从未讨论过它。您提到的用于查找文件位置和事件发生后的可用空间的ioctl是专门为解决具体用例而添加的(就像引导加载程序的需要。即使如此,暴露这一点也很脆弱:当涉及RAID奇偶校验或存储在inode中的文件数据时,这意味着什么?@mikebloch defrag软件,如fsck,将被视为文件系统实现的一部分,并与特定的文件系统类型紧密相关,可能由同样的团队。它将使用文件系统的私有接口,而这些接口不是为公共用途设计的,并且无论如何也不能扩展到足够通用的程度。例如,想想zfs:它是一个写时复制的文件系统,所以每次修改文件时,文件都会移动到一个新的块。你是否希望这样?无论如何,对于zfs,你必须deal不仅仅是块:你有存储池