在安装Linux的时候,通常遇到的一个比较头痛的问题就是分区,到底每个区该分多少,用了一段时间之后,某个分区又不够用了,该怎么办?如果是普通的服务器,那一切都好说,大不了就关机重新划分分区嘛,但是对于有些关键的服务器,别说关机,就是停止服务都是不可忍受的。例如:一个虚拟主机服务提供商,本来给/home划了100G空间,在刚开始的第一年,一切都还好,空间够用,等到了第二年,开始搞促销,结果两个月之后,/home分区就只剩下1GB了,而且/var分区估计1个月后也要用完了,怎么办?有没有在不停止服务的前提下,就能动态增加硬盘空间的技术?有,这就是Linux下LVM技术的来历。
LVM全称为Logical Volume Management,它是Linux环境下对磁盘分区进行管理的一种机制,它通过在硬盘和分区上建立一个抽象的逻辑层,来屏蔽分区大小,磁盘空间给用户带来的困难。在LVM中,可以将多个磁盘分区组做成一个存储池,管理员可以在此存储池上随意创建逻辑卷组,再mount到相应的挂载点上去,从而达成动态增加磁盘空间的目的。例如上边的这个例子,当/home分区不够大时,可把磁盘的一部分空间mount到/home上去,这样的话,就可以实现零当机时间来调整磁盘了。
在开始LVM配置之前,先简述几个基本概念和术语:
1. 物理存储介质:
指的是物理的硬盘,在/dev目录下看到的sda,sdb,sdc,hda,hdb,hdc等。
2. 物理卷(Pisical Volume):
指的是物理硬盘上的分区或逻辑上与磁盘分区具有相同功能能的设备,是LVM的基本存储块,但和分区来比,却包含了与LVM管理相关的参数。这个就是前面讲的存储池。
3. 卷组(Volume Group):
LVM的卷组类似于物理硬盘,卷组上边可以建立多个虚拟的“分区”,LVM卷组由一个或多个物理卷组成。
4. 逻辑卷(Logical Volume):
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷上边可以建立文件系统,用于mount到不同的挂载点,提升分区空间——这是真正跟用户打交道的部分。
5. PE (Physical Extent)
每一个物理卷被划分为一个个的基本存储单元,每一个PE都具有唯一的编址(这个东西类似于物理硬盘上的磁盘地址)。PE的大小默认为4MB。
6. LE(Logical Extent)
每一个逻辑卷也被划分为一个个的基本存储单元,每一个LE也具有一个唯一的编址。在同一个卷组中,LE和PE的大小是相等的。
综上所述,进行一个总结就是,一个或者多个物理硬盘上都可以划分出一个或者多个LVM分区,然后这些分区可以组成一个物理卷(PV),形成一个存储池。用户把这个存储池划分出来一个或者多个LV,挂载到不同的分区上去使用,这个就是LVM的基本原理,也是建立LVM的过程。
结合上边那个例子,如果要为/home和/var分区增加空间,则要有如下步骤:
1. 给服务器装上2块新硬盘
2. 把新硬盘进行分区,并标记为LVM分区
3. 把2块新硬盘上的LVM分区合并起来,组成一个新的物理卷(PV)
4. 把物理卷划分成两个逻辑卷(LV):名字分别是home和var
5. 在这两个逻辑卷上建立文件系统
6. 把这两个逻辑卷挂载到/home和/var上去
现在,开始进行LVM的实践,本文的例子在VMware中进行,磁盘空间只有8GB,和上边的例子不同。
在这台server中,安装了1块硬盘,其分区大小如下:
swap: 384M
/boot:100M
/home:2GB
/var:2GB
/:其余所有空间
现在,发现/home的空间不够了,/var也在告急,于是,我决定为这台Server安装LVM,扩充空间。
【第一步】
关闭虚拟机,增加两块硬盘,两块硬盘的大小均为8GB。由于这是虚拟机,没办法热插拔硬盘,所以只能关机,如果是实体服务器,具备热插拔硬盘接口的,自然就可以省去这一步
【第二步】
再次开机之后,可以在/dev目录下看到新增加的两块硬盘sdb和sdc,原来的那块是sda。
首先,先安装LVM管理软件:
- $sudo apt-get install lvm2
然后,查看一下当前系统中的硬盘:
- $sudo fdisk -l
可以看到当前系统中有3块硬盘了。
然后,对sdb进行分区:
- $sudo fdisk /dev/sdb
系统提示:
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xc3a40868.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won’t be recoverable.
Warning: invalid flag 0×0000 of partition table 4 will be corrected by w(rite)
Warning: DOS-compatible mode is deprecated. It’s strongly recommended to switch off the mode (command ‘c’) and change display units to sectors (command ‘u’)
不管这个提示,现在开始,在Command(m for help):后输入n,这代表创建新分区
然后系统会提示:
e extend
p primary partition
e代表要创建的是扩展分区,p代表要创建的是主分区。这里输入p,创建主分区。
系统提示partition number(1-4):,我要把这块硬盘的全部空间都分配给/home,不做它用,所以只分1个区就够了,在此处输入1。
然后系统提示First cylinder (1-1044, default 1):默认从第一个柱面开始,这里直接回车就OK。
然后系统提示
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044)
这里是分区大小了,我打算把所有空间全部分配给这个分区,所以直接输入:1044,就把全部空间分配完了。
然后使用p命令,打印出来当前的分区情况。
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 83 Linux
然后,可以看到这个分区的类型是Linux,现在要把它改为LVM,使用t命令:
系统提示:Hex code (type L to list codes): ,然后输入L命令,查看所有的代码。在系统打印出来的这个表格中,可以看到Linux LVM对应的代码是8e,在这里输入8e,标记完成。这一步做完之后,这块硬盘就算是OK了,记得使用w命令保存。
然后用同样的方法,把/dev/sdc也做一遍。
【第三步】
现在,系统中有了两块新的硬盘:sdb和sdc,并且在上边都建立了LVM分区sdb1和sdc1,现在要做的,就是把这两块硬盘上的两个LVM分区,加入到物理卷(Physical Volume)中去。使用命令:
- $sudo pvcreate /dev/sdb1 /dev/sdc1
系统提示:
Physical volume “/dev/sdb1″ successfully created
Physical volume “/dev/sdc1″ successfully created
要删除某个分区也很简单,使用命令:
- $sudo pvremove /dev/sdb1
这条命令就可以把/dev/sdb1从物理卷中删除掉了。
创建之后,可以使用pvdisplay命令来查看物理卷的状态:
- $pvdisplay
【第四步】
物理卷(PV)创建完毕之后,就把这些分散在一个个的物理硬盘上的LVM分区组成了一个存储池。
现在开始创建逻辑卷组(Volume Group),这个逻辑层将屏蔽掉硬盘、分区,使用户透明地使用LVM功能管理磁盘,使用命令:
- $sudo vgcreate extspace /dev/sdb1 /dev/sdc1
系统提示:
Volume group “extspace” successfully created
这样就创建了一个名称为extspace的逻辑卷,创建完毕之后,可以在/dev目录下看到一个名为extspace的设备。
*注:如果已经存在了一个物理卷fileserver,把新的硬盘分区/dev/sdb1加入到该逻辑卷组,其命令是:
- $sudo vgextend fileserver /dev/sdb1
当创建了一个逻辑卷组extspace后,删除它的命令是:
- $sudo vgremove extspace
查看逻辑卷组的命令是:
- $sudo vgdisplay
或
- $sudo vgscan
【第五步】
逻辑卷组(VG)创建好了,现在在上边创建逻辑卷,我将要创建两个逻辑卷,一个叫home_ext,一个叫var_ext,望文生义,一个用来增加/home分区的空间,一个用于增加/var分区的空间。
使用命令:
- $sudo lvcreate --name home_ext --size 8G extspace
- $sudo lvcreate --name var_ext --size 8G extspace
这两条命令很简单,意思就是,在逻辑卷组(VG)上创建两个大小均为8GB的逻辑卷(LV),其名称分别为home_ext,var_ext
完成之后,系统会提示:
Logical volume “home_ext” created
Logical volume “var_ext” created
使用如下命令可以查看逻辑卷(LV)的情况:
- $sudo lvdisplay
系统的输出结果很容易看懂,分别是两个逻辑卷的参数。创建完毕之后,可以在/dev/extspace/下看到两个设备,分别叫home_ext和var_ext
如果要删除逻辑卷,同样很简单,使用命令:
- $sudo lvremove /dev/extspace/home_ext
这就删除掉了刚才创建的逻辑卷home_ext。
【第六步】
逻辑卷(LV)创建完毕之后,基本上工作就做完了90%,只需要往挂载点上mount就可以了,在mount之前,如果对逻辑卷的空间大小、名称不满意,还可以修改(当然可以使用删掉重建的办法),LVM提供了相应的命令:
- $sudo lvextend -L 10G /dev/extspace/home_ext
这条命令把名为home_ext的逻辑卷(LV)的空间大小增至10G(本例中无法增加,因为创建LVM分区的时候已经使用了所有磁盘空间了)
- $sudo lvreduce -L 4G /dev/extspace/home_ext
这条命令把home_ext的逻辑卷(LV)的空间大小缩减至4G
- $sudo lvrename extspace/home_ext home_ext1
这条命令把extspace卷组中的逻辑卷(LV)home_ext改名为home_ext1
【第七步】
接下来,就是要在逻辑卷上创建文件系统了,这个文件系统是要和挂载点的文件系统一致的,我没有尝试过在ext4文件系统上挂载FAT32是什么效果,反正我做的都是相同的文件系统。
首先,把home_ext做成ext4文件系统,我的/home分区是ext4的
- $sudo mkfs.ext4 /dev/extspace/home_ext
再把var_ext做成ext4文件系统,我的/var分区也是ext4的
- $sudo mkfs.ext4 /dev/extspace/var_ext
做好之后,就可以挂载逻辑卷了。
- $sudo mount /dev/extspace/home_ext /home
- $sudo mount /dev/extspace/var_ext /var
至此,空间不足的问题得以解决!
可以查看挂载的文件系统,使用df -h命令。
【第八步】
到第七步就完成了LVM的配置,但是考虑到服务器也会有重启的时候,而重启之后,这几个逻辑卷是不会自动挂载的,所以需要修改/etc/fstab文件(修改之前先保留一个备份):
- $sudo vi /etc/fstab
增加如下几行:
- /dev/extspace/home_ext /home ext4 rw,noatime 0 0
- /dev/extspace/var_ext /var ext4 rw,noatime 0 0
重启验证,一切正常。