2.5 磁盘的管理方式node
用户也好,权限也罢,它们老是要有一个证实本身的天地;文件也罢,程序也好,它们老是得有一个安身立命的家园;即使Linux本身也必须得有本身的栖身之所。那就是磁盘。其实Linux对磁盘的管理十分对得起两个字:“不赖”!centos
2.5.1Linux的文件系统bash
只要是磁盘就得格式化,好像已是天经地义的事情了,几乎没有人去问为何。不少有经验的人在彷佛都有个这样的经历,就是风风火火的从朋友那里借来了一张装满高清“A”片的移动硬盘,暗爽事后还想留下一些待之后慢慢品味,但是总有那么一些质量比较好的片子(尺寸超过4G)复制失败。追问缘由还每每被高手们嘲笑:“都什么年代了你还用FAT32,赶忙换NTFS吧”。我想这个时候你就不得不追问一下,为何FAT32不行而NTFS却能行吧?数据结构
由于它们是不一样的文件系统,功能不一样,能力不一样。FAT32是在Windows95时代开始采用的文件系统,到如今都有人在用(好比U盘),能够说是伴随着咱们成长的文件系统。FAT是File Allocation Table的缩写,从字面意义上就能看出这是一种相似表格同样的文件系统。因为其用于描述文件大小的属性是一个32位的值,致使其可以支持的单个文件最大不能超过4G。而NTFS是微软专门为NT系统设计的,单个文件最大能够达到2T。如今最为经常使用的Windows XP和Windows 7都支持NTFS。至于NTFS是怎么管理文件的有点不太好说,由于微软一直当它是个“秘密”。app
Linux也有本身的文件系统格式,被称为ExtN(N=2、3、4)。若是要追溯ExtN的起源,其实要比FAT32和NTFS都要古老,也就是咱们前面所说的基于inode的文件系统。如前面所述,ExtN文件系统一定要包含inode数据结构来表明一个文件,而且存储这个文件的各类属性和权限。至于实际的数据则放在data block块区中。除此以外,ExtN文件系统还有一个超级块区(superblock),用于记录整个文件系统的总体信息,包括inode与data block的总量、使用量和剩余量。dom
data block与inode同样,每个都有一个惟一编号,inode只须要记录这些编号,就可以定位整个文件的任意一段数据。咱们假定有一个编号为3的inode,它所表明的文件的数据被放置在编号为2、5、6、8、13和20的这几个data block中。那么读取这个文件的过程则如图2.4所示。采用这种数据存取的方法的文件系统被称之为“索引式文件系统”。它与伴随着不少人成长的FAT32有什么不一样呢?图2.5对比了这个过程。工具
经过对两个图的比较,咱们能够清晰的看出,ExtN经过inode可以一次性得到文件数据所存放的位置,能够据此来安排磁盘的阅读顺序,尽可能保证在磁盘只旋转一圈的状况下将全部内容读出来。而FAT32则只有将对应的data block读入以后才知道下一个data block在什么地方。若是一个文件的data block比较分散的话,将很难保证在磁盘只旋转一圈的状况下读取所有数据,有时候甚至要多转不少圈才能读完数据。oop
这就是咱们很是熟悉的“磁盘碎片”问题。因为长时间的对文件进行建立、删除、读写,很难保证同一个文件的data block的位置相邻。而因为FAT32的读写特性,在data block不相邻的状况下读写性能会极具降低。因此为了提升Windows系统的磁盘性能,常常性的作“磁盘碎片整理”是很是有必要的。布局
而对于Linux这种文件系统,则基本上不须要进行磁盘碎片整理。并且你也基本上找不到相似的工具。可是Linux系统通过长时间使用以后,仍是会有文件数据过于分散的问题的。即使可以作到很好的规划,可是对性能多多稍稍仍是会有一些影响,只是没有使用FAT32的Windows那么严重罢了。因此,一个使用时间好久的Linux系统也会由于磁盘碎片问题而变慢,这也是事实。只是不须要太过在乎它。性能
图2.4 ExtN文件系统读取数据过程示意图
图2.5 FAT32文件系统读取数据过程示意图
2.5.2 磁盘的基本操做
在前面的小结中介绍过几个最经常使用的文件操做命令:ls、cd、cp、rm和mv。虽然它们也都是做用在磁盘上,可是它们面向的对象更为高级一些,属于文件范畴的。而咱们如今要介绍的是稍微低级一点,面对是的文件的载体——磁盘的一些基本操做。最经常使用的是:df、du、dd、fsck和mount。
df命令用于查看系统中全部磁盘的总体使用量。在咱们的测试系统中可以获得以下所示信息:
Filesystem 1K-blocks Used Available Use% Mountedon
/dev/mapper/VolGroup-lv_root
51606140 5587240 43397460 12% /
tmpfs 250860 272 250588 1% /dev/shm
/dev/sda1 495844 31891 438353 7% /boot
/dev/mapper/VolGroup-lv_home
9877432 1681704 7693968 18% /home
可见df命令的输出仍是比较清晰的。可是有两个概念可能须要解释一下,就是这里所说的“Filesystem”和“Mounted on”。若是要翻译成中文(不少人的机器中可能显示的字段名)则是“文件系统”和“挂载点”。
这里所说的“文件系统”与咱们以前所说的操做系统中的文件系统的概念有点不尽相同,着这里更多的含义指的是磁盘分区。之因此叫它是文件系统,是由于每个磁盘分区都是一个文件系统的具体实例,若是套用面向对象的说法就是,类和对象。诸如ExtN这样的就是类,而具体的磁盘分区就是这个类的对象。至于“挂载点”则比较有趣,它是某个具体的目录。
从df每个行的输出上看,难道具体的磁盘分区会与某个具体的目录有关?事实的确是这样的。前面也是说过,Linux没有Windows中的C盘、D盘的概念。精通Windows的同窗都清楚,Windows中的分区会有一个盘符与它对应,在分区中的文件和目录的组织结构就像一颗树同样,树根就是盘符+“:”。Linux组织文件和目录的方式最终也能被看做是一棵树。可是因为没有C盘、D盘的概念,更没有盘符一说,因而就特地规定了一个总的树根叫“/”,而具体某个分区的树根就从某个目录开始。至于不一样的分区应该从哪一个目录开始这个就没有明确的规定。其实不规定也就是有规定,即你能够随意指派。而具体指派哪一个分区与哪一个目录对应,就由mount命令来指定了。以后只要访问哪一个目录里的任何文件或目录,都是对具体的分区进行访问了。而这个目录则被称为“挂载点”。
根据df命令的输出内容能够看出,Linux文件中的总树根“/”与“分区”/dev/mapper/VolGroup-lv_root相关联,而/dev/shm目录与“分区”tmpfs相关联,/boot目录与分区/dev/sda1相关联,……。这些“分区名”都什么含义呢?其实在这些所谓的分区中,只有/dev/sda1才是真正的磁盘分区,而这个名称则是这个磁盘分区的“设备名”。在Linux系统中,/dev目录下的全部文件都与一个具体的设备有关,有物理的,也有虚拟的。而sda1这个就是一个物理的设备。它对应系统第一块串口硬盘的第一个分区。那么若是是第二个分区呢?sda2,第三个是sda3……,而对应整块硬盘的则是sda。由此递推,第二块串口硬盘,应该是sdb,第三块应该是sdc……。而/dev/mapper/*这些又是什么呢?这个就是虚拟的设备了,它其实是逻辑卷。有关逻辑卷的概念咱们稍后在说,如今你只要知道它是虚拟的磁盘分区就好了。不过更奇怪的是tmpfs,这个设备文件在什么地方呢?答案是没有,由于它不对应任何设备。它其实是真正的文件系统名称。而这个文件系统是在内存中虚拟的,与具体的硬盘无关,因此也没有具体的设备。因而在df的输出中所幸就与“类名”代替了。这样的文件系统还有不少,好比procfs、sysfs等,本书会有专门的一章来介绍这些特种文件系统。
df命令自己就没有什么好继续再介绍的了,上述的一些概念远比df自己要重要不少,这个是你们应该更加注意的。对于/dev目录下的那些文件,本书不会逐个的去讲述它们都表明谁。毕竟每一个人的系统都不一样,因此也无法说,你没看到你怎么信我呢?比较好办的办法是问百度或谷歌,它们是你学习Linux必不可少的工具。好了,我不能再说多了,由于这样大家都会不买个人书而逛百度去了。
df命令是用来观察整体磁盘使用量的,要观察局部使用量,须要使用du命令。df命令能够经过读取磁盘的superblock来实现,而du命令则不一样,它要搜索全部的inode来计算局部数据,因此du命令的执行效率,常常要比df差不少。
从严格意义上来说,dd命令应该不属于管理磁盘的命令,由于在联机帮助中说它的功能是“convert and copy a file”。可是若是你想要直接读写磁盘的每个扇区,或者镜像整个磁盘,dd命令则是很是好的选择。一般dd命令的格式以下:
dd if=input_file of=out_file
从这个基本用法,若是像联机帮助中说描述的,复制一个文件,可使用相似这样的命令:
# dd if=/etc/bashrc of=./bashrc
这个命令与cp /etc/bashrc ./bashrc是等价的。其实“if”和“of”这两个参数也不用给定,会有默认值。“if”的默认值是标准输入,“of”的默认值是标准输出。若是要模拟cat命令,可使用这样的命令:
# dd if=/etc/bashrc
根据前面的讲述的内容,具体的硬件设备在/dev目录下会由具体的文件与之对应,好比/dev/sda1。若是要制做第一个串口磁盘第一个分区的镜像文件,可使用这样的命令:
# dd if=/dev/sda1 of=./sda1.img
须要注意,执行上面的命令时,输出文件所在的分区必须大于sda1分区,至于为何我想你懂的。若是还但愿对生成的镜像文件压缩一下,可使用这样的命令:
# dd if=/dev/sda1 | gzip -9 > ./sda1.img
按照这个思路,咱们将整个磁盘都作一个镜像呢?
# dd if=/dev/sda | gzip -9 > ./sda.img
若是要恢复这个磁盘的内容,就能够这样:# gzip -dc ./sda.img | ddof=/dev/sda
经过这两条命令,你们想到了什么?这个是否是与咱们在Windows下常用ghost很是像呢?感受塞门铁克公司的老大应该找块豆腐撞死。而dd命令还不止这点本事,它还能指定读写数据量。好比bs和count这两个参数,可以指定依次读写的本身数和读写次数,这样就可以指定读写数量了。好比我要备份磁盘的主引导记录,能够这样:
# dd if=/dev/sda of=./mbr.img bs=512 count=1
这要求值读取sda磁盘的首个512个字节的信息,也就是第一个扇区的内容,将它保存到mbr.img文件。对mbr内容感兴趣的同窗,可使用反汇编工具,将这个文件反汇编掉,就能知道计算机是怎么启动的了。
使用dd命令可以作的事情还有不少,好比销毁磁盘数据、测试磁盘读写速度、修复磁盘等,为了方便你使用,我将这些技巧列下来:
# dd if=/dev/urandom of=/dev/sda1
# dd if=/dev/zero of=./test.file bs=1024count=1000000
# dd if=./test.file bs=8k | dd of=/dev/null
# dd if=/dev/sda of=/dev/sda
看完这些,我以为大家更会认为赛门铁克公司的老大应该买块豆腐撞死。特别说明一下/dev/urandom、/dev/zero和/dev/null这三个虚拟设备设备文件很是有用。urandom表明随即数,每次读入的数据都不会相同;zero表明0,每次读入的数据都是0;而null主要面对写,至关因而一个黑洞同样,不管写什么都会消失得无影无踪。
不知道经过我上面的介绍,你们是否已经理解dd在磁盘管理中的做用了呢?既然到了这个份上,理不理解我也管不了了。生活还得继续,咱们的内容接着往下走,该说一下fsck了。
fsck通常咱们不多手工执行,基本上都是在系统启动阶段就执行了。至于它是什么做用则很是简单,与Windows的scandisk同样,对文件系统的损坏进行修复。须要注意,fsck只能对文件系统的损坏进行修复,对磁盘的损坏它是没有办法的。后面咱们会有单独的章节来介绍fsck的工做原理,这里就不作复述。具体的使用方法就是:
# fsck -t 文件系统设备名
好比:
# fsck -f -t ext3 /dev/hda3
其中参数“-f”要求进行强制检查。若是不增长-f选项,在没有报错的磁盘中是不会作检查的。至于磁盘何时会报错呢?通常就是非法关机的时候了!
期待已久的mount的终于登场了。前面已经讲过“挂接点”是个什么东西了,相信你们还在为Linux这种“怪异”的设计而啧啧称奇呢。可是早已用惯Linux的我反倒以为Windows的设计很是奇怪。相比之下,Linux的方式更为灵活。就好比在Windows下有一个软件必须在D盘下的某个目录中读取文件,而这个软件如果在一个没有D盘的系统中就没法执行了;相反的,在Linux下,只须要特地建立一个目录便可,若是须要单独的磁盘分区来存储它,使用mount命令指定给它就行了。
虽然说mount命令听起来有点神奇,可是使用起来倒是很是简单。通常的用法是这样的:
# mount [-t 文件系统] 设备名称挂接点
好比咱们要将系统中第二块串口硬盘的第一个分区(若是有的话)挂接到/data目录下,能够这样用:
# mount /dev/sdb1 /data
或
# mount -t vfat /dev/sdb1 /data
怎么样,够简单的吧?对于第二种用法不少时候“-t”参数是多余的,由于相似ext2、ext3这样的ExtN类的基于inode的文件系统,都是都有超级块的。利用超级块就可以了解到具体的文件系统。因此第一种用法在大多数时候都会成功。而第二种用法多数用于挂接Windows分区时使用,由于这些文件文件系统不具有超级快。
其实挂接磁盘分区还只是mount命令的最日常的一种用法。因为Linux使用设备文件来描述一个设备,那么若是有一个实际的文件中的内容与在某个磁盘设备文件中的读到的内容一致,那么这个实际的文件也可以挂接进来。就好比咱们以前使用dd命令建立的sda1.img文件(未压缩的),就能够利用这样的命令来挂进到一个目录上:
# mount -o loop ./sda1.img /mnt/sda1
这样你就会发现/mnt/sda1目录下的内容与/boot目录下的内容相同(别忘了以前df命令的输出)。以此类推,咱们下载到的*.iso文件也可使用一样的方法挂接到某个目录上直接访问了。例如:
# mount -o loop ./CentOS-6.4-x86_64-bin-DVD1.iso/mnt/centos
看到这里是否是以为Windows下那些虚拟光驱软件的做者们都开买块豆腐撞死了?
在这种mount的用法中,比较重要的是“-o”命令选项,这是个mount比较灵活的一个选项,有不少可选参数。好比“ro”说明挂接的磁盘是只读的、“rw”说明挂接的磁盘是可读写的等等。而loop则说明要挂接的文件是一个虚拟设备,而这个虚拟设备是环形的设备。为何是“环形”呢?想一想硬盘、光盘、软盘等都是什么形状就好了。还不知道?圆形的啊!
与mount相反的操做就是卸载了,使用umount命令。它的操做更加简单,给定挂接点目录或具体设备就好了。好比:
# umount /data
或
#umount /dev/sdb1
若是你的系统中有这些设备,则这两种方法是等价的。
其他的有关进行磁盘分区和格式化的命令就不作详细介绍了。由于不少人连Windows下这样的工具怎么用都还搞不清楚,可见它们都是不多用到的东西。为了知足一份同窗的好奇心,咱们在这里只说一下它们的名字。
用于磁盘分区的命令是fdisk,这与Windows或DOS下的命令名是一致的。比fdisk更好用一些的分区工具是cfdisk,Cent OS中有提供。而对磁盘作格式化的则不是format命令。在Linux是下mkfs.*命令。至于*是什么,取决于你格式化成什么系统。好比要格式化成ext3文件系统,就应该是mkfs.ext3。若是想了解系统中都对那些文件系统支持这样的命令,直接到/sbin目录下查看就是了。而更为通用的格式化命令则是mkfs,具体如何使用,查看联机帮助吧。这类工具与以前介绍的那些磁盘工具也是同样的,能够对某个磁盘中的一个具体文件进行“分区”和格式化。
2.5.3 /etc/fstab文件
如今你们已经了解到了Linux磁盘的一些基本管理方式,也了解了“挂接”这个新鲜玩意儿。Windows是怎么操做的咱们不是很清楚,可是在Linux启动以后,其文件布局可以像你所见到的这样都是通过一步一步的挂接来完成的。决定让磁盘的各个分区具体要挂接到哪一个目录是由/etc/fstab文件所决定的,因此这个文件是Linux系统中十分重要的文件,一旦损坏或丢失,系统将没法正常启动。因此掌握这个文件的格式并能手工恢复它,将是成为Linux系统管理员的必修课程。这个文件(/etc/fstab)在咱们的测试系统中以下所示:
#
# /etc/fstab
# Created by anaconda on Sat Mar 17 05:12:212012
#
# Accessible filesystems, by reference, aremaintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8)and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=ec11a28b-9bf2-4f7e-95dc-2b7ccd5992ca /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
咱们能够清楚地看到,这个文件一共分为6个字段,分别是:
l设备文件、磁盘卷标或者UUID
l挂接点
l文件系统类型
lmount命令的-o选项参数,defaults不给定-o选项时的行为
l是否使用dump命令备份,0表明不作,1表明天天备份
l是否使用fsck命令检查磁盘;0表明不检查,1表明最先检查(通常只有树根“/”是1),2也是要检查,只是比1要晚(除树根以外的通常都使用这个)
在第一个字段中,咱们看到了一些在df命令中出现的“分区”,而有一些则没看到过。其实使用“df –a”就能够查看更多了。而比较让人困惑的是/dev/sda1确不见了,可是能明显看出来是“UUID=ec11a28b-2bf2-4f7e-95dc-2b7ccd5992ca”这个设备。使用命令blkid命令就能露出真面目了。实际上在这里直接写/dev/sda1也是没有问题的。
虽然/dev/sda1找到主了,可是还有一个分区在df命令的输出怎么也找不到,那就是类型为swap的这个分区。这个是什么呢?这个是交换分区!交换分区是什么概念呢?与Windows的页面文件是相同的概念!
所谓的页面交换文件,实际上就是虚拟内存管理时要使用的内存置换文件,就是用来扩展虚拟内存空间的。固然,也是拖慢系统的罪魁祸首之一。须要注意,若是你使用的是32位的系统,并且已经配备了4G的内存,那么就没有必要给Windows分配页面交换文件(在没有开启PAE模式的状况下)。Linux下也有这样的规矩,只是将页面交换文件变成交换分区了。
建立交换分区可使用fdisk命令,格式化它使用mkswap命令。这个彷佛并无逃出咱们以前所掌握的一些知识。可是到了具体挂接的时候就不同了,它不是挂接的,即不是使用mount命令来用的。取而代之的是使用swapon命令。若是须要关掉某个交换分区,则使用swapoff命令。
此外,根据咱们以前的经验,普通文件也是可以成为“交换分区”的(还记得前面讲的虚拟光驱吗?),咱们所幸就叫它交换文件好了。方法就是使用dd命令来建立一个空的文件,而后使用mkswap命令来“格式化”它。好比建立一个1G的交互文件,能够这样:
# dd if=/dev/zero of=/tmp/swap bs=1Mcount=1024
# mkswap /tmp/swap
至于接下来该怎么作,我想你懂的。
2.5.4 逻辑卷
在前一小节中咱们留下了一个小尾巴,说/dev/mapper/*这些都是逻辑卷。而具体逻辑卷是什么就没有继续说,主要是由于这个小尾巴其实并不小,一不当心可能夹到尾巴。
1.什么是逻辑卷
那么到底什么是逻辑卷呢?这个可能得须要一个比较实际的场景来解释一下,正好还有一个。
前几天我有一个同事,在本身的电脑中与他的Windows并行安装了一个Ubuntu。他在使用Linux的时候老是显得很小气,只给他的Ubuntu分了10G的硬盘空间,并划分了三个分区分别给了“/”、“/home”和swap。树根“/”分配2G的空间,“/home”分配了7G,swap为1G。这样的分配方法仍是比较专业的。只是没过几天他就遇到了麻烦。他想用这个Linux系统来定制一套Android系统,因而就须要下载到Android的所有源代码。可是没想到Google实在是大方,7G的磁盘空间不够装Android的源代码。好了,我想问问各位同窗,你遇到这样的问题要怎么作?
按照咱们前面掌握的知识能够这样作。首先再从硬盘中划分一个更大的分区出来,好比100G;而后再将这个分区格式化成Linux的文件系统,并将/home目录下的内容所有复制到新的分区;最后修改/etc/fstab文件,让新的分区成为/home。重启以后就大功告成了。看来问题解决的很是好,Linux的灵活性显然不通常。可是若是以为100G给的太多了呢,Windows又不够用了怎么办?难道再重复上述动做?天哪,复制文件是要花很长很长时间的,尤为是这种源代码的东西,无数的小文件。
好了,逻辑卷就是来解决这个问题的,它可以弹性的调整文件系统的容量。从理论上说,逻辑卷就是在磁盘分区和文件系统之间增长了一个逻辑层。这样,当文件系统的容量以为不够用时,能够向逻辑卷中增长新的分区来实现扩大容量的目的;而当发现文件系统过大而有磁盘浪费的时候,能够选择去除一些基本没有使用的磁盘分区来达到容量的目的。在Linux系统中实现逻辑卷更能的是LVM,即Logical Volume Manager,逻辑卷管理器。
2.基本术语与原理
在进一步讲述逻辑卷以前,咱们先了解一下它的基本术语。
lPhysical Volume,PV,物理卷
物理卷就是具体的硬盘分区,或者与硬盘分区具备相同功能的设备,好比raid等,是LVM的基本存储单元。可是与基本的物理存储介质,好比普通的硬盘分区等,物理卷还要包含与LVM相关的管理参数。
lVolume Group,VG,卷组
卷组相似于非LVM系统中的物理硬盘,由多个物理卷组成。能够在卷组上建立一个或多个LVM分区。
lPhysical Extend,PE,物理扩展区
每个物理卷被进一步划分红被称为物理扩展区的基本单元,换句话说PE是LVM使用的最小存储区,与物理磁盘中的“扇区”或文件系统中的“簇”的概念基本相同。LVM的默认PE大小是4M,每一个卷组最多仅能含有65534个PE。因此,一个卷组的最大容量就是4M*65534=256G。若是改变PE的大小,就可以改变卷组的最大容量。
lLogical Volume,LV,逻辑卷
最后咱们说道正题上了,就是逻辑卷。这个逻辑卷就是在卷组之上再进行切分,与在物理磁盘上继续划分分区是同样的道理。可是逻辑卷的大小必须是PE的整数倍。这就是LVM可以弹性调整逻辑卷容量的秘密所在。须要增长容量,就增长PE;须要减小容量,就减小PE。LVM的构成原理见图2.6所示。
图2.6 LVM的构成原理
到了具体的逻辑卷上,就能够应用mkfs命令进行格式化了,如此以来就可以使用mount命令挂接到系统中了。
构成原理如今算是搞定了,可是对于一个逻辑卷可能会对应到多个物理分区上,那么在向硬盘中写入数据的时候是怎么操做的呢?目前有两种模式:
l线性模式(linear):即逐个物理分区使用。好比一个逻辑卷占用了/dev/sda1和/dev/sda2两个分区,那么首先写/dev/sda1,直到满了以后才会使用/dev/sda2。
l交错模式(triped):这个就将一笔数据拆成两个部分,分别写入/dev/sda1和/dev/sda2。这个与RAID 0很像。若是使用/dev/sda1和/dev/sdb1这样的组合来作逻辑卷,有至关于一份数据用两个硬盘来写,理论上是可以提高读写效率的。
须要注意,虽然交错模式的逻辑卷有点像RAID,可是它的最终目的仍是用于磁盘容量的弹性可调的。若是要关注性能,仍是直接使用RAID比较好。并且triped模式的逻辑卷与RAID 0是相似的,即当某个分区挂掉了,那么你的数据也会跟着灰飞烟灭的。因此逻辑卷的默认工做模式是linear的。
3.基本操做
Cent OS已经默认支持逻辑卷了,因此若是选择了Cent OS的同窗,如今就已经在使用逻辑卷了。可是若是你选择了Ubuntu这样的发行版,就没有这么幸运了,由于Ubuntu并无提供这方面的支持。可是也没关系,咱们能够手动安装。
首先,逻辑卷必须有内核支持才能工做。因此必须保证你所使用的内核已经开启了的逻辑卷的支持(好在大多数主流发行版的内核都支持);其次,须要安装lvm2软件包。当这些都准备稳当以后,就可开始具体的工做了。
第一步就是准备磁盘空余空间(PQ绝对是个好工具),硬盘多的同窗能够考虑利用第二块硬盘。而后在这些准备好的空余空间中划出几个分区来,并设置分区类型为Linux LVM(分区标志是8e)。咱们这里正好有一个块20G的老硬盘,咱们将它划分了4个分区,平均每一个分区5G。
第二步是建立物理卷。与物理卷相关的命令有:pvcreate、pvscan、pvdisplay和pvremove四个。具体都提供那些功能,相比经过名称都能了解到。咱们将刚刚划分的4个分区都设置成物理卷,执行这样的命令:
# pvcreate /dev/hdb1
# pvcreate /dev/hdb2
# pvcreate /dev/hdb3
# pvcreate /dev/hdb4
或
# pvcreate /dev/hdb{1,2,3,4}
显而后一种的风格更加简便,因此咱们后面的全部操做都将采用这种风格。
第三步就是建立卷组VG。操做卷组的命令有:vgcreate、vgscan、vgdisplay、vgextend、vgreduce、vgchange和vgremove。建立一个新卷组能够执行相似这样的命令:
# vgcreate /dev/hdb{1,2,3} NewVolGroup
咱们知道卷组是由多个物理卷构成的,如今咱们将/dev/hdb1、/dev/hdb2和/dev/hdb3作成一个名为NewVolGroup的卷组,留下的那个用于放在后面说明若是动态增长或减小容量用。在卷组中额外添加或删除物理卷的命令是vgextend和vgreduce。在建立建立卷组的这一时刻,能够给vgcreate命令传递“-s”选项指定物理扩展区PE的大小,好比16M。可能有同窗会以为设置较大的PE会致使磁盘的浪费。其实否则,PE与磁盘的最小存储单元“扇区”或“簇”不一样,他只是LVM用于进行动态伸缩尺寸的一个最小分配单元,而在真正存储文件的时候,仍是会利用磁盘自己的最小存储单元。
第四步是建立逻辑卷LV,就至关于对卷组这个大磁盘进行分区。与逻辑卷LV有关的命令有:lvcreate、lvscan、lvdisplay、lvextend、lvreduce、lvremove和lvresize。出于方便考虑,咱们将整个VG只划分为一个LV,使用命令:
# lvcreate -l 3842 -n lv_data NewVolGroup
在这个命令中“-l”选项说明分配的PE数量,“-n”选择则为新的LV命名。本例中3842正是咱们现有的所有PE数量。咱们从哪里得到的呢?利用vgdisplay命令就行。
这样,一个新的逻辑卷就建立完毕了。剩下的事情就是格式化并挂接它。咱们使用以下命令:
# mkfs.ext4 /dev/mapper/NewVolGroup-lv_data
# mkdir /mnt/data
# mount /dev/mapper/NewVolGroup-lv_data/mnt/data
以后就可使用df命令来确认这个新的磁盘使用状况了。
4.缩放逻辑卷
使用逻辑卷的目的就是冲着它能任意缩放的,因此如何缩放逻辑卷才是关键所在。咱们先来看一下如何给逻辑卷增长容量。
咱们以前特地留下了/dev/hda4来作这件事。在实际应用中,还须要经历建立分区和物理卷的阶段。将一个新的物理卷加入到一个已有的卷组中使用vgextend命令。在咱们的例子中这样操做:
$ vgextend NewVolGroup /dev/hda4
以后咱们使用vgdisplay命令就能发现有新的Free PE出现,在咱们的测试机中是1274个。这个阶段是扩大了卷组的容量,可是逻辑卷的尚未改变。还须要使用lvresize命令将新增长的PE加入到逻辑卷中。在咱们的例子中这样操做:
$ lvresize -l +1274/dev/mapper/NewVolGroup-lv_data
这样再使用vgdisply命令就发现已经没有Free PE了。不过这个时候咱们使用df命令查看磁盘空间状况时,并无发现有什么变化。主要是由于咱们还差一个步骤,就是执行resize2fs命令。具体的缘由其实很简单,咱们新增长的那些磁盘空间尚未格式化呢。这个命令很简单,在咱们的例子中只须要这样:
$ resize2fs /dev/mapper/NewVolGroup-lv_data
这样,咱们的磁盘容量就增大了,彻底是在线的,是否是至关神奇呢?
好了,说完了增长容量,就来看看如何减少容量吧。此次咱们要把/dev/hda1抽出来。可是减少容量相对来说就要麻烦一些了,首先它就是不能在线的了。
咱们先要肯定/dev/hda1到底有多大,能够经过pvdisplay命令得到。在咱们的测试机中获得的结果是5.01G。而咱们的硬盘是20G的,那么先要使用resize2fs命令将咱们的磁盘调整到20G-5.01G=14990M的大小。咱们执行这样的命令:
# umount /mnt/data
# e2fsck -f /dev/mapper/NewVolGroup-lv_data
# resize2fs /dev/mapper/NewVolGroup-lv_data14990M
# mount /dev/mapper/NewVolGroup-lv_data/mnt/data
这以后咱们再经过df命令查看就能看出磁盘容量已经缩减了。可是此时咱们还有没回收任何PE。这个时候还须要使用lvresize命令来回收PE。回收多少呢?固然是/dev/hda1中含有的那些了。经过pvdisplay命令能够查到有1282个,因此执行命令:
# lvresize -l -1282/dev/mapper/NewVolGroup-lv_data
那如今是否是就能够将/dev/hda1抽出来了呢?还不行。由于经过pvdisplay命令发现,/dev/sda1并无空闲的PE,而空闲的PE如今在/dev/sda3和/dev/sda4上。/dev/sda4上有1274个Free PE,而/dev/sda3上有8个Free PE(总共1280个PE)。要抽出/dev/sda1,必须是的它的所有PE为Free状态,这个能够借由pvmove命令完成。在咱们这个场景中可使用相似这样的命令:
# psmove /dev/hda1:0-1273 /dev/hda4:0-1273
# psmove /dev/hda1:1274-1281/dev/hda3:1272-1279
这以后再使用pvdisplay查看,就发现/dev/sda1的PE都为Free状态了。这以后就可使用vgreduce命令,将/dev/sda1抽出了。在咱们的场景中可执行相似这样的命令:
# vgreduce NewVolGroup /dev/hda1
须要提醒你们一下,在咱们这个例子中,因为/dev/sda1是全部分区中最大的一个,使得没法将它的整个数据移入到任何其余分区中,因此咱们在使用psmove命令的时候参数有些复杂。可是这种状况倒是在实际应用当中常常遇到的状况。若是遇到了目标分区空余空间比原分区大的时候,PE编号范围就能够省略了。顺便提一句,PE编号是从零开始的。