装系统的时候脑子疼,给了56GB的根分区,40GB的home,24GB的opt。现在发现,home和opt快满了,根分区剩了一大堆,只好调整一下了。
好在,我的根分区是btrfs,opt是ext4,home是xfs,都能够支持缩放。这次的主要目的是缩小根分区,扩大opt分区,home就不动了,改天把Android SDK丢到opt应该就没事了。
老规矩,先备份。方法很多,不过大概都需要个liveCD之类的东西,或者recuseCD啥的。我用了Ubuntu 17.10的LiveCD(因为手上刚好有),大蜥蜴的RecuseCD也可以用。备份的话,我比较懒,直接记录一下分区大小直接dd出去了……
然后开始调整,不过要搞明白这个文件系统的缩放是怎么回事。首先,每个分区都有一个分区大小,这个是硬杠杠,它告诉你的内核,/dev/sdaX这个设备文件从/dev/sda这个设备文件的哪个位置开始,文件长度有多少。如果你的分区只有20G,那么你想把文件系统扩展到40G那是不可能的。然后,每个分区内部存在文件系统,文件系统的大小则是指的从分区头部开始,有效的数据可以存储的范围。比如说,可以分配一个100G大小的分区,但里面的文件系统只有40GB,这是可以的,但反过来不行。在这种情况下,虽然这个分区有100GB,但只有前40GB有数据,后面60GB没有任何的有效数据(即文件系统不会往这里面写东西)。
那么先来缩小根分区,由于可能存在单位不匹配,这里直接先缩小到一个很小的值(比如30GB),然后修改完分区表再扩大到最大。
btrfs的缩放时要先挂载,然后用 btrfs filesystem resize /mnt 30G 就可以了。然后用 fdisk 把根分区缩小到40G,不过要注意起始位置必须相同,否则会找不到文件系统。之后再用 btrfs resize 给调整到 max 就好了。
同理,ext4也是类似的操作流程,只不过ext4的起始位置需要变化。我的做法是,先缩小,然后dd直接复制到新的位置。当然,dd先复制到别的文件,重新分区写回再 resize 也是可以的,只是我嫌慢。另外,ext4的是要先解除挂载,然后用resize2fs /dev/sda8 11G 这样直接调整磁盘设备文件,别的都没差。
不过有几个坑要注意,一般fstab会被设置为按照文件系统的UUID来挂载,如果把 /dev/sda5 给 dd 到 /dev/sda8,但又没把源分区删掉,这样在 boot 的时候,fstab 会不知道该挂载哪个分区。更可怕的是,如果出现了两个UUID相同的 root,那么在 grub-efi 进行 grub 传递的时候可能会找不到跟分区 grub,就算找到了跟分区的 grub,在下一步找内核的时候可能也会出现问题。之前我笔电调挂了就是这情况。
好的,总之整体过程算是有惊无险,又可以愉快的码代码了~
不错不错
其实还可以莽一点,因为btrfs可以(也只能)在线缩放,所以可以直接缩小然后分区表再重启,重启完了放大。