LVM环境中根分区的调整

ChinaUnix网友:Jerrywjl

  大概是因为Linux系统相比于微软等系统具有超强的灵活性和透明度的关系,长久以来从来不乏富于想象力的兄弟姐妹总是不断摩拳擦掌地准备将这种在灵活和透明上建立起来的可调控性发挥到极致。

  正因为这样,经过不懈的铤而走险才有像LVM缩根、单盘分身Raid 1等极度刺激和过瘾的方案不断从本人手中孕育出来。当然测试和总结这些方案的初衷基本上都是来自于很多企业和生产环境中的客户顾头不顾腚的前期部署。我们完全有理由相信,并且也时刻做好准备,在今后肯定会有更多神来的想法让我等游走于这种生死之间。所以今天的非LVM环境的分区调整又让我体验了一把刺激。废话不多说了,具体情况大概是这样:


      在某生产环境中有一台Red Hat Enterprise Linux 4的服务器,只安装了一块160GB的磁盘,所有的文件系统都部署在非LVM的普通分区环境中。但在当年部署该系统的时候估计那哥们的脑袋让驴踢得不轻,整了一个/boot 分区100MB/分区为120GB,数据分区为40GB的结构。结果显而易见,该服务器没跑多长时间,存储数据的文件系统即开始告急,但客户又不想将数据放在根分区下,估计用过Windows上类似分区魔术师之类的软件,所以自然就又打起了调整根文件系统的主意。要实现的目的如图:

    调整前:

    |/boot 100MB|----------------/ 120GB-----------------| -------/data 40GB-------|

    调整后:

    |/boot 100MB|--------/ 40GB--------|------------------- /data 120GB ------------|

    这个对比图相信大家都看得明白,无损数据是基本要求。

      这的确是个很有意思和很刺激的需求。其实要说做到也并不能难。尽管没有LVM的环境,这种做法不单适用于分区的缩小,而且也可适用于非LVM环境中的分区的扩大,而且事实上缩小的操作要比扩大的操作难度更大。但事实上个人认为关键的问题不在于扩大和缩小,而就在于一个字——“算”。我没有办法找到和用户一样的环境,除非有人愿意给我捐一块盘,所以只有找一个虚拟机来模拟测试环境。

    这是一个用虚拟机构建一个RHEL4.7的系统,安装在一个4GB的磁盘上,该系统的分区结构如下:

    [root@localhost ~]# fdisk -l

    Disk /dev/sda: 4294 MB, 4294967296 bytes

    255 heads, 63 sectors/track, 522 cylinders

    Units = cylinders of 16065 * 512 = 8225280 bytes

    

    Device Boot Start End Blocks Id System

    /dev/sda1 * 1 13 104391 83 Linux

    /dev/sda2 14 274 2096482+ 83 Linux

    /dev/sda3 275 522 1992060 83 Linux

    

    df文件系统:

    [root@localhost ~]# df -TH

    Filesystem Type Size Used Avail Use% Mounted on

    /dev/sda2 ext3 2.2G 802M 1.3G 40% /

    /dev/sda1 ext3 104M 13M 86M 13% /boot

    none tmpfs 131M 0 131M 0% /dev/shm

    /dev/sda3 ext3 2.1G 44M 1.9G 3% /data1

    [root@localhost ~]# df

    Filesystem 1K-blocks Used Available Use% Mounted on

    /dev/sda2 2063536 782996 1175716 40% /

    /dev/sda1 101086 12222 83645 13% /boot

    none 127332 0 127332 0% /dev/shm

    /dev/sda3 1960716 42220 1818896 3% /data1

      我的目标是最大化地将根分区缩小。根据这里显示文件系统和块设备的大小,我的目标是将原本存在于/dev/sda2这个2GB磁盘分区上的根文件系统和/dev/sda2分区本身缩小至少1GB,因为系统当初是采用RHEL4的最小化安装,所以应该只有800GB左右;而同时将压缩出来的空间提供给/dev/sda3

      现在开始进行操作。由于要对根进行操作,所以无论如何也得进入rescue先。操作之前先计算一下,如果根缩小1GB的话,剩下的空间是否满足文件系统的要求:

    1GB = 1024 x 1024KB = 1048576KB

    2063536KB – 1048576KB = 1014960KB

      这证明即便缩小根文件系统1GB,也能为当前的系统根提供足够空间(782996KB)。所以就以此为目标开干!先进入到rescue模式下,在提示是否挂载系统根的时候选择“skip”,以备后续手动挂载文件系统。创建目录/mnt/sysp_w_picpath备用。现在开始对根分区进行调整。

    首先检查该文件系统:# e2fsck –f /dev/sda2

    调整journal# tune2fs -0 has_journal /dev/sda2

    然后缩小该文件系统到所需大小:# resize2fs /dev/sda2 1014960k

    

    在这个操作成功之后,需要挂载/dev/sda2和原来的/dev/sda3以测试文件系统通过刚才的折腾是否OK

    

    同时查看fdisk –l的信息,准备将根分区所在的块设备sda缩小到合适大小。

      这个地方是最考人的,由于fdisk严格来说是以柱面大小为单位计算容量的,所以我们要将已经缩小之后的文件系统换算成柱面数量,再决定当前/dev/sda2这个文件系统到底需要多少柱面。比如这里根据图示缩小之后的文件系统只有998472KB,按照df命令1KB为单位计算的。而通过fdsik –l显示的结果,每个柱面为8225280字节,所以现在开始换算:

    998472 x 1024 / 8225280 = 124.30401 柱面

      也就是说,精确角度来说需要为/dev/sda2分配124.30401个柱面,而这里为了保证分配的柱面数足够而应该分配整数的柱面数,即125个;而且同时不要忘了。从fdisk –l的结果看来,sda2原本从14柱面开始,但并不意味着其起始位置就可丁可卯地在第14柱面开头,因为一个柱面有接近8MB,换句话说,如果该分区开始的位置在14柱面的靠后部分则还需要分配额外的空间。考虑到这种情况可能出现,所以需要再增加一个柱面,即126个柱面。即新的/dev/sda2起始和终止位置应该是14柱面到140柱面。

      因此在大致的考虑和计算之后可以进行分区的调整。方法是运行fdisk /dev/sda,将/dev/sda2删除,但注意千万不要保存分区表,然后接着直接建立新的/dev/sda2分区。将起始和终止柱面设置为14140柱面,然后保存分区表。

    

    然后再次挂载文件系统并运行resize2fs自动调整文件系统到合适大小。

      这个操作完成之后,首先可以确认的一点是分区和文件系统都调整成功了!而且从刚才最后一次df命令显示微调结果看来,文件系统扩大了5MB左右。证明刚才增加的126柱面的算法还是正确的。

      现在另外一个关键的问题就是如何压缩出来的磁盘空间来扩展sda3。事实上如果可用空间在/dev/sda3文件系统的后面,那么resize2fs是可以的,因为这种情况下原来文件系统的superblock位置是不变的。但是现在这个情况正好相反,可用空间在/dev/sda3的前面部分,所以如果按照刚才的方法来强行扩大分区将造成文件系统无法被读取。

    

      http://os.chinaunix.net/a2009/0921/999/000000×××37.shtml


----

vmwre下非lvm安装如何扩展根分区

系统安装没有详细的分区,分区如下 :
/
/boot
/swap

现在/var空间占用很大空间, 请问如何扩展硬盘空间,或请提供扩展的思路,非lvm环境。

lvm的环境里,扩展成功,有看过一些帖子,但大多需要挂载点的,先umount,然后拷贝,然后mount的方式,我这个好像没法做啊

谢谢!!!

[root@test-test /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             6.9G  4.6G  2.1G  69% /
/dev/sda1              99M   11M   83M  12% /boot
tmpfs                 125M     0  125M   0% /dev/shm
[root@test-test /]# fdisk  -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14         115      819315   82  Linux swap / Solaris
/dev/sda3             116        1044     7462192+  83  Linux

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table


sdb是我添加的硬盘,尚未格式化,另外10.7G的sda空间里有3G是添加但未格式化使用的


 [root@test-test /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             6.9G  4.6G  2.1G  69% /
/dev/sda1              99M   11M   83M  12% /boot
tmpfs                 125M     0  125M   0% /dev/shm
[root@test-test /]# fdisk  -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14         115      819315   82  Linux swap / Solaris
/dev/sda3             116        1044     7462192+  83  Linux

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table


sdb是我添加的硬盘,尚未格式化,另外10.7G的sda空间里有3G是添加但未格式化使用的

CentOS release 5.2 (Final)
Kernel \r on an \m


--jiejue


用光盘启动系统进入rescue模式,在询问挂根的时候选择skip,这样后续需要的话可以手动挂载。


先执行一次e2fsck.ext3 /dev/sda3检查一下文件系统。


执行fdisk /dev/sda,选d先删除sda3,然后选n重建sda3,并使用全部空间。这个时候才选择w保存分区表,注意步骤一定不要错了,一定不要在删除sda3之后w保存分区表!


然后执行resize2fs /dev/sda3,在此之前可能需要按照提示执行fsck一下,那么就按照要求e2fsck执行一遍磁盘修复即可。


执行完成resize2fs之后,你的文件系统和块设备的大小就统一了。


重启系统应该就可以了



回复 8# jerrywjl 

初步成功,不过不知道对于有大量数据的环境,且有mysql主从同步的情况下对数据是否有影响????
另外:   e2fsck.ext3 /dev/sda3  这一步我执行的是  e2fsck /dev/sda3  好像没有e2fsck.ext3 这个命令 而且好像也不是作为参数执行的吧?
    [root@test-test~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             8.9G  4.5G  4.0G  53% /
/dev/sda1              99M   11M   83M  12% /boot
tmpfs                 125M     0  125M   0% /dev/shm
[root@test-test~]# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14         115      819315   82  Linux swap / Solaris
/dev/sda3             116        1305     9558675   83  Linux

Disk /dev/sdb: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table
[root@test-test~]#

http://bbs.chinaunix.net/thread-1929547-1-1.html



---

 Linux下用fdisk和resize2fs动态修改分区大小 

我的Archlinux发现root(/)分区不够用了,于是想把/home分区的空间腾出一些来,
原理:用resize2fs调整/home文件系统的大小,用fdisk调整分区的大小。
试验结果:由于开始不小心把/home(/dev/sda4)分区删掉了,所以没试验成功,于是用以下步骤扩大了root分区:
1. fdisk把root(/dev/sda3)分区删除,注意删除前记录开始柱面号,具体命令:
fdisk /dev/sda ,p命令显示的Start列)
2. 用同样的开始柱面号,建立(fdisk /),命令 n
3. 再使用resize2fs重新修改分区的大小,命令:resize2fs /dev/sda3。
4. 重启系统,出现挂载/home分区失败,按照提示:mount -o remount,rw /,同时删除/etc/fstab下的含有/home那一行。
5. 再重启系统。

成功了!(以后可以试一下用lvm动态调整分区)




--http://lyh3679305.blog.163.com/blog/static/29868737201212234553462/