问题描述
事实证明:不分区,没有太多好处;分区不合理,也有很多坏处的;应该是使用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,使用情况如下:
/dev/mmcblk0p1 15G 8.5G 5.3G 62% /mnt/os
里面放了三个操作系统的镜像,MD5如下:
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?