问题:为什么在一个linux系统,mv在本地磁盘操作那么快,即使数据有100多G,瞬间完成。

inode表

首先要了解下一个关键的东西:inode 表

inode(index node)表中包含文件系统所有文件列表,一个节点 (索引节点)是在一个表项,包含有关文件的信息( 元数据 ),包括:文件类型,权限,UID,GID、链接数(指向这个文件名路径名称个数)、该文件的大小和不同的时间戳、指向磁盘上文件的数据块指针、有关文件的其他数据。Inode表结构如下图所示:

linux系统中mv、cp、rm这三个命令的工作原理_文件系统

继续从下图中去了解inode表,文件引用的是 inode号,是通过文件名来引用一个文件,一个目录是目录下的文件名和文件inode号之间的映射。

linux系统中mv、cp、rm这三个命令的工作原理_文件系统_02

原理剖析:

了解完inode表结构之后,我们需要首先了解下cp和rm两个命令:

  • cp命令
  •       cp命令是用来拷贝数据,在cp命令执行过程中:分配一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将名称与inode编号关联,拷贝数据生成新的文件。

  • rm命令 
    rm命令是删除数据的工具,在rm命令执行过程中;数据链接数递减,从而释放inode号,并且inode号可以被重用,把数据块放在空闲列表中,删除目录项,数据实际上不会马上被删除,但当另一个文件使用数据块时将被会被覆盖。(这就是为什么高手可以找回数据的原因。)


  • mv命令:
    mv命令是经常用来将数据从一个地方挪到另外一个地方的工具,而mv命令在挪动数据的时候底层工作分为两种情况:
  1. 第一种是mv命令的目标和源在相同的文件系统,可以理解为同一分区,mv命令在执行过程中用新的文件名创建对应新的目录项,删除旧目录条目对应的旧的文件名,并不影响inode表(除时间戳)或磁盘上的数据位置,也就是说没有数据被移动。(这时候知道为什么移动数据在秒间完成了吧)。

  2.   第二种如果目标和源不在一个文件系统,也就是不在一个分区,那么 mv就相当于cp和rm。即改变了inode表的条目,也发生了数据移动。​​(mv -v 移动一个文件夹,文件夹大一点,好观察,移动过的文件(在整个文件夹还没有移动完成)ls那个文件是一直在的,知道移动完成后,才会删除不在。)