最近我将 ext4 文件系统的大小缩小到 500GB
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 493G 64G 404G 14% /
现在我想缩小分区大小以完全适合文件系统大小。
我尝试使用 parted 和 resizepart 命令。问题是当 parted 要求新尺寸时。如果我选择 500GB,则生成的分区比 500GB 小,因此底层文件系统无法适应该分区。关于如何进行正确尺寸计算的任何提示?
报告的大小
df
将不正确,因为它们仅考虑文件系统内部使用的数据块和未命中块以及保留块。最简单的方法是将文件系统缩小到比您想要的小至少 10%。将分区大小调整为您想要的大小,然后使用 resize2fs 扩展文件系统。
如果你想手动计算它,你必须知道文件系统内部有多大。检查这一点
tune2fs -l /dev/sda2
并将块计数乘以块大小。在 parted 中调整分区大小时,将单元切换到带有unit s
和print
表的扇区以获取起始扇区和逻辑扇区大小。将上面的总大小(以字节为单位)除以扇区大小。向上舍入到最接近的 2048 倍数并调整为此扇区数(结束扇区 = 扇区大小 + 起始扇区 - 1)。方程(可在python中运行只需填写前4个值):
这是整个过程的一个例子。
这是我们的硬盘:
它包含一个大小为 4.7GB 的分区 (/dev/loop0p1)。这是分区上的文件系统:
默认情况下,它具有与分区相同的大小(4.7GB)。但仅使用了 2.1GB (45%) 的文件系统。这意味着我们可以将文件系统和分区缩小到仅 2.1 GB 而不会丢失任何数据。
第一步是使用 resize2fs 和分区上的 -M 开关。与磁盘碎片整理程序类似,此命令将尝试将所有文件移动到文件系统的开头以形成一个连续的块。然后,这允许将文件系统缩小到可能的最小大小。
文件系统现在看起来像这样:
硬盘现在包含一个 4.7GB 的分区,其中有一个 2.1GB 的文件系统,已 100% 使用。下一步是缩小分区大小以适应较小的文件系统。
为此,我们需要计算文件系统大小。dumpe2fs 工具对此非常有用,它显示有关文件系统的详细信息。
这告诉我们有 565950 个块,块大小为 4096 字节。这允许我们计算文件系统大小:
565950 块 * 4096 字节 = 2318131200 字节
由此,我们可以计算扇区中的文件系统大小。从上面的 fdisk 输出,我们知道硬盘扇区大小为 512 字节:
2318131200 字节 / 512 = 4527600 个扇区
因为分区不是从扇区 0 开始的,所以我们需要从 fdisk 输出中添加起始扇区:
4527600 + 8192(起始扇区)= 4535792
这是我们分区的新结束扇区。为了安全起见,将 10 个扇区(约 5 KB)添加到该数字:4535802
现在我们可以使用 parted 将分区缩小到这个新的结束扇区。“unit s”命令用于将单位切换到扇区。
它给了我们一个关于潜在数据丢失的警告,但是因为我们之前将所有数据移动到了分区的开头,所以可以放心地忽略它。完毕!我们现在有一个 2.1GB 的分区和一个 100% 占用的 2.1GB 文件系统。