概述
在WMware中安装Ubuntu 12.04时,分区大小默认使用了20G,安装完成后根目录大小只有12G。因为一开始打算将源码放到单独挂载的分区中,所以觉得12G应该也足够。但在Android源码编译过程中遇到了空间不足的问题,源码编译最后会将相关的img文件压缩成zip包,这个步骤会暂时利用/tmp这个目录。因为根目录只有12G,再加上/home下存放了一点东西,Android源码编译最后打包时,提示根目录空间不足打包操作被终止。
本文的目的是,动态调整分区大小,扩大根分区容量,避免Android编译无法打包。
转载请务必注明出处http://blog.csdn.net/yihongyuelan
步骤
分区扩展计划
在概述中已提到原有根分区只有12G,本文计划将其替换为20G。这里说的是替换,也就是用20G的根分区替换12G的根分区,那么也就还会剩下12G的容量,计划将这12G给/home独立使用。调整之后的硬盘挂载情况如图1所示:
图1 调整之后WMware挂载硬盘信息
在Ubuntu中使用df -h查看分区情况如图2所示:
图2 Ubuntu中查看分区信息
从图2中可以看到,根分区从/dev/sda1变成了/dev/sdc1而大小由12G变成了20G,原来的/dev/sda1则挂载到了/home目录。
新建虚拟硬盘
在WMWare->Settings中添加新的硬盘,步骤比较简单具体不表。在指定磁盘容量的时候,建议勾选上立即分配所有磁盘空间,如图3:
图3 勾选"立即分配所有磁盘空间(A)"
根分区迁移
在完成新硬盘的添加之后,记得在Ubuntu中使用fdisk或者Disk Utility工具对新硬盘进行分区和格式化,之后就需要对原来的根目录进行备份了。新硬盘格式化和分区完成之后,这里即/dev/sdc1,其挂载到/new_root,在终端中执行:
sudo mkdir /new_root因为需要对当前的根目录进行迁移,所以需要建一个备份目录/old_root,并将当前根目录挂载到/old_root (当前根目录即/dev/sda1) ,因此操作如下:
sudo mount /dev/sdc1 /new_root
sudo mkdir /old_rootsudo mount /dev/sda1 /old_root接着就需要使用rsync指令来完成根目录的迁移了。
rsync是类unix系统下的数据镜像备份工具,即remote sync。rsync是Linux系统下的文件同步和数据传输工具,可以在客户机和远程文件服务器之间进行文件同步,也可以在本地系统中,将数据从一个分区备份到另一个分区上。如果rsync在备份过程中出现了数据传输中断,恢复后可以继续传输不一致的部分,并且rsync可以执行完整备份或增量备份(具体信息可以man一下,中文翻译参考这里)。
使用rsync命令,将/old_root备份到/new_root:
sudo rsync -lva /old_root/. /new_root参数解释:
-l表示保持软链接;
-a表示archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD;
-v表示操作过程详细输出;
完成之后卸载old_root:
sudo umount /old_root
修改/etc/fstab
因为/new_root后续就是新的根分区,所以需要修改/new_root下的fstab文件,即/new_root/etc/fstab,修改如下:
#UUID=46df0a25-8f0f-4ef5-90c0-8a665f4ab82d / ext4 errors=remount-ro 0 1第一行表示注释掉原来的根目录挂载,第二行表示新的设备为/dev/sdc1挂载到根目录。
/dev/sdc1 / ext4 errors=remount-ro 0 1
因为要把启动分区切换到/dev/sdc1,所以要将启动相关的信息更新到grub菜单中,继续在终端中执行:
sudo grub-install /dev/sdc在grub启动菜单中加入/dev/sdc,之后更新grub启动菜单:
sudo update-grub
更改启动顺序
现在设备/dev/sda1即原来的根目录(old_root),新设备/dev/sdc1即新的根目录(new_root),都已经加入了grub启动菜单,需要设置哪个设备优先加载,即启动顺序。修改启动顺序实际上就是进入BIOS中,设置硬盘的加载顺序。完成以上操作之后,选择重启,并快速短按F2(虚拟机开机时有提示),进入BIOS操作界面,通过左右方向键选择"Boot"菜单,并通过上下方向键选择Hard Drive子菜单,如图4所示:
图4 WMware BIOS界面
将新添加的硬盘/dev/sdc1通过+/-调节到Bootable Add-in Cards下第一个,这里即VMware Virtual SCSI Hard Drive (0:2),之后通过F10保存并退出,重启即可进入系统。完成以上操作之后,根分区的迁移大致就已完成。
独立/home分区
根分区已经从/dev/sda1切换到了/dev/sdc1,因此/dev/sda1已经没有用了,为了资源最大化利用,我打算将其作为/home独立分区,而操作步骤和备份根分区时的操作差不多。新建一个/home_new,将/dev/sda1挂载到/home_new,将/dev/sda1中原有的内容删掉,并通过rsync将/home中的内容同步到/home_new,将/home重命名为/home_bak,将/home_new重命名为/home,并修改/etc/fstab如下:
/dev/sda1 /home ext4 defaults,user,exec,dev,suid 0 0
保存之后重启,通过df -h就能看到如图5中的效果了:
图5 调整后的分区
遇到的问题
虽然文章中描述的步骤明确,但在实际操作过程中也遇到了很多坑,如:
1. 如果不建立/old_root文件夹就开始执行
sudo rsync -lva / /new_root这样会导致递归备份,即/new_root/new_root/new_root/....无限循环下去;
2. 如果发现/new_root目录下./ 和 .. / 的ower和group不对,可执行
sudo chown root:root ./ ../
总结
因为之前将根分区设置得太小,导致源码编译打包时空间不足,从而无法完成打包操作,根分区扩展后问题解决。如果遇到重装系统的问题,独立的/home分区可以复用,许多配置不用重新再设置一遍。