我们从一个新硬盘安装到Linux系统,期间的配置,一直到正常使用的角度,来学习磁盘存储和文件系统,过程如下:
选择分区类型(MBR或GPT)-->创建分区-->同步分区-->创建文件系统-->文件系统检测和修复-->挂载-->虚拟内存的使用-->RAID的使用-->LVM的管理
分区的类型有两种:MBR和GPT
MBR分区结构
  
GPT分区结构
  
  
- 我们首先选择分区的类型是MBR和GPT,根据命令fdisk(新建、管理MBR分区)、gdisk(新建、管理GPT分区)、parted(新建、管理MBR和GPT分区)创建分区。
 - parted在硬盘上新建分区,实时(马上)生效;fdisk和gdisk在内存中新建分区,不会实时生效,确定保存后才会生效,常用这两个命令。
 
两个命令的选项参数一样,就是命令的书写不一样
fdisk 设备名<-->gdisk 设备名
parted的操作都是实时生效的,小心使用
用法:parted [选项]... [设备 [命令 [参数]...]...]
1)指定设备/dev/sdb分区类型是gpt或msdos(MBR)  
parted /dev/sdb mklabel gpt|msdos-->"mklabel"  
2)显示分区表  
parted /dev/sdb print-->"print"  
3)新建(mkpart)主分区(primary),分区编号1,大小200M  
parted /dev/sdb mkpart primary 1 200 (默认M)  
4)删除分区编号是1的分区  
parted /dev/sdb rm 1  
5)列出分区信息  
parted –l  
真正有效的分区在内存上,但是分区表存放在磁盘上,所以需要两者同步一致
查看内存中的分区表:
lsblk  
ll /dev/sd*  
cat /proc/partitions
partprobe
创建分区后同步命令:partx -a 设备名  
删除分区后同名命令:partx -d --nr N-M(删除的分区编号) 设备名
新建分区后我们需要格式化,就是创建文件系统。
ls /lib/modules/`uname –r`/kernel/fs
用户输入的命令,在文件系统上执行,并不是直接作用在文件系统,而是执行在Linux的虚拟文件系统VFS(图中:Virutal file system),VFS通过真正的文件系统执行命令,这里只是简单介绍。
  
CentOS6常用ext4文件系统;CentOS7常用xfs文件系统。
创建文件系统有两种方法:
方法一(常用):  mkfs.文件系统类型 设备名  
方法二(很少用):  mkfs -t 文件系统类型 设备名  mkfs -L 卷标名 设备名-->卷标名最好和挂载点的名称一样  
检测文件系统是否创建成功  
后面有命令会说到,但这里记录一个,使用二进制命令查看文件系统是否创建成功。  hexdump -C 设备名-->查看分区是否有数据(全是0表示没数据,里面都是二进制数。)
因为ext系列的文件系统是老牌的文件系统,所以它有很丰富的命令支持各种功能,所以它有自己的命令工具,就是mke2fs。
mke2fs:ext系列文件系统专用管理工具
我们新装的系统,每个分区都能给文件或目录设置ACL,但是在已有的系统中,CentOS6新建的分区默认没有ACL功能,CentOS7默认有。那么给CentOS6新建的分区添加ACL功能如下:
1.在CentOS6新建分区,创建文件系统后,查看文件系统的属性:  
tune2fs -l 设备名  
会看到:“Default mount options: 为空”  
2.空表示该分区的文件系统没有开启acl功能,开启命令如下:  
tune2fs -o acl 设备名    
3.接着卸载该分区挂载点,在重新挂载,然后使用查看命令查看,就会看到:“Default mount options:  acl”  
4.有时候会删除一个分区的acl功能,删除命令如下:  
tune2fs -o ^acl 设备名  
新建ext4文件系统后,把分区进行挂载,进入到挂载目录会看到名为“lost+found”的文件夹,这个文件夹里存放分区之前的文件,或是被覆盖的文件。因为Centos7是xfs文件系统,所以没有此文件夹。
tune2fs -l 设备名查看文件系统,其中“Filesystem state:         clean”反应了分区是否干净,即文件系统是否有故障或错误。“clean”表示干净。  
不能再挂载状态下修复
(1).修复命令:  
fsck -y 设备名  
或fsck.补全 设备名  
或fsck -t(文件系统) -p(自动修复) -r(交互修复) 设备名  
(2).ext系列的文件系统有自己的修复工具:  
ezfsck -y(自动回答yes) -f(强制修复)  
练习题  
查找设备列表/etc/fstab中分区名对应的设备名  
思路:blkid -U "UUID"  
命令:blkid -U sed -rn ‘/\/data/s#^.*=(.*) /data.*$#\/#p‘ /etc/fstab  
(1)挂载:mount 设备名或UUID 挂载点
(2)取消挂载:umount 挂载点
(3)强制取消挂载:有时候我们要取消挂载,但因为用户正在挂载目录,所以要用到强制取消挂载。  
方法一:杀进程。查看进程(lsof 挂载点),杀掉。  
方法二:  
查看挂载点:fuser -v 挂载点  
强杀挂载点:fuser -km 挂载点    
(4)挂载选项
想要永久挂载,就要修改/etc/fstab文件。
/etc/fstab每行定义一个要挂载的文件系统
  
1)要挂载的设备或伪文件系统
2)挂载点  
挂载点最好是空目录  
3)文件系统类型  
ext4,xfs,iso9660,nfs,none  
4)挂载选项  
常用的挂载选项:  
defaults , acl , bind  
其它挂载选项:(这些选项也能用作临时挂载,就是添加“-o 选项”)
(5)转储频率  
0:不做备份 1:每天转储 2:每隔一天转储  
(6)fsck检查的文件系统的顺序:允许的数字是0 1 2  
0:不自检  
1:首先自检;一般只有rootfs才用  
2:非rootfs使用  
有时候挂载分区"mount -a(挂载新分区)"没用,试试"mount -o remount 挂载点(从新挂载)"
创建好挂载点后,打开/etc/fstab文件进行挂载,格式如下:  
UUID   挂载点   文件系统类型   defaults 0 0  
之后退出文件,使用“mount -a”挂载,之后查看挂载(df)
创建好挂载点后,打开/etc/fstab文件进行挂载,格式如下:  
UUID   挂载点   文件系统类型   acl 0 0  
之后退出文件,使用“mount -a”或“mount -o remount 挂载点”挂载,之后查看挂载(df)
创建好挂载点后,打开/etc/fstab文件进行挂载,格式如下:  
目录   挂载点   none(表示没有文件系统类型)   bind 0 0  
(临时挂载命令是:mount 目录 挂载点 -B --bind)
之后退出文件,使用“mount -a”挂载,  
之后查看挂载(df或mount),注意显示的是分区,但确实挂载成功,可以查看挂载点和目录的内容,如果一致表示目录挂载目录成功。
查看文件类型:file 文件绝对路径  
把光盘文件挂载到目录,首先创建挂载点(即目录),在/etc/fstab文件里写入一行:  
文件绝对路径 挂载点 iso9660 loop 0 0  
(CentOS6临时挂载:mount -o loop /data/centos6.iso 挂载点)  
(CentOS7临时挂载:mount /data/centos7.iso 挂载点)  
查看:"losetup"和“df”  
方法一:findmnt 挂载点(例如:findmnt /mnt/sda1)  
有时候挂载设备太多不容易看到,可以用方法二。
方法二:  
findmnt 挂载点的上一目录(例如:findmnt /mnt)  
echo $?  
“0”表示成功,“非0”表示失败  
虚拟化技术基础:loop设备文件和稀疏文件
示例:我们把CentOS7的一个文件当U盘用。首先在这个文件里创建很多文件,然后把这个文件放到CentOS6系统里,挂载这个文件,然后查看挂载目录,是否有那些文件。  
(1).创建文件data.img  
dd if=/dev/zero of=/data/data.img bs=1M count=100  
(2).给文件创建文件系统  
mkfs.ext4 /data/data.img  
(3).查看文件的文件系统  
blkid /data/data.img  
(4).创建挂载点  
mkdir /mnt/disk  
(5).挂载  
1)CentOS7挂载:mount /data/data.img /mnt/disk  
2)CentOS6挂载:mount -o loop /data/data.img /mnt/disk  
注释:当一个文件f1挂载到另一个文件f2,系统会分配一个loop设备名关联此文件(f1),然后利用loop名进行挂载。  
(6).复制文件data.img到CentOS6系统  
(7).创建挂载点:mkdir /mnt/disk6  
(8).在CentOS6挂载  
挂载:mount -o loop /data/data.img /mnt/disk6  
查看:ls /mnt/disk6  
卸载挂载点:umount /mnt/disk6  
(9)删除设备关联(CentOS6,7都删):  
losetup -d /dev/loopx(“loopx”中x是什么需要查看命令"losetup -a"去获取)  
稀疏文件的特点是,查看文件大小和查看文件占空间的大小不一样,像VM虚拟机一样,实际创建的系统大小是1G,但你可以当8G的用。稀疏文件用作虚拟化技术。
查看稀疏文件实际大小:ll -h 文件名  
查看稀疏文件占空间的大小:df -sh 文件名或df 文件所在目录  
dd if=dev/zero of=bigfile bs=1M count=1024 seek=2048  
注释:创建稀疏文件bigfile,大小是3072M,其中2048M为空内容(可留在以后添加内容)  
CentOS6:
第一步:模拟错误的挂载文件  
UUID(故意写错一位) 挂载点 ext4 defaults 0 3  
第二步:重启系统会看到系统错误,进不了系统,让输入root用户的密码  
第三步:输入密码后,查看/etc/fstab挂载文件发现UUID写错一位,这时修改发现无法保存,用“mount”查看分区有“rw”权限,但文件就是无法保存,其实当前是只读模式  
第四步:修改根目录“/”只读模式为读写模式"mount -o remount,rw /"  
第五步:修改/etc/fstab挂载配置文件,保存成功(修改错误有两种方式可以让系统重新启动,第一种就是把UUID写对;第二种是把“3”改为“0”,这项是检查系统错误的,如果改为“0”表示不检查)  
第六步:重启,系统成功启动(如果是改数字的方式,也会成功启动,但在字符界面会看到红色的错误,记得最后把UUID改回)  
CentOS7:
第一步:模拟错误的挂载文件  
UUID(故意写错一位) 挂载点 ext4 defaults 0 0  
第二步:重启系统会看到系统错误,进不了系统,让你等1分钟左右检查错误  
第三步:检查完后让输入管理员密码,就能进入字符系统,直接进入/etc/fstab文件修改错误,保存后重启,会看到系统成功启动。  
第四步:注意这里和Centos6有区别,Centos7直接就有修改文件的权限。
SWAP分区的作用:暂时缓解内存不够用
当我们执行程序时,如果内存资源耗尽,在执行程序时会提示内存不足,这时可以借助SWAP空间当做暂时的内存空间使用,所以:“系统内存最大容量=内存容量+SWAP容量”。其实SWAP容量是磁盘的容量,我们在装系统,划分分区时会创建SWAP分区,分区容量最好是当前内存(当前内存不超过4G)的1.5-2倍,最大(当前内存超过4G)不超过8G或16G,SWAP分区的读写速度并没有内存那么快,查看SWAP分区和内存的容量使用“free -h”命令。
(1)把SWAP分区放到高速硬盘上,例如固态硬盘(强烈推荐)  
(2)因为机械硬盘同一时间指针的角速度不变,而机械硬盘同一磁道外侧扇区比内侧扇区存放数据多,划分分区是从外侧开始划分,所以把SWAP分区在新硬盘上划分为第一个分区,读写性能在这个硬盘上是最快的。附两张机械硬盘图,如下:  
  
  
SWAP分区可以有多个,创建SWAP分区如下:分两种格式
分区之间的修改其实是ID的修改,ID在fdisk(或gdisk)--->m--->t-->L 可看到
示例1:把GPT分区的sdc1分区修改为SWAP分区
1)卸载挂载点:  umount 挂载点  
2)使用GPT分区工具:  gdisk /dev/sdc  
3)查看分区:  p
4)查看指定ID的子命令:  m  
5)指定分区的ID:  t  
6)选择分区编号:  1  
7)显示ID类型:   L  
8)输入ID:       8200  
9)查看分区:      p  
10)保存退出:    w  
11)创建SWAP分区的文件系统: mkswap /dev/sdc1   
12)查看:       blkid  
13)在/etc/fstab挂载:  
UUID swap swap  defaults 0 0  
14)使挂载生效:   swapon -a  
15)查看swap容量: free -h  
16)详细查看swap分区: cat /proc/swaps或者swapon -s  
注意,Prionity是优先级的意思,数字越大,优先级越高。从性能的角度,应该先使用读写速度快的swap分区,所以要把那个分区的优先级调高。  
17)调整swap分区的优先级:修改/etc/fstab  
UUID swap swap pri=6(范围是0-32767,数越大优先级越高) 0 0  
18)禁用修改的swap分区:swapoff /dev/sdc1  
19)查看是否禁用swap分区:cat /proc/swaps或者swapon -s  
20)启用修改的swap分区:swapon -a  
21)查看swap分区优先级是否生效:cat /proc/swaps或者swapon -s  
22)删除swap分区:  先禁用swapoff /dev/sdc1然后把/etc/fstab文件里/dev/sdc1对应的那行删掉,最后删除分区。
示例2:把MBR分区的sdd1分区修改为SWAP分区
1)卸载挂载点:  umount 挂载点  
2)使用GPT分区工具:  fdisk /dev/sdd  
3)查看分区:  p
4)查看指定ID的子命令:  m  
5)指定分区的ID:  t  
6)选择分区编号:  1  
7)显示ID类型:   L  
8)输入ID:       82  
9)查看分区:      p  
10)保存退出:    w  
11)创建SWAP分区的文件系统:   mkswap /dev/sdd1  
12)查看:       blkid  
13)在/etc/fstab挂载:  
UUID swap swap  defaults 0 0
14)使挂载生效:   swapon -a  
15)查看swap容量: free -h  
16)详细查看swap分区: cat /proc/swaps  
注意,Prionity是优先级的意思,数字越大,优先级越高。从性能的角度,应该先使用读写速度快的swap分区,所以要把那个分区的优先级调高。  
17)调整swap分区的优先级:修改/etc/fstab  
UUID swap swap pri=6(范围是0-32767,数越大优先级越高) 0 0  
18)禁用修改的swap分区:swapoff /dev/sdd1  
19)查看是否禁用swap分区:cat /proc/swaps  
20)启用修改的swap分区:swapon -a  
21)查看swap分区优先级是否生效:cat /proc/swaps  
22)删除swap分区:  先禁用swapoff /dev/sdd1然后把/etc/fstab文件里/dev/sdd1对应的那行删掉,最后删除分区。
示例3:使用文件当做SWAP分区
有时候电脑不能创建新分区,并且现有的分区不能更改为swap分区,但我们又需要swap为内存做缓存,这时可以用一个文件当做swap分区,Windows系统类似swap功能的就是一个文件。步骤如下:
1)创建fileswap文件大小2G
dd if=/dev/zero of=/fileswap(文件名) bs=1M count=2048  
2)格式化为swap文件系统  
mkswap /fileswap  
3)挂载  
UUID swap swap defaults 0 0  
4)使挂载生效  
swapon -a  
生效的同时会提醒权限警告,如果都有看的权限,普通用户通过二进制查看方式(hexdump -C /fileswap)可以看到文件里的内容,所以下一步要修改文件的权限  
5)修改文件权限  
chmod 600 /fileswap  
6)查看swap: cat /proc/swaps或者swapon -s
注意:U盘格式必须是NTFS32文件系统格式。如果是NTFS文件系统,Linux不支持。
挂载在/run/media/<user>/<label>  推荐系统 swap 空间
  
df [OPTION]... [FILE]...
du [OPTION]... DIR
dd作用:转换和复制文件
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
conv=conversion[,conversion...] 用指定的参数转换文件
示例1:把/etc/fstab文件里的小写字母转换为大写,生成为文件/data/daxie  dd if=/etc/fstab of=/data/daxie conv=ucase  
示例2:用dd创建的的文件写到磁盘上,而不是内存里
dd创建一个很大的文件一下就创建完了,其实她在创建在内存里,而不是磁盘上,所以断电后这个文件如果后台没有真正创建完,就会损坏。那么如何让dd命令创建的文件直接保存在磁盘上呢,而不是默认的内存里呢?其实加“fdatasync”就行。如下:  dd if=/dev/zero of=/data/f1 bs=1M count=100 conv=fdatasync  
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1  
有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下:  dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc  
将本地的/dev/sdx整盘备份到/dev/sdy  dd if=/dev/sdx of=/dev/sdy  
将/dev/sdx全盘数据备份到指定路径的image文件  dd if=/dev/sdx of=/path/to/image  
备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径  dd if=/dev/sdx | gzip >/path/to/image.gz  
将备份文件恢复到指定盘  dd if=/path/to/image of=/dev/sdx  
将压缩的备份文件恢复到指定盘  gzip -dc /path/to/image.gz | dd of=/dev/sdx  
1)拷贝内存资料到硬盘  
将内存里的数据拷贝到root目录下的mem.bin文件dd if=/dev/mem of=/root/mem.bin bs=1024  
2)从光盘拷贝iso镜像  
拷贝光盘数据到root文件夹下,并保存为cd.iso文件  dd if=/dev/cdrom of=/root/cd.iso  
3)销毁磁盘数据  
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行  dd if=/dev/urandom of=/dev/sda1  
4)得到最恰当的block size(块设备大小)  
通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size(块设备)大小  dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000  dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000  dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000  
测试硬盘写速度:  dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000  
测试硬盘读速度:  dd if=/root/1Gb.file bs=64k | dd of=/dev/null
说明:用dd创建的的文件写到磁盘上,而不是内存里  
dd创建一个很大的文件一下就创建完了,其实她在创建在内存里,而不是磁盘上,所以断电后这个文件如果后台没有真正创建完,就会损坏。那么如何让dd命令创建的文件直接保存在磁盘上呢,而不是默认的内存里呢?其实加“fdatasync”就行。如下:  
dd if=/dev/zero of=/data/f1 bs=1M count=100 conv=fdatasync
RAID-0:条带卷,strip
RAID-1:镜像卷,mirror
RAID-2
省略
RAID-5
RAID-6
RAID-10
RAID-01
常用的RAID有RAID-1、RAID-5、RAID-10  
企业常用硬件RAID,软RAID用于测试环境  
  将一个分区或硬盘变成逻辑卷,过程是:
第一步:将分区和硬盘变成物理卷
第二步:将物理卷变成卷组
第三步:卷组从卷组划分出若干逻辑卷
第四步:将逻辑卷创建文件系统(格式化)
第五步:创建挂载点,挂载(即修改/etc/fstab文件)
pvcreate /dev/DEVICE  pvremove /dev/DEVICE  使用帮助:pvcreate --help
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]  vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]  vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]  使用帮助:vgcreate --help
使用帮助:lvcreate --help
示例:使用分区/dev/sdc1和硬盘/dev/sdd创建一个逻辑卷,名为mysql
1)分区要变成逻辑卷,首先卸载挂载,其次把分区ID变为逻辑卷的ID;硬盘不用。  
2)把分区和硬盘加入物理卷,可一次指定多个分区加入物理卷  
  pvcreate 设备名(分区名)  
  pvcreate /dev/sdc1 /dev/sdd  
  pvs(查看物理卷)  
3)创建卷组  
  vgcrte 卷组名 要加入的物理卷 
  vgcreate vg0 /dev/sdc1 /dev/sdd  
  vgs(查看卷组)  
4)创建逻辑卷  
  lvcreate -n 逻辑卷名 -L 逻辑卷大小 卷组  
  lvcreate -n mysql -L 4G vg0  
  lvs(查看逻辑卷)  
  注意你看到的逻辑卷名/dev/vg0/mysql其实是一个软连接,可通过“ll /dev/vg0/mysql”查看到真名是“dm-数字”,但其实这个真名还有一个软连接“/dev/mapper/vg0-mysql”。所以当你格式化分区后在"/etc/fstab"查看设备会有两种情况,要不逻辑卷叫“/dev/vg0/mysql”,或者叫“/dev/mapper/vg0-mysql”。  
5)给逻辑卷创建文件系统  
  mkfs.xfs /dev/vg0/mysql  
6) 创建挂载点,在/etc/fstab文件里进行挂载  
  UUID 挂载点 xfs defaults 0 0  
  (分享一个复制UUID的办法,在"vim /etc/fstab"后,输入“:r!blkid空格/dev/vg0/mysql(逻辑卷的绝对路径)”后回车就看到UUID出现在此文件里了)  
7) 重新加载分区:mount -a  
8) 查看逻辑卷是否挂载成功:df  
扩展:先扩展,在格式化(创建文件系统)逻辑卷
缩减:先格式化,在缩减逻辑卷
先扩展逻辑卷,在格式化(创建文件系统)逻辑卷
在线扩展:用户在使用该逻辑卷的时候,可以扩展逻辑卷,不用卸载挂载在扩展,扩展的过程对用户使用没有影响,也不会损坏文件
示例:在线扩展逻辑卷mysql,增加3个G
1)扩展:lvextend -L +3G /dev/vg0/mysql  
2)查看:df -hT  
这时你会看到逻辑卷mysql并没有扩大,是因为df命令查看的是"分区的文件系统"的大小,想看扩展后逻辑卷的大小需要在重新格式化逻辑卷  
3)格式化逻辑卷:(注意不同的文件系统格式化所用的命令不一样)  
4)查看逻辑卷是否扩展成功  
df -hT  
5)一条命令实现扩展逻辑卷并格式化文件系统(-r表示格式化,支持各种文件系统)  lvextend -r -L +100M /dev/vg0/mysql  
先格式化,在缩减逻辑卷(前提:逻辑卷处于离线状态,即卸载挂载点)
缩减前一定要备份
缩减会导致空间变小,所以会丢失数据xfs文件系统支持扩展,不支持缩减;
ext系列文件系统支持扩展和缩减文件系统,但只能离线缩减,不支持在线缩减。
示例:卸载逻辑卷/dev/vg0/binlog(文件系统是ext4)  
1)查看:df -hT  
2)卸载挂载点:umount /mnt/binlog  
3)检查文件系统错误  e2fsck -f /dev/vg0/binlog  
注释:如果你不执行检查文件系统错误的命令,直接格式化逻辑卷,会提示你先检查错误,并标明命令。
4)格式化逻辑卷  resize2fs /dev/vg0/binlog 1G  
注释:resize2fs默认是扩展的意思,加了大小就是缩减的意思了。  
5)缩减逻辑卷为1G大小  lvreduce -L 1G /dev/vg0/binlog  
6)重新挂载  mount -a  
7)查看:df -hT  
因为逻辑卷是由卷组分配出来的逻辑空间,而卷组的空间是无数个PE组成的(查看PE的大小及数量用“vgdisplay”或“pvdisplay”)。PE的空间又是普通的分区或硬盘给予的,所以在移动(迁移)逻辑卷的时候,把逻辑卷占用的所有的PE迁移到新电脑上就成功迁移了。
相当于对之前的命令做一个总结
示例:把家目录/home迁移到逻辑卷  
1.查看分区,找出能创建逻辑卷的空间
[root@centos7 ~]#  lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0  200G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
├─sda2           8:2    0  100G  0 part /
├─sda3           8:3    0   50G  0 part /data
├─sda4           8:4    0    1K  0 part 
└─sda5           8:5    0    3G  0 part [SWAP]
sdb              8:16   0   20G  0 disk 
├─sdb1           8:17   0    1G  0 part /mnt/sdb1
└─sdb2           8:18   0    2G  0 part 
  └─vg0-binlog 253:1    0    1G  0 lvm  /mnt/binlog
sdc              8:32   0   10G  0 disk 
└─sdc1           8:33   0    3G  0 part 
  └─vg0-mysql  253:0    0   23G  0 lvm  /mnt/mysql
sdd              8:48   0   20G  0 disk 
└─vg0-mysql    253:0    0   23G  0 lvm  /mnt/mysql
sr0             11:0    1   10G  0 rom  
[root@centos7 ~]#
从上面看到sdb和sdc还有空间,所以决定创建sdb3和sdc2,供逻辑卷使用 
2.fdisk -l
查看sdb和sdc的分区类型,使用对应的分区工具划分sdb3和sdc2
3.同步分区,查看是否创建出新分区
CentOS7上同步:partprobe
查看:lsblk
[root@centos7 ~]# lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0  200G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
├─sda2           8:2    0  100G  0 part /
├─sda3           8:3    0   50G  0 part /data
├─sda4           8:4    0    1K  0 part 
└─sda5           8:5    0    3G  0 part [SWAP]
sdb              8:16   0   20G  0 disk 
├─sdb1           8:17   0    1G  0 part /mnt/sdb1
├─sdb2           8:18   0    2G  0 part 
│ └─vg0-binlog 253:1    0    1G  0 lvm  /mnt/binlog
└─sdb3           8:19   0   17G  0 part 
sdc              8:32   0   10G  0 disk 
├─sdc1           8:33   0    3G  0 part 
│ └─vg0-mysql  253:0    0   23G  0 lvm  /mnt/mysql
└─sdc2           8:34   0    7G  0 part 
sdd              8:48   0   20G  0 disk 
└─vg0-mysql    253:0    0   23G  0 lvm  /mnt/mysql
sr0             11:0    1   10G  0 rom
4.把/dev/sdb3和/dev/sdc2加入物理卷  
[root@centos7 ~]# pvcreate /dev/sdb3 /dev/sdc2
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdc2" successfully created.
5.查看物理卷
[root@centos7 ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree   
  /dev/sdb2  vg0 lvm2 a--   <2.00g 1020.00m
  /dev/sdb3      lvm2 ---  <17.00g  <17.00g
  /dev/sdc1  vg0 lvm2 a--   <3.00g       0 
  /dev/sdc2      lvm2 ---   <7.00g   <7.00g
  /dev/sdd   vg0 lvm2 a--  <20.00g       0 
6.创建卷组vg1,并指定每个PE大小是16M,把sdb3加入卷组
[root@centos7 ~]# vgcreate -s 16M vg1 /dev/sdb3
  Volume group "vg1" successfully created
7.把sdc2加入卷组vg1
[root@centos7 ~]# vgextend vg1 /dev/sdc2
  Volume group "vg1" successfully extended
8.查看物理卷(vgs或者pvdisplay)
[root@centos7 ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree   
  /dev/sdb2  vg0 lvm2 a--   <2.00g 1020.00m
  /dev/sdb3  vg1 lvm2 a--   16.98g   16.98g
  /dev/sdc1  vg0 lvm2 a--   <3.00g       0 
  /dev/sdc2  vg1 lvm2 a--    6.98g    6.98g
  /dev/sdd   vg0 lvm2 a--  <20.00g       0 
[root@centos7 ~]# 
9.查看卷组(vgs或者vgdisplay)
[root@centos7 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree   
  vg0   3   2   0 wz--n- <24.99g 1020.00m
  vg1   2   0   0 wz--n- <23.97g  <23.97g
[root@centos7 ~]#
[root@centos7 ~]# vgdisplay 
    --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  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               <23.97 GiB
  PE Size               16.00 MiB
  Total PE              1534
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1534 / <23.97 GiB
  VG UUID               rQ4H68-jtLb-1WPf-GhOU-xdax-TO7p-eiF6AZ
[root@centos7 ~]#
10.创建逻辑卷home,分配卷组vg1的所有空间给逻辑卷home
[root@centos7 ~]# lvcreate -n home -l 100%free vg1
  Logical volume "home" created.
11.查看逻辑卷(注意查看逻辑卷的空间单位不再是PE,而是LE)
[root@centos7 ~]# lvdisplay /dev/vg1/home 
  --- Logical volume ---
  LV Path                /dev/vg1/home
  LV Name                home
  VG Name                vg1
  LV UUID                ufnLxD-1UqE-j0Uy-1QVH-pyAh-ZJt8-qvdRdi
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-30 17:17:03 +0800
  LV Status              available
  # open                 0
  LV Size                <23.97 GiB
  Current LE             1534
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
[root@centos7 ~]#
12.给逻辑卷/dev/vg1/home创建文件系统
[root@centos7 ~]# mkfs.xfs /dev/vg1/home 
meta-data=/dev/vg1/home          isize=512    agcount=4, agsize=1570816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=6283264, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3068, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
13.查看逻辑卷/dev/vg1/home设备名和UUID 
[root@centos7 ~]# blkid /dev/vg1/home
/dev/vg1/home: UUID="7bfd7b30-f670-4b04-9f0e-6df3cb364f3b" TYPE="xfs" 
14.因为挂载需要空目录去挂载,如果目录里有文件,挂载就会看不到原有的文件。想要把家目录迁移到逻辑卷,就是把逻辑卷的挂载点设置为家目录,可家目录里有很多文件该怎么办呢?需要把逻辑卷临时挂载,然后把家目录的文件复制过去,注意保留属性。之后清空家目录,在永久挂载逻辑卷,即编辑/etc/fstab。注意的是,因为一个设备(这里是逻辑卷)可以挂载多个目录,所以不用把临时挂载的挂载点卸载。挂载成功后使用普通用户登录,看是不是自己的家目录,如果是就表示成功迁移。
[root@centos7 ~]#mkdir /mnt/home
15.临时挂载
[root@centos7 ~]# mount /dev/vg1/home /mnt/home
16.查看家目录
[root@centos7 ~]# ls /home
niu  niubin
[root@centos7 ~]# ls /mnt/home
17.复制家目录内容并保留文件原来的属性和设置
[root@centos7 ~]# cp -a /home/. /mnt/home
18.查看复制到挂载点的文件的属性是否一致,还有家目录和挂载点的大小是否一致
[root@centos7 ~]# ls /mnt/home/
niu  niubin
[root@centos7 ~]# ll -a /home
total 0
drwxr-xr-x.  4 root root  31 Mar 17 03:45 .
dr-xr-xr-x. 19 root root 251 Mar 12 11:49 ..
drwx------.  5 niu  niu  159 Mar 17 03:47 niu
drwxr-xr-x.  2 root root  39 Mar 12 15:21 niubin
[root@centos7 ~]# ll -a /mnt/home/
total 0
drwxr-xr-x.  4 root root  31 Mar 17 03:45 .
drwxr-xr-x. 10 root root 102 Mar 30 17:27 ..
drwx------.  5 niu  niu  159 Mar 17 03:47 niu
drwxr-xr-x.  2 root root  39 Mar 12 15:21 niubin
[root@centos7 ~]# du -sh /home
36K /home
[root@centos7 ~]# du -sh /mnt/home
36K /mnt/home
[root@centos7 ~]#
19.删除家目录内的文件
[root@centos7 ~]# rm -rf /home/*
20.永久挂载,修改配置文件/etc/fstab
[root@centos7 ~]# blkid /dev/vg1/home
/dev/vg1/home: UUID="7bfd7b30-f670-4b04-9f0e-6df3cb364f3b" TYPE="xfs" 
[root@centos7 ~]# echo "UUID=7bfd7b30-f670-4b04-9f0e-6df3cb364f3b /mnt/home xfs defaults 0 0" >> /etc/fstab 
[root@centos7 ~]# mount -a
21.查看挂载
[root@centos7 ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/sda2               100G  3.6G   97G   4% /
devtmpfs                705M     0  705M   0% /dev
tmpfs                   721M     0  721M   0% /dev/shm
tmpfs                   721M   11M  711M   2% /run
tmpfs                   721M     0  721M   0% /sys/fs/cgroup
/dev/sdb1              1014M   33M  982M   4% /mnt/sdb1
/dev/sda3                50G   33M   50G   1% /data
/dev/sda1              1014M  164M  851M  17% /boot
/dev/mapper/vg0-mysql    23G   33M   23G   1% /mnt/mysql
/dev/mapper/vg0-binlog  976M  2.6M  911M   1% /mnt/binlog
tmpfs                   145M   12K  145M   1% /run/user/42
tmpfs                   145M     0  145M   0% /run/user/0
/dev/mapper/vg1-home     24G   33M   24G   1% /home
22.使用普通用户登录,查看刚进系统是不是自己的家目录  
[root@centos7 ~]# su - niu
Last login: Sun Mar 17 03:48:13 CST 2019 on pts/2
[niu@centos7 ~]$ pwd
/home/niu
[niu@centos7 ~]$
23.迁移成功
1)卸载挂载点
umount 挂载点
2)删除逻辑卷
lvremove 逻辑卷名1)为现有逻辑卷创建快照  lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data  
2)挂载快照  mkdir -p /mnt/snap  mount -o ro /dev/vg0/data-snapshot /mnt/snap  
3)恢复快照  umount /dev/vg0/data-snapshot  umount /dev/vg0/data  lvconvert --merge /dev/vg0/data-snapshot  
4)删除快照  umount /mnt/databackup  lvremove /dev/vg0/databackup  
创建快照
1.查看逻辑卷/dev/vg0/mysql
[root@centos7 ~]# lvdisplay /dev/vg0/mysql 
  --- Logical volume ---
  LV Path                /dev/vg0/mysql
  LV Name                mysql
  VG Name                vg0
  LV UUID                IGpiUg-OgXh-QFXA-ZwsV-WkvC-7ehq-nUNEVC
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-29 05:12:23 +0800
  LV Status              available
  # open                 1
  LV Size                22.99 GiB
  Current LE             5886
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
[root@centos7 ~]#
2.给逻辑卷/dev/vg0/mysql创建快照,前提逻辑卷的卷组要有足够的空间,快照名为“mysql_kuaizhao”,并指定大小100M。(“-s”表示创建快照;还可以加“-p r”,表示创建只读的快照,这样快照被挂载后,访问挂载点,里面的内容就不怕被改。)
[root@centos7 ~]# lvcreate -n mysql_kuaizhao -s -L 100M /dev/vg0/mysql
  Logical volume "mysql_kuaizhao" created.
3.使用lvdisplay查看/dev/vg0/mysql会看到,该逻辑卷有一个快照
[root@centos7 ~]# lvdisplay /dev/vg0/mysql
  --- Logical volume ---
  LV Path                /dev/vg0/mysql
  LV Name                mysql
  VG Name                vg0
  LV UUID                IGpiUg-OgXh-QFXA-ZwsV-WkvC-7ehq-nUNEVC
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-29 05:12:23 +0800
  ---------------------------------------------------------
  - LV snapshot status     source of                      -
  -                       mysql_kuaizhao [active]         -
  ---------------------------------------------------------
  LV Status              available
  # open                 1
  LV Size                22.99 GiB
  Current LE             5886
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
[root@centos7 ~]#
4.或者用lvs可以看到多出一个逻辑卷,并且“Attr”的第一个字符是s,表示快照
[root@centos7 ~]# lvs
  LV             VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  binlog         vg0 -wi-ao----   1.00g                                                    
  mysql          vg0 owi-aos---  22.99g                                                    
  mysql_kuaizhao vg0 swi-a-s--- 100.00m      mysql  0.02                                   
  home           vg1 -wi-ao---- <23.97g                                                    
[root@centos7 ~]#
5.查看设备blkid会看到逻辑卷/dev/vg0/mysql和它的快照的UUID相同
6.挂载快照
因为快照UUID与原逻辑卷的UUID一样,所以正常挂载会报错,xfs文件系统挂载需要加“-o nouuid”,意思是不检查UUID进行挂载,ext系列的文件系统不用加。建议在加“ro”,让快照的挂载目录无法被修改
[root@centos7 ~]# mkdir /mnt/mysql_kuaizhao 
[root@centos7 ~]# mount -o nouuid,ro /dev/vg0/mysql_kuaizhao /mnt/mysql_kuaizhao
7.查看挂载
[root@centos7 ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/sda2                       100G  3.6G   97G   4% /
···············
···············
/dev/mapper/vg0-mysql            23G   33M   23G   1% /mnt/mysql
/dev/mapper/vg1-home             24G   33M   24G   1% /home
/dev/mapper/vg0-binlog          976M  2.6M  911M   1% /mnt/binlog
···············
/dev/mapper/vg0-mysql_kuaizhao   23G   33M   23G   1% /mnt/mysql_kuaizhao
8.查看原逻辑卷和逻辑卷快照的挂载点内容
[root@centos7 ~]# ls /mnt/mysql
f1  f2
[root@centos7 ~]# ls /mnt/mysql_kuaizhao/
f1  f2
注意:虽然在快照的挂载点看到了逻辑卷的数据,但这些数据并不在快照里,而是在原来的逻辑卷里,只是显示一下。
恢复快照
以上面的逻辑卷及其快照为例,删除逻辑卷的f1文件,在查看快照的挂载点里f1依然存在,证明了快照的作用。现在要使用快照恢复逻辑卷f1文件。
1.使用快照恢复逻辑卷内容,先卸载该逻辑卷和快照的挂载点
umount /mnt/mysql
umount /mnt/mysql_kuaizhao
2.合并
lvconvert --merge /dev/vg0/mysql_kuaizhao
合并后,快照恢复数据后会自动删除
3.查看逻辑卷是否有快照(lvdisplay /dev/vg0/mysql),可以看到原来的快照信息消失了。
4.重新挂载,查看挂载,发现快照消失了
[root@centos7 ~]# mount -a
[root@centos7 ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/sda2               100G  3.6G   97G   4% /
devtmpfs                705M     0  705M   0% /dev
tmpfs                   721M     0  721M   0% /dev/shm
tmpfs                   721M   11M  711M   2% /run
tmpfs                   721M     0  721M   0% /sys/fs/cgroup
/dev/sdb1              1014M   33M  982M   4% /mnt/sdb1
/dev/sda3                50G   33M   50G   1% /data
/dev/sda1              1014M  164M  851M  17% /boot
/dev/mapper/vg1-home     24G   33M   24G   1% /home
/dev/mapper/vg0-binlog  976M  2.6M  911M   1% /mnt/binlog
tmpfs                   145M   12K  145M   1% /run/user/42
tmpfs                   145M     0  145M   0% /run/user/0
/dev/mapper/vg0-mysql    23G   33M   23G   1% /mnt/mysql
5.查看逻辑卷的挂载目录里,f1恢复成功
[root@centos7 ~]# ls /mnt/mysql
f1  f2
如果有一块磁盘闪烁黄灯,表示磁盘快坏了。但是该磁盘加入了物理卷,给逻辑卷提供了空间(即PE),把它拔出代表卷组和逻辑卷的一部分空间没了,如果有数据就会丢失。解决的办法是,把该磁盘的提供给卷组的PE复制到正常的磁盘即可。如果情况坏点,当时没有多余的空间,那么在添加一个硬盘加入物理卷,给卷组增加空间(PE)即可。在如果没有多余的插槽添加硬盘,可通过缩减逻辑卷(xfs文件系统不支持缩减,ext系列文件系统支持),在增加卷组空间。
1)添加新硬盘后,使用lsblk看不到硬盘,需要刷新,命令如下  echo "---" > /sys/class/scsi_host/host2/scan
2)把新硬盘添加到物理卷,并添加到卷组  
3)移动坏掉的PE(假设硬盘空间都要移动)
"pvmove"命令可以指定,把卷组中的某一空间(PE)移动到同一卷组的其他空间中去。pvmove 要移动的磁盘分区
4)删除卷组中快要坏的磁盘分区  vgreduce 卷组 磁盘分区
5)删除物理卷中快要坏的磁盘分区(其实是删除PE)pvremove 磁盘分区
原文:https://blog.51cto.com/13465487/2371994