当我将文件从一个文件夹移动到同一磁盘上的另一个文件夹时,是否会复制任何文件?

当我将文件从一个文件夹移动到同一磁盘上的另一个文件夹时,是否会复制任何文件?

或者只是引用发生了变化?这是一个普遍性问题。并非特定于 Ubuntu。

顺便说一句:我试过 sudo fdisk -l,但它似乎没有提供完整的信息。

在此处输入图片描述

答案1

*nix 中的文件由三部分组成:

  • 磁盘上的数据
  • 指向磁盘上的数据并存储有用信息(例如访问和修改时间、权限等)的 inode。这些将根据文件系统而有所不同。
  • 一个(或多个)硬链接,提供位置(路径和文件名)并指向 inode。

实际上,系统正在编辑硬链接,但这可能会导致并发冲突,因此实际发生的情况是系统创建一个新的硬链接,然后删除旧的硬链接。

我是最后一个从这里但我会尝试找到此技术来源。

答案2

我最近实际上一直在阅读这篇文章,虽然它专门涉及 ext2,但我相信 ext3 和 ext4 相似,甚至相同。

我们将您的物理硬盘称为sda。在最高级别,您的磁盘首先被分成单独的分区。每个分区都有自己的文件系统,该文件系统决定如何管理该分区上的文件。例如,您可能在sda1使用 NTFS 文件系统的 Windows、在sda2使用 ext4 文件系统的 Ubuntu 和sda3不使用文件系统的 Swap。在 的开头附近sda,在分区开始之前,有两件事。首先是引导扇区,您的 BIOS 在启动时加载它,可能包含 grub。其次是分区表,它列出了有关磁盘上所有分区开始和结束位置的详细信息。您可以使用 查找有关分区的详细信息sudo fdisk -l

在 上的 ext4 分区中sda2,该分区进一步划分为块组。块组内首先是超级块,它提供有关文件系统和可用空间的重要信息。文件系统使用的几个区域之后是 inode。每个 inode 都包含最多 12 个数据块的位置列表。每个 inode 还可以引用最多三个其他 inode。块组中的最后一个区域用于实际数据,并被划分为块(通常每个块 4KB)。

每个目录、文件和链接都有一个唯一的 inode。文件中的数据包含在许多不同的磁盘块中,这些磁盘块可能位于磁盘上的任何位置。文件的 inode 列出了所有可能分散的数据块的位置。同样,每个目录的内容都以相同的方式存储为数据。

例如,当您打开一个文件时,/home/user/contacts.txt计算机首先会找到根目录的 inode,它始终知道在哪里可以找到它。inode 列出了描述目录内容的所有数据块的位置。然后,计算机在数据块中搜索名为“home”的条目。目录的条目home告诉它home在磁盘上哪里可以找到 inode。然后,计算机在该 inode 中查找,在指定的块中搜索user,并重复该过程以找到文件contacts.txt,该文件的 inode 列出了包含文件内容的块。

如果要移动contacts.txt/home,首先必须执行上述所有操作来查找文件的 inode。然后计算机必须导航到 的 inode /home(这会很快,因为 Linux 维护了最近访问的目录的 inode 缓存,称为 dentry 缓存),并将其添加contacts.txt到目录的数据块中。然后它必须导航到 的 inodeuser并在其数据块中搜索contacts.txt并删除其条目。

因此,如果两个位置都位于同一分区,则文件的数据块实际上从未移动过。文件的 inode 引用将只是从源目录的数据块移动到目标目录的数据块。如果一个位置位于不同的分区(这算作一个完全独立的文件系统),则将删除文件的 inode 条目,复制其数据块,并在相关目录的数据块中创建一个新的 inode 条目。

和 的后台还运行着另外一件事ext3ext4这称为日志记录,它有助于确保文件系统在崩溃时保持完整性。每当发生文件操作时,文件系统都会在日志中写入一个条目,描述它将要做什么。只有当它描述的每个操作都完成后,才会删除该条目。这样,当计算机在文件操作过程中崩溃后启动时,它会立即看到日志中的未完成条目,并可以尝试修复问题。

资料来源:Andrew S. Tanenbaum 撰写的《现代操作系统 3e》

相关内容