我正在使用 targetcli 调整 iSCSI 目标的大小。我创建了一个很大的 FILEIO 后台存储,这浪费了资源。我是否可以在不丢失数据的情况下缩小文件大小?
答案1
您需要使用 truncate 命令来实现这一点。请注意,truncate 将在您指定的偏移处截断文件的末尾,因此如果您没有首先调整此 LUN 在 iSCSI 启动器端提供的文件系统的大小(以便其中包含的文件系统小于您将其截断到的大小),您将丢失该点之后的数据。
以下是一个例子:
truncate -s SIZE /srv/totallyalun.img
SIZE 可能是(或者可能是可选后跟的整数)下列之一:KB 1000、K 1024、MB 1000*1000、M 1024*1024,等等(对于 G、T、P、E、Z、Y)。
这将就地调整文件大小。如果文件最初大于通过 -s 指定的大小,则 truncate 将截断其末尾。如果文件小于指定的大小,则 truncate 将细化您的备份文件,末尾区域的数据将读取为零(因为它们将是空洞)。
再次,如果您不确保该文件(LUN)内的文件系统小于或完全等于您通过截断指定的备用存储的大小,那么缩小它是丢失数据的好方法。
您可以在 iscsi 目标使用文件时执行此操作并立即获得可读结果,前提是目标未配置为独占锁定文件。
或者,如果您不关心数据(或者不介意复制数据),您可以使用稀疏分配创建一个新的精简文件并复制到该文件,以避免出现整个混乱。精简分配确实有助于资源管理,尤其是在处理软件定义存储时。
答案2
在这种情况下,我最好坚持使用旧的数据迁移。
我自己也尝试过 -truncate,但那次我最终只能从快照中恢复。很可能是因为文件系统和逻辑卷大小不匹配。
例如,VMware 开发了一套很好的工具,可以通过将可用空间清零或删除零来缩小厚虚拟磁盘或薄虚拟磁盘。