【问题标题】:open file on a specific block in Linux在 Linux 中的特定块上打开文件
【发布时间】:2012-07-04 11:35:06
【问题描述】:

出于调试目的,我想在特定的预定义块上打开一个文件。例如,如果我怀疑某个特定块已损坏,我想对其进行写入和读取,我宁愿在挂载分区时在用户模式下执行此操作。

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

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

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

【问题讨论】:

  • 这将高度依赖于使用的特定文件系统。一些文件系统甚至没有块的概念。但是您已将问题标记为 ext4。我非常怀疑 ext4 或任何其他类似文件系统是否有这样的功能。
  • @Celada 他们必须有块的概念,因为这是他们写入物理设备的基本单位,不是吗?
  • 我说一些文件系统没有块的概念。 nfs、tmpfs、虚拟文件系统、大多数 fuse 文件系统、jffs2(虽然那个确实是按块擦除)等等……但我只是顺便说一下,因为我收集到你是专门询问 ext4 的。
  • @Celada,您能否解释一下(我是块设备的新手),jffs2 最终不会将 4K 写入底层闪存中的第二个块吗? (管他呢)。也许它会为许多文件分配一个特定的块,也许它根本没有文件的概念,但在一天结束时,它会将 4K(或任何块大小)的数据写入底层块设备(可能是一个伪装成块设备的文件,但它仍然会认为它是块设备)。我错了吗?
  • 这个问题让我想起了想从用户空间访问特定物理内存地址的人。叹息……

标签: linux filesystems ext4


【解决方案1】:

例如,如果我怀疑某个特定块已损坏,我想对其进行读写 ... 有没有办法告诉 Linux,“嘿!如果它是免费的,请在第 4579 块打开这个新文件”。

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

否则,不,文件系统被设计为隐藏经常掩盖真实几何图形底层设备的布局,因此没有这样的机制来提示文件在哪里应该创建。

【讨论】:

  • 即使是驱动器也不会暴露它们的真实几何形状。当然,除了原始 NAND 芯片之外的所有闪存设备都会自动进行磨损均衡,因此根本不存在存储中特定位置的概念。并且磁性设备可以通过 ECC 机制检测错误并透明地重新映射扇区,而在操作系统级别没有任何可见性。
  • @AndyRoss 我不在乎那个级别,我只想获得操作系统使用的相同块级访问权限。
  • @Brian 我知道,但是我不想破坏我的文件系统。
  • @mikebloch 我不认为 Brian 有责任展示 LKML 参考资料,说明该功能已被考虑并拒绝。对于文件系统来说,允许外部输入进入其块分配决策策略是一件非常奇怪的事情,因此很可能以前从未讨论过它。您提到的用于查找文件位置和可用空间的 ioctl 是专门为解决具体用例而添加的(例如引导加载程序的需求。即便如此,暴露这一点也很脆弱:当 RAID 奇偶校验为涉及?还是存储在inode中的文件数据?
  • @mikebloch 碎片整理软件,如 fsck,将被视为文件系统实现的一部分,并且与特定文件系统类型紧密相关,并且可能也由同一团队开发。它将使用不是为公共使用而设计的文件系统的私有接口,并且无论如何都不能真正扩展为足够通用。例如,想想 zfs:它是一个写时复制文件系统,因此文件每次被修改时都会移动到一个新块。你期待吗?无论如何,对于 zfs,您必须处理的不仅仅是块:您还有存储池
猜你喜欢
  • 2011-02-10
  • 2013-05-06
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多