一、背景
MacBook Air 要转手,内置 SSD 上面的 Ubuntu 要备份出来,习惯性 dd 到移动硬盘上。尽管都是 512GB,但确实注意到了目标盘比源盘要小那么一点点,只不过抱着侥幸的心理,还是执行完毕了。心想磁盘最后应该都是空白区域,不会损失文件,分区表之类的管理信息,系统引导后自我修复一下大概就可以。然而并不行。因此,需要手动调整源盘位于最后的分区,使其完整处于目标盘的容量范围内,再重新 dd。
类似的操作之前曾经有过一次比较顺利的经历,可能过于顺利了,没有做任何记录,导致这次磕磕绊绊,有必要从头记录下来。
二、过程
有一个原则,应该记住:在使用工具的全程中,指定容量时要使用 block(通常是 4KB)或者扇区(512 字节)这种无歧义的单位,否则不同工具对 G/GB/GiB 之类的有可能会有不同解读,1000 或者 1024 进制一旦交错出现,结果会很糟糕。
涉及到的命令/工具有:lsblk、tune2fs、e2fsck、resize2fs、lvdisplay、lvreduce、pvdisplay、pvresize、parted,这些用于操作;GParted 用来查看信息(其实 parted 也可以,但是图形界面工具更直观和易用一些)。
磁盘布局简介(此处没有考虑 GPT 磁盘布局)。整个磁盘(/dev/sda)布局相对传统、简单,一个主分区(/dev/sda1),为引导分区,一个扩展分区(/dev/sda2),其上建立了一个单一的逻辑分区;在其上创建了卷组/物理卷,物理卷(sda5)上为单一的逻辑卷,逻辑卷上为 ext4 文件系统。
如果分区要调整大小,扩展时的处理顺序是:物理分区表->[LVM 的 PV]->[LVM 的 LV]->文件系统,收缩时则要把顺序颠倒过来。本次是后者。因为系统正常引导后会导致不能操作正在使用中的磁盘,所以所有操作都是用 Ubuntu 的 LiveUSB 完成的。
0、操作中可能多次要查看信息使用的命令。
0.1、查看分区文件系统的信息。命令如 tune2fs -l /dev/sda1,其中有 Block count 和 Block size 信息(还有 inode 的 count),较为重要。
0.2、检查文件系统。e2fsck -f /dev/vg-name/mountpoint。
0.3、LVM 的物理卷和逻辑卷的信息查看命令,分别为 pvdisplay 和 lvdisplay。
1、缩小分区上的文件系统。resize2fs /dev/vg-name/mountpoint SIZE。
2、缩小逻辑卷。使用 lvreduce -L SIZE 命令。
3、缩小物理卷。使用 pvresize –setphysicalvolumesize SIZE 命令。这个命令的好处在于,如果指定的 SIZE 比其上存在的逻辑卷还小,则会失败,无不良后果。在实践中出现的吊诡现象是,缩小逻辑卷时,给 lvreduce 指定的 SIZE 为 465G,命令执行成功,查看该卷占用的 LE 个数为 119040,同样的 465G 指定给 pvresize 则爆出此值等价于 119039 个 PE(LE 和 PE 的值相同,均为 4MB),后来不得不使用了 465.01G,产生的结果是 119042 个 PE。根据物理卷的大小,计算出其占用的扇区数。
4、到 GParted 中查看物理卷的起始扇区,加上上面得出的占用扇区数,减去一,此值 endSector 记录备用。
5、首先处理逻辑分区 sda5。执行 parted /dev/sda,用 unit s 命令把容量单位切换为扇区,执行 resizepart 5 endSector,然后退出,即可将分区表调整妥当。
6、继续在 parted 中处理 sda2,也即扩展分区本身,它的结束扇区和物理卷的保持一致即可。