1.交换两个文件的extents
Ext4的EXT4_IOC_MOVE_EXT命令用于交换两个文件的extents,实际上是交换两个文件的对应逻辑长度的数据的物理存储空间(见下图),也是EXT4文件系统碎片整理的基础。
用户可以通过ioctl函数使用Ext4文件系统的Ioctl命令EXT4_IOC_MOVE_EXT将用户指定交换的两个文件及交换的范围的相关信息struct move_extent的地址传给ioctl的第三个参数unsigned int arg:
ioctl(fd, EXT4_IOC_GROUP_ADD, arg )
至于操作是否成功,结果验证可以使用filefrag命令,分别在执行转移前后使用该命令获取文件的区段信息,就可以判断是否执行的转移(交换)操作。
2.EXT4_IOC_MOVE_EXT交换文件extents的限制
利用Ext4的EXT4_IOC_MOVE_EXT交换两个文件的extents的操作受到以下限制(这里将进行转移的文件称为源文件,参与转移操作正确执行的另一文件称为donor文件):
1.文件自身的限制:
1)源文件与donor文件应该是不同的文件;
2)源文件与donor文件应该是常规文件;
2.交换区段的参数限制(即调用mext_check_arguments()函数检查struct move_extent的元素数值是否有效):
1)donor文件都不能设置SUID或SGID;
2)两个文件都不能支持swapfile,也就是两个文件都不能是swapfile;
3)两个文件应当在同一个Ext4文件系统中;
4)两个文件都要是基于extent的;
5)两个文件都不能是0长