第一次成功地调整分区的大小,所以写篇文章记录一下。
我依稀记起了刚用 Linux 的时候,大概是在 06 或者 07 年吧,当时也是要调整分区大小,结果一番操作下来,启动系统,发现硬盘上啥都没有了。所以最后只能重装系统。现在再来做这件事,虽然不是轻车熟路,但也是不慌不忙了 :P
我要给一个 qemu 虚拟机调整分区,所以下文第一部分是关于 qemu 的。第二部分应该能适用于一般的在真正的硬件上的系统。
1. 调整 qemu 虚拟磁盘的大小
我现在用了一个 12G 的虚拟磁盘给虚拟机用,里边装了个 Linux,根分区大约 10G。我想把根分区扩大 4G。
所以首先要扩大虚拟磁盘的大小。Google 一下可以找到很多办法,我采取的是
这里提到的,先创建一个 4G 的文件,然后把它 cat 到原磁盘文件的末尾。这个看起来比较安全 (我一直比较惧怕 dd)。
$ dd if=/dev/zero of=zeros.raw bs=1024k count=4096
$ cat foresight.img zeros.raw > new-foresight.img
用
cat zeros.raw >> foresight.img 估计也可以。
(如果磁盘文件不是 raw 格式的,可能需要先把磁盘文件从 qcow 等格式转换为 raw 格式;可用
qemu-img info foresight.img 查看)。
到这儿,我的虚拟磁盘文件 (foresight.img) 就从 12G 变成 16G 了。以上都是在 host 机器上做的,下一步就是在虚拟机里调整分区大小。
2. 调整分区大小
为了能够在不挂载的条件下进行操作 (以免出问题,fdisk 实际上好像也要求分区不能挂载),需要用另一个系统来启动机器。用 liveCD 光盘或者 liveUSB 都可以,我是直接用的 Foresight Linux 的安装盘,因为它支持一个 rescue 模式 (跟 liveCD 差不多,但是命令行的,速度快一点)。
普通安装的话,把光盘放光驱就可以了。用 qemu 的话,传一个 -cdrom 选项。(同时也把启动时的菜单打开,以便能选择从光驱启动。)
-cdrom /path/to/foresight/iso -boot menu=on
进入后,不用挂载机器上原来的分区。
先来点小知识。对 Linux 来说,分区 (partition) 和文件系统 (filesystem) 是分开的,前者指的是硬件,后者指的是软件。文件系统创建在分区上,它的大小可以比分区更小。我的最终目的是调整文件系统的大小,因为操作系统是安装在文件系统中的。
所以要为操作系统提供更多的可用空间,需要分两步:1,扩大硬盘分区;2,扩大文件系统。前者用 fdisk 完成,后者用 resize2fs。(有的工具比如 parted 和 gparted 把两步合在一块了)。
2.1 扩大分区
# fdisk /dev/sda
执行 fdisk。把原来的分区删掉,然后创建一个新的分区。新分区的开头要跟旧分区一样,长度要比旧分区大。
由于我当初分区的时候把根分区放在了 swap 之前,所以我要先把 swap 分区删掉,最后再创建一个新的 swap。
fdisk 不会修改分区里面的东西,所以这样就把分区扩大了。其上的文件系统没有变,还是原来的大小。
2.2 扩大文件系统
# resize2fs -f /dev/sda2
resize2fs 把 sda2 上的文件系统扩大到跟分区一样大。
至此就搞定了。执行下 sync 重启即可。
2.3 其他
由于我上边重建了 swap 分区,所以要重新格式化 swap。
$ sudo mkswap /dev/sda3
我系统中原来的 fstab 是用 label 来引用分区。由于 label 没有了,所以把它改成直接使用 /dev/sda3:
LABEL=SWAP-sda3 swap swap defaults 0 0
/dev/sda3 swap swap defaults 0 0
应该也可以重新创建 label 的,但是由于我不知道怎么做,就只好这样了。
我是在系统启动之后执行这两步的,也可以在 rescue 系统中做。
如果用的是 lvm,就更省事儿了,不过我一直不会用...