resize2fs
玩 linux 的朋友应该都知道这个工具,此工具可调整 ext2、ext3、ext4 文件系统的大小,注意是文件系统的大小。
我想我应该简单介绍以下文件系统与分区之间的关系。分区,这个动作是将磁盘中一片连续的存储空间,划分到一个区域内,这个区域的名称也叫分区。文件系统则一般建立在分区之上,由系统对应的模块,对分区内的部分或全部空间,使用一套标准的方法进行管理。
一般来说,文件系统大小和分区大小是保持一致的,毕竟没有被文件系统管理的空间,一般不可使用。但文件系统也支持只占据分区的部分空间。 这也是 resize2fs
的基础。
分区就像一个“蜗牛壳”,文件系统是蜗牛壳里蜗牛的身体。身体最大也不能超过壳的限制,再想扩大则要增加壳的大小;缩小也类似,身体缩小了,壳还占据较大的空间,想要腾出剩余的空间,就要减小壳的大小,壳最小也不能比身体还小。
resize2fs
调整的是文件系统(蜗牛身体)的大小,而分区(蜗牛壳)的大小需要我们自己调整,方法就是删掉旧分区,再重建新的分区,而且重建时不能清除旧分区签名 (signature),亦不能格式化文件系统,还要时刻保证此时的分区大小大于或等于文件系统大小。否则旧的文件系统数据将会丢失。
好了,该谈实践了。我们需要关闭树莓派,并用读卡器将 TF 卡连接到电脑,找到对应的设备路径。在本例中假设为 /dev/sdb
。
$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 16 GiB, 17179869184 bytes, 33554432 sectors
Units: sectors of 1 * 512 = 512 bytes
..
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G c W95 FAT32 (LBA)
/dev/sdb2 2099200 33554431 31455232 15G 83 Linux
可以从输出信息中看到 /dev/sdb
有两个分区,一个 1G 一个 15G,总共 TF 卡有 16G 空间。一个扇区的大小是 512 字节。我们现在演示一下,对 /dev/sdb2
调整大小,记住 sdb2
的起始扇区 2099200
。
缩小分区
默认的文件系统大小与分区大小是一致的,想要缩小分区,先调整文件系统大小,再重建分区。
# 调整文件系统大小前,需强制执行文件系统检查
$ sudo e2fsck -f /dev/sdb2
e2fsck 1.44.1 (24-Mar-2018)
..
rootfs: 11/983040 files (0.0% non-contiguous), 88340/3931904 blocks
resize2fs
缩小文件系统大小,可以指定特定大小,也可以使其缩小到不导致数据损失的最小大小。这里我们演示后者
# 调整分区大小到指定的大小 size,支持 s(扇区数)、K、M、G 后缀,无后缀默认单位为 4K 区块大小
# sudo resize2fs /dev/sdb2 -p size
# 调整文件系统到不导致文件数据损失的最小大小(-M),并输出进度(-p)
# 这个可能要消耗一定时间
$ sudo resize2fs /dev/sdb2 -M -p
resize2fs 1.44.1 (24-Mar-2018)
..
The filesystem on /dev/sdb2 is now 30825 (4k) blocks long.
最后输出的信息中 30825 (4k) blocks
中 4k
为一个块的大小,30825
为区块数目,故实际得到的文件系统大小为 30825 * 4096 = 126259200
字节,按照之前 fdisk
输出信息,一个扇区的大小是 512 字节,则这个文件系统所占扇区数为 126259200 / 512 = 246600
,记住这个值。
# 使用 fdisk 命令编辑分区表
$ sudo fdisk /dev/sdb
接下来用 l
命令查看分区表信息,用 d
命令删除第二个分区,再用 n
命令新建第二分区,新建的第二分区起始扇区必须和原来的起始扇区相同,本例中是 2099200
,指定大小或终止扇区时,计算起始扇区+扇区数-1,即 2099200+246600-1=2345799
,输入计算出来的值 2345799
。(之所以不用 +246600
的方法,是因为 fdisk
对扇区数的处理似乎有问题,+246600
得到的可能是 246601
个扇区,还是直接计算结束扇区更保准。)
此时会提示
Created a new partition 2 of type 'Linux' and of size 120.4 MiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o:
此时一定要输入 n
,否则原有分区标志会被破坏。
然后输入 w
保存分区表并退出 fdisk
即可。
扩大分区
扩大分区的顺序与缩小分区恰好相反,先重建分区,再调整文件系统大小。之前我们将分区大小缩小到一百多 MB,现在我们将其扩展到 5G。
$ sudo fdisk /dev/sdb
接下来用 l
命令查看分区表信息,用 d
命令删除第二个分区,再用 n
命令新建第二分区,新建的第二分区起始扇区还是必须和原来的起始扇区相同,指定大小时,输入 +5G
。提示是否覆盖分区标志时,选 n
。最后 w
保存并退出。
然后调整文件系统大小
# 执行文件系统检查
$ sudo e2fsck /dev/sdb2 -f
# 不指定大小,使其自动调整到与分区一致的大小
$ sudo resize2fs /dev/sdb2 -p