Linux磁盘和文件系统管理进阶(swap、磁盘配额、RAID、LVM、btrfs)

概述:

    上篇已经介绍了一些磁盘和文件系统管理的基础概念,对磁盘的硬件构造,文件系统的基础概念部分有了一个大致的了解。本篇就分享一些关于磁盘和文件系统管理的一些高级应用,具体包含:

    1、swap交换分区的管理

    2、挂载移动介质及dd及相关命令的补充

    3、磁盘配额的管理

    4、RAID管理

    5、LVM逻辑卷管理

    6、btrfs文件系统管理

    7、高级磁盘管理实战演练

第一章    swap交换分区管理

    交换分区是用于当物理内存空间不够用时,将内存中的数据,按照LSU算法,将最近最少使用的一些数据展示存储到交换分区里面,充当内存的补充,inux上的交换分区必须使用独立的文件系统,且文件系统的system ID 必须为82

    1、交换分区的创建:

        利用fdisk命令,创建一个分区,并将分区类型修改为82,也就是swap类型,出于读写速度考虑,建议将交换分区创建为一个独立磁盘的起始柱面开始的分区(一般为第一个分区),因为按照磁盘物理结构来看,起始柱面处于盘片的最外圈,读写速率相对较高

        1.png

    2、格式化交换分区

        创建了交换分区之后,可利用mkswap命令来创建文件系统,格式为:mkswap DEVICE

        blob.png

        

    3、启用禁用交换分区       

        启用: swapon

            swapon [OPTION]… [DEVICE]

                -a:激活所有的交换分区,实际是去读/etc/fstab文件

                -s  显示swap的分区状况

                -p PRIORITY:指定优先级

        blob.png      

        禁用:swapoff  /DEVICE

        blob.png

    4、挂载交换分区,让交换分区能够开启自动挂载

        编辑/etc/fstab文件添加关于swap分区的挂载条目

        blob.png

        3.png

  

    5、管理交换分区

        交换分区的优先级:

            用户可以给某个swap指定一个0到32767的优先级

            如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一。

            先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)。

        调整swap优先级的方法:

           1、 在swapon -p 指定优先级(重启后失效)

        blob.png 

          2、  在fstab中默认挂载选项中定义pri=优先级(永久有效,要想立即生效,需要swapoff,然后再swapon)

        blob.png

        blob.png

    6、利用文件(而不是分区)当做交换分区使用

        先创建一个合适大小的文件,然后mkswap格式化为swap的文件系统,然后启用之

        blob.png

        也支持将配置写入/etc/fstab文件,让其自动挂载,只是挂载选项那里注意要加上loop选项

第二章    挂载移动介质和dd及相关命令补充

    1、移动介质挂载使用(光盘、U盘)

        挂载意味着使外来的文件系统看起来如同是主目录树的一部分

        访问前、介质必须被挂载

        摘除时,介质必须被卸载

        按照默认设置,非根用户只能挂载某些设备(光盘、 DVD、软盘、 USB等等)挂载点通常在/media 或/mnt下

        光盘:

            手工挂载,如:mount /dev/cdrom /mnt/

            eject命令卸载或弹出磁盘

            创建ISO文件,如:

                cp /dev/cdrom /root/centos7.iso

                mkisofs -r -o /root/etc.iso /etc

            刻录光盘

                wodim –v –eject centos.iso

        USB介质:

            被内核探测为SCSI设备,/dev/sdaX、 /dev/sdbX、或类似的设备文件

            手动挂载:mount /dev/sdb1 /mnt

    2、dd命令详解

        dd命令:convert and copy a file

        用法:

            dd if=/PATH/FROM/SRC of=/PATH/TO/DEST

            bs=#: block size, 复制单元大小

            count=#:复制多少个bs

            of=file 写到所命名的文件而不是到标准输出

            if=file 从所命名文件读取而不是从标准输入

            bs=size 指定块大小(既是是ibs也是obs)

            ibs=size 一次读size个byte

            obs=size 一次写size个byte

            cbs=size 一次转化size个byte

            skip=blocks 从开头忽略blocks个ibs大小的块

            seek=blocks 从开头忽略blocks个obs大小的块

            conv=conversion[,conversion…] 用指定的参数转换文件

                转换参数:

                    block 转换为长度为 cbs 的记录,不足部分用空格填充。

                    unblock 替代cbs长度的每一行尾的空格为新行

                    lcase 把大写字符转换为小写字符

                    ucase 把小写字符转换为大写字符

                    swab 交换输入的每对字节。

                    nocreat  输出的文件不存在,不默认创建

                    noerror 出错时不停止

                    notrunc 不截短输出文件。

                    sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐

        用法示例:

            磁盘拷贝:dd if=/dev/sda of=/dev/sdb

            备份MBR:dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

            破坏MBR中的bootloader:dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

            备份:

                dd if=/dev/sdx of=/dev/sdy

                将本地的/dev/sdx整盘备份到/dev/sdy

                dd if=/dev/sdx of=/path/to/image

                将/dev/sdx全盘数据备份到指定路径的image文件

                dd if=/dev/sdx | gzip >/path/to/image.gz

                备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径

            恢复:

                dd if=/path/to/image of=/dev/sdx

                将备份文件恢复到指定盘

                gzip -dc /path/to/image.gz | dd of=/dev/sdx

                将压缩的备份文件恢复到指定盘

            拷贝内存资料到硬盘

                dd if=/dev/mem of=/root/mem.bin bs=1024

                将内存里的数据拷贝到root目录下的mem.bin文件

            从光盘拷贝iso镜像

                dd if=/dev/cdrom of=/root/cd.iso

                拷贝光盘数据到root文件夹下,并保存为cd.iso文件

            销毁磁盘数据

                dd if=/dev/urandom of=/dev/sda1

                利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后, /dev/sda1将无法挂载,创建和拷贝操作无法执行。

            得到最恰当的block size

                dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

                dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

                dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

                dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

                通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

            测试硬盘读写速度

                dd if=/root/1Gb.file bs=64k | dd of=/dev/null

                dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

                通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度

            修复硬盘

                dd if=/dev/sda of=/dev/sda

                当硬盘较长时间(比如1, 2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。

    3、磁盘管理其他相关命令

        内存空间使用状态:

            free [OPTION]

                -m: 以MB为单位

                -g: 以GB为单位

        文件系统空间占用等信息的查看工具:

            df [OPTION]… [FILE]…

                -H 以1000为单位

                -T 文件系统类型

                -h: human-readable

                -i:不以块显示磁盘空间占用情况,而是以inode的数量显示占用情况

                -P: 以Posix兼容的格式输出

        查看某目录总体空间占用状态:显示出来默认是K为单位

            du [OPTION]… DIR

                -h: human-readable

                -s: summary

                du -sh /*  显示根下每个目录的大小

        blob.png       

        blob.png

第三章    磁盘配额的管理

    Linux是多用户的操作系统,同一时间可能有多个用户登录到系统上进行相关操作,用户在操作的时候,可能会写入很多数据,占用大量磁盘空间,导致其他用户想写数据的时候,没有磁盘空间可用,如何限定某个用户对磁盘的使用空间大小,以及可使用的inode多少,也就是限定可创建多少个文件,这就是磁盘配额管理的作用。

    磁盘配额管理的是针对一个独立的分区文件系统进行管理,不能跨分区,如果我们希望对某个目录进行磁盘配额管理,则需要将该目录单独挂载至某个独立的分区

    磁盘配额管理的设定流程:

        1、启用分区挂载选项usrquota、grpquota,根据需要,只针对用户启用或只针对组启用,也可以两个都启用

            注意修改挂载选项后执行重新挂载

        quo1.png

        qu2.png

        2、初始化quota数据库

            quotacheck -cu|-cg|-cug  /DIR

            针对某个分区的挂载目录初始化quota数据库,可以针对用户创建、针对组创建、或者两个都创建,看第一步挂载选项启用的那些都创建那些

        qu3.png

        初始化数据块后,会在被执行磁盘配额的目录下生成相关的数据库文件,该文件无法通过vi等编辑器查看

        3、启用磁盘配额功能

            quotaon /DIR

            关闭用 quotaoff

            quotaon -p  /DIR  查看某目录磁盘配额是否启用

        blob.png

        4、编辑具体配额信息

            edquota USERNAME 进入交互式界面定义配额

            或setquota USERNAME  软容量  硬容量  软数量  硬数量  /DIR

            或根据现有用户的配置来设置别的用户

                edquota -p USER1  USER2  根据user1设置user2

        qu4.png

        blob.png

        blob.png

        5、验证配额情况

            quota USERNAME  查看某用户配额信息

            repquota  /DIR  查看挂载点的整体配额信息

            quotaon -p  /DIR  查看某目录磁盘配额是否启用

        blob.png

第四章    RAID管理

    1、RAID概述:

        多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供

        提高IO能力:磁盘并行读写

        提高耐用性;磁盘冗余来实现

        RAID级别:多块磁盘组织在一起的工作方式有所不同

        RAID实现的方式:

            外接式磁盘阵列:通过扩展卡提供适配能力

            内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置

            Software RAID:利用软件实现RAID功能

    2、常见RAID级别及其相关属性

        RAID的级别仅仅代表磁盘组织方式的不同,不代表先进性

        0:代表条带技术(一份分成多分存储,提升读写速率)

            性能表现:读写性能提升

            冗余能力(容错能力):无

            空间利用率:n倍,每个raid0存储量取决于几块盘中最小的容量

            至少2块盘

        blob.png

        1:代表镜像技术(一份复制多分存储,提升容错率)

            性能表现:写下降,读提升

            冗余能力:有

            空间利用率:1/2,每个raid1存储量取决于几块盘中最小的容量

            至少2块盘

        blob.png

        5:校验码技术

            性能表现:读写提升

            冗余能力:有,只能同时坏一块盘

            空间利用率:(n-1)/n,每个raid5存储量取决于几块盘中最小的容量

            至少3块盘

        blob.png

        01:先做0,后做1

            性能表现:读写提升

            冗余能力:有

            空间利用率:1/2

            至少4块盘

        blob.png

        10:先做1,后做0;实际公司一般用这种,实用性比01好(底层是1,上层是0)

            性能表现:读写提升

            冗余能力:有,每组镜像对多只能坏一块

            空间利用率:1/2,每个raid10存储量取决于几块盘中最小的容量

            至少4块盘

        blob.png

        50:

            性能表现:读写提升

            冗余能力:有

            空间利用率:(n-2)/2

            至少6块盘

        blob.png

        JBOD技术:将多块盘组成一个大的盘,不提升读写速率,不提供冗余

        常用级别:raid-0,raid-1,raid5,raid10,raid50,JBOD

    

    3、软件RAID的实现:mdadm  (实际效果演示见本文第七章)  

        md:(内核中支持软件RAID的模块) 

        mdadm:模式化的工具,支持的RAID级别:LINEAR, RAID0, RAID1, RAID4,RAID5, RAID6, RAID10

            将任何块设备做成RAID,支持将磁盘的某个分区、也支持整个磁盘创建为RAID设备,利用分区创建的时候,需要将分区类型修改为fd,利用整个磁盘创建时,则直接指定磁盘即可

        语法:命令的语法格式: mdadm [mode] <raiddevice> [options] <component-devices>

            模式mode:

                创建: -C(注意在同一个磁盘上的不同分区创建是没有意义的,因为RAID本身是为了防止物理损坏,而创建在同一个磁盘上的不同分区,磁盘坏了,RAID的各个分区也坏了)

                装配: -A

                监控: -F

                管理: -f, -r, -a

                <raiddevice>: /dev/md#

                <component-devices>: 任意块设备

            创建模式-C:

                -n #: 使用#个块设备来创建此RAID

                -l #:指明要创建的RAID的级别

                -a {yes|no}:自动创建目标RAID设备的设备文件

                -c CHUNK_SIZE: 指明块大小,2^n,单位K,默认为512K

                -x #: 指明空闲盘的个数

                例如:创建一个10G可用空间的RAID5

                    mdadm -C /dev/md1 -n 3 -x 1 -l 5 -a yes /dev/sd{b,c,d,e}1

            显示RAID的详细信息:mdadm -D /dev/md#

            观察RAID的状态:cat /proc/mdstat

            创建好raid设备后,要利用mdadm -Ds >> /etc/mdadm.conf  保存到配置文件,否则下次启动或利用mdadm -A装配时,会找不到raid设备

            管理模式:

                -f: 标记指定磁盘为损坏

                -a: 添加磁盘

                -r: 移除磁盘

            停止RAID设备:

                mdadm -S /dev/md#

            软RAID管理:

                生成配置文件: mdadm –D –s >> /etc/mdadm.conf

            激活: mdadm –A –s /dev/md0 激活

                注意,停止想激活,前提是生成过配置文件

            删除raid信息: mdadm –zero-superblock /dev/sdb1

            增长模式:当创建某raid时,指定的磁盘个数为N,后面想增加磁盘个数时用到此模式

                mdadm –G /dev/md0 –n4 -a /dev/sdf1

        注意:

            raid创建完成后,如果用UUID挂载,则需要用blkid看到的UUID进行挂载,而不应该用mdadm -D /dev/md0看到的UUID

            停止RAID后,如果发现分区没有被清除干净,需要用mdadm –zero-superblock  /dev/sdb1将每个分区信息删除

        总结:

            创建RAID过程:

            1、fdisk创建分区,修改类型为fd

            2、创建raid设备: mdadm -C /dev/md# -n 设备个数 -x 空闲盘个数 -l RAID级别  -c CHUNK大小 -a yes  /DEVICES…

            3、如果有必要,将raid信息导出:mdadm -Ds >> /etc/mdadm.conf

            4、格式化创建文件系统:mke2fs -t FILESYSTEM_TYPE /dev/md#

            5、挂载:mount /dev/md# /MOUNT_POINT

            6、挂载写入配置文件,实现自动挂载 vim /etc/fstab

                注意,要用blkid查看到的UUID进行挂载,因为重启后raid设备名称会发生变更

            

            测试:

            1、手工损坏某个磁盘:mdadm /dev/md# -f /DEVICE

            2、观察md设备的状态:cat /proc/mdstat  或 mdadm -D /dev/md#

            3、移除认为损坏的设备,添加新的设备

                    mdadm /dev/md# -r /DEVICE

                    mdadm /dev/md# -a /DEVICE

            4、增加raid设备的磁盘数量(增长模式)

                    mdadm -G /dev/md# -n # -a /DEVICE

                    -n指定要增长到几块磁盘,-a指定增加进去的磁盘

            5、停用RAID设备:

                    mdadm -S /dev/md#

            6、重新启用之前停用的RAID设备(前提是导出过配置文件)

                    mdadm -As /dev/md#

            完全删除停止raid设备:

            1、停用RAID设备:mdadm -S /dev/md#

            2、删除保存过的RAID配置文件:rm -f /etc/mdadm.conf

            3、删除创建过RAID分区:fdisk 命令

            4、如果发现无法完全删除分区信息,利用mdadm –zero-superblock /DEVICE 将每个分区信息删除

        

第五章    LVM逻辑卷管理

    1、LVM的基础概念

       可以基于任何块设备,包括磁盘的某个分区,或整个磁盘,甚至包括raid设备来创建

        dm:device mapper  将一个或多个底层块设备组织成一个逻辑设备的模块

        创建后的设备文件是:/dev/dm-#

        由于以上的表达方式不方便记忆和调用,故有/dev/VG_NAME/LV_NAME和/dev/mapper/VG_NAME-LV_NAME这两个链接文件指向了真实文件

    

        PV:(physical volume物理卷):提供物理空间的磁盘或分区

        PE:(physical extend 物理盘区):类似块的概念

        VG:(volume group 卷组):类似扩展分区的概念

        LV:(logical volume 逻辑卷):真正提供访问的逻辑空间

        LE:(logical extend 逻辑盘区):PE映射到LV上面的就叫LE

        blob.png

    2、PV管理工具,利用分区创建pv时,需要将分区类型改为8e

        PV管理工具:(pv只有在加入vg后才能会有PE块大小,才能进行分配)

            pvs  简要显示pv信息

            pvdisplay [DEVICE] 显示指定块设备的pv详细信息,不指定默认显示全部pv信息

            pvcreate /dev/DEVICE  将指定的设备创建为pv

                例如:pvcreate /dev/sda3  /dev/sdb

            pvremove /dev/DEVICE  将指定的设备从pv中移除

            pvmove /dev/DEVICE  当缩减VG大小时,需要先将被缩减的设备上的文件移动到同一个VG上面的其他设备上,此时需要用pvmove来实现数据的转移

        blob.png

        pv1.png

        blob.png

    4、VG管理工具

        vgs  简要显示vg信息

        vgdisplay  [VG_NAME] 显示指定VG的详细信息,不指定默认显示全部的VG信息

        vgcreate [-s PE_SIZE] VG_NAME  /dev/DEVICE…

            -s PE_SIZE  指定PE大小,单位可以有KMGT…默认为4M,PE的大小一旦vg创建完成就不能更改

            /dev/DEVICE  指定用哪个PV设备创建该VG

            例如:vgcreat -s 2M myvg  /dev/sda3

        vgextend  VG_NAME  /dev/DEVICE  将指定的pv设备加入到vg

            例如:

                pvcreate /dev/sda5

                vgextend myvg /dev/sda5

        vgreduce  VG_NAME  /dev/DEVICE  将指定的pv设备从vg移除,移除pv前要先将pv的数据移走,然后再从vg中移除该pv 

            例如: 

                pvmove /dev/sda5

                vgreduce myvg /dev/sda5

            注意:移除pv时,要将pv上的数据移动到改vg组内的其他pv上

        vgremove VG_NAME  移除指定的整个VG

        vg1.png

        blob.png

        blob.png

        blob.png

    5、LV管理工具:

        lvs  简要显示lv信息

        lvdisplay [/dev/VG_NAME/LV_NAME] 显示指定lv的详细信息,不指定则默认显示全部lv的信息

        lvcreate [OPTION]… -n LV_NAME VG_NAME

            -L SIZE :指明lv的大小,支持的单位MGT等;指明的大小在指明的VG中有足够的空间分配

            -n LV_NAME  指明lv的名称

            VG_NAME   指明在哪个VG上创建

            例如:lvcreate -L 2G -n mylv myvg

            创建完成lv后,设备文件名一般是/dev/VG_NAME/LV_NAME

        lvremove /dev/VG_NAME/LV_NAME  可以实现删除指定的lv

        blob.png

        扩展LV:(先扩展物理边界,也就是lv,再扩展逻辑边界 resize2fs)支持在线扩展

            lvextend -L [+]SIZE  /dev/VG_NAME/LV_NAME

                -L [+]SIZE 指明扩展多大的空间,可以是MGT等

                    -L SIZE  表示增加到多大,表示lv的总的空间大小

                    -L +SIZE  表示在原有基础上增加多少

                例如:lvextend -L +5G /dev/myvg/mylv

            注意:扩展完成lv大小后,只是扩展了物理上的存储大小,但是文件系统的大小还是没有改变,所以在扩展完lv大小后,要重置指定分区的文件系统大小,方法如下:(实际是扩展逻辑边界)

            resize2fs /dev/myvg/mylv (该命令只适用于ext系列文件系统)

        lv1.png

        lv2.png

        注意:

            扩展lv时,如果文件系统是xfs时,不能用resize2fs(专用用ext系列) ,而要用xfs_growfs /dev/VG_NAME/LV_NAME

            扩展时如果使用的lvextend -r -l 100%FREE /dev/nwc_vg/nwc_lv 表示将剩余空间全部扩展,则不需要进行文件系统边界扩展,也就是不需要执行resize2fs

            xfs文件系统只能扩展,不能缩减,但ext系列的可以扩展,也可以缩减

        缩减LV:(缩减不能在线进行,缩减lv要先卸载,先缩减逻辑边界,也就是文件系统边界,再缩减物理边界,也就是lv)缩减LV有丢失数据风险,需要谨慎

            umount /dev/VG_NAME/LV_NAME  卸载

            e2fsck -f /dev/VG_NAME/LV_NAME    强制检查文件系统

            resize2fs /dev/VG_NAME/LV_NAME  SIZE  缩减逻辑边界至多大,单位MGT等

                如:resize2fs /dev/myvg/mylv 3G

            lvreduce  -L [-]SIZE /dev/VG_NAME/LV_NAME   缩减物理lv大小

                -L SIZE  表示缩减到多大

                -L -SIZE  表示在原有基础上缩减多少

            mount /dev/VG_NAME/LV_NAME  /DIR   缩减完成,重新挂载

            注意:缩减LV有丢失数据风险,需要谨慎

        333.png

        当lv创建完成后,需要进行格式化创建文件系统,并挂载,才能使用

        例如:

            mke2fs -t ext4 -b 1024 -L LVTEST -o acl /dev/myvg/mylv

            mount /dev/myvg/mylv  /testdir/lvdir

    6、快照卷

        <1>快照卷原理:

        快照卷是对处于同一个vg下的lv创建一个快照逻辑卷,目的是为了对某个lv的数据进行备份,快照卷与逻辑卷一定要处于同一卷组,在创建完快照卷后,如果逻辑卷内的内容发生变化,则会把原始为发生变化的数据存放到快照卷中,这样就保证了快照卷中的内容都处于创建快照卷那一刻的数据的状态,然后对快照卷内的内容用copy或其他备份方式进行备份,这样就实现了数据的备份。

        虽然我们说快照卷内的内容都是创建快照卷之后,逻辑卷中变化过的内容,但是在实际操作的过程中,会发现即使逻辑卷的数据没有发生变化,但切换到快照卷的挂载目录时,仍然能够看到有与逻辑卷内的数据一样的内容。其实,对于那些没有变化的数据,快照卷内看到的文件的存储位置依然是在逻辑卷内,为了起到备份的效果,映射到了快照卷内。但是对于创建快照卷之后,发生变化的数据,则原始数据会存储在快照卷的存储空间内,而变化后的数据存储在了逻辑卷的存储空间内。如此,即保证了快照卷的数据即是创建快照卷那一刻文件的状态。

        通过上述快照卷的实现方式,可以得知,快照卷的大小,只需要保证从快照卷创建,到备份快照卷里面的数据这段时间内,原始数据可能发生变化的数据的大小,最大即为跟原始逻辑卷一样大。

        

        <2>创建快照卷:

            lvcreate -L SIZE -p r -s -n SNAPSHOT_NAME  ORIGINAL_LV_NAME

                -L SIZE  指明快照卷的大小(在做备份这段时间可能发生的改变的数据量),可接受的单位是MGT等

                -p r   表示快照卷的属性是只读,一般快照卷用来做备份,备份过程中,快照卷不允许可写

                -s  标明是在做快照卷

                -n  SNAPSHOT_NAME   标明快照卷的名称

                ORIGINAL_LV_NAME   标明是对那个原卷做快照,如/dev/myvg/mylv

        例如:对之前的mylv做快照

            lvreate -L 2G -p r -s -n mysnap /dev/myvg/mylv

        <3>快照卷的挂载使用

            创建完快照卷,需要挂载才能使用

            mount /dev/myvg/mysnap  /testdir/testsnap

            比如原卷挂载在/backup中,snap挂载在/testdir/testsnap下,一旦快照卷创建完成,在原卷的挂载点中改变的文件,在快照卷的挂载点中是不会有的,此时就可以利用快照卷的挂载点里面的内容做备份了,如

            cp -pa /testdir/snapdir /nwc/back

            备份完成后,快照卷的使命完成,就可以卸载并删除快照卷了

                umount /testdir/snapdir

                lvremove /dev/myvg/mysnap

        1.png

第六章    btrfs文件系统管理

    1、btrfs核心特性:

        多物理卷支持:一个文件系统,可以由多个底层物理卷组成,支持RAID,支持以联机“增加”“修改”“删除”

        写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新

        数据及元数据校验码机制:checksum

        子卷:sub_volume

        快照:支持快照的快照,增量快照机制

        透明压缩机制

    2、创建btrfs文件系统:mkfs.btrfs(一般在多块磁盘上创建btrfs,而不是在一块磁盘的不同分区上创建)

        格式:mkfs.btrfs [OPTIONS] DEVICE

            -L LABEL 指定卷标

            -m raid0|raid1|raid5|raid10|single|dup 指明元数据存储方式,由于btrfs底层默认支持raid,故可以定义元数据的存储方式,是raid还是只存储一份,还是做冗余存储,默认是single

            -d raid0|raid1|raid5|raid10|single 指明数据存储方式,由于btrfs底层默认支持raid,故可以定义数据的存储方式,是raid还是只存储一份,默认是single

            -O FEATURE1,FEATURE2…  指明创建文件系统时时,默认开启哪些特性,可利用mkfs.btrfs -O list-all来查看支持的特性列表

        例如:mkfs.btrfs -L MyBtrfsTest /dev/sdb /dev/sdc

            btrfs filesystem show 可以查看当前系统上的btrfs文件系统的信息

    3、查看btrfs文件系统:btrfs filesystem 

        格式:btrfs filesystem <subcommand> <args>

        subcommand:

            df /PATH  显示btrfs文件系统中挂载点的空间占用情况

            show [–mounted|–all-devices|PATH|UUID|DEVICE|LABEL] 显示指定的文件系统相关信息,如已挂载的信息,所有设备的信息等,默认不指名,则显示所有的

            label /DEVICE  [NEWLABEL] 显示或修改设备的卷标,不加NEWLABEL则为显示,如果指明NEWLABEL则为修改

            resize DEVICE:SIZE   可实现调整文件系统大小,支持的单位有KMG

        查看时,如果指明DEVICE,则指明创建文件系统时的任何一个设备都可以,因为他们都属于同一个文件系统

        例如:btrfs filesystem show

        btrfs filesystem resize -10G  /testdir/btrfstest

        btrfs filesystem resize +10G  /testdir/btrfstest

        btrfs filesystem resize max  /testdir/btrfstest

        btrfs filesystem df /testdir/btrfstest

    4、挂载btrfs文件系统:mount

        mount -t btrfs DEVICE  /MOUNT_POINT

        DEVICE:为任意一个创建文件系统时的设备

        例如:mount -t btrfs /dev/sdb /testdir/btrfstest

        可利用挂载选项,启用btrfs透明压缩机制:

        mount -o compress={lzo|zlib}  /dev/sdb /testdir/btrfstest

    5、添加删除底层磁盘进btrfs文件系统:btrfs device

        格式:btrfs device <subcommand> <args>

        subcommand:

            add   添加一块设备到btrfs,支持在线进行

            delete   从btrfs里面删除设备,支持在线进行

            scan   扫描设备

            ready   将设备标记为可用状态

            stats

        例如:btrfs device add /dev/sdd /testdir/btrfstest

        btrfs device delete /dev/sdb  /testdir/btrfstest

    6、将btrfs的底层设备均衡存储数据:btrfs balance

        格式: btrfs balance <subcommand>|<args>

        subcommand:

            start  :启动均衡存储

            stop :停止均衡存储

            status :查看均衡存储的状态信息

            pause :暂停均衡存储

            resume :继续实施均衡存储

        例如:btrfs balance start /testdir/btrfstest

    7、修改元数据和数据存储的组织方式:(mkfs.btrfs里面-m和-d的相关信息的修改)

        语法:btrfs balance start {-d|-m|-s}convert=FILTER /MOUNT_POINT

            -d  表示修改数据的存储组织方式,支持在线进行

            -m  表示修改元数据的存储组织方式,支持在线进行

            -s  表示修改系统存储的组织方式,支持在线进行

            FILTER:

                raid0、raid1、raid5、raid10、single、dup

            改变raid级别时,前提要有对应的多少块磁盘,raid0 2块,raid1 2块,raid5 3块,raid10 4块 

        例如:btrfs balance start -dconvert=raid5 /testdir/btrfstest

    8、在btrfs上管理子卷:btrfs subvolume

        可理解为在现有的btrfs上在创建一个btrfs文件系统,单独挂载使用

        格式:btrfs subvolume <subcommand> [args]

        subcommand:

            create:创建子卷

            btrfs subvolume  create /testdir/btrfstest/subdir

            相当于在父卷挂载点上创建一个子目录

            上述例子表示创建一个名为subdir的子卷

            list:列出子卷

                btrfs subvolume list /testdir/btrfstest

            snapshot:做快照

            set-default:设置默认子卷

            get-default:查看默认子卷

        挂载子卷:

            当挂载时,如果指明的是父卷的挂载路径,则父卷下属的所有子卷都会被自动挂载,访问时通过父卷的挂载点下的对应子目录进行访问,如果要单独挂载某些子卷,则创建完子卷后,卸载父卷,然后再挂载子卷

            如果挂载父卷,则所有子卷下的内容都能被访问到,但是如果单独挂载子卷,则父卷上的内容就没办法正常访问

            mount -o subvol=SUBVOLUME_NAME /DEVICE  /MOUNT_POINT

                 /DEVICE  :创建父卷时的任意一个设备都可以

                 /MOUNT_POINT: 挂载点不需与父卷在相同目录下

            例如:mount -o subvol=subdir  /dev/sdc  /mnt/test

        查看子卷的详细信息:

            show:查看给定子卷的详细信息

            btrfs subvolume show /SUB_MOUNT_POINT

            例如:btrfs subvolume show /mnt/test

        删除子卷:删除子卷后,子卷上的数据就不能访问了

            前提是要挂载父卷之后,才能删除子卷

            例如:btrfs subvolume delete  /testdir/btrfstest/subdir

        对子卷创建快照:

            创建快照卷的时候,需要快照卷与子卷在同一个父卷下

            例如:btrfs subvolume snapshot  /testdir/btrfstest/subdir  /testdir/btrfstest/subdir_snapshot

                表示对/testdir/btrfstest/subdir,也就是subdir子卷,创建一个名为subdir_snapshot的快照卷

        当备份完成后,就可以删除快照卷了

            btrfs subvolume delete /testdir/btrfstest/subdir_snapshot

    9、在btrfs文件系统上,对单个文件创建快照

        创建的位置最好在当前卷下属的某个路径上

        例如:卷下有个文件是test.txt,对该文件创建快照

            cp –reflink test.txt  test.txt_snap

    10、如何将ext4或ext3文件系统转换成btrfs(不影响原有数据的情况下)

        <1>先将需要转的ext文件系统umount,假设为/dev/sdc1

        <2>强制检查文件系统,fsck -f  /dev/sdc1

        <3>转换btrfs-convert /dev/sdc1

        <4>然后就可以利用 btrfs filesystem show来查看是否已经转换成功

        <5>最后,正常进行挂载使用  mount /dev/sdc1  /test

        <6>正常使用原有文件

    11、将转换后的btrfs再换回ext4文件系统

        btrfs-convert -r  /dev/sdc1

        再挂载,即可使用

第七章    高级磁盘管理实战演练

    1、写一个脚本,完成如下功能:
        (1) 列出当前系统识别到的所有磁盘设备
        (2) 如磁盘数量为1,则显示其空间使用信息
        否则,则显示最后一个磁盘上的空间使用信息

    #!/bin/bash    
    # Autor: nwc
    # Version: 2.0
    # CreateTime: 2016-08-24
    # Description: 
    
    disks=(`lsblk|grep -o "^sd[a-z]"|sort`)
    echo -e "\033[35msystem disk list is : ${disks[@]}\033[0m"
    i=$[${#disks[@]}-1]
    fdisk -l /dev/${disks[$i]}

    执行效果如下:

    blob.png  

    2、创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录

        步骤:

        <1>fdisk创建三个大小为1G的分区,修改分区类型为fd,过程略过,结果如下

    blob.png

        <2>利用mdadm -C /dev/md2 -n 2 -x 1 -l 1 -a yes /dev/sd{b,c,d}1

    blob.png

    blob.png

        <3>导出raid配置文件

    blob.png

        <4>格式化创建文件系统

    blob.png

        <5>挂载,写入/etc/fstab,注意要使用blkid看到的UUID进行挂载

    111.png

    3、创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录

        步骤:

        <1>fdisk创建3个1G的磁盘,更改分区格式为fd,过程略过,效果如下:

    blob.png

        <2>mdadm -C /dev/md5 -n 3 -l 5 -c 256 -a yes /dev/sd{b,c,d}1  创建raid设备

    blob.png

        <3>导出raid的配置文件,放置系统重启或停止raid后重载raid时无法识别

    blob.png 

        <4>格式化文件系统

    blob.png

        <5>编辑开机自动挂载配置文件,实现自动挂载,注意用blkid识别到的UUID进行挂载

    blob.png

    

    4、创建和扩展逻辑卷

        环境:centos6.8,利用sdb1和sdc一个分区,一个完成的磁盘组建pv

        步骤:

        <1>利用fdisk对sdb进行分区,将分区类型改为8e

    blob.png

        <2>创建pv

    blob.png

        <3>创建vg

    blob.png

        <4>创建lv

    blob.png

        <5>格式化创建文件系统

    blob.png

        <6>挂载使用

    blob.png

        <7>扩展逻辑卷(支持在线扩展,确保vg里面有空间供lv扩展,否则就要加pv,扩展vg再扩展lv)

            先扩展逻辑卷大小

    blob.png

            再扩展逻辑卷上文件系统大小

    blob.png

        

    5、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录

    [root@localhost ~]# lsblk    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0     11:0    1 1024M  0 rom  
    sdb      8:16   0   20G  0 disk 
    └─sdb1   8:17   0    5G  0 part 
    sda      8:0    0   20G  0 disk 
    ├─sda1   8:1    0  200M  0 part /boot
    ├─sda2   8:2    0    2G  0 part /home
    ├─sda3   8:3    0    2G  0 part /var
    ├─sda4   8:4    0    1K  0 part 
    ├─sda5   8:5    0 1000M  0 part [SWAP]
    └─sda6   8:6    0 14.9G  0 part /
    sdd      8:48   0   10G  0 disk 
    sdc      8:32   0   10G  0 disk 
    sde      8:64   0   10G  0 disk 
    [root@localhost ~]# 
    [root@localhost ~]# pvcreate /dev/sd{c,d}   //利用sdc、sdd两块磁盘做pv,如果用分区,需要改分区类型为8e
      Physical volume "/dev/sdc" successfully created
      Physical volume "/dev/sdd" successfully created
    [root@localhost ~]# pvs
      PV         VG   Fmt  Attr PSize  PFree 
      /dev/sdc        lvm2 ---- 10.00g 10.00g
      /dev/sdd        lvm2 ---- 10.00g 10.00g
    [root@localhost ~]# vgcreate -s 16M testvg /dev/sdc /dev/sdd   //创建vg,指定PE大小为16M
      Volume group "testvg" successfully created
    [root@localhost ~]# vgs
      VG     #PV #LV #SN Attr   VSize  VFree 
      testvg   2   0   0 wz--n- 19.97g 19.97g
    [root@localhost ~]# vgdisplay 
      --- Volume group ---
      VG Name               testvg
      System ID             
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  2
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                1
      Open LV               1
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               19.97 GiB
      PE Size               16.00 MiB
      Total PE              1278
      Alloc PE / Size       320 / 5.00 GiB
      Free  PE / Size       958 / 14.97 GiB
      VG UUID               K2QPzO-Vp6T-DeIV-PWqS-9soO-uSKA-ooc9eN
    [root@localhost ~]# lvcreate -L 5G -n testlv testvg   //创建lv,大小为5G
      Logical volume "testlv" created.
    [root@localhost ~]# lvs
      LV     VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      testlv testvg -wi-a----- 5.00g                                                    
    [root@localhost ~]# mkdir /testdir/users
    [root@localhost ~]# mke2fs -t ext4 -L "TESTLV" /dev/testvg/testlv     //格式化lv创建文件系统
    mke2fs 1.41.12 (17-May-2010)
    文件系统标签=TESTLV
    操作系统:Linux
    块大小=4096 (log=2)
    分块大小=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    327680 inodes, 1310720 blocks
    65536 blocks (5.00%) reserved for the super user
    第一个数据块=0
    Maximum filesystem blocks=1342177280
    40 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
    	32768, 98304, 163840, 229376, 294912, 819200, 884736
    
    正在写入inode表: 完成                            
    Creating journal (32768 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成
    
    This filesystem will be automatically checked every 21 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    [root@localhost ~]# mount /dev/testvg/testlv /testdir/users/       //挂载
    [root@localhost ~]# df -h      //验证是否挂载成功
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda6              15G  2.9G   11G  21% /
    tmpfs                 491M     0  491M   0% /dev/shm
    /dev/sda1             190M   33M  147M  19% /boot
    /dev/sda2             1.9G   62M  1.8G   4% /home
    /dev/sda3             1.9G  191M  1.7G  11% /var
    /dev/mapper/testvg-testlv
                          4.8G   10M  4.6G   1% /testdir/users
    [root@localhost ~]#

    6、新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录

    [root@localhost ~]# useradd archlinux -d /testdir/users/archlinux     //创建用户,指定家目录
    [root@localhost ~]# tail -1 /etc/passwd
    archlinux:x:516:4336::/testdir/users/archlinux:/bin/bash
    [root@localhost ~]# su - archlinux
    [archlinux@localhost ~]$ cp -r /etc/pam.d .
    [archlinux@localhost ~]$ ls
    pam.d
    [archlinux@localhost ~]$ ls -a
    .  ..  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [archlinux@localhost ~]$

    7、扩展testlv至7G,要求archlinux用户的文件不能丢失

    [root@localhost ~]# lvextend -L 7G /dev/testvg/testlv      //扩展lv大小
      Size of logical volume testvg/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).
      Logical volume testlv successfully resized.
    [root@localhost ~]# resize2fs /dev/testvg/testlv    //扩展文件系统大小
    resize2fs 1.41.12 (17-May-2010)
    Filesystem at /dev/testvg/testlv is mounted on /testdir/users; on-line resizing required
    old desc_blocks = 1, new_desc_blocks = 1
    Performing an on-line resize of /dev/testvg/testlv to 1835008 (4k) blocks.
    The filesystem on /dev/testvg/testlv is now 1835008 blocks long.
    
    [root@localhost ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda6              15G  2.9G   11G  21% /
    tmpfs                 491M     0  491M   0% /dev/shm
    /dev/sda1             190M   33M  147M  19% /boot
    /dev/sda2             1.9G   62M  1.8G   4% /home
    /dev/sda3             1.9G  191M  1.7G  11% /var
    /dev/mapper/testvg-testlv
                          6.8G   12M  6.5G   1% /testdir/users
    [root@localhost ~]# su - archlinux    //验证文件是否被破坏
    [archlinux@localhost ~]$ ls -a
    .   .bash_history  .bash_profile  .gnome2
    ..  .bash_logout   .bashrc        pam.d
    [archlinux@localhost ~]$

    8、收缩testlv至3G,要求archlinux用户的文件不能丢失

    [root@localhost ~]# du -sh /testdir/users/   //验证挂载目录的大小是否小于希望缩减到的大小
    192K	/testdir/users/
    [root@localhost ~]# cp -a /testdir/users/ /backup/           //缩减lv时,建议先将lv里面的内容进行备份
    [root@localhost ~]# ls -a /backup/users/archlinux/
    .   .bash_history  .bash_profile  .gnome2
    ..  .bash_logout   .bashrc        pam.d
    [root@localhost ~]# umount /dev/testvg/testlv          //卸载,缩减lv必须先卸载
    [root@localhost ~]# fsck -f /dev/testvg/testlv         //强制检查,缩减lv必须强制检查文件系统
    fsck from util-linux-ng 2.17.2
    e2fsck 1.41.12 (17-May-2010)
    第一步: 检查inode,块,和大小
    第二步: 检查目录结构
    第3步: 检查目录连接性
    Pass 4: Checking reference counts
    第5步: 检查簇概要信息
    TESTLV: 59/458752 files (0.0% non-contiguous), 64490/1835008 blocks
    [root@localhost ~]# resize2fs /dev/testvg/testlv 3G                 //缩减文件系统大小
    resize2fs 1.41.12 (17-May-2010)
    Resizing the filesystem on /dev/testvg/testlv to 786432 (4k) blocks.
    The filesystem on /dev/testvg/testlv is now 786432 blocks long.
    
    [root@localhost ~]# lvreduce -L 3G /dev/testvg/testlv              //缩减lv大小
      WARNING: Reducing active logical volume to 3.00 GiB.
      THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce testvg/testlv? [y/n]: y
      Size of logical volume testvg/testlv changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents).
      Logical volume testlv successfully resized.
    [root@localhost ~]# mount /dev/testvg/testlv /testdir/users/          //重新挂载
    [root@localhost ~]# su - archlinux
    [archlinux@localhost ~]$ ls -a                 //验证文件是否被损坏
    .   .bash_history  .bash_profile  .gnome2
    ..  .bash_logout   .bashrc        pam.d
    [archlinux@localhost ~]$

    9、对testlv创建快照,并尝试基于快照备份数据,验正快照的功能

    [root@localhost ~]# lvcreate -L 500M -s -n testlv_snap -p r /dev/testvg/testlv      //创建快照卷
      Rounding up size to full physical extent 512.00 MiB
      Logical volume "testlv_snap" created.
    [root@localhost ~]# lvdisplay /dev/testvg/testlv_snap    //查看快照卷详情
      --- Logical volume ---
      LV Path                /dev/testvg/testlv_snap
      LV Name                testlv_snap
      VG Name                testvg
      LV UUID                tuewoS-utZq-tIfv-KOLn-hhbl-g847-VIgcu3
      LV Write Access        read only
      LV Creation host, time localhost.localdomain, 2016-08-31 14:14:36 +0800
      LV snapshot status     active destination for testlv
      LV Status              available
      # open                 0
      LV Size                3.00 GiB
      Current LE             192
      COW-table size         512.00 MiB
      COW-table LE           32
      Allocated to snapshot  0.00%
      Snapshot chunk size    4.00 KiB
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:3
       
    [root@localhost ~]# mount /dev/testvg/testlv_snap  /backup/     //挂载快照卷,注意快照卷挂载时,不需要实现格式化
    mount: block device /dev/mapper/testvg-testlv_snap is write-protected, mounting read-only
    [root@localhost ~]# ls -a /testdir/users/archlinux/       //验证初始时快照卷与原卷内容
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [root@localhost ~]# ls -a /backup/archlinux/
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [root@localhost ~]# rm -rf /testdir/users/archlinux/pam.d/      //破坏原卷内容,验证快照卷是否发生变化
    [root@localhost ~]# ls -a /testdir/users/archlinux/
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2
    [root@localhost ~]# ls -a /backup/archlinux/
    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .gnome2  pam.d
    [root@localhost ~]#

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/41824

(2)
上一篇 2016-08-30 15:18
下一篇 2016-08-30 15:48

相关推荐

  • sed&awk

    Evernote Export 1、总结sed和awk的详细用法; awk Linux文本处理工具三剑客:grep、sed和awk。其中grep是一种文本过滤工具,sed是文本编辑器,而awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示。 在Linux之上我们使用的是GNU a…

    Linux干货 2017-01-05
  • httpd功能配置之访问控制

       httpd服务可以实现对资源访问控制,可以根据IP地址和用户两种方式进行控制。    一、用户认证控制      1、在站点根目录下创建一个目录及一个页面文件      2、修改/var/httpd/conf/httpd.conf文件   &n…

    Linux干货 2016-03-11
  • 总考十分的学习宣言

    目标:按照学习线路图完成所有视频的学习,完成每一次的博客作业及云学堂考试,成功转型互联网运维。 宣言:我一定要转型互联网运维工程师,并在这个领域不断坚持耕耘下去,成为行业的专家,拿高薪,挣so much money,可以有钱去看看世界,去台湾环岛,去日本爬天空树,去北欧看极光,去南极看企鹅,去看盐湖和大象,去非洲看动物迁徙。一生的时间是有限的,在有限的时间里…

    Linux干货 2016-10-24
  • N25第四周总结(lvm)

    lvm 详解 大纲:    1、什么是lvm     2、为什么要使用lvm     3、如何实现lvm     4、lvm各项命令详解   1、什么是lvm:        lmv (Logical Volume Manager…

    Linux干货 2016-12-22
  • N26-第五周作业-邢岩

    马哥门徒-N26-邢岩    我要继续今天的博客,《一万小时天才理论》里提到了髓鞘质,我是不是正在慢慢的给自己包裹一层髓鞘质呢?如果还没有,那么继续吧。    第一题:显示当前系统上root、fedora或user1用户的默认shell。      ~]# grep -E &#8…

    2017-02-24
  • 从shell眼中看世界–展开和引用

    这篇博客的目的在于加深对于展开和引用的理解,阐释展开和引用之间联系。 ‘ ‘ :强引用,其中的变量引用不会被替换为变量值,而保持原字符串       ” “:弱引用,其中的变量引用会被替换为变量值    如果之前对于’ …

    Linux干货 2017-04-16

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-01 12:17

    文章对当天所学的知识进行了详细的总结与梳理,通过练习巩固了学到的东西,整篇博客能让人看到很多专业性所在,也能看出很用心的地方,革命尚未成功,同志仍需努力啊,加油!