如何快速释放磁盘空间
如何快速扩大磁盘空间
问题的出现原因:
- 在Linux系统中,使用传统的dd命令来创建大文件会比较慢,因为它需要在写入数据之前分配磁盘块并将其填充为零。
- 在某些文件系统上,如ext4、xfs、btrfs和ocfs2,使用dd命令来创建大文件同样会比较慢。
解决方法:
- Linux系统中,可以使用xfs_mkfile命令或fallocate命令来快速创建大文件。xfs_mkfile命令在大多数Linux系统上都可用,即使不是在XFS文件系统上也可以使用。而fallocate命令只能在某些文件系统上使用,如btrfs、ext4、ocfs2和xfs。
- 在OS X、Solaris、SunOS和其他UNIX系统中,可以使用mkfile命令来创建大文件。
- 在HP-UX系统中,可以使用prealloc命令来创建大文件。
mkfile是从SunOS发展而来的,不是在所有地方都可用。大多数Linux系统都有xfs_mkfile命令,其工作方式与mkfile相同,而不仅仅适用于XFS文件系统。xfs_mkfile命令包含在xfsprogs中(适用于Debian/Ubuntu)或类似命名的软件包中。
大多数Linux系统还有fallocate命令,它只适用于某些文件系统(如btrfs、ext4、ocfs2和xfs),但它是最快的,因为它分配了整个文件空间(创建非空洞文件),但不对其进行初始化。
在RHEL默认安装中没有mkfile命令。它是一个Solaris实用程序。如果搜索gpl mkfile,可以找到一些源代码示例。
在OS X上可以使用mkfile命令,例如:mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img。
在Ubuntu上,xfs_mkfile命令包含在xfsprogs中,并且在我的ext3文件系统上工作良好。
如何快速消耗磁盘空间
在虚拟环境下,这是一个常见的问题。不幸的是,答案并不像人们想象的那么简单明了。
dd是显而易见的首选,但dd实际上是一种复制操作,这意味着你需要写入每个数据块(从而初始化文件内容)...而这个初始化过程会占用大量的I/O时间。(想让它变得更慢吗?使用/dev/random而不是/dev/zero!这样你就会同时使用CPU和I/O时间!)但最终,dd是一个糟糕的选择(尽管在虚拟机的“创建”GUI中通常是默认选项)。例如:
dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G
truncate是另一个选择,很可能是最快的...但这是因为它创建了一个“稀疏文件”。实际上,稀疏文件是磁盘的一部分,其中有很多相同的数据,底层文件系统通过不真正存储所有数据,而只是“假装”所有数据都在那里来“欺骗”。因此,当你使用truncate创建一个20GB的虚拟磁盘时,文件系统并没有真正分配20GB的空间,而是通过欺骗说有20GB的零填充数据,即使实际上只有一个磁道可能真正被使用。例如:
truncate -s 10G gentoo_root.img
fallocate是最后也是最好的选择,用于虚拟机磁盘分配,因为它实际上“预留”(或“分配”)了你要寻找的所有空间,但它不会费心去写入任何内容。所以,当你使用fallocate创建一个20GB的虚拟磁盘空间时,你真的会得到一个20GB的文件(不是“稀疏文件”),而且你不需要费心写入任何内容,这意味着里面可以是任何东西,就像一个全新的磁盘一样!例如:
fallocate -l 10G gentoo_root.img
+1 truncate在JFS上是可用的;fallocate则不行。还有一点:你不能在数字中包含小数点,我需要指定1536G而不是1.5T。
根据我的fallocate手册页,它只支持btrfs、ext4、ocfs2和xfs文件系统。
注意swapon在预分配的范围上不起作用,至少我最后检查过是这样。XFS邮件列表上曾经讨论过一些关于使用fallocate选项来公开旧的空闲空间数据而不标记范围为预分配的内容,以便swapon能够正常工作的问题,但我认为最终没有采取任何行动。
顺便说一下,从/dev/random读取过多的数据可能导致随机数据耗尽,“当熵池为空时,从/dev/random读取将会阻塞,直到收集到额外的环境噪声”,所以可能需要很长很长的时间。
谢谢,我正在阅读这个帖子时来到这里:brianschrader.com/archive/…
如何快速扩大磁盘空间的问题出现的原因是因为用户想要在短时间内快速扩大磁盘空间。以下是解决这个问题的方法:
1. 使用Linux和其他POSIX系统上的fallocate命令,该命令可以在不实际写入数据的情况下使用所需的空间,适用于大多数现代磁盘文件系统,并且速度非常快。
例如:
2. 如果使用dd命令进行写操作,可能会因为操作系统的缓存而导致速度变慢。可以尝试写入超过内存大小的数据,并使用status=progress选项来查看速度如何随着缓存耗尽而变化,还可以使用oflag=direct或oflag=nocache选项。
3. 对于不支持fallocate命令的文件系统,可以先使用fallocate命令创建一个相对较大的文件(例如2GB),然后使用mv命令将文件移动到其他文件系统,最后使用cat命令将文件的大小组合到所需大小。例如,如果有一个名为"a"的2GB文件,并且想要创建一个名为"b"的10GB文件,可以执行"cat a a a a a > b"命令。
4. 注意,上述方法在文件系统是32位文件系统或文件限制比要创建的文件小的情况下不适用。
5. 对于特定的系统环境,可以查看fallocate命令的支持情况和其他命令(如falloctae/truncate/mkfile)的支持情况,可能需要使用其他shell,如bash。
以上是解决如何快速扩大磁盘空间的问题的方法。使用fallocate命令可以快速扩大磁盘空间,而对于不支持fallocate命令的文件系统,可以使用其他方法来实现相似的效果。