Linux随笔7-Linux分区类型、kvm-qemu虚拟机磁盘附加以及存储基础(RAID、LVM)

Linux分区类型、kvm-qemu虚拟机磁盘附加以及存储基础(RAID、LVM)

本篇将会介绍两种常用的分区类型(MBR、GPT)以及对应的BIOS和UEFI;并通过破坏并恢复MBR的操作简单介绍下如何通过liveCD营救出现问题的操作系统。随后将会介绍到RAID的基础知识;然后通过给kvm-qemu管理的虚拟机附加虚拟磁盘文件,进行格式化文件系统的操作;以及通过附加多个虚拟磁盘文件实现LVM,并对LVM进行文件系统格式化操作。

1. 分区类型

现在的PC和x86服务器领域的基本存储的分区上,通常采用两种分区方式:

  • MBR(Master Boot Recorder):主引导记录,这种分区类型中0号扇区(一般来讲,每个扇区512字节)用于记录MBR的信息,当计算机完成自检之后,首先会查找硬盘MBR扇区并且读取其中的引导记录(前446字节),随后将控制权交给MBR。MBR的剩余64字节记录的是系统的分区表,每分区占用16字节,所以最多可以记录4个主分区或者3个主分区加上1个扩展分区,在扩展分区中可以创建逻辑分区(逻辑分区的个数没有明确的限制,但是实际操作上,通常不会分很多逻辑分区)。在16字节的分区记录信息中,包含了可引导标识(即该分区是否可以引导系统启动)、分区类型、分区的起始扇区、分区占用的扇区数,即分区的大小。MBR分区表无法管理超过2TB的磁盘。单盘容量超过2TB的磁盘分区形式,通常都不会采用MBR,而是采用GPT分区形式。
  • GPT(GUID Partition Table):全局ID分区表,允许每个磁盘最多有128个分区,单个分区容量最大可达到18EB(Exabytes);且磁盘分区表可以有多个备份。GPT形式的磁盘分区一般由两部分组成:保护MBR和EFI(Extensible Firmware Interface,可扩展固件接口),其中保护MBR为与0号扇区;EFI部分又可以分为4块:1号扇区的GPT头、2-33号扇区的分区表、GPT头所定义的分区、GPT结束扇区到EFI结束扇区之间的33个扇区组成的备份区域(最后一个扇区用于备份1号扇区的EFI信息,剩余的32个扇区用于备份2-33号扇区的分区表)。

与上述的两种分区方式相对应的固化到主板上的程序分别为BIOS(Basic Input Output System)和UEFI(Unified Extensible Firmware Interface)。

  • BIOS:在计算机完成加电自检之后,BIOS会读取开机启动在boot order里面指定的第一个可引导设备的MBR,执行记录在MBR中的开机管理程序,并将系统的控制权移交给开机管理程序。随后开机管理程序会去加载内核文件,加载完内核文件之后,就启动并进入到操作系统。如果是采用的GPT分区,由于其中也包含了保护MBR,且也是位于0号扇区,所以BIOS也可以读取到其中记录的第一段开机管理程序代码。如果这段开机管理程序能够正确识别GPT分区,那么也是可以正常加载内核文件并且启动并进入到操作系统的。如果开机管理程序无法正确识别GPT分区,那么就无法加载位于GPT分区格式下文件系统中的内核文件了,也就无法正常完成开启并进入到操作系统的过程。
  • UEFI:由于GPT形式分区可以提供64位寻址,所以可以有更大的地方存放开机管理程序。由于BIOS并不能理解GPT形式分区,所以还依赖于GPT提供兼容模式(保护MBR)才能读写GPT分区,而且BIOS是16位程序,为了替代BIOS提供功能更完备的主板程序,UEFI应运而生。

这两者的区别如下图所示:
在这里插入图片描述在实际使用上,通常是BIOS搭配MBR分区形式使用;UEFI搭配GPT分区形式使用。

从上述表述可以看出,磁盘的0号扇区是很重要的,其中记录了引导程序,如果该扇区损坏,将会导致无法正常启动系统。下面在虚拟机中模拟下该扇区的破坏以及修复过程。

1.1. 破坏并修复磁盘的MBR

这个过程需要liveCD的镜像来完成,通过进入到liveCD的系统,从而对虚拟机的MBR进行修复。这个过程需要事先对硬盘的0号扇区的MBR进行备份,MBR由2部分组成,引导程序只占446字节,剩下的64字节为分区表。备份完成之后,将备份好的MBR存储在另外一台虚拟机上,后面通过在被损坏的节点上插如liveCD并进入live系统之后,对受损虚拟机进行援救。具体过程如下所示:

  1. 备份MBR

    下述操作都是在Virtual Machine Manager中进行操作。

    a. 在Virtual Machine Manager中打开实验虚拟机,并在其配置信息中将liveCD挂载到CDROM设备上。具体如下所示:
    在这里插入图片描述由于实验虚拟机使用的是CentOS7.6,即1810版本的CentOS7,所以这里的liveCD也是采用的这个版本。
    b. 调整启动顺序,将CDROM调整为第一个启动设备,并启动该虚拟机,点击小灯泡按钮即可
    在这里插入图片描述c. 进入live系统
    在这里插入图片描述上述为live系统的启动菜单选项,选择第一个即可,直接进入到live系统,然后进入到下面的菜单。如同初始装完系统之后的样子,会进入到初始设置界面。点击右上角的Next完成设置即可。
    在这里插入图片描述完成设置之后,在桌面启动一个Terminal,如下所示:
    在这里插入图片描述在上述的Terminal中,默认是liveuser这个普通用户,由于我们需要对磁盘进行写入操作,所以此处需要切换为root用户,直接再命令行中输入sudo su即可切换为root用户,从启动进入live系统到切换为root用户,这个过程中无需输入任何密码。
    d. 查看并备份MBR
    在这里插入图片描述上述显示要查找的设备为vda,MBR就位于该块虚拟磁盘的0号扇区,主要不是下面的vda1或者vda2。
    在这里插入图片描述上述通过hexdump命令查看了MBR的内容。最后的55aa为MBR的结束标记。
    将上述的512字节备份,具体如下所示:
    在这里插入图片描述上述过程将512字节的MBR备份之后存入192.168.122.30这台虚拟机上。
    在192.168.122.30这台虚拟机上查看备份好的MBR内容,具体如下所示:
    在这里插入图片描述1. > 上述中先执行lsblk命令列出系统上的磁盘设备,除了live设备是这张liveCD的分区之外,vda就是我们要找的实验虚拟机的磁盘。接下来通过hexdump命令查看MBR的内容;随后通过dd命令将MBR保存到live系统的root用户家目录中,然后通过scp命令将保存的MBR备份内容发送到另一台虚拟机上,留待后面恢复使用。

  2. 破坏MBR

    接下来就可以破坏该虚拟机的MBR了,同样使用dd命令即可。具体如下:
    在这里插入图片描述利用dd命令,向vda磁盘设备中写入512字节0,完成之后,查看MBR的内容如下所示:
    在这里插入图片描述至此,破坏操作完成,关闭live系统,并修改启动顺序,将虚拟磁盘作为第一启动盘,并移除其他启动项。具体如下所示:
    在这里插入图片描述此时只保留虚拟磁盘作为有效启动项,其他启动项被禁用。此时点击灯泡右边的三角按钮,启动被破坏的虚拟机,具体如下所示:
    在这里插入图片描述1. > 此时提示没有有效的可引导设备,造成无法启动系统。

  3. 恢复MBR

    上述的破坏操作完成,接下来还是借助dd命令以及此前备份的mbr.dd文件进行恢复。此时由于无法启动该虚拟机,就需要再次借助liveCD这个镜像,挂载到CDROM上,并启动该live系统。将CDROM调整为第一启动项,具体如下所示:
    在这里插入图片描述然后启动liveCD的live系统,具体如下所示:
    在这里插入图片描述进入live系统之后,由于需要对虚拟磁盘进行写入操作,所以需要从liveuser切换为root用户,为此,需要执行命令sudo su,在这个过程中无需输入任何密码。从上述输出中可以看出,此时的vda已经丢失了所有分区,因为MBR的512字节中除了446字节的引导程序之外,还包含了64字节的分区表,所以用0填充了0号扇区之后,分区表自然也就丢失了。
    接下来将备份的mbr.dd从另外一台虚拟机上拷贝回来,并且通过dd命令将其写入到vda这个虚拟磁盘上。具体如下所示:
    在这里插入图片描述写入完成之后,查看0号扇区MBR的内容,具体如下所示:
    在这里插入图片描述恢复如初了。
    接下来再次调整启动项的顺序,将CDROM去掉,只保留虚拟磁盘作为第一有效启动项。具体如下所示:
    在这里插入图片描述修改完启动项之后,启动该虚拟机,具体如下所示:
    在这里插入图片描述1. > 此时就可以正常进入到破坏之前的操作系统中了。

上述就是完整的MBR查看、破坏以及恢复的过程。

2. RAID级别以及介绍

RAID的全称是“Redundant Array of Independent Disk”,即冗余独立磁盘阵列,其最初是由美国加州大学伯克利分校提出的,最初的名字全程为“Redundant Array of Inexpensive Disk”,即冗余廉价磁盘阵列,这个名称已经很少被用到了。如其最初的名字一样,这项技术最初就是为了组合廉价的、小容量的磁盘来替代大容量、昂贵的磁盘。随着这项技术的发展,通过组合磁盘实现更好的性能以及更高的数据可靠性和安全性就成了主要诉求。也由此发展出来一系列的不同形式的RAID,在实际应用上,最常用的几种形式如下:

  • RAID0:条带卷,最少2个磁盘,数据被打散并行写入到两块盘里面,读写性能最好,磁盘利用率也是最高的;与此同时,由于没有冗余磁盘,所以不支持磁盘容错,坏掉一块磁盘则会导致整个RAID0中的所有数据都无法访问。适合于数据不那么重要,但是对于读写性能有很高要求的应用场景,比如图片和视频编辑领域。其架构图如下所示:
    在这里插入图片描述

  • RAID1:镜像卷,2块磁盘,顾名思义,两块磁盘互为镜像,这种组合提供了足够的数据冗余;与此同时,由于同一份数据要写入两次,所以写入性能差。适合于数据很重要,但是对于写入性能要求不严苛的场景,比如账户信息的存储、只有两块磁盘的小型服务器等。其架构图如下所示:
    在这里插入图片描述RAID的磁盘利用率只有50%,且写入性能是几种组合中最差的。但是优势是当其中的一块磁盘离线的时候,无需像带校验的RAID那样需要进行RAID重建,只是将数据再拷贝一份到替换的新硬盘上即可。

  • RAID5:带校验的条带卷:最少需要3块磁盘,最多16块磁盘。以3快磁盘组成的RAID5为例,在组成RAID5的各个磁盘上总是有一块磁盘用于存放另外两块磁盘上对应区域的异或校验值。由于这种异或校验值的存放并不是固定在一块磁盘上,而是按照规律在各个磁盘上循环出现的,所以按照校验值的排列方式,通常分为左循环RAID5和右循环RAID5。这种方式兼顾了性能和冗余,允许1块磁盘损坏而不影响RAID5的整体数据读写(由于有1快磁盘离线的时候,实际上对性能会有一些影响,但并不会导致数据无法访问),这种形式用的比较普遍。其架构图如下所示:
    在这里插入图片描述如上图的绿色parity部分,即为分散存储的校验值,上图为典型的左循环RAID5的数据以及校验值存储方式。

    由于RAID5的条带式数据分布,所以其读取性能很好;但是相比于读取性能,由于每次写入数据的时候都需要进行异或运算来求得校验值,所以写入性能比读取性能略差。假设磁盘数为N,由于有1块磁盘的容量用于存储校验值,所以实际存储有效数据的磁盘数为N-1块磁盘。

    由于有校验值的存在,所以在有硬盘离线并且更换了新硬盘的时候,就需要进行RAID重建,这个过程RAID控制器会自动完成,无需人工干预(由于异或运算具有可逆性,以3块磁盘的RAID5为例,当1块磁盘离线并被替换之后,可以利用剩余2快磁盘中的内容通过异或运算计算出第3快磁盘中的实际内容,然后将计算出的结果写入到第三块磁盘的对应区域中,完成RAID5重建过程)。最糟糕的情况,如果在RAID5重建的时候,又有新的硬盘坏掉离线,此时会导致RAID5整体崩溃,造成其中的数据无法访问。所以在实际操作中,考虑到硬盘损坏更换之后的RAID5重建时间,就需要在创建RAID5的时候,根据单盘容量以及单盘读写性能权衡每组RAID5采用多少块磁盘来构建,并不是单组RAID5中采用的磁盘越多越好。

  • RAID6:带双校验的条带卷:最少需要4块磁盘,不同于RAID5的异或校验,RAID6的双校验采用的是P+Q的校验形式,且这两个校验值分散在2块磁盘中。由于有双重校验,所以允许最多2块磁盘同时离线而不影响数据读写(此时对读写性能有影响,但是不会导致整个RAID6中的数据无法访问,其中的数据仍然可以进行读写)。这种方式比RAID5的冗余度更高,但是性能较RAID5略差,磁盘利用率也较RAID5差一些。但是容错能力比RAID5更高。这种形式的架构图如下所示:
    在这里插入图片描述上图即为RAID6的数据以及校验值的分布方式之一,为典型的左循环RAID6。由于需要两块磁盘的容量来存放双校验值,所以实际用于数据存储的磁盘数为N-2。

    类似于RAID5,RAID6的数据读取速度很快,但是相较于读取速度,其写入速度由于需要计算两次校验值,所以RAID控制器需要比RAID5多计算一次校验值,造成写入速度更差一些。但是其冗余能力比RAID5更好,其写入能力相比于同规模的RAID5更差一些,尤其在有磁盘离线的时候,性能会更差,但是并不会阻碍数据访问。

    由于存在双校验值,所以在硬盘离线并替换了新硬盘之后,也需要进行RAID6重建,这个过程也是由RAID控制器自动完成的(以4块磁盘组成的RAID6为例,如果是1块硬盘离线,则是利用剩余的3块磁盘中的数据计算出离线磁盘中原有的数据内容;如果是2块硬盘离线,则是利用这两块磁盘中的数据计算出第三块磁盘中的数据,然后再利用这3块磁盘中的数据计算出第4块磁盘中的实际数据。全部数据计算完成的时候,也就完成了RAID6的重建操作)。由于重建操作时间长短一方面取决于原有RAID6中存有多少数据,另一方面取决于单盘容量以及单盘的读写性能和RAID控制器的计算能力,所以在实际操作中并不会一味追求单组RAID6中包含尽可能多的磁盘数量。因为如果2块磁盘离线并更换之后,在完成RAID6重建之前如果又有1块硬盘离线,此时就相当于3块硬盘离线,就会导致RAID6崩溃,从而导致RAID6中所存储的数据整体都无法被访问。

    实际操作中,还需要考虑的一点就是磁盘利用率,多做一组RAID6,就意味着少2块磁盘用于实际的数据存储。比如一个磁盘阵列柜有16个盘位,如果16块硬盘全部做成1组RAID6,那么实际用于存储数据的磁盘容量相当于14块磁盘的容量;但是如果每组RAID6采用8块磁盘,共做2组RAID6的话,此时整体的用于数据存储的磁盘容量相当于12块磁盘的容量,因为每组都需要2块磁盘容量来存放校验值。依此类推,单个磁盘阵列柜上所做的RAID6越多,用于校验值存放的磁盘也就越多,如果做n组RAID6,每组RAID6有m块磁盘,那么用于校验值存储的容量就相当于2n块磁盘的容量;而用于实际数据存储的磁盘数为(m-2)*n块磁盘容量。

    所以就需要在潜在崩溃情况与实际的容量浪费情况之间做出取舍和权衡。

  • RAID10:镜像卷与条带卷的组合:是先将磁盘组成多组镜像卷,然后将多个镜像卷组成条带卷,从而兼顾了性能与冗余能力。比如4快磁盘组成的RAID10,先是每2块磁盘组成RAID1,共组,每组允许最多坏1块磁盘,如果损坏的磁盘分布在两组RAID1中,那么这种形式允许最多坏2块磁盘(随着RAID1的增多,这种理想情况下支持的硬盘损坏个数会与RAID1相等,但是如果2块磁盘都发生在一组RAID1中,那么这组RAID1就整体失效了);随后将这2组RAID1作为逻辑磁盘组成RAID0,效果相当于2块磁盘的RAID0,以弥补RAID1的写入性能差的情形。此时,理想情况下,如果损坏的磁盘分布在各组RAID1中,那么支持的磁盘损坏个数与RAID1个数相等;但是如果某一组RAID1的两块磁盘都损坏,则该组RAID1失效,由于该组RAID1还是顶层RAID0的成员,所以导致顶层RAID0也一并失效,最终导致RAID10整体的数据无法被访问。这种形式的架构图如下所示:
    在这里插入图片描述如果RAID10中的一块磁盘离线之后被替换,那么重构时间将会非常快,1TB的磁盘大概需要30分钟即可完成。但是由于有1半的磁盘容量用于存放镜像值,所以相比较于RAID5和RAID6而言,这是一种很昂贵的实现冗余的方式。

虽然RAID在一定程度上可以提供冗余的能力(RAID0除外),从而达到避免因为单块磁盘失效而造成数据缺失的情况。设置对于RAID6而言,可以允许2块硬盘同时离线而不会造成数据缺失,但是对于至关重要的数据,仍然需要进行备份来确保数据不会因为小概率的偶发故障而丢失。比如进行异地容灾备份对于重要数据而言是很有必要的。另外,进行数据备份的一个很重要原因,就是在用户错误操作的时候,仍然可会回溯和恢复数据。

3. 简单分区创建以及格式化

关于简单分区的格式化操作,需要用到的命令为mkfsparted命令等。还是以kvm-qemu管理的虚拟机作为实验环境,创建并格式化一个2GB的文件系统,将文件系统的块大小设置为2048字节,即2K;并且预留1%的空间,文件系统类型为ext4,卷标为TEST,且开启acl,并且能够开机自动挂载至/test目录。

为了实现上述的目的,就需要对mkfs.ext4命令以及parted这两个命令的一些基本了解,分别介绍如下:

  • mkfs.ext4命令:用于格式化分区

    要查看这个命令的详细使用方法,在命令行中执行man mkfs.ext4,可以看到man手册定位到mke2fs这个专门用于创建ext2/3/4文件系统的命令上。该命令的选项以及参数如下:

    mke2fs [ -b block-size ] [ -i bytes-per-inode ] [ -I inode-size ] [ -j ] [ -J journal-options ] [ -N number-of-inodes ] [ -n ] [ -m reserved-blocks-percentage ] [ -O [^]feature[,...] ] [ -q ] [ -L volume-label ] [ -M last-mounted-directory ] [ -t fs-type ] [ -T usage-type ] [ -U UUID ] [ -e errors-behavior ] device [ fs-size ]

    上述选项解释如下:

    • -b block-size:指定块大小,默认单位为字节,块大小的有效值为1024、2048以及4096,如果忽略block-size值,在格式化文件系统的时候会根据文件系统的大小以及-T选项指定的期望使用的类型,通过试错的方式来确定块大小的值;如果将block-size值前面加上负号(’-’),那么在格式化的时候也会以试错的方式来确定块大小的合适值,且块大小最小是指定的block-size的值。这对于某些存储硬件要求块大小必须是2K的整倍数的场景来说是很有用的。

    • -i bytes-per-inode:指定字节/inode率,即为数据空间中每多少个字节创建1个inode,这个字节数最小不能低于块大小的值。将bytes-per-inode的值设定的越大,那么在整个文件系统上所需要创建的inode数也就越少。需要注意的是,这个值在格式化文件系统的时候指定并且完成文件系统格式化操作之后,就无法被更改了,除非重新格式化文件系统。注意,当调整文件系统的大小的时候,会自动调整inode数以维持这个bytes-per-inode的比率。

    • -I inode-size:指定每个inode占用的字节数,inode-size的值必须是比2大的且为2的n次方,n最大为128,这个inode-size的值指定的越大,那么inode表所消耗的磁盘空间也就越大,这就会导致文件系统的数据空间的可用空间会相应的减少,并且对性能也会有一些负面影响。同样,载文件系统被格式化完成之后,就无法再修改这个值了。默认的inode-size值是由/etc/mke2fs.conf指定的,关于这个文件的更详细的说明,可以在命令行中执行命令man mke2fs.conf查看。默认情况下,inode-size的值是256字节,一些较小的文件系统的inode-size的值为128字节。

    • -N number-of-inodes:忽略默认计算出来的为文件系统保留的inode数,而使用number-of-inodes指定的数作为文件系统应该预留的inode数。这个选项允许用户直接指定文件系统中有多少inode数。

    • -n:这个选项会导致mke2fs命令不去直接创建文件系统,而是显示创建文件系统的过程会做什么操作。这个选项可以用于确定某个特定文件系统的备份超级块的位置。

    • -m reserved-blocks-percentage:指定文件系统中为超级用户预留的文件系统块数的百分比,通过这个预留的空间,可以保证root的进程,比如syslogd在非特权用户无法写入该文件系统的时候仍然可以正常执行。默认的保留百分比为5%。

    • -O [^]feature[,...]:使用指定的特性创建文件系统,并且忽略掉默认的特性。默认的特性记录在/etc/mke2fs.conf这个文件的"defaults"区域中;feature是一个特性列表,各个特性之间用英文半角逗号分隔,指定的特性表示明确开启的文件系统特性。要禁用某些特性,则需要在第一个特性前面加上脱字符"^"即可;文件系统的依赖特性并不会被清除,如果指定了none,那么将会移除所有特性。

    • -q:静默执行,不打印过程输出。适合在脚本中使用。

    • -L volume-label:将文件系统的卷标设置为volume-label,卷标的最大长度是16字节。

    • -M last-mounted-directory:为文件系统设置最后的挂在路径,在某些场景下的一些应用需要使用这个选项来决定文件系统应该被挂载到哪个路径下面。

    • -t fs-type:指定创建的文件系统类型,一般在执行mke2fs命令的时候才需要指定这个选项,如果直接执行mkfs.ext4这个命令,则无需指定这个选项。fs-type的有效值为ext2, ext3, ext4。

    • -T usage-type:指定文件系统会以何种形式使用,以便mke2fs命令可以选择最合适的文件系统参数来格式化文件系统。支持的使用类型记录在/etc/mke2fs.conf这个配置文件中。用户可以指定其中记录的1个或者多个,如果指定多个,则需要用英文半角逗号分隔。如果未指定该选项,那么格式化的时候会根据待创建的文件系统大小选择一个默认的使用类型。

      如果文件系统的大小的值是:

      • 小于3M:那么usage-type的值就是floppy;
      • 大于3M,小于512M:那么usage-type的值就是small;
      • 大于等于4T,小于16T:那么usage-type的值就是big;
      • 大于等于16T:那么usage-type的值就是huge;
      • 否则,就是用默认的usage-type值,default。
    • -U UUID:为文件系统指定UUID,此处-U UUID的UUID的可选值如下:

      • clear:清空文件系统的UUID值
      • random:生成一个随机的UUID值
      • time:生成一个基于时间的UUID值
    • -e errors-behavior:当检查到文件系统错误的时候,修改内核的行为,可选值如下:

      • continue:继续正常执行
      • remount-ro:以只读的方式重新挂载该文件系统
      • panic:引发panic级内核错误
    • -j:表示创建带有ext3日志功能的文件系统,如果后面未指定-J journal-options,那么将会采用默认的日志参数,在文件系统中创建一个适当大小的日志。

    • -J journal-options:使用指定的选项创建带有ext3日志功能的文件系统,多个日志选项之间用英文半角逗号分隔,并且可以使用=号,下面是支持的日志选项:

      • size=journal-size:创建一个大小为journal-size兆字节的内部日志,日志的大小必须是最少1024个文件系统块大小(即,如果块大小为1K,那么日志占用的文件系统大小为1M,如果块大小为4K,那么日志占用的文件系统块大小为4M,依此类推),最大不超过10,240,000个文件系统块,或者不超过文件系统大小的一半。
      • location=jounal-location:指定日志的位置,journal-location这个参数可以指定为块数,或者是带有单位的数字,比如(M、G等单位),此时会将其解释为从文件系统起始处的偏移量。
      • device=external-journal:将文件系统的日志附加到external-journal所指定的块设备上。所指定的外部块设备必须事先已经使用mke2fs -O journal_dev external-journal创建完成,注意,external-journal必须是与新文件系统有相同的块大小。除了可以直接指定设备名之外,还可以通过LABEL=label标签名的方式来指定或者通过UUID=uuid的方式来指定外部设备。

      对于给定的文件系统,size=journal-size或者device=external-journal这两个只能二选一。

  • parted命令:用于创建分区

    要查看该命令的详细帮助信息,可以在命令行中执行man parted命令。其基本形式如下:

    parted [options] [device [command [options...]...]]

    这个命令既支持交互式操作,也支持非交互式操作。

    • 如果要进行交互式操作,直接在命令行中输入parted不加任何选项参数即可。如下所示:

      root@ubuntu20u04:~# parted
      GNU Parted 3.3
      Using /dev/mapper/vg0-lv--0--root
      Welcome to GNU Parted! Type 'help' to view a list of commands.
      (parted) print                                                            
      Model: Linux device-mapper (linear) (dm)
      Disk /dev/mapper/vg0-lv--0--root: 48.9GB
      Sector size (logical/physical): 512B/512B
      Partition Table: loop
      Disk Flags: 
      
      Number  Start  End     Size    File system  Flags
      1      0.00B  48.9GB  48.9GB  xfs
      
      (parted) 
      

      上述就是在交互式模式下,通过print命令打印当前系统的磁盘设备。

      如果要在交互式模式下查看有哪些操作命令,可以执行help子命令,具体如下所示:

      root@ubuntu20u04:~# parted
      GNU Parted 3.3
      Using /dev/mapper/vg0-lv--0--root
      Welcome to GNU Parted! Type 'help' to view a list of commands.
      (parted) help                                                             
        align-check TYPE N                       check partition N for TYPE(min|opt) alignment
        help [COMMAND]                           print general help, or help on COMMAND
        mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
        mkpart PART-TYPE [FS-TYPE] START END     make a partition
        name NUMBER NAME                         name partition NUMBER as NAME
        print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular
              partition
        quit                                     exit program
        rescue START END                         rescue a lost partition near START and END
        resizepart NUMBER END                    resize partition NUMBER
        rm NUMBER                                delete partition NUMBER
        select DEVICE                            choose the device to edit
        disk_set FLAG STATE                      change the FLAG on selected device
        disk_toggle [FLAG]                       toggle the state of FLAG on selected device
        set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
        toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
        unit UNIT                                set the default unit to UNIT
        version                                  display the version number and copyright information of GNU Parted
      (parted)
      

      注意,该命令中的操作都是即时生效,无需执行保存或者写入之类的命令,也没有该类子命令。

    • 非交互是执行:parted [options] [device [command [options...]...]]

      如上述所见,在非交互式执行的时候,需要注意的是设备路径需要写在具体子命令的前面。具体如下所示:

      root@ubuntu20u04:~# parted print /dev/vda
      Error: Could not stat device print - No such file or directory.
      Retry/Cancel? C                                                           
      root@ubuntu20u04:~# parted /dev/vda print
      Model: Virtio Block Device (virtblk)
      Disk /dev/vda: 53.7GB
      Sector size (logical/physical): 512B/512B
      Partition Table: gpt
      Disk Flags: 
      
      Number  Start   End     Size    File system  Name  Flags
       1      1049kB  2097kB  1049kB                     bios_grub
       2      2097kB  526MB   524MB   ext4
       3      526MB   53.7GB  53.2GB
      
      root@ubuntu20u04:~# 
      

      上述第一次执行的时候,就是设备名写在了子命令的后面,提示找不到这个设备或者文件。

      第二次执行的时候,就可以正常执行了,print子命令打印出命令行中指定的设备的分区都有哪些。

    上述即为分区操作的命令parted的介绍。

接下来在kvm-qemu管理的虚拟机中进行实验,创建并格式化一个2GB的文件系统,将文件系统的块大小设置为2048字节,即2K;并且预留1%的空间,文件系统类型为ext4,卷标为TEST,且开启acl,并且能够开机自动挂载至/test目录。具体过程如下所示:

  1. qemu-img创建所需要的镜像文件

    由于默认情况下qemu-img create命令创建的qcow2格式磁盘镜像为稀疏格式,即并不会一开始就分配全部磁盘空间。这样的磁盘镜像文件是可以附加到虚拟机中的,但是在创建分区或者创建pv的时候,是会被忽略的。因为这个文件本身太小了。

    为此,就需要在宿主机上执行qemu-img convert -S 0命令将稀疏格式转化为完全分配模式。具体如下所示:

    [root@host c7u6m1]# qemu-img create -f qcow2 -o size=2G ./c7u6m1_attach-disk_sparse.qcow2
    Formatting './c7u6m1_attach-disk_sparse.qcow2', fmt=qcow2 size=2147483648 cluster_size=65536 lazy_refcounts=off refcount_bits=16
    [root@host c7u6m1]# ls -hl ./c7u6m1_attach-disk_sparse.qcow2
    -rw-r--r-- 1 root root 193K Apr 25 16:06 ./c7u6m1_attach-disk_sparse.qcow2
    [root@host c7u6m1]# qemu-img convert -S 0 -O qcow2 ./c7u6m1_attach-disk_sparse.qcow2 ./c7u6m1_attach-disk.qcow2
    [root@host c7u6m1]# ls -lh ./c7u6m1_attach-disk.qcow2
    -rw-r--r-- 1 root root 2.1G Apr 25 16:08 ./c7u6m1_attach-disk.qcow2
    [root@host c7u6m1]# 
    

    从上述输出中可以看出,默认创建的qcow2格式磁盘镜像文件的大小为193K,在转化为完全分配模式之后,磁盘镜像文件的大小为2.1G。

    至此,所需要的磁盘镜像文件就创建完成了。

  2. virsh attach-disk命令附加磁盘镜像文件到虚拟机

    有了上述创建好的磁盘镜像文件,此时在虚拟机中还无法访问该磁盘镜像文件,需要利用virsh attach-disk命令将创建好的磁盘镜像文件附加到虚拟机中才可以。执行附加操作之前,先看下虚拟机中原本具有什么磁盘设备。具体如下所示:

    [root@c7u6m1 ~]# lsblk
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0           11:0    1  4.3G  0 rom  
    vda          252:0    0   40G  0 disk 
    ├─vda1       252:1    0  512M  0 part /boot
    ├─vda2       252:2    0    1G  0 part [SWAP]
    └─vda3       252:3    0 38.5G  0 part 
      └─vg0-root 253:0    0 38.5G  0 lvm  /
    loop0          7:0    0  4.3G  1 loop /media
    [root@c7u6m1 ~]# 
    

    从上述可以看出,sr0是装了了系统iso镜像的CDROM设备;loop0是将sr0挂载到/media之后的回环设备。只有vda是磁盘设备。

    下面在宿主机上利用virsh attach-disk命令将磁盘镜像文件附加到这个虚拟机中,并且指定为vdb。具体如下所示:

    [root@host c7u6m1]# virsh attach-disk c7u6m1 ./c7u6m1_attach-disk.qcow2 vdb --cache writethrough
    error: Failed to attach disk
    error: Cannot access storage file './c7u6m1_attach-disk.qcow2': No such file or directory
    
    [root@host c7u6m1]# virsh attach-disk c7u6m1 `pwd`/c7u6m1_attach-disk.qcow2 vdb --cache writethrough
    Disk attached successfully
    
    [root@amdhost c7u6m1]#
    

    上述第一次执行附加操作的时候报错,提示无此文件或者目录,考虑应该是使用了相对路径的原因。所以第二条命令改用绝对路径指定要附加的磁盘镜像文件,成功附加。

    在虚拟机中查看如下所示:

    [root@c7u6m1 ~]# lsblk
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0           11:0    1  4.3G  0 rom  
    vda          252:0    0   40G  0 disk 
    ├─vda1       252:1    0  512M  0 part /boot
    ├─vda2       252:2    0    1G  0 part [SWAP]
    └─vda3       252:3    0 38.5G  0 part 
      └─vg0-root 253:0    0 38.5G  0 lvm  /
    vdb          252:16   0    2G  0 disk 
    loop0          7:0    0  4.3G  1 loop /media
    [root@c7u6m1 ~]# 
    

    从上述输出中可以看出,此时就多了一个vdb设备,大小为2G。至此,磁盘镜像文件附加完成。

  3. parted命令创建分区

    成功附加了磁盘镜像文件之后,就可以对该虚拟磁盘进行分区操作了,使用parted命令进行分区如下所示:

    [root@c7u6m1 ~]# parted /dev/vdb
    GNU Parted 3.1
    Using /dev/vdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) mklabel msdos                                                    
    (parted) print 
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 2148MB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start  End  Size  Type  File system  Flags
    
    (parted) mkpart primary 1 -1                                              
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 2148MB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start   End     Size    Type     File system  Flags
     1      1049kB  2147MB  2146MB  primary
    
    (parted) quit                                                             
    Information: You may need to update /etc/fstab.
    
    [root@c7u6m1 ~]#
    

    上述采用交互式模式进行分区创建,先执行了mklabel子命令创建了分区标签为’msdos’,即MBR形式分区。然后执行print子命令可以查看分区信息,包括标签类型等。由于此时还没创建分区,所以分区部分为空。然后执行mkpart primary 1 -1表示创建一个主分区,从第1M的地方开始,-1表示使用全部可用空间。创建完成之后,再次执行print命令即可打印出创建好的分区信息。由于每个子命令的操作都是即时生效,所以无需其他操作进行保存,直接执行quit子命令进行退出即可。

    至此,分区创建操作就完成了。在非交互模式下查看创建好的分区,如下所示:

    [root@c7u6m1 ~]# parted /dev/vdb print
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 2148MB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start   End     Size    Type     File system  Flags
     1      1049kB  2147MB  2146MB  primary
    
    [root@c7u6m1 ~]# 
    [root@c7u6m1 ~]# ls -lh /dev/vdb1
    brw-rw---- 1 root disk 252, 17 Apr 25 16:29 /dev/vdb1
    [root@c7u6m1 ~]# ls -lh /dev/vdb*
    brw-rw---- 1 root disk 252, 16 Apr 25 16:29 /dev/vdb
    brw-rw---- 1 root disk 252, 17 Apr 25 16:29 /dev/vdb1
    [root@c7u6m1 ~]#
    

    接下来就是重头戏,格式化文件系统了。

  4. mkfs.ext4命令创建文件系统

    文件系统的格式化要求为:块大小设置为2048字节,即2K;并且预留1%的空间,文件系统类型为ext4,卷标为TEST,且开启acl,并且能够开机自动挂载至/test目录。

    执行格式化命令:

    [root@c7u6m1 ~]# mkfs.ext4 -b 2048 -m 1 -L TEST -O acl -U random /dev/vdb1                                  
    mke2fs 1.42.9 (28-Dec-2013)
    Invalid filesystem option set: acl
    [root@c7u6m1 ~]# mkfs.ext4 -b 2048 -m 1 -L TEST -U random /dev/vdb1 
    mke2fs 1.42.9 (28-Dec-2013)
    /dev/vdb1: could not parse UUID: random
    
    [root@c7u6m1 ~]# mkfs.ext4 -b 2048 -m 1 -L TEST -U time /dev/vdb1                                                                                
    mke2fs 1.42.9 (28-Dec-2013)
    /dev/vdb1: could not parse UUID: time
    
    [root@c7u6m1 ~]# mkfs.ext4 -b 2048 -m 1 -L TEST  /dev/vdb1                                                                                       
    mke2fs 1.42.9 (28-Dec-2013)
    Filesystem label=TEST
    OS type: Linux
    Block size=2048 (log=1)
    Fragment size=2048 (log=1)
    Stride=0 blocks, Stripe width=0 blocks
    131072 inodes, 1048064 blocks
    10480 blocks (1.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=269484032
    64 block groups
    16384 blocks per group, 16384 fragments per group
    2048 inodes per group
    Superblock backups stored on blocks: 
            16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done 
    
    [root@c7u6m1 ~]# 
    

    上述使用-O feature_list选项以及-U random这两个选项均失败。但是用法是符合man mkfs.ext4的相关选项的描述信息的。去掉这两块的内容,就可以格式化了。实际上,通过dumpe2fs查看格式化好的文件系统的时候,是默认支持acl的,而且自动生成UUID。所以这两块无需指定。

    dumpe2fs的结果如下所示:

    [root@c7u6m1 ~]# dumpe2fs /dev/vdb1 | egrep -i acl
    dumpe2fs 1.42.9 (28-Dec-2013)
    Default mount options:    user_xattr acl
    [root@c7u6m1 ~]#
    [root@c7u6m1 ~]# dumpe2fs /dev/vdb1
    Filesystem volume name:   TEST
    Last mounted on:          <not available>
    Filesystem UUID:          c3bb6bd3-92ce-411f-b096-87d0718514d5
    Filesystem magic number:  0xEF53
    Filesystem revision #:    1 (dynamic)
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
    Filesystem flags:         signed_directory_hash 
    Default mount options:    user_xattr acl
    Filesystem state:         clean
    Errors behavior:          Continue
    Filesystem OS type:       Linux
    Inode count:              131072
    Block count:              1048064
    Reserved block count:     10480
    Free blocks:              1010523
    Free inodes:              131061
    First block:              0
    Block size:               2048
    Fragment size:            2048
    Group descriptor size:    64
    Reserved GDT blocks:      512
    Blocks per group:         16384
    Fragments per group:      16384
    Inodes per group:         2048
    Inode blocks per group:   256
    Flex block group size:    16
    

    上述就完成了文件系统的格式化操作。接下来就可以进行挂载操作了。

  5. 挂载格式化好的文件系统

    要实现开机自动将上述的文件系统挂载到/test目录,需要先创建该目录用于挂载点。然后编辑/etc/fstab文件进行挂载项写入。具体如下所示:

    [root@c7u6m1 ~]# blkid /dev/vdb1
    /dev/vdb1: LABEL="TEST" UUID="c3bb6bd3-92ce-411f-b096-87d0718514d5" TYPE="ext4" 
    [root@c7u6m1 ~]# dumpe2fs /dev/vdb1 | egrep UUID
    dumpe2fs 1.42.9 (28-Dec-2013)
    Filesystem UUID:          c3bb6bd3-92ce-411f-b096-87d0718514d5
    [root@c7u6m1 ~]#
    

    上述查看了磁盘的基本信息,发现文件系统的UUID与磁盘的UUID是一致的。

    接下来编辑/etc/fstab文件,并在其中使用UUID指定挂在设备。具体如下所示:

    [root@c7u6m1 ~]# vim /etc/fstab
    [root@c7u6m1 ~]# mkdir /test
    [root@c7u6m1 ~]# ll -d /test
    drwxr-xr-x 2 root root 6 Apr 25 17:20 /test
    [root@c7u6m1 ~]# cat /etc/fstab | egrep test
    UUID="c3bb6bd3-92ce-411f-b096-87d0718514d5"     /test   ext4    defaults,acl    0 0
    [root@c7u6m1 ~]#
    

    上述就完成了/etc/fstab文件的编辑操作。以后开机的时候就会自动挂载这个文件系统了。当次要挂载的话,需要执行命令mount -a,其效果如下所示:

    [root@c7u6m1 ~]# mount -a
    [root@c7u6m1 ~]# df -hT
    Filesystem           Type      Size  Used Avail Use% Mounted on
    /dev/mapper/vg0-root xfs        39G  5.0G   34G  13% /
    devtmpfs             devtmpfs  988M     0  988M   0% /dev
    tmpfs                tmpfs    1000M     0 1000M   0% /dev/shm
    tmpfs                tmpfs    1000M   33M  967M   4% /run
    tmpfs                tmpfs    1000M     0 1000M   0% /sys/fs/cgroup
    /dev/vda1            xfs       509M  129M  381M  26% /boot
    tmpfs                tmpfs     200M     0  200M   0% /run/user/0
    /dev/loop0           iso9660   4.3G  4.3G     0 100% /media
    /dev/vdb1            ext4      2.0G  9.1M  1.9G   1% /test
    [root@c7u6m1 ~]#
    

    接下来检查下是否支持acl,具体如下所示:

    [root@c7u6m1 ~]# cd /test/
    [root@c7u6m1 test]# ls 
    lost+found
    [root@c7u6m1 test]# touch file
    [root@c7u6m1 test]# setfacl -m u:xiaoqiang:r-- file
    [root@c7u6m1 test]# getfacl file
    # file: file
    # owner: root
    # group: root
    user::rw-
    user:xiaoqiang:r--
    group::r--
    mask::r--
    other::r--
    
    [root@c7u6m1 test]# 
    

    由上述可见,acl功能已经开启。

至此,普通分区的文件系统格式化操作就完成了。

4. 基于LVM的分区创建以及格式化

LVM的全程是Logical Volume Manager,即逻辑卷管理器。逻辑卷的构成架构图如下图所示:
在这里插入图片描述从上图可以看出,逻辑卷主要分为PV(Physical Volume)、VG(Volume Group)以及LV(Logical Volume)三部分组成。PV通常是由存储设备或者分区创建的;VG是由PV创建出来的,通过将多个PV组合在一起形成一个VG;而LV则是从VG中分配可用的存储单元作为逻辑分区。在这几个层面中,只有LV是最终需要格式化为文件系统用于给用户提供数据存储的。

上图将每个磁盘都进行了独立分区,然后把分区创建为PV,其实可以直接将磁盘创建为PV,而无需先分区再进行PV的创建操作。

下面还是以kvm-qemu管理的虚拟机为例,先创建2个磁盘镜像文件,然后将其附加到虚拟机上。在虚拟机上会将两个虚拟磁盘分别创建为PV,然后将这两个PV创建为1个VG,最后从VG中分配可用空间创建LV。LV创建好之后,就可以对其进行格式化并挂载为文件系统了。

  1. 磁盘镜像文件构建

    在宿主机上执行qemu-img create命令创建2个磁盘镜像文件,由于默认是稀疏格式的,所以需要执行qemu-img convert将其转为完全分配的形式。具体如下所示:

    [root@host c7u6m1]# qemu-img create -f qcow2 -o size=10G ./c7u6m1_attach-disk1_sparse.qcow2
    Formatting './c7u6m1_attach-disk1_sparse.qcow2', fmt=qcow2 size=10737418240 cluster_size=65536 lazy_refcounts=off refcount_bits=16
    [root@host c7u6m1]# qemu-img create -f qcow2 -o size=10G ./c7u6m1_attach-disk2_sparse.qcow2
    Formatting './c7u6m1_attach-disk2_sparse.qcow2', fmt=qcow2 size=10737418240 cluster_size=65536 lazy_refcounts=off refcount_bits=16
    [root@host c7u6m1]# qemu-img convert -f qcow2 -S 0 -O qcow2 ./c7u6m1_attach-disk1_sparse.qcow2 ./c7u6m1_attach-disk1.qcow2
    [root@host c7u6m1]# qemu-img convert -f qcow2 -S 0 -O qcow2 ./c7u6m1_attach-disk2_sparse.qcow2 ./c7u6m1_attach-disk2.qcow2
    [root@host c7u6m1]# ls -lh c7u6m1_attach-disk*
    -rw-r--r-- 1 root root  11G Apr 25 22:41 c7u6m1_attach-disk1.qcow2
    -rw-r--r-- 1 root root 193K Apr 25 22:37 c7u6m1_attach-disk1_sparse.qcow2
    -rw-r--r-- 1 root root  11G Apr 25 22:41 c7u6m1_attach-disk2.qcow2
    -rw-r--r-- 1 root root 193K Apr 25 22:37 c7u6m1_attach-disk2_sparse.qcow2
    -rw-r--r-- 1 qemu qemu 2.1G Apr 25 17:23 c7u6m1_attach-disk.qcow2
    -rw-r--r-- 1 root root 193K Apr 25 16:06 c7u6m1_attach-disk_sparse.qcow2
    [root@host c7u6m1]# 
    

    上述操作就完成了磁盘镜像文件的创建以及转换过程。转换后的磁盘镜像文件分别为c7u6m1_attach-disk1.qcow2和c7u6m1_attach-disk2.qcow2。

  2. 附加磁盘镜像文件到虚拟机

    将上述创建好的磁盘镜像文件附加到虚拟机上,需要在宿主机上执行virsh attach-disk命令,具体过程如下所示:

    [root@host c7u6m1]# virsh attach-disk c7u6m1 `pwd`/c7u6m1_attach-disk1.qcow2 vdc --cache writethrough
    Disk attached successfully
    
    [root@host c7u6m1]# virsh attach-disk c7u6m1 `pwd`/c7u6m1_attach-disk2.qcow2 vdd --cache writethrough
    Disk attached successfully
    
    [root@host c7u6m1]#
    

    上述就完成了给虚拟机附加磁盘镜像的操作,接下来在虚拟机中查看附加的虚拟磁盘。具体如下所示:

    [root@c7u6m1 ~]# lsblk
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0           11:0    1  4.3G  0 rom  
    vda          252:0    0   40G  0 disk 
    ├─vda1       252:1    0  512M  0 part /boot
    ├─vda2       252:2    0    1G  0 part [SWAP]
    └─vda3       252:3    0 38.5G  0 part 
      └─vg0-root 253:0    0 38.5G  0 lvm  /
    vdb          252:16   0    2G  0 disk 
    └─vdb1       252:17   0    2G  0 part /test
    vdc          252:32   0   10G  0 disk 
    vdd          252:48   0   10G  0 disk 
    loop0          7:0    0  4.3G  1 loop /media
    [root@c7u6m1 ~]#
    

    从上述虚拟机的输出中可以看出,增加了vdc和vdd这两个10G大小的虚拟磁盘。接下来就是将这两磁盘创建为PV了。

  3. 将附加的虚拟磁盘创建为PV

    在虚拟机中将附加的虚拟磁盘创建为PV,需要以root身份执行pvcreate命令,具体如下所示:

    [root@c7u6m1 ~]# pvcreate /dev/vd{c,d}
      Physical volume "/dev/vdc" successfully created.
      Physical volume "/dev/vdd" successfully created.
    [root@c7u6m1 ~]# pvs
      PV         VG  Fmt  Attr PSize   PFree 
      /dev/vda3  vg0 lvm2 a--  <38.50g     0 
      /dev/vdc       lvm2 ---   10.00g 10.00g
      /dev/vdd       lvm2 ---   10.00g 10.00g
    [root@c7u6m1 ~]# 
    

    上述就完成了PV的创建,通过命令pvs可以查看系统上当前存在的PV都有哪些。要查看PV的更详细的信息,还可以执行命令pvdisplay,具体如下所示:

    [root@c7u6m1 ~]# pvdisplay
      --- Physical volume ---
      PV Name               /dev/vda3
      VG Name               vg0
      PV Size               <38.50 GiB / not usable 3.00 MiB
      Allocatable           yes (but full)
      PE Size               4.00 MiB
      Total PE              9855
      Free PE               0
      Allocated PE          9855
      PV UUID               vmGcUA-PPmI-2qCp-Vg9u-IYA2-UBFl-VP5YuN
       
      "/dev/vdd" is a new physical volume of "10.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/vdd
      VG Name               
      PV Size               10.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               BCRlvl-IEgs-U95s-kAp6-oGdE-7AO3-WLVhQJ
         
      "/dev/vdc" is a new physical volume of "10.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/vdc
      VG Name               
      PV Size               10.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               VvdCk6-xfVm-ROqA-7wau-QpPa-lm0d-DIk7Pn
       
    [root@c7u6m1 ~]# 
    

    PV创建好之后,就可以从PV创建VG了。

  4. 从PV创建VG

    VG是由多个PV创建出来的,创建VG的命令为vgcreate vg-name pv1 pv2 ...。在创建vg之前,利用vgs命令查看下系统上当前存在的vg,具体如下所示:

    [root@c7u6m1 ~]# vgs
      VG  #PV #LV #SN Attr   VSize   VFree
      vg0   1   1   0 wz--n- <38.50g    0 
    [root@c7u6m1 ~]# 
    

    此时系统上存在一个vg0。

    下面我们使用vdc和vdd这两个虚拟磁盘创建的PV创建一个名为vg1的VG,具体如下所示:

    [root@c7u6m1 ~]# vgcreate vg1 /dev/vd{c,d}
      Volume group "vg1" successfully created
    [root@c7u6m1 ~]# vgs
      VG  #PV #LV #SN Attr   VSize   VFree 
      vg0   1   1   0 wz--n- <38.50g     0 
      vg1   2   0   0 wz--n-  20.00g 20.00g
    [root@c7u6m1 ~]#
    

    从上述输出中可以看出,VG创建完成。查看vg1的详细信息,具体如下所示:

    [root@c7u6m1 ~]# vgdisplay vg1
      --- Volume group ---
      VG Name               vg1
      System ID             
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  1
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               20.00 GiB
      PE Size               4.00 MiB
      Total PE              5120
      Alloc PE / Size       0 / 0   
      Free  PE / Size       5120 / 20.00 GiB
      VG UUID               AQffZM-JOfS-gbuZ-fwTl-xIBD-I4yi-YUn35P
       
    [root@c7u6m1 ~]#
    

    从上述输出中可以看,这个VG的容量为20G,包含的PE数量为5120个,每个PE的大小为4M,当前已经分配的PE数为0;未分配的PE数量为5120个。

    有了VG之后,就可以从VG中创建LV出来,并且将其格式化为文件系统了。

  5. 从VG中创建LV

    创建LV的命令为lvcreate,该命令支持的选项很多,具体的可以创建的LV类型参见man lvcreate的man手册。此处将会创建条带化的LV,所以用到的选项分别介绍如下:

    • -i|--stripes number:指定条带数,不应该超过PV的数量。一般是将number设置为与PV的数量相同。
    • -I|--stripesize Size[k|unit]:指定条带的大小,即在每个PV上写多少数据之后才会切换到下一个条带。需要根据具体业务场景来定,如果是小文件居多,则该值不宜设置得过大;如果大文件居多,该值不应设置的过小。
    • -l|--extents Number[percent]:可以指定所用的PE数量,也可以指定占用的百分比,通常都是直接指定PE的数量。
    • -L|--size Size[m|unit]:指定要创建的LV的容量,需要带上具体的单位,通常会有些许偏差,没有-l number这种直接指定PE数量的方式来的精确。
    • --type linear|striped|snapshot|mirror|raid|thin|cache|vdo|thin-pool|cache-pool|vdo-pool:指定LV的类型,此处需要指定为striped,即条带化LV。
    • -n|--name String:为LV指定名字,如果不指定,则采用默认的"lvol#"的命名方式对LV进行命名。

    上述就是我们此处所用的选项以及解释。具体的创建过程如下所示:

    [root@c7u6m1 ~]# lvcreate -n testlv -i 2 -I 128k -L 5G --type striped vg1
      Logical volume "testlv" created.
    [root@c7u6m1 ~]# lvs
      LV     VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      root   vg0 -wi-ao---- <38.50g                                                    
      testlv vg1 -wi-a-----   5.00g                                                    
    [root@c7u6m1 ~]# lvdisplay testlv
      Volume group "testlv" not found
      Cannot process volume group testlv
    [root@c7u6m1 ~]# lvdisplay /dev/vg1/testlv 
      --- Logical volume ---
      LV Path                /dev/vg1/testlv
      LV Name                testlv
      VG Name                vg1
      LV UUID                yJNE6i-qp30-T0Zo-jSgK-e4kP-NuHh-6IiBQO
      LV Write Access        read/write
      LV Creation host, time c7u6m1.localhost.com, 2021-04-25 23:22:23 +0800
      LV Status              available
      # open                 0
      LV Size                5.00 GiB
      Current LE             1280
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     1024
      Block device           253:1
       
    [root@c7u6m1 ~]# 
    

    上述就在vg1中创建了一个大小为5G的LV,接下将其格式化为xfs文件系统之后挂载到/users目录。

  6. 格式化LV为xfs文件系统并挂载

    创建好LV之后,就可以将其格式化为对应的文件系统了。此处将其格式化为xfs文件系统。具体如下所示:

    [root@c7u6m1 ~]# mkfs.xfs /dev/vg1/testlv 
    meta-data=/dev/vg1/testlv        isize=512    agcount=8, agsize=163808 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=1310464, imaxpct=25
             =                       sunit=32     swidth=64 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=32 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@c7u6m1 ~]# 
    

    上述就将testlv这个LV格式化为xfs文件系统了。

    接下来将其挂载到/users目录。具体如上下所示:

    [root@c7u6m1 ~]# mkdir /users
    [root@c7u6m1 ~]# ls -ld /users                               
    drwxr-xr-x 2 root root 6 Apr 25 23:26 /users
    [root@c7u6m1 ~]# blkid /dev/vg1/testlv
    /dev/vg1/testlv: UUID="5ed4bef1-4ec2-42b1-b328-012c96c4e76c" TYPE="xfs" 
    [root@c7u6m1 ~]# vim /etc/fstab 
    [root@c7u6m1 ~]# cat /etc/fstab | egrep users
    UUID="5ed4bef1-4ec2-42b1-b328-012c96c4e76c"     /users  xfs             defaults        0 0
    [root@c7u6m1 ~]# 
    [root@c7u6m1 ~]# mount -a
    [root@c7u6m1 ~]# df -hT
    Filesystem             Type      Size  Used Avail Use% Mounted on
    /dev/mapper/vg0-root   xfs        39G  5.0G   34G  13% /
    devtmpfs               devtmpfs  988M     0  988M   0% /dev
    tmpfs                  tmpfs    1000M     0 1000M   0% /dev/shm
    tmpfs                  tmpfs    1000M   33M  967M   4% /run
    tmpfs                  tmpfs    1000M     0 1000M   0% /sys/fs/cgroup
    /dev/vda1              xfs       509M  129M  381M  26% /boot
    tmpfs                  tmpfs     200M     0  200M   0% /run/user/0
    /dev/loop0             iso9660   4.3G  4.3G     0 100% /media
    /dev/vdb1              ext4      2.0G  9.1M  1.9G   1% /test
    /dev/mapper/vg1-testlv xfs       5.0G   33M  5.0G   1% /users
    [root@c7u6m1 ~]#
    

    上述操作完成了LV的格式化以及挂载的操作。

5. References

  1. https://www.prepressure.com/library/technology/raid
  2. 鸟哥的Linux私房菜-第四版
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值