最近在mv文件的时候,操作失误将生产服务器一个1TB的文件夹mv到了/opt/test目录,因为最后/opt/目录被沾满所以1TB的文件夹没有迁移过来,写入了30GB数据到了/opt/test目录,因为系统分区被沾满,所以把test目录给删除了。
那么问题就来了,1TB的源目录哪些文件被mv到了/opt/test目录中,因为/opt/test/目录被删除无法进行判断,查看生产系统都正常没有发现数据丢失。
在测试服务器上进行实验,测试将大量数据mv到小于该数据容量硬盘会发生什么现象。新建一个5GB的硬盘,将root目录中的数据(远大于5GB)mv到这个5GB硬盘中.
执行 mv /root /mnt,在mv的过程中,发现源盘的容量没有减少,但是目标盘的数据量不断在增加,指导目标目录空间被沾满,源盘的数据都没有减少。
所以鉴于上面的实验可以得知,在mv数据的时候,mv指令因为目标目录被沾满而未完成mv操作,不会对源目录的数据进行删除操作,只是将源目录中的数据写入到目标目录中。
下面通过strace跟踪mv执行过程。
情况A,mv单个文件,在根目录创建文件“1”,写入数据“111111111111111”,然后mv“1”文件到/mnt目录。通过下面可以知道在数据写入完成后,然后unlink掉源文件“1”
情况B,如果mv整个目录,目录中包含多个文件,那么是mv完成单个文件后就删除对应的源文件,还是mv完成整个目录后,再删除源文件及目录?
创建文件夹mvdata3,写入6个测试文件
执行mv /root/mvdata3 /mnt。
通过上面截图可知,首先判断目标目录/mnt中有没有mvdata3目录及对应所需mv的文件;第二步打开源文件并将数据写入到目标文件。可以看到在文件“1”完成写入后,没有对文件“1”进行unlink操作,而是继续mv文件“2”,依次类推,知道文件“6”。
在文件“1”到文件“6”全部写入完成后,通过strace看到最后删除文件及目录
所以通过上面strace跟踪mv执行可以得出结论,mv操作是在完成所有数据写入后,再执行的删除源文件动作。