最近因为要开发一个 Android 项目,因此需要在系统上安装 AndroidStudio,安装途中却提示我 java.io.IOException: No space left on device,立刻就意识到分区空间不足了,因此进行了该次扩容。而我本身是双系统(Ubuntu 18.04 作为日常开发使用,而 Windows 10 作为游戏娱乐用),因此我要对 Ubuntu 下的分区进行扩容。

如何扩容

  1. 使用 GUI 工具:GParted (本篇文章不进行阐述)
  2. 利用 fdisk / parted / lvm 等指令进行扩容

提前准备

  1. 备份重要数据,很关键!!!
  2. 因为涉及到 umount 卸载分区操作,请制作好 LiveCD(对应 Linux 版本的 USB 启动盘)
  3. 遇到其他问题请主动查阅相关资料

找出空间不足的分区

首先使用 df -h | grep "dev/sda" 指令查看 /dev/sda 以下各个分区占用比

1
2
3
4
5
 [email protected]  ~  df -h | grep "sda"
/dev/sda10 22G 21G 96M 100% /
/dev/sda8 1.9G 467M 1.3G 27% /media/a9032676/b2b692f8-bdcf-46c1-9998-503b0970f5b3
/dev/sda9 19G 2.8G 15G 16% /media/a9032676/9b5cdc3a-f296-490a-b329-6ae23acee7de
/dev/sda7 4.7G 20M 4.4G 1% /media/a9032676/1bbfb6fa-f919-4460-86f9-5ced5a900ec8

可以得出挂载于 / 的根分区 /dev/sda10 空间严重不足,剩下 96MB。然后我们使用 sudo fdisk -l /dev/sda 指令查询 /dev/sda 下各分区大小及总和。

1
2
3
4
5
6
7
8
9
10
11
12
 [email protected]  ~  sudo fdisk -l /dev/sda
Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors
/dev/sda1 * 2048 1126399 1124352 549M 7 HPFS/NTFS/exFAT
/dev/sda2 1126400 383537151 382410752 182.4G 7 HPFS/NTFS/exFAT
/dev/sda3 383539198 488396799 104857602 50G 5 Extended
/dev/sda5 383539200 383928319 389120 190M 83 Linux
/dev/sda6 383930368 387928063 3997696 1.9G 82 Linux swap / Solaris
/dev/sda7 387930112 397928447 9998336 4.8G 83 Linux
/dev/sda8 397930496 401928191 3997696 1.9G 83 Linux
/dev/sda9 401930240 441927679 39997440 19.1G 83 Linux
/dev/sda10 441929728 488396799 46467072 22.2G 83 Linux
[email protected]  ~ 

可以看到这个盘大小总和是 232.9G,而由于双系统的缘故, /dev/sda1/dev/sda2 这两个分区是 Windows 10 的,因此是 NTFS 文件系统。/dev/sda5grub 预留分区,而扩展分区 /dev/sda3 则作为我 Ubuntu 系统所有文件的主分区,可以看见扇区从 383539198 横跨到 488396799,途中包含了 sda5sda10 这几个分区,而他们都是 ext4 文件系统的逻辑分区,加起来刚刚好 50G。

查询分区挂载情况

确定了是 /dev/sda10 分区空间不足后,我们利用 mount -l | grep "/dev/sda" 指令查看分区实际挂载情况。

1
2
3
4
5
 [email protected]  ~  sudo mount -l | grep "/dev/sda"
/dev/sda10 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda8 on /media/a9032676/b2b692f8-bdcf-46c1-9998-503b0970f5b3 type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks2)
/dev/sda9 on /media/a9032676/9b5cdc3a-f296-490a-b329-6ae23acee7de type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks2)
/dev/sda7 on /media/a9032676/1bbfb6fa-f919-4460-86f9-5ced5a900ec8 type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks2)

从以上情况总括出:这台电脑两个系统都是安装在了同一个盘上面(因为是 SSD),合计可用大小是 232.9G,而分给 Ubuntu 的总共有 50G,Windows 则占用了 182.4G(撇除系统保留的 549M)。但现在 Ubuntu 挂载在根目录的分区 /dev/sda10 已经所剩无几,因此我打算的是从 Windows 处 /dev/sda2 释放 30G 的空间为 /dev/sda10 增加容量。

开始调整

  1. 重启电脑,将系统更换成 Windows 10。

  2. 在【磁盘管理】处压缩 NTFS 卷/分区,释放已分配空间给予 Ubuntu 使用,这里我共计在 /dev/sda2 处压缩并腾出了共计 30G 的未分配空间。(本步骤不多作阐述,具体可参考:如何在 Windows 中对硬盘进行分区

  3. 因为途中涉及根分区前后移动,因此必须要让本身处于 busy(忙碌) 状态的根分区先 unmount (卸载分区),否则会一直锁定着,无法移动。制作对应 Ubuntu 版本的 LiveCD(USB启动盘)。

  4. 重启电脑并插入刚刚制作好的 USB,切换系统到 USB 搭载的 Ubuntu 系统上。

  5. 进入系统后。于命令行内手动输入 sudo umount /dev/sda10,把我们的目标分区卸载掉,同时需要将扩展分区内的 Swap Space(交换空间)关闭掉:sudo swapoff -a

  6. 然后使用 sudo fdisk /dev/sda 进入 fdisk 命令交互界面以调整分区:

    1
    2
    3
    4
    5
    6
    7
    8
    9
     [email protected]  ~  sudo fdisk /dev/sda
    [sudo] password for a9032676:

    Welcome to fdisk (util-linux 2.31.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.


    Command (m for help):
  7. 然后我们使用 p 指令查询分区情况,虽然上面已经查询过,但为了安全起见还是先确认一遍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Command (m for help): p
Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdefb6f09

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 1126399 1124352 549M 7 HPFS/NTFS/exFAT
/dev/sda2 1126400 320622591 319496192 152.4G 7 HPFS/NTFS/exFAT
/dev/sda3 383539198 488396799 104857602 50G 5 Extended
/dev/sda5 383539200 383928319 389120 190M 83 Linux
/dev/sda6 383930368 387928063 3997696 1.9G 82 Linux swap / Solaris
/dev/sda7 387930112 397928447 9998336 4.8G 83 Linux
/dev/sda8 397930496 401928191 3997696 1.9G 83 Linux
/dev/sda9 401930240 441927679 39997440 19.1G 83 Linux
/dev/sda10 441929728 488396799 46467072 22.2G 83 Linux

可以看到在 /dev/sda2 的扇尾 320622591/dev/sda3 的扇头 383539198 之间差了 62916607 个 Blocks,刚好 30G,也就是我们之前在 Windows 上腾出来的空间。

  1. 接下来这一步很关键,由于在我们上面的分区里面,没分配空间是处于扩展分区 /dev/sda3 以及 /dev/sda10 的前面(左侧),而我们需要先将其移动到靠近我们的 /dev/sda10 分区右侧(也就是把 free space 移动到整个盘最后面)方可与 /dev/sda10 逻辑分区进行合并,因此我们需要用到 dd 这条指令去操作分区移动:

待补充

  1. 但由于我们这里的例子 /dev/sda10 本身已经处于整个盘的最后方,因此可以直接使用 fdisk 的 dn 指令直接合并已经移动到 /dev/sda10 左侧旁的 free space,而省去了最后的从 /dev/sda10 左侧移动到其的右侧。

待补充

  1. 在一轮操作完成之后,再输入 p 查询分区表究竟是否有误,再三确认后输入 w 保存变更并退出。

待补充