「Linux」- 调整硬盘分区

  CREATED BY JENKINSBOT

背景介绍

事实证明:不分区,没有太多好处;分区不合理,也有很多坏处的;应该是使用LVM的。

(理想环境)目前,我的SWAP分区在机械硬盘上,想换到固态硬盘上。这很简单,固态硬盘切个分区,然后mkswap(8)一下,挂载一下就行了。事情本该就这么简单,但是每次落实的时候都会遇到各种问题,不是操作复杂,而是情形总是和预想的不一样,会有各种状况。

(现实情况)在我的环境里,固态硬盘一共三个分区,分别挂载了不同的文件系统,已经没有空间来创建新的分区了。而且由于分区不合理,导致目前部分分区空余了大量的空间。所以怎么办呢?那些年我还接触LVM呢。有的时候真的是,我们今天遇到的问题,其实前人很早之前就遇到过了。

(解决方案)我的办法是:缩小原有的某个磁盘的分区,从我的固态硬盘上切出8G的分区,然后创建SWAP分区。目前还不打算迁移到LVM中,因为迁移到LVM需要做大量的工作(备份数据、创建LVM、然后回迁数据),而且也没有找到一个直接转换到LVM而无需迁移数据的方法,但是有个工具(「blocks」)。

环境概述

操作系统:Kali Linux Rolling

磁盘分区:/dev/sdb1 /dev/sdb2 /dev/sdb3

# df -h | grep /dev/sdb
/dev/sdb1 49G 26G 21G 56% /opt
/dev/sdb2 30G 15G 14G 52% /root
/dev/sdb3 32G 3.3G 27G 12% /usr/local

操作步骤

(1)将/dev/sdb3分区缩小到7G大小,然后从富余的20G空间中切出8G用作交换分区,剩下的留作备用。

(2)第(1)步是主要的操作,至于后续的创建交换分区就不再介绍了。本文也侧重第(1)步的讲解。

注意事项

请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!请先测试!!!

请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!请先备份!!!

防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!防止丢失数据!!!

扩容步骤

#1 用于执行测试的设备

我有一个SD卡,16G,使用情况如下:

# df -h | grep /dev/mmcblk0p1

/dev/mmcblk0p1 15G 8.5G 5.3G 62% /mnt/os

里面放了三个操作系统的镜像,MD5如下:

# find ./ -type f -print0 | xargs -0 md5sum

adfcff7187115681d63d4da5cae0a296 ./cn_windows_7_professional_with_sp1_x86_dvd_u_677162.iso

660aab9894136872770ecb6e1e370c08 ./CentOS-7-x86_64-DVD-1804.iso

9b3e050058a176ca780652627a496889 ./2018-06-27-raspbian-stretch-lite.img

这里计算MD5是为了检查调整后是否导致了数据的损坏。顺便说以下,SD的读取速度并不高,我这里只有40MB/s。

#2 卸载/mnt/os分区

使用umount /mnt/os卸载/mnt/os分区。

可能会出现“umount: /mnt/os: target is busy.”提示,这表示有程序正在占用该分区。可以使用fuser -v /mnt/os/查看占用进程,然后可以使用fuser -km /mnt/os/命令终止占用的进程。最后,再使用umount /mnt/os卸载分区。

最后,使用df -h检查分区已经成功卸载。

#3 调整分区大小

执行e2fsck -f /dev/mmcblk0p1命令检查分区。

通过命令resize2fs /dev/mmcblk0p1 11G设置分区为11G大小。

#4 调整分区表(关键步骤)

使用fdisk /dev/mmcblk0删除/dev/mmcblk0p1分区表。

然后,在使用命令fdisk /dev/mmcblk0重建分区表,重建时指定11G大小。注意必须是11G大小,因为上面执行resize2fs的将分区调整为了11G大小,你可以选择不一致,但是你要单独处理这个问题“分区数据丢失”或“无法使用剩余空间”的问题,何必呢?

#5 重新挂载分区

使用mount /dev/mmcblk0p1 /mnt/os命令挂载分区,然后用df -h命令查看,可以看到/mnt/os已经变成11G了。

附加说明

如果执行resize2fs /dev/mmcblk0p1 11G命令时,产生“resize2fs: New size smaller than minimum (1308208)”形式的错误提示,这表示你所指定的大小(这里是11G空间)小于最小值。其中,“1308208”是块的个数,“该值”乘以“块大小”后可以得到需要的最小磁盘空间。

参考文献

(1)Resize Partition and Filesystem with fdisk & resize2fs
linux下分区调整(图解)
How to find the size of an unmounted partition on Linux?
How do I determine the new size for resize2fs?