假设我有一个 Linux 系统并且想要写入原始设备。但我想用新版本替换该设备上的某个文件。这能实现吗?我认为使用 dd 您可以从旧版本的偏移量开始写入新文件。我想如果新文件的大小与旧文件的大小相同或更小,一切都应该没问题。但如果新文件更大但磁盘本身未满,会发生什么情况呢?它会覆盖其他文件并损坏文件系统吗?如果是这样,你能阻止这种情况发生吗?您也可以替换 btrfs 等压缩文件系统上的文件吗?
答案1
您需要挂载文件系统。不存在“旧版本的偏移量”这样的东西:文件可以支离破碎的。为了修改数据,您需要找到所有片段的偏移量和大小。如果新版本具有不同的大小,情况会更糟:您需要弄清楚哪里有一些可用空间用于额外数据,并且您需要更新目录数据结构以指示新块的位置。
您可能会在文件系统调试器中找到一些代码来执行此操作,但它们很难可靠地使用,并且通常不支持编写太多内容。用于修改文件系统上的数据的唯一易于使用、可靠的代码是文件系统驱动程序,您可以通过挂载文件系统来访问它。
一些文件系统(例如 zfs 和 btrfs 的可选功能)甚至具有文件完整性数据 - 它们保留文件或块的校验和以检测数据损坏。对于这样的文件系统,如果您更改文件中数据块的内容而不更改相应的完整性数据,您将无法读取它,因为文件将被损坏。
在某些情况下,可以绕过驱动程序来覆盖文件的数据而不更改文件大小,例如,某些文件系统设计为只读(即,您准备文件系统,然后将其写入某些文件系统)。闪存并且不要更新它)。如果数据被压缩,则只有在以下情况下才可行压缩的当然,尺寸保持不变。但一般来说,安装是唯一的方法。