Linux分区调整(LVM和非LVM环境中扩容和缩小)

前言:我的上一篇博文详细介绍了磁盘、格式以及分区知识,里面也涉及了LVM,本文主要实践下LVM和非LVM环境中Linux分区如何扩容和缩小。

分区调整原理:
Linux磁盘分区和磁盘格式紧密相连,想要调整分区大小,也必须调整磁盘格式大小。格式是建立在分区之上的,分区为我们提供空间,而我们真正能直接使用的是格式系统,例如windows下使用的ntfs文件系统一样。而在linux下使用的是ext系列格式或xfs格式的格式系统,所以格式系统只能比分区小,不能比分区大。这就意味着在扩容的时候需要先扩容分区,再对格式进行划分;在缩小的时候需要先缩小格式系统,再对分区进行缩小。这个时候问题来了,ext4格式系统是支持后期扩容和缩小的,但xfs格式系统只支持后期扩容并不支持后期缩小,除非备份整个分区数据后重新删除分区再格式化分配,这对于跟分区来说就不太现实了。另外说明下无论是lvm还是非LVM,如果是mbr磁盘则用fdisk分区工具,如果是gpt则用parted工具,当然无论哪种可以用图形化Gparted更好,parted分区方法我另一篇博客
https://www.cnblogs.com/cyrus0w/p/13195187.html 有写,本文案例均是mbr环境中使用fdisk,其他过程思路是一样的。

分区调整中LVM相比非LVM有哪些不同之处?

??????LVM中不是根分区都可以在线扩容和缩小,根分区是可以在线扩容,但不可以在线缩小;
非LVM无论哪个分区都不能在线扩容或缩小,均需要先卸载分区。
非LVM只能操作同一块磁盘,LVM可以操作多块磁盘

非LVM:
非LVM中无论什么格式系统扩容或缩小分区均是按这个步骤来:卸载分区--->扩容或缩小分区和格式系统--->重新挂载分区。且在扩容的时候,需要满足此分区相连后面有多余未分配磁盘空间,如果相连磁盘前面有多余空间(比如前一个分区缩小后多出来的未分配空间),这样是无法直接扩容的,只能备份数据删除此分区后调整,如果是LVM的话,则无需删除分区重新分配了;在缩小的时候,只能从此分区最后磁盘区往前缩小,不能从此分区磁盘开始位置缩小,可以参考下Linux图形化磁盘管理工具gparted中的分区结构:

①在xfs格式中:
xfs只支持扩容,我做过实验一般/home分区可以在root用户登录时卸载,需要用fuser -mvki /dev/sd4 或losf查看并kill掉关联此分区的进程再卸载,卸载后再对此分区进行扩容,扩容完了重新挂载到home分区即可,而对于/ /var /tmp则无法卸载,我尝试过卸载后会自动重启,不过可以用U盘进入救援模式(rescue)下不挂载此分区(选择skip)进行扩容操作,用fdisk先扩容分区,再用xfs_growfs /dev/sda4自动调整格式系统和分区大小适应。参考案例(此案例没有介绍进入救援模式,我在下面ext4格式介绍中有进入救援模式的详细过程):https://www.jianshu.com/p/7d23e6d1f313

②在ext4格式中:
ext4支持扩容和缩小,home分区扩容或缩小均可以在root用户登录做卸载后调整,其他分区必须进救援模式进行扩容或缩小。ext4的扩容和xfs类似,扩容后需要用resize2fs -f /dev/sd3 进行强制自动调整格式系统大小来适配分区大小。这里只对ext4缩小根分区进行下案例讲解(其他分区类似,案例是mbr+ext4用的fdisk,如果是gpt+ext4可以用parted,思路是一样的):

1.先在当前系统中df -h看下根分区已用空间,并结合其他分区调整情况预估下根分区能缩小到多大。如图所示我这里根分区已用3.9G,总容量15G,能缩减的空间还是蛮大的。
2.因为要先卸载分区才能操作,系统运行中无法卸载根分区,所以必须进救援模式操作(还可以进便携式U盘系统操作,推荐Gparted live U盘系统,图形化界面,详情见我的另一篇博客:https://www.cnblogs.com/cyrus0w/p/13199027.html )。插入制作好的U盘启动盘,重启bios设置u盘启动,如图选择rescue...进入救援模式,接着屏幕弹出选项,选择skip...(这一项代表不挂载本地磁盘各个分区),这样就进入了救援模式shell中。这时候可以df -h看下主机自己的根分区和其他分区是没有挂载的。

3.fdisk-l看下要划分的根分区/信息,如图红框所示:(屏幕翻页按键为shift+pageup/pagedown)
可以看到我的根分区当前总大小(Blocks)为15728640K,磁盘起始位置(Start)和结束位置(End)分别为2099200和33556479。
4.先缩小格式系统大小:

#先检查格式系统
e2fsck –f /dev/sda2
#开启journal,在系统事故,或者掉电的情况下, journal 可以帮助文件系统找回丢失的文件。
tune2fs -o has_journal /dev/sda2
#缩小该格式系统到所需大小,上面Blocks为15728640K,我想要缩小空间到10G,且目前系统占用根目录空间为3.9G,这里就多缩小点到9000000k,为了遵从格式系统大小必须小于分区大小原则,后面分区划分好后,可以再用e2fsck –f /dev/sda2自适应调整到分区大小
resize2fs -f /dev/sda2 9000000k


5.再缩小分区大小:这里其实有点复杂,需要计算分区结尾所在磁盘位置,可以百度“Fdisk计算分区大小”查看相关计算方法,我这里提供一个自己原创的土公式。缩减后的结束位置(End)=结束位置(End)-{(结束位置(End)-起始位置(Start))/总大小(Blocks)}乘1024乘1024乘需要减少的空间G。我想要缩减5个G,则得到的缩减后的结束位置(End)为23070719=33556479-{(33556479-2099200)/15728640}* 1024* 1024*5。好了,可以fdisk /dev/sda进去给根分区划分空间了。如图操作:

6.最后让格式系统自动适应当前分区:

resize2fs -f /dev/sda2

7.至此,根分区大小已缩小完成,这时候会在sda2分区的磁盘结尾位置出现多出的5G大小未分配空间,这5G空间在下一个分区sda3前面,如果想要把这部分区域扩容给sda3,只能tar等工具备份sda3后删除sda3,再重新扩容划分,这里不做过多介绍了。后面重启设备拔掉U盘进入主系统即可。

延伸:针对非根分区,如:/var /home /tmp分区后期其实还有个办法可以进行扩容,加一块硬盘划分区,将它们中的内容同步过去,再将新磁盘这个分区重新挂载成/var /home /tmp。此方法参考:https://www.cnblogs.com/saszhuqing/p/8716644.html

LVM:
LVM在扩容的时候无需卸载分区,步骤为:
LVM在缩小的时候需要卸载lv分区再调整,步骤为:

原文地址:https://www.cnblogs.com/cyrus0w/p/13194028.html