Linux之磁盘管理
理论储备
硬盘的基本知识
硬盘:用于存储数据的存储介质,硬盘也叫磁盘
硬盘接口:硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据,不同的硬盘接口决定硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的优劣直接影响着程序运行快慢和系统性能好坏。
pc机和服务器硬盘接口区别:
-
个人pc机:IDE接口 ——> SATA I/II/III (接口版本越高,读写速率越快)
-
服务器上:SCSI接口 ——> SAS接口 (SAS是新一代的SCSI技术,可兼容SATA硬盘)
硬盘命名方式:
/dev/sd*
:物理硬盘安装在服务器上的命名方式/dev/vd*
:云计算中的硬盘命名方式,因为使用了红帽公司的kvm技术
OS | IDE(并口) | SATA(串口) | SCSI |
---|---|---|---|
RHEL5 | /dev/hda | /dev/sda | /dev/sda |
RHEL6 | /dev/sda | /dev/sda | /dev/sda |
RHEL7 | /dev/sda | /dev/sda | /dev/sda |
磁盘设备的命名:
-
如果是本机的第一块硬盘,硬盘命名:/dev/sda 或 /dev/vda
-
如果是本机的第二块硬盘,硬盘命名:/dev/sdb或/dev/vdb
如:/dev/sda2
s=硬件接口类型(sata/scsi),d=disk(硬盘),a=第1块硬盘(b,第二块),2=第几个分区
-
/dev/hd
h=IDE硬盘 =>/dev/hdd3
: 表示IDE硬盘的第四块硬盘的第三个分区 -
/dev/vd
v=虚拟硬盘 =>/dev/vdf7
: 标识虚拟硬盘的第五块硬盘的第七个分区
HP服务器硬盘:
如:/dev/cciss/c0d0
-
/dev/cciss/c0d0p1
=> c0第一个控制器, d0第一块磁盘, p1分区1 -
/dev/cciss/c0d0p2
=> c0第一个控制器, d0第一块磁盘, p2分区2
硬盘的分区方式:MBR和GPT
为什么要对硬盘进行分区?
- 需要合理使用硬盘,用不同的分区储存不同的文件
硬盘寻址
基本分区管理
磁盘划分思路:
- 进入分区表 新建分区 fdisk /dev/sdb
- 更新分区表<刷新分区表>
- 格式化分区——>文件系统 mkfs.ext4 /dev/sdb1
- 挂载使用——>mount【开机自动挂载 | autofs自动挂载】
MBR分区方案
MBR分区特点:
-
只能对小于2TB的硬盘进行分区划分(
MBR
分区也叫DPT
分区也叫MSDOS
分区) -
最多划分4个主分区
分区方案:
-
4个主要分区
-
1个主要分区1个扩展分区,再划分逻辑分区
-
2个主要分区1个护展分区,再划分逻辑分区
-
3个主要分区1个扩展分区,再划分逻辑分区
-
1个扩展分区,再划分逻辑分区(操作系统只能安装在主分区上)
添加一块小于2TB硬盘
当添加一块硬盘后需要对硬盘进行分区(需要关机操作)
第一步:fdisk命令[新建分区]
- 对硬盘进行分区
- fdisk命令用于MBR分区方案
- 分区前需要确认硬盘是否存在数据
fdisk命令选项说明:
# lsblk => 查看系统设备挂载情况
# df -h => 查看系统已经挂载的设备情况
# fsidk [选项]
选项说明:
-l:查看当前系统的所有设备分区情况
如:fdisk -l /dec/sdb => 就是列出这个设备的分区情况
设备名称:如 fdisk /dev/sdb,就是对这个设备进行分区
# fdisk 设备名称
选项说明:
Command(m for help): m => 输出帮助信息
Commandaction
a toggle a bootable flag => 设置启动分区
b edit bsd disklabel => 编辑分区标签
c toggle the dos compatibility flag => 切换dos兼容性标志
d delete a partition => 删除一个分区
l list known partition types => 列出分区类型
m print this menu => 帮助
n add a new partition => 建立一个新的分区
o create a new empty DOS partition table => 创建一个新的空白DOS分区表
p print the partition table => 打印分区表
q quit without saving changes => 退出不保存设置
s createa new empty Sun disklabel => 创建一个新的空的SUN标示
t changea partition's system id => 改变分区的类型
u changedisplay/entry units => 改变显示的单位
v verifythe partition table => 检查验证分区表
w write table to disk and exit => 保存分区表
x extra functionality (experts only)
fdisk -l 命令详解:
# fdisk -l
[root@lamp ~]# fdisk -l
Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors => /dev/sda 目录下分区情况
Units = sectors of 1 * 512 = 512 bytes => 单元
Sector size (logical/physical): 512 bytes / 512 bytes => 扇区大小(逻辑/物理) 都是512字节
I/O size (minimum/optimal): 512 bytes / 512 bytes => I/O 大小(最小/最大) 都是512字节
Disk label type: dos => 磁盘标签类型:dos,即分区类型为MSDOS(MBR)分区
Disk identifier: 0x000a316c => 设备识别码
#L 启动设备加* 起始 结束 块 id 系统
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/centos-root: 18.2 GB, 18249416704 bytes, 35643392 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
备注:CentOS 6 中可能还会有:下面一列选项
255 heads, 63 sectors/track, 3263 cylinders
255磁头 63个扇区 每 磁道 3263个圆柱体
对新加硬盘/dev/sdb
创建分区:
# fdisk /dev/sdb => 使用fdisk 设备名称创建分区
[root@lamp ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5583886d.
Command (m for help): n => "n:代表新建分区"
Partition type:
p primary (0 primary, 0 extended, 4 free) => "p:为新建主分区,编号只能分1-4主分区"
e extended => "e:为新建扩展分区"
Select (default p): 1 => "1:代表新建主分区的编号为1"
First sector (2048-20971519, default 2048): => "直接回车,默认选择启始扇区,系统会自己创建"
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +2G => "+2G:代表创建的1号主分区为2G大小"
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): p => "p:打印分区表"
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5583886d
#l 设备名称 启始扇区 结束扇区 块大小
Device Boot Start End Blocks Id System => "分区表信息,创建了编号1的主分区"
/dev/sdb1 2048 4196351 2097152 83 Linux
后面以此类推....
#l 删除分区
Command (m for help): d => "d:代表删除分区"
Partition number (1-4, default 4): 1 => "1:代表删除分区的编号,可选选项1-4,因为我创建了4个分区"
Partition 1 is deleted
现在已经删除了1号分区
#l 创建扩展分区
Command (m for help): n => "n:代表新建分区"
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): e => "创建扩展分区,因为创建了三个主分区,现在扩展分区改为了扩展分区。但是也可以继续创建主分区"
Using default response e
Selected partition 4 => "现在只剩编号4了所以默认"
First sector (10487810-20971519, default 10489856):
Using default value 10489856
Last sector, +sectors or +size{K,M,G} (10489856-20971519, default 20971519): => "注意:现在默认回车就是把剩下的容量全部给扩展分区,当然也可以自己给,但是会造成硬盘使用不充分浪费了为分配的容量"
Using default value 20971519
Partition 4 of type Extended and of size 5 GiB is set
Command (m for help): p => "p:打印分区表"
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5583886d
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
/dev/sdb2 4196352 10487807 3145728 83 Linux
/dev/sdb3 10487808 10487809 1 83 Linux
/dev/sdb4 10489856 20971519 5240832 5 Extended => 扩展分区
#l 在扩展分区下创建逻辑分区,注意:逻辑分区的容量大小是从扩展分区获取的,所有逻辑分区的总大小不超过扩展分区总大小
Command (m for help): n => "n:新建分区"
Partition type:
p primary (2 primary, 1 extended, 1 free) => "p:代表创建扩展分区还是主分区"
l logical (numbered from 5) => "l:代表创建逻辑分区"
Select (default p): l => "l:代表创建扩展分区"
Adding logical partition 5
First sector (10491904-20971519, default 10491904): => "直接回车,启始扇区选项让系统默认创建"
Using default value 10491904
Last sector, +sectors or +size{K,M,G} (10491904-20971519, default 20971519): +1G => "+1G:代表创建逻辑分区大小为1G"
Partition 5 of type Linux and of size 1 GiB is set
Command (m for help): p => "p:打印分区表"
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5583886d
Device Boot Start End Blocks Id System
/dev/sdb2 4196352 10487807 3145728 83 Linux
/dev/sdb3 10487808 10487809 1 83 Linux => "这个是在+1G选项时,我写的+1造成的"
/dev/sdb4 10489856 20971519 5240832 5 Extended
/dev/sdb5 10491904 12589055 1048576 83 Linux => "创建的逻辑分区编号是从5开始的,删除这个逻辑分区时,直接d => 5"
#l 最后最后,
Command (m for help): w => "w:保存退去"
Command (m for help): q => "1:不保存退出"
fdisk分区注意:
-
最多只能创建4个主分区,扩展分区编号(1-4),逻辑分区编号从5开始
-
删除分区时建议从后面的编号开始删除,假设你跳着删除了2号分区,然后重新创建2号分区,那么新创建2号分区的大小只能是你之前删除的2号分区大小 。因为1号和3号分区截断了硬盘中扇区(柱面)的划分
-
逻辑分区总大小不能超过扩展分区,因为其是从扩展分区中取得容量,且逻辑分区是不能挂载使用的。
-
扩删除展分区就是删除这个扩展分区下所有逻辑分区
-
不创建主分区,直接创建一个扩展分区也是可以的,如果扩展分区占满了硬盘容量那么就无法再创建主分区,也就是说这个硬盘只有一个扩展分区
-
当删除分区时,需要将分区数据进行备份,否则数据丢失。
-
如果分区删除后,数据没有进行备份,需要特殊技术才能恢复数据,注意:这时硬盘不能写入数据否则数据无法恢复
第二步:parts命令[刷新分区]
-
当分区文件没有被内核识别出来,需要使用命令进行探测
-
告诉内核去识别、登记某个硬盘上的分区信息。并不是加载,只是识别并记录而已
# partx [选项] 设备名称
选项说明:
-a:登记某块盘上的所有分区信息,如果某个分区信息已有记录,就会报错:
-d: 删除内核中关于某磁盘上的所有分区的记录(不是卸载)
-d --nr m-n 删除从第m--n分区的记录,如果已经挂载,则无法删除,并报错:
如果都删除了,使用-a选项来重新登记,不会有报错。
#l fdisk分区完后,让内核识别分区信息
# partx -a /dev/sdb => 让内核识别分区信息,如果内核已经识别到会报错(报错无关紧要)
partx: /dev/sdb: error adding partitions 1-6
或者使用"partprobe"命令刷新分区:
# partprobe /dev/sdb
使用ls /dev/sdb*命令查看分区信息:
# ls /dev/sdb* => 当出现以下内容时证明该硬盘的分区可以格式化
[root@node3 ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb5 /dev/sdb6
刷新分区注意事项:
- 分区完后需要手动刷新分区表,如果刷新不成功,有可能是设备正在挂载,解挂后再刷新,还不成功就重启系统
第三步:mkfs命令[分区格式化]
需要给分区设置文件系统类型
格式化定义:按照一定的文件系统,对硬盘分区进行存储数据
-
Linux常见文件系统:ext3、ext4、xfs
-
vfat文件系统为Windows中的fat32文件系统
ext与xfs文件系统比较与总结
ext2-4 文件系统
fat 文件系统
Minix文件系统
#l 查看当前系统支持哪些文件系统命令
# mkfs. => 按两次tab键
[root@lamp ~]# mkfs.
mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs
对分区进行格式化:
各分区格式化命令:
# mkfs.[文件系统] 设备目录
或
# mkfs -t [文件系统] 设备目录
#l 查看系统设备情况
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 2G 0 part
├─sdb2 8:18 0 3G 0 part
├─sdb3 8:19 0 1K 0 part
├─sdb5 8:21 0 3G 0 part
└─sdb6 8:22 0 12G 0 part
sr0 11:0 1 1024M 0 rom
给"/dev/sdb1"分区格式化为xfs文件系统:
# mkfs.xfs /dev/sdb1 => 对/dev/sdb1分区进行格式化,且分区文件系统为xfs
给"/dev/sdb2"分区格式化为ext4文件系统:
# mkfs.ext4 /dev/sdb2 => 对/dev/sdb2分区进行格式化,且分区文件系统为ext4
第四步:mount命令[挂载已格式化分区设备]
手动挂载:系统重启后需要重新挂载,手动卸载后需要手动挂载
# mount [选项 选项的值] 需要挂载的设备 挂载目录
选项说明:
-o:挂载选项,以什么方式挂载
ro:只读
rw:读写
sync:同步
remount:重新挂载(挂载一个正在挂载设备),当前设备已经被挂载时使用
挂载:
# mkdir /mnt/sdb1 => 创建挂载目录,注意:设备分区不能挂载在同一目录下
# mount -0 rw,sync /dev/sdb1 /mnt/sdb1
=> 使用读写和同步的方式挂载/dev/sdb1分区
# mkdir /mnt/sdb2 => 创建挂载目录,注意:设备分区不能挂载在同一目录下
# mount -0 rw,sync /dev/sdb2 /mnt/sdb2
=> 使用读写和同步的方式挂载/dev/sdb2分区
查看挂载情况:
# df -h
[root@node3 rc.d]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 6.1G 11G 36% /
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 179M 836M 18% /boot
tmpfs 182M 4.0K 182M 1% /run/user/42
tmpfs 182M 24K 182M 1% /run/user/1000
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb1 2.0G 33M 2.0G 2% /mnt/sdb1 => 已挂载到/mnt/sdb1
/dev/sdb2 2.9G 9.0M 2.8G 1% /mnt/sdb2 => 已挂载到/mnt/sdb2
查看挂载情况:
# blkid 已挂载的设备分区
# blkid /dev/sdb1
[root@node3 rc.d]# blkid /dev/sdb1
/dev/sdb1: UUID="8a6eafb1-105b-4749-abe3-2531011454e4" TYPE="xfs"
# blkid /dev/sdb2
[root@node3 rc.d]# blkid /dev/sdb2
/dev/sdb2: UUID="67aadf92-dbb3-4649-9930-e81d4afd67ac" TYPE="ext4"
解挂载:
# umount 挂载目录
# umount /mnt/sdb1 => 直接解挂挂载目录即可
自动挂载:重启系统后还是挂载情况
第一种方法:将挂载命令写入到开机启动文件中:"/etc/rc.d/rc.local"
# echo 'mount -o ro /dev/sdb1 /mnt/sdb1' >> /etc/rc.d/rc.local
=> 添加到开机启动文件中(永久挂载)
# chmod +x /etc/rc.d/rc.local
=> 需要给这个文件添加可执行权限,不然配置不生效(CentOS7需要添加执行权限)
=> 这个文件给了执行权限是不安全的
=> chmod -x /etc/rc.d/rc.local 可删除开启启动文件的执行权限
# reboot => 重启即可挂载成功
第二种方法:使用"/etc/fstab"文件,比开机启动文件更早执行,在系统初始化的时候执行这个文件
文件格式:
# vim /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a59200a1-e857-4dd2-b2d3-fe92535cf25f /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
#l 挂载设备 挂载点 文件系统 挂载选项
演示:
# vim /etc/fstab
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb5 /mnt/sdb5 xfs defaults 0 0 => 写入
# mount -a => mount -a 的意思是将/etc/fstab的所有内容重新加载,此时sdb5已挂载
第三种方法:使用"autofs",以服务的方式实现自动挂载,按需挂载(访问的时候就挂载,不访问就不挂载)
第一步:安装autofs软件
# yum install autofs -y
第二步:修改配置文件
1️. 需要进入挂载目录的test目录才能挂载成功:
# vim /etc/auto.master => 修改主配置文件,/mnt/sdb5挂载目必须存在
/mnt/sdb5 /etc/auto.sdb5 -t 120
挂载目录 子配置文件 时间120秒
=> 增加一行配置信息
=> 表示/mnt/sdb5目录的挂载由/etc/auto.test子配置文件来决定,超时时间120秒后不访问挂载目录就自动解挂载
# vim /etc/auto.sdb5 => 此配置文件不存在,需要创建,增加一行信息
test -fstype=xfs,rw :/dev/sdb5
#l 挂载参数 挂载设备名称
=> 表示/dev/sdb5会自动挂载到/mnt/sdb5目录,xfs,rw是挂载选项的参数
=> xfs文件系统选项需要看格式化的时候此分区是使用什么文件系统的
=> test表示进入到test目录才会进行挂载
2. 直接进入挂载目录就可以挂载成功:
# vim /etc/auto.master => 修改主配置文件
/- /etc/auto.sdb5 -t 120 => 注意:/- 为固定写法
# vim /etc/auto.sdb5 => 此配置文件不存在,需要创建,增加一行信息
/mnt/sdb5 -fstype=xfs,rw :/dev/sdb5 => 直接写挂载目录
第三步:重启autofs服务
# systemctl restart autofs
第四步:测试验证,需要进入到挂载目录且再进一个test目录
# cd /mnt/sdb5/test
[root@node3 ~]# cd /mnt/sdb5/test
[root@node3 test]# pwd
/mnt/sdb5/test
[root@node3 test]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb5 3.0G 33M 3.0G 2% /mnt/sdb5/test => 已经挂载到/mnt/sdb5/test目录下
备注:再重启服务的时候就解挂载了,因为没有进入"/mnt/sdb5/test"进行自动挂载
挂载设备的方式
通过设备名进行挂载:
# mount -t ext4 /dev/sdb2 /mnt/sdb2
=> 直接用设备名称/dev/sdb2进行挂载
通过设备的UUID进行挂载:
UUID是由格式化后产生的一个唯一设备标识,可以通过"blkid"命令查看分区相关信息(UUID、卷标、文件系统类型等)
# blkid 设备名称
[root@node3 ~]# blkid /dev/sdb2
/dev/sdb2: UUID="67aadf92-dbb3-4649-9930-e81d4afd67ac" TYPE="ext4"
[root@node3 ~]# blkid /dev/sdb5
/dev/sdb5: UUID="1cae6b56-6962-449e-81be-c34b43891ad7" TYPE="xfs"
使用设备uuid进行挂载:
# mount UUID="67aadf92-dbb3-4649-9930-e81d4afd67ac" /mnt/sdb2 => 通过uuid进行挂载
# vim /etc/fstab => 备注:也可以将设备的UUID写入到"/etc/fstab"文件中进行挂载
UUID=67aadf92-dbb3-4649-9930-e81d4afd67ac /mnt/sdb2 ext4 defaults 0 0
# mount -a => 将/etc/fstab的所有内容重新加载,此时sdb2已挂载
通过设备的卷标进行挂载:
分区的标识,默认无,使用时,请自行添加。
说明:
"e2label"命令只能够对ext2~ext4的文件系统设置卷标
xfs 使用"xfs_admin"命令进行查看及设置卷标
查看各设备分区文件类型:
# blkid 设备名称 => 命令格式
[root@node3 ~]# blkid /dev/sdb1
/dev/sdb1: UUID="8a6eafb1-105b-4749-abe3-2531011454e4" TYPE="xfs"
[root@node3 ~]# blkid /dev/sdb2
/dev/sdb2: UUID="67aadf92-dbb3-4649-9930-e81d4afd67ac" TYPE="ext4"
对ext2~4文件类型的设备设置卷标:
# e2label 设备名称 卷标签 => 命令格式
[root@node3 ~]# e2label /dev/sdb2 disk_sdb2
[root@node3 ~]# blkid /dev/sdb2
/dev/sdb2: LABEL="disk_sdb2" UUID="67aadf92-dbb3-4649-9930-e81d4afd67ac" TYPE="ext4"
=> 可以看到多了一个LABEL的卷标
通过卷标对ext2~4文件系统类型进行挂载:
# mount LABEL="disk_sdb2" /mnt/sdb2 => 通过卷标进行挂载
#vim /etc/fstab => 也可以将设备的卷标写入到"/etc/fstab"文件中进行挂载
LABEL=disk_sdb2 /mnt/sdb2 ext4 defaults 0 0
# mount -a => 将/etc/fstab的所有内容重新加载,此时sdb2已挂载
对xfs文件类型的设备设置卷标:
命令格式:
# xfs_admin -l 设备名称 => 查看xfs设备的卷标
# xfs_admin -L 卷标 设备名称 => 设备xfs设备卷标
演示:
# xfs_admin -L disk /dev/sdb5 => 设置卷标
[root@node3 ~]# xfs_admin -L disk /dev/sdb5
writing all SBs
new label = "disk"
# xfs_admin -l /dev/sdb5 =>查看卷标
[root@node3 ~]# xfs_admin -l /dev/sdb5
label = "disk"
GPT分区方案
GPT分区特点:
-
大于或小于2TB的硬盘都可以划分分区
-
划分分区数量不设限制
实验:
往虚拟机添加一块大于2TB的新硬盘
# lsblk => /dev/sde 为新添加硬盘,大小为4TB
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sde 8:64 0 4T 0 disk
第一步:parted命令[创建分区]
parted命令选项说明:
# parted 设备名称 => 进入命令后的选项说明
选项说明:
print:打印分区表且显示分区表类型
mklabel gpt:修改为GPT分区类型
mkpart:创建分区指令
quit:退出并保存
显示标志说明:
[]?:分区名称。创建分区后需要填写该分区的名称,名称可随意
[ext2]?:文件系统类型。该分区的文件系统类型(与格式化分区时的文件系统类型一致)
Start?:起始点。第一个分区以0开始会有警告,这里以"2048s"开始或者从"1049KB"开始
=> "s"代表扇区,2048*518=1048.576kb
=> 注意:当划分第二个分区时,该选项可以通过print查看,输入上一个分区的结束点作为起始点
End?:结束点。输入"2.2TB" 表示该分区大小为2.2TB,单位可以是"M、G、T等"
=> 下一分区创建时,起始点为2.2TB
=> 分区大小为"结束点 - 起始点"
对新添加硬盘/dev/sde创建GPT分区:
[root@node3 ~]# parted /dev/sde => "parted /dev/sde" 通过parted命令创建分区
(parted) mklabel gpt => "mklabel gpt" 修改为gpt分区类型
#l 创建第一个分区
(parted) mkpart => "mkpart" 创建新分区
Partition name? []? 1 => "1" 表示该分区名称为1
File system type? [ext2]? xfs => "xfs" 表示该该分区文件系统类型为xfs格式
Start? 2048s => "2048s" 表示该分区的启始位置从第2048扇区开始
End? 2.2T => "2.2T" 表示该分区的结束位置是2.2TB
(parted) print => "print" 打印分区表且显示分区表类型
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sde: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2200GB 2200GB 1
#l 创建第二个分区
(parted) mkpart
Partition name? []? 2
File system type? [ext2]? xfs
Start? 2.2T => "2.2T" 表示第二个分区开始位置,从上一分区结束位置开始
End? 3.2T => "3.2T" 表示第二个分区结束位置,该分区大小为"结束-启始"
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sde: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2200GB 2200GB 1
2 2200GB 3200GB 1000GB 2
(parted) quit => "quit" 退出并保存设置
第二步:partprobe命令[刷新分区]
-
当分区文件没有被内核识别出来,需要使用命令进行探测
-
告诉内核去识别、登记某个硬盘上的分区信息。并不是加载,只是识别并记录而已
命令格式:
# partprobe 设备名称
演示:
# partprobe /dev/sde
查看系统设备:
# lsblk
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sde 8:64 0 4T 0 disk
├─sde1 8:65 0 2T 0 part
└─sde2 8:66 0 931.3G 0 part
第三步:mkfs命令[分区格式化]
- 文件系统需要和创建gpt分区时的文件系统一致
格式化分区命令:
命令格式:
# mkfs.[文件系统] 设备目录
或
# mkfs -t [文件系统] 设备目录
演示:
# mkfs.xfs /dev/sde1 => 对1分区进行格式化
# mkfs.xfs /dev/sde2 => 对2分区进行格式化
第四步:mount命令[挂载已格式化分区设备]
# mkdir /sde1 => 设置sde1分区的挂载目录
# mkdir /sde2 => 设置sde2分区的挂载目录
# mount /dev/sde1 /sde1 => 挂载sde1分区
# mount /dev/sde2 /sde2 => 挂载sde2分区
查看挂载情况:
# lsblk
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sde 8:64 0 4T 0 disk
├─sde1 8:65 0 2T 0 part /sde1
└─sde2 8:66 0 931.3G 0 part /sde2
DPT与GPT对比
- MBR分区只能划分不大于2TB硬盘的分区
- GPT分区大于小于2TB都可以划分
分区表类型
分区表类型 | 描述 |
---|---|
msdos | 有主分区(primary),扩展分区(extend),逻辑扩展分区(logical)的概念。单个分区大小不能超过2TB。 |
gpt | 没有主分区(primary),扩展分区(extend),逻辑扩展分区(logical)的概念。单个分区大小可以超过2TB. |
分区工具
分区命令 | 描述 |
---|---|
fdisk | 只能分msdos分区类型 |
parted | 可以分msdos和gpt分区类型 |
逻辑卷管理
逻辑卷介绍
逻辑卷管理:(logical volume management),简称LVM
LVM是Linux环境下对物理磁盘设备(硬盘或分区)进行管理的方式
优点:
- 动态在线扩容
- 离线剪裁(缩容)
- 数据条带化
- 数据镜像
逻辑卷基本概念
物理卷 PV(Physical Volume):
物理卷是底层真正提供容量,存放数据的设备。它可以是整个硬盘或硬盘上的分区等
卷组 VG(Volume Group):
卷组建立在物理卷之上,它由一个或多个物理卷组成。即把物理卷整合起来提供容量分配。 一个LVM系统中可以只有一个卷组,也可以包含多个卷组。
逻辑卷 LV(Logical Volume):
逻辑卷建立在卷组之上,它是从卷组中“切出”的一块空间。它是最终用户使用的逻辑设备。逻辑卷创建之后,其大小可以伸缩。
物理区域 PE(physical extent):
每一个物理卷被划分称为PE的基本单元,具有唯一编号的PE是能被LVM寻址的最小单元。PE的大小可指定,默认为4 MB。 PE的大小一旦确定将不能改变,同一个卷组中的所有物理卷的PE的大小是一致的。 4MB=4096kb=4096kb/4kb=1024个block
1PV = 1PE,即每个物理卷 PV的基本单位为PE,多个PV组成VG
- 说明:
1. 硬盘读取数据最小单位1个扇区512字节
2. 操作读取数据最小单位1个数据块=8*512字节=4096字节=4KB
3. lvm寻址最小单位1个PE=4MB
逻辑区域 LE(logical extent):
逻辑卷被划分称为LE的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且相互对应
1LE = 1PE = 1PV,即逻辑卷LV的基本单位为LE,逻辑卷基本单位LE与物理卷基本单位PE一 一对应
快速创建逻辑卷LV
给虚拟机添加四块硬盘
# lsblk
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 50G 0 disk
sdc 8:32 0 50G 0 disk
sdd 8:48 0 50G 0 disk
sde 8:64 0 50G 0 disk
sr0 11:0 1 1024M 0 rom
单个硬盘上多个设备分区创建LV
将sdb硬盘划分三个设备分区:
# lsblk
[root@node3 ~]# lsblk
sdb 8:16 0 50G 0 disk
├─sdb1 8:17 0 10G 0 part
├─sdb2 8:18 0 20G 0 part
└─sdb3 8:19 0 20G 0 part
sdc 8:32 0 50G 0 disk
sdd 8:48 0 50G 0 disk
sde 8:64 0 50G 0 disk
sr0 11:0 1 1024M 0 rom
在/dev/sdb
磁盘的设备分区创建物理卷 PV:pvcreate
命令
命令格式:
# pvcreate 设备分区1 设备分区2 ...
演示:
# pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
或 =>两种方式都可以
# pvcreate /dev/sdb[123]
[root@node3 ~]# pvcreate /dev/sdb[123]
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdb3" successfully created.
#l => 物理卷PV创建成功,物理卷名称也是原来的设备分区名称
在物理卷基础上整合创建卷组 VG:vgcreate
命令
命令格式:
# vgcreate VG名称 [选项 选项的值] PV名称1 PV名称2 ..
或
# vgcreate VG名称 [选项 选项的值] PV名称[12..]
选项说明:
-s:可以指定PE的默认值,默认PE为4M。如:-s 16M
=> 可以使用"vgdisplay vgone"命令查看PE情况
演示:
# vgcreate vg01 /dev/sdb1 /dev/sdb2 /dev/sdb3
或 =>两种方式都可以将卷组名称设置为"vg01"
# vgcreate vg01 /dev/sdb[123]
[root@node3 ~]# vgcreate vg01 /dev/sdb[123]
Volume group "vg01" successfully created
#l => vg01卷组创建成功
查看卷组创建情况:
# vgs
[root@node3 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 0 0 wz--n- <49.99g <49.99g
#l => 有一个卷组:vg01,由三个物理卷PV组成
在卷组的基础上创建逻辑卷 LV :lvcreate
命令
命令格式:
# lvcreate [选项 选项的值] 卷组名称
选项说明:
-n:指定逻辑卷名称
-L:指定逻辑卷容量大小
=> 如:-L 10G => 就是指定该逻辑卷大小为10G
-l:指定逻辑卷大小
如:-l 100 => 100个PE,每个PE大小默认4M,故逻辑卷大小为400M
-l 50%free => 卷组剩余空间的50%
演示:
# lvcreate -n lv01 -L 35G vg01 => 创建一个35G大小的lv01逻辑卷
[root@node3 ~]# lvcreate -n lv01 -L 35G vg01
Logical volume "lv01" created.
查看逻辑卷创建情况:
# lvs
[root@node3 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg01 -wi-a----- 35.00g
格式化逻辑卷:mkfs命令
查看逻辑卷lv01在系统中的完整路径:
# find /dev -name "lv01"
[root@node3 ~]# find /dev -name "lv01"
/dev/vg01/lv01
对逻辑卷lv01进行格式化,使用ext4文件系统:
# mkfs.ext4 /dev/vg01/lv01
挂载逻辑lv01:
# mkdir /lv01 => 创建挂载目录
# mount /dev/vg01/lv01 /lv01 => 挂载
# df -h => 查看挂载结果
[root@node3 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg01-lv01 35G 49M 33G 1% /lv01
=> mapper是映射的意思,因为是通过技术手段整合在一起的逻辑空间
多个硬盘创建LV
对c、d、e三块硬盘整合成逻辑卷
# lsblk
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 50G 0 disk
sdd 8:48 0 50G 0 disk
sde 8:64 0 50G 0 disk
创建物理卷 PV:pvcreate
命令
# pvcreate /dev/sd[cde] => 将三块硬盘创建物理卷
整合创建卷组 VG:vgcreate
命令
# vgcreate vg02 /dev/sd[cde] => 整个三块硬盘创建卷组,并命名为"vg02"
# vgs => 查看卷组创建情况
创建逻辑卷 LV :lvcreate
命令
# lvcreate -n lv02 -L 125G vg02 => 在vg02卷组上创建125G大小的逻辑卷lv02
# lvs => 查看逻辑建创建情况
格式化逻辑卷:mkfs命令
# find /dev -name "lv02" => 查看逻辑卷lv02所在路径
# mkfs.xfs /dev/vg02/lv02 => 以xfs文件系统类型格式化逻辑卷lv02
挂载逻辑卷lv02:
# mkdir /lv02 => 创建挂载目录
# mount /dev/vg01/lv02 /lv02 => 挂载
# df -h => 查看挂载情况
逻辑卷删除
删除逻辑卷与创建逻辑卷步骤相反
LV删除:lvremove
命令
- LV删除前需要解挂载
# lvs => 查看创建了哪些逻辑卷
[root@node3 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg01 -wi-ao---- 35.00g
lv02 vg02 -wi-ao---- 125.00g
命令格式:
# lvremove 逻辑卷lv所在完成路径
演示:
# lvremove /dev/vg01/lv01 => 删除lv01逻辑卷
[root@node3 ~]# lvremove /dev/vg01/lv01
Do you really want to remove active logical volume vg01/lv01? [y/n]: y => 确认删除lv01
Logical volume "lv01" successfully removed
卷组(VG)删除:vgremove
命令
- 先把LV删除,再删除VG
# vgs => 查看卷组创建情况,还可以使用"vgscan"命令、" vgdisplay"命令更详细查看
[root@node3 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 0 0 wz--n- <49.99g <49.99g
vg02 3 1 0 wz--n- <149.99g <24.99g
=> vg01中lv的值为0,代表可以删除
=> vg02中lv有值,不可以删除
命令格式:
# vgremove 卷组vg所在完整路径
演示:
# vgremove /dev/vg01 => 删除vg01卷组
[root@node3 ~]# vgremove /dev/vg01
Volume group "vg01" successfully removed
物理卷(PV)删除:pvremove
命令
# pvs => 查看物理卷使用情况,还可以使用"pvscan"命令、"pvdisplay"命令更详细查看
[root@node3 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
#l /dev/sdb1 lvm2 --- 10.00g 10.00g
#l /dev/sdb2 lvm2 --- 20.00g 20.00g
#l /dev/sdb3 lvm2 --- <20.00g <20.00g
/dev/sdc vg02 lvm2 a-- <50.00g 0
/dev/sdd vg02 lvm2 a-- <50.00g 0
/dev/sde vg02 lvm2 a-- <50.00g <24.99g
=> 可以看到/dev/sdb没有创建卷组,可是直接删除物理卷pv
命令格式:
# pvremove 物理卷pv名称1 物理卷pv名称2 ..
或
# pvremove 物理卷名称[123..]
演示:
# pvremove /dev/sdb[123] => 删除物理卷PV
[root@node3 ~]# pvremove /dev/sdb[123]
Labels on physical volume "/dev/sdb1" successfully wiped.
Labels on physical volume "/dev/sdb2" successfully wiped.
Labels on physical volume "/dev/sdb3" successfully wiped.
备注:直接对设备分区进行格式化也相当于删除物理卷
逻辑卷(LV)动态扩容
新克隆一台虚拟机,添加三块硬盘
- ext4文件系统类型支持动态扩容和离线裁剪(缩容)
- xfs文件系统类型只支持动态扩容,不支持离线裁剪(缩容)
# lsblk
[root@node3 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 50G 0 disk
sdc 8:32 0 50G 0 disk
sdd 8:48 0 50G 0 disk => 这块硬盘用于扩用
对b、c两块硬盘创建逻辑卷:
创建物理卷pv:
# pvcreate /dev/sd[bc] => 对b、c两块硬盘创建物理卷PV
创建卷组vg:
# vgcreate vgone -s 16M /dev/sd[bc] => 对b、c两块硬盘物理卷PV整合成卷组vgone,并更改物理卷PE单元的值
创建逻辑卷lv:
# lvcreate -n lvone -L 90G /dev/vgone => 从卷组vgone中取出90G创建逻辑卷并命名为lvone
格式化逻辑卷:
# mkfs.ext4 /dev/vgone/lvone => 对新创建的逻辑卷进行格式化
挂载:
# mkdir /lvone => 创建一个空挂载目录
# mount /dev/vgone/lvone /lvone => 挂载
# df -h => 查看挂载情况
以上步骤完成就可以对硬盘进行使用
任务:
现在两块PV容量共100G,已划分90G给逻辑卷lvone。现在需要lvone需要120G空间。
思路:
添加一块PV进VG,使VG大于120G。再为LV进行在线扩容
将新硬盘制作成PV:
# pvcreate /dev/sdd
将新PV加入卷组VG(vgone):"vgextend"命令扩容卷组
# vgxtend vgone /dev/sdd
对逻辑卷lvone扩容到120G:
第一步:"lvextend"命令进行扩容
# lvextend -L 120G /dev/vgone/lvone => 代表lvone的总大小是120G
或
# lvextend -L +30G /dev/vgone/lvone => 代表在原来90G的基础上增加30G
第二步:需要同步文件系统类型
# resize2fs /dev/vgone/lvone => ext4文件系统类型用此命令
或
# xfs_growfs /dev/vgone/lvone => xfs问你件系统类型用此命令
逻辑卷(LV)离线裁剪
离线裁剪注意事项:
-
LV裁剪时需要注意已用数据量大小
-
离线:就是解挂载LV
-
解挂载时如果有系统正在使用LV
裁剪LV步骤:
- 原本lv大小为120G,现在将其大小裁剪至100G
第一步:解挂载逻辑卷lv
# umount 挂载点(/lvone)
第二步:检验lv文件系统,使用"e2fsck"命令(用于检查Linux中文件系统中的分区是否能正常工作)
命令格式:
# e2fsck 选项 逻辑卷lv所在路径 => 此命令可检查ext2~4文件系统
选项说明:
-f:强制检查
演示:
# e2fsck -f /dev/vgone/lvone
第三步:计算lv裁剪大小,"resize2fs"命令
命令格式:
# resize2fs lv所在路径 裁剪大小
演示:
# resize2fs /dev/vgone/lvone 100G
第四步:执行裁剪lv,"lvreduce"命令
命令格式:
# lvreduce lv所在路径 选项 裁剪大小
选项说明:
-L:表示lv裁剪后的大小
演示:
# lvreduce /dev/vgone/lvone -L 100G => 输入y确认执行
第五步:挂载使用
# mount /dev/vgone/lvone 挂载点(/lvone)
通过NFS服务实现LV共享远程主机使用
OS | IP |
---|---|
NFS | 10.1.1.20 |
远程主机 | 10.1.1.21 |
环境准备:
设置静态ip,关闭防火墙和selinux,
NFS服务器安装:
-
在NFS服务器上配置可在线扩容的逻辑卷,将LV共享给远程客户机使用
-
当LV在线扩容,远程主机挂载的LV同步扩容
在NFS上查看LV挂载目录:
# df -h
安装NFS服务组件:
# yum install rpcbind nfs-utils -y
编写NFS服务配置文件,共享LV挂载目录
# vim /etc/exports
/lvone 10.1.1.21/24(rw,sync)
启动NFS服务:
# systemctl start rpcbind => 启动rpcbind服务
# systemctl start nfs => 启动nfs服务
在NFS上查看共享:
# showmount -e => 查看共享
[root@nfs ~]# showmount -e
Export list for nfs:
/lvone 10.1.1.21/24
远程客户机挂载LV:
查看共享:
# showmount -e 10.1.1.20
挂载LV:
# mkdir /nfs_lvone => 创建挂载目录
# mount.nfs 10.1.1.20:/lvone /nfs_lvone => 将NFS共享目录挂载使用
查看挂载情况:
# df -h
扩展
扩容swap空间
第一种方法:增加一个硬盘或者分区来扩容swap空间
- 用于扩用的硬盘或分区要没有被格式化挂载使用过的,防止里面有残留数据
查看swap空间大小:
# free -mh
或
# swapon -s
[root@client ~]# free -mh
total used free shared buff/cache available
Mem: 1.8G 772M 149M 27M 897M 818M
Swap: 2.0G 0B 2.0G => 这个是swap交换分区空间大小
[root@client ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
设备分区 分区 单位:字节 优先级,数值越大优先级越高
查看哪个设备可以用于扩容swqp空间:
# lsblk => 查看可用设备
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot => sda是操作系统盘,不可随意更改
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
sdd 8:48 0 100G 0 disk
sde 8:64 0 100G 0 disk
└─sde1 8:65 0 1G 0 part
# blkid /dev/sdb* => 查看是否使用过的硬盘,只有sda*盘使用过
[root@client ~]# blkid /dev/sd*
/dev/sda: PTTYPE="dos"
/dev/sda1: UUID="a59200a1-e857-4dd2-b2d3-fe92535cf25f" TYPE="xfs"
/dev/sda2: UUID="WWOAN2-IbXr-c2O2-2wby-8I38-qDuj-Rd6SRn" TYPE="LVM2_member"
/dev/sde: PTTYPE="dos"
格式化/dev/sde1设备用作扩容swap空间:
# mkswap /dev/sde1
[root@client ~]# mkswap /dev/sde1
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=1e8416d7-a466-4e7c-943f-e0c6f543ff27
# blkid /dev/sdb1 => 查看该分区文件系统类型
[root@client ~]# blkid /dev/sde1
/dev/sde1: UUID="1e8416d7-a466-4e7c-943f-e0c6f543ff27" TYPE="swap"
激活用于扩容swap空间的设备:
# swapon /dev/sde1 => 临时扩容
查看swap空间是否增大:
# swapon -s
[root@client ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sde1 partition 1048572 0 -3
=> 很明显,增加一个/dev/sde1的设备用于swap空间
永久扩容swap空间:
# vim /etc/fstab => 将命令写入到开机初始化文件中
/dev/sde1 swap swap defaults,pri=1 0 0
=> pri:指定优先级
关闭swap空间:
# swapoff /dev/sde1 => 移除扩展的/dev/sde1 swap空间
查看swap空间:
# swapon -s
[root@client ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
第二种方法:使用dd命令模拟大文件来扩容swap空间
查看原本swap空间大小:
# free -nh
[root@client ~]# free -mh
total used free shared buff/cache available
Mem: 1.8G 821M 67M 27M 930M 748M
Swap: 2.0G 0B 2.0G
使用dd命令制作一个设备文件:
# dd if=/dev/zero of=/home/swap_newfile bs=1M count=1024 => 制作一个swap_newfile设备文件
格式化swap_newfile设备文件用于扩容swap空间:
# mkswap /home/swap_newfile
激活用于扩容swap空间的设备:
# swapon -p 1 /home/swap_newfile => 临时扩容
选项说明:
-p:指定优先级,数值越大优先级越高
查看swap空间是否增大:
# free -mh
[root@client ~]# free -hm
total used free shared buff/cache available
Mem: 1.8G 779M 73M 20M 966M 799M
Swap: 3.0G 22M 3.0G
逻辑卷实现条带化
条带化介绍:
优点:把保存到逻辑卷的数据分成n等分,分别写到不同的物理卷,可以提高数据的读写效率。
缺点:但是如果任何一个涉及到的物理卷出现故障,数据都无法恢复
LV实现条带化:
- 添加一块硬盘,并创建设备分区
- 注意:如果是正在使用的硬盘,在新创建分区后需要重启才可以使用
创建完设备分区后刷新分区:
# partprobe /dev/sdb
查看块设备信息:
# df -h
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
├─sdb1 8:17 0 20G 0 part
├─sdb2 8:18 0 30G 0 part
└─sdb3 8:19 0 25G 0 part
创建物理卷:
# pvcreate /dev/sdb[123]
创建卷组:
# vgcreate vg_tdh /dev/sdb[123]
创建条带化逻辑卷:
命令格式:
# lvcreate [选项 选项的值] 卷组名称
选项说明:
-n:指定逻辑卷名称
-L:指定逻辑卷容量大小
=> 如:-L 10G => 就是指定该逻辑卷大小为10G
-i:创建条带化LV时,需要指定个数和设备
演示:
# lvcreate -n lv_tdh -L 30G -i 3 vg_tdh /dev/sdb[123]
[root@client ~]# lvcreate -n lv_tdh -L 30G -i 3 vg_tdh /dev/sdb[123]
Using default stripesize 64.00 KiB.
Logical volume "lv_tdh" created.
查看物理卷:
# pvs /dev/sdb[123]
[root@client ~]# pvs /dev/sdb[123]
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg_tdh lvm2 a-- <20.00g <10.00g
/dev/sdb2 vg_tdh lvm2 a-- <30.00g <20.00g
/dev/sdb3 vg_tdh lvm2 a-- <25.00g <15.00g
格式化逻辑卷:
# mkfs.ext4 /dev/vg_tdh/lv_tdh
挂载逻辑卷:
# mkdir /lv_tdh => 创建挂载目录
# mount /dev/vg_tdh/lv_tdh /lv_tdh => 挂载
验证条带化读写:
终端1往挂载目录写东西
# dd if=/dev/zero of=/lv_tdh/file.img bs=100M count=100
终端2监控逻辑卷读写:
# yum install -y sysstat
# iostat -m -d /dev/sdb[123] /dev/vg_tdh/lv_tdh 1
选项说明:
-d:指定磁盘或设备分区
-m:以MB速度显示,每秒 MB
2:每隔两秒显示一次,如果后面还有数字表示显示多少次
逻辑卷快照
当前有一个逻辑卷,然后对这个逻辑卷创建快照
对逻辑卷创建快照就是创建一个逻辑卷(逻辑卷的快照远比逻辑卷要小)
创建逻辑卷快照时只是拍摄逻辑卷当时的状态
当逻辑卷数据发生变化时,会将发送变化的数据大小拷贝到逻辑卷快照中,发生变化的数据大于逻辑卷快照的容量时,逻辑卷快照会崩溃,无法使用
创建逻辑卷快照:
比如当前有一个逻辑卷lv_tdh:
# de -f
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_tdh-lv_tdh 30G 30G 0 100% /lv_tdh
查看块设备:
# dmsetup ls --tree
[root@client ~]# dmsetup ls --tree
vg_tdh-lv_tdh (253:2)
├─ (8:19)
├─ (8:18)
└─ (8:17)
创建逻辑卷lv_tdh的快照:当逻辑卷正在使用时需要先解挂载
# lvcreate -n lv_mysql_snap -L 100M -s /dev/vg_tdh/lv_tdh
选项说明:
-L:指定创建逻辑卷大小,会拷贝逻辑卷发生变化的数据到快照中
-n:指定逻辑卷名称
-s:指定需要拍快照的逻辑卷名称
#l 注意:创建逻辑卷快照不需要指定卷组,逻辑卷属于哪个卷组,逻辑卷快照就属于哪个卷组
查看块设备:
# dmsetup ls --tree
[root@client ~]# dmsetup ls --tree
vg_tdh-lv_mysql_snap (253:5) => 逻辑卷快照,由两部分组成cow和real
├─vg_tdh-lv_mysql_snap-cow (253:4) =>
│ └─ (8:17)
└─vg_tdh-lv_tdh-real (253:3) => real设备发现改变的时候,会拷贝到cow快照中去
├─ (8:19)
├─ (8:18)
└─ (8:17)
vg_tdh-lv_tdh (253:2)
└─vg_tdh-lv_tdh-real (253:3) => 拍完快照后设备变成real,real是真实逻辑卷
├─ (8:19)
├─ (8:18)
└─ (8:17)
逻辑卷快照动态自动扩容:
需要修改lvm配置文件:
# vim /etc/lvm/lvm.conf
1396 snapshot_autoextend_threshold = 100 => 将值改为80
1409 snapshot_autoextend_percent = 20
#l 表示当快照使用到80%时,自动扩容20%;当snapshot_autoextend_threshold = 100表示关闭自动扩容
磁盘配额
作用:限制用户组或用户对磁盘空间的使用,例如文件服务器,邮件服务器等…
启用磁盘配额:
启用磁盘限额:修改挂载选项
挂载选项说明:
usrquota:支持用户配额
grpquota:支持用户组配额
第一步:现在有一个lv_quota逻辑卷进行磁盘配额挂载
# mount -o rw,usrquota,grpquota /dev/vg_quota/lv_quota /lv_quota
第二步:创建磁盘配额的数据文件(注意:建议停用selinux)
安装quota软件:
# yun install -y quota
命令格式:
# quotacheck [选项]
选项说明:
-c:创建数据库文件
-u:用户的限制
-g:用户组的限制
演示:
# quotacheck -ucg /lv_quota => 对此设备创建磁盘配额数据文件
# ll /lv_quota
[root@client ~]# ll /lv_quota/
total 32
-rw------- 1 root root 6144 May 26 23:25 aquota.group
-rw------- 1 root root 6144 May 26 23:25 aquota.user
第三步:启用磁盘配额
# quotaon -a => 启用所有设置磁盘限额设备
或
# quotaon /lv_quota => 只启用指定磁盘限额设备
选项说明:
-a:对当前系统所有支持磁盘配额的设备进行检查,启用磁盘配额
[root@client ~]# quotaon -a
quotaon: using /lv_quota/aquota.group on /dev/mapper/vg_quota-lv_quota [/lv_quota]: Device or resource busy
quotaon: using /lv_quota/aquota.user on /dev/mapper/vg_quota-lv_quota [/lv_quota]: Device or resource busy
设置磁盘配额:
第一种方法:"edquota"命令
命令格式:
# edquota 选项 用户名
选项说明:
-u:针对某个用户设置磁盘配额
第一步: 针对admin用户进行磁盘限额设置
# edquota -u admin => 会打开一个文件
Disk quotas for user admin (uid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg_quota-lv_quota 0 0 0 0 0 0
配置文件说明:
磁盘空间限制说明:
"blocks":已使用空间,无需要设置
soft:用户空间使用限制,为"软限制",需要设置
=> 当用户到达这个限制以后,系统会给予警告,但仍可写入
hard:用户空间使用限制,为"硬限制",需要设置
=> 到达这个限制,就完全禁止任何写入
总文件个数限制说明:
"inodes":已有文件总数,无需要设置
soft:文件总数限制,为"软限制",需要设置(警告)
hard:文件总数限制,为"硬限制",需要设置(禁止)
第二步:设置admin用户在此磁盘下使用空间10M,最多不能超过12M;文件总数为6个,最多不能超过10个
# edquota -u admin
Disk quotas for user admin (uid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg_quota-lv_quota 0 10M 12M 0 6 10
第三步:针对admin用户对磁盘挂载目录设置acl扩展权限
# mount -o remount,acl /lv_quota => 先对挂载目录追加acl权限
# setfacl -m u:admin:rwx /lv_quota => 追加acl权限后再扩展admin用户权限
第四步:切换到admin用户验证是否增加限制
文件个数限制验证:
# su - admin
# touch /lv_quota/file{1..7}
# touch /lv_quota/file{8..11}
[admin@client lv_quota]$ touch /lv_quota/file{1..7}
dm-6: warning, user file quota exceeded.
[admin@client lv_quota]$ touch /lv_quota/file{8..11}
dm-6: write failed, user file limit reached.
touch: cannot touch ‘/lv_quota/file11’: Disk quota exceeded
磁盘限额验证:
# dd if=/dev/zero of=/lv_quota/file.img bs=11M count=1 => 超出软限制限额给出警告
# dd if=/dev/zero of=/lv_quota/file1.img bs=11M count=1 => 超出硬限制限额不允许写入,数据只能写入一部分
[admin@client lv_quota]$ dd if=/dev/zero of=/lv_quota/file.img bs=11M count=1
dm-6: warning, user block quota exceeded.
1+0 records in
1+0 records out
11534336 bytes (12 MB) copied, 0.00911861 s, 1.3 GB/s
[admin@client lv_quota]$ dd if=/dev/zero of=/lv_quota/file1.img bs=2M count=1
dm-6: write failed, user block limit reached.
dd: error writing ‘/lv_quota/file1.img’: Disk quota exceeded
1+0 records in
0+0 records out
1048576 bytes (1.0 MB) copied, 0.00132019 s, 794 MB/s
独立冗余磁盘阵列(RAID)
RAID介绍
RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。
RAID就是一种由多块廉价磁盘构成的冗余阵列,在操作系统下是作为一个独立的大型存储设备出现。
RAID可以充分发挥出多块硬盘的优势,可以提升硬盘速度,增大容量,提供容错功能,能够确保数据安全性,易于管理的优点,在任何一块硬盘出现问题的情况下都可以继续工作,不会受到损坏硬盘的影响。
RAID应用场景:
-
廉价磁盘冗余阵列
-
安装操作系统
-
大量数据存储
RAID实现分类:分为硬RAID、软RAID两种
硬RAID:
通过RAID卡这种硬件设备实现的,独立的RAID卡,主板集成的RAID芯片都是硬RAID。RAID卡就是用来实现RAID功能的板卡,通常是由I/O处理器、硬盘控制器、硬盘连接器和缓存等一系列零组件构成的。不同的RAID卡支持的RAID功能不同。支持RAlD0、RAID1、RAID4、RAID5、RAID10不等。
软RAID:
通过RAID相关的软件实现的,软RAID运行于操作系统底层,将SCSI或者IDE控制器提交上来的物理磁盘,虚拟成虚拟磁盘,再提交给管理程序来进行管理。软RAID有以下特点:
-
占用内存空间
-
占用CPU资源
-
如果程序或者操作系统故障就无法运行
-
使用方便,成本低
基于以上缺陷,所以现在企业很少用软raid。
RAID级别
RIAD 0:
应用场景:大文件
优点:
-
至少二块硬盘
-
提高了硬盘的读写效率(多个硬盘同时读写)
-
数据以条带化方式存储(将同一个数据分别存在其他硬盘上,提高硬盘的读写速率)
-
空间使用率 100%
缺点:
- 不支持容错,没有数据的冗余性(当一块硬盘出错,数据就无法正常读写)
RAID 1:
应用场景:数据备份(操作系统可以安装在此硬盘)
优点:
-
二块硬盘或二块硬盘以上
-
镜像卷,二块硬盘互为镜子,数据同时写入二块硬盘,写二份
-
空间使用率 50%(两块硬盘存一块硬盘的数据,如果三块RAID 1 空间使用率就是1/3)
-
支持容错(一块硬盘出错可以用另一块硬盘替代)
缺点:
- 写的性能差,读性能还可以(因为写的时候需要写两份,读的时候可以同时读两块硬盘)
RAID 5:
例如:把A数据条带化,条带化成A1及A2,存储时使用异或运算得到P1(用于校验),分别把A1、A2、P1存储到三块硬盘上。
优点:
-
三块硬盘或三块硬盘加一块备盘
-
读效率与RAID0一样
-
空间使用率 (n-1)/n,n为硬盘数量(因为有校验数据也要存储)
-
支持容错(两块硬盘可以推算第三块硬盘数据,如果两块硬盘损坏了就无法退出其他两块硬盘数据)
缺点:
- 写效率比RAID0低,比RAID1高
RAID 6:
应用场景:一般用于对数据安全性要求非常高的场合,如:支付系统、银行系统
数据盘增加越多,读写效率越快。但是写数据的时候还要写两次数据的校验值
优点:
-
至少需要4块磁盘(两块存数据,另外两块存校验数据)
-
数据条带化存储在磁盘,读取性能好,容错能力强
-
采用双重校验方式保证数据的安全性
-
如果2块磁盘同时故障,可以通过两个校验数据来重建两个磁盘的数据
缺点:
- 成本要比其他等级高,并且更复杂
RAID 0+1:
先实现RAID0,再实现RAID1,RAID01则是先做条带,然后再做镜象。
比如以4个盘为例,RAID01则是先利用2块盘做RAID0条带,然后将另外2块盘做为RAID0的镜象。假设有disk1、2、3、4,我们假设disk1损坏,这时左边的条带将无法读取。在剩下的3块盘中,只要disk3,disk4两个盘中任何一个损坏,都会导致整个RAID失效,我们可简单计算故障率为2/3。
至少四块硬盘,加快读写速率和容错,因为故障率较高,一般较少用RAID 0+1,因为容错率较高
优点:
- 支持容错,但容错率较低
RAID 1+0:
先实现RAID1,再实现RAID0,RAID10是先做镜象,然后再做条带。
比如以4个盘为例,RAID10就是先将盘分成2组镜象,然后再对这2个RAID1做条带。假设有disk1、2、3、4,我们假设当disk1损坏时,在剩下的3块盘中,只有当disk3一个盘发生故障时,才会导致整个RAID失效,我们可简单计算故障率为1/3。因此RAID10比RAID01在安全性方面要强。
将数据条带化写入RAID 0 中,然后RAID 1 相互拷贝,提高读写速率,RAID 01和RAID 10读写速率一样,但是因为容错率所以RAID 10性能优于RAID 10
优点:
-
支持容错
-
安全性比RAID 0好
-
读写性能比RAID1好
缺点:
-
空间使用率为50%
-
空间使用率比RAID5差
总结:
类型 | 读写性能 | 可靠性 | 磁盘利用率 | 成本 |
---|---|---|---|---|
RAID0 | 最好 | 最低 | 100% | 较低 |
RAID1 | 读正常;写两份数据 | 高 | 50% | 高 |
RAID5 | 读:近似RAID0 写:多了校验 | RAID0<RAID5<RAID1 | (n-1)/n | RAID0<RAID5<RAID1 |
RAID6 | 读:近似RAID0 写:多了双重校验 | RAID6>RAID5 | RAID6<RAID5 | RAID6>RAID1 |
RAID10 | 读:RAID10=RAID0 写:RAID10=RAID1 | 高 | 50% | 最高 |
软RAID实现
需要安装mdadm软件
# yum install mdadm -y
mdadm命令创建软RAID说明:
命令格式:
# mdadm --create /dev/md0 --level=0 --raid-devices=2 设备名称1 设备名称2(设备名称[12])
或
# mdadm -C /dev/md0 -l 0 -n 2 设备名称1 设备名称2(设备名称[12])
选项说明:
--create :使用空闲的设备创建一个新的阵列,每个设备具有元数据块,设备名称随意
--level:设置RAID级别
--raid-devices:指定一个RAID中设备的数目。
-x:选择做备用盘的个数,创建完可以使用cat /proc/mdstat 查看哪个是备用盘
-C:--create简写
-l:--level简写
-n:与--raid-devices作用相同
查看阵列状态:
# cat /proc/mdstat
RAID可以直接格式化或者创建LV都可以,然后挂载使用
RAID 0 实现
添加两块硬盘
创建RAID 0:
查看硬盘:
# lsblk
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
创建RAID 0:
# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sd[bc]
[root@client ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sd[bc]
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
查看RAID状态:
# cat /proc/mdstat
[root@client ~]# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdc[1] sdb[0] => 两块硬盘是正在使用状态
209582080 blocks super 1.2 512k chunks
unused devices: <none>
直接格式化RAID:
# mkfs.xfs /dev/md0
[root@client ~]# mkfs.xfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=16, agsize=3274624 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=52393984, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=25584, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载使用:
# mkdir /md0
# mount /dev/md0 /md0
查看挂载状态:
# df -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md0 200G 33M 200G 1% /md0
RAID 0存储数据验证:
- 主要验证md0 input及output数据情况,使用sysstat软件中的iostat
安装sysstat软件:
# yum install sysstat -y
终端1利用"dd"命令创建一个100G的数据:
# dd if=/dev/zero of=/md0/file.img bs=10M count=100
终端2利用"iostat"命令观察/md0目录的读写速率:
# iostat 1
RAID 1 实现
添加四块硬盘,两块硬盘互为镜像,第三块做备用盘(第三块也是镜像),第四块做热拔插添加
创建RAID 1:
查看硬盘:
# lsblk
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
sdd 8:48 0 100G 0 disk
sde 8:64 0 100G 0 disk
创建RAID 1:
# mdadm --create /dev/md1 --level=1 --raid-devices=2 -x 1 /dev/sdb /dev/sdc /dev/sdd
查看RAID状态:
# cat /proc/mdstat
或
# watch -n .5 cat /proc/mdstat => 查看RAID1同步状态,每5秒执行一次 cat /proc/mdstat
[root@client ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdd[2](S) sdc[1] sdb[0] => 可以看到硬盘sdd是停止状态
104791040 blocks super 1.2 [2/2] [UU]
unused devices: <none>
直接格式化RAID:需要等待同步完成100%
# mkfs.xfs /dev/md1
挂载使用:
# mkdir /md1
# mount /dev/md1 /md1
查看挂载状态:
# df -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md1 100G 33M 100G 1% /md1
=> 三个硬盘每个100G,但是挂载的也是100G,所以有一个做了镜像,还有一个做了备用盘
RAID 1存储数据验证:
- 主要验证md1 input及output数据情况,使用sysstat软件中的iostat
安装sysstat软件:
# yum install sysstat -y
终端1利用"dd"命令创建一个100G的数据:
# dd if=/dev/zero of=/md1/file.img bs=10M count=1000
终端2利用"iostat"命令观察/md0目录的读写速率:
# iostat 1
RAID 1 修复:
- 在线状态下修复
查看RAID状态:
# cat /proc/mdstat
[root@client ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdd[2](S) sdc[1] sdb[0]
104791040 blocks super 1.2 [2/2] [UU] => 两个U,说明正在使用,镜像正常
模拟/dev/sdb故障:
# mdadm /dev/md1 --fail /dev/sdb => 此命令用于告知RAID,硬盘/dev/sdb已损坏
再次查看RAID状态:
# cat /proc/mdstat
[root@client ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdd[2] sdc[1] sdb[0](F) => 可以看到sdb是失效状态,sdd替换上去了使用了
104791040 blocks super 1.2 [2/1] [_U] => 1个U,说明另一个失效
[>....................] recovery = 4.7% (5012864/104791040) finish=8.2min speed=200514K/sec
=>并且两个硬盘正在同步,同步时间8min
unused devices: <none>
查看挂载状态:
# df -h => 并没有影响到挂载,还是可以正常使用
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md1 100G 18G 83G 18% /md1
热拔插移除失效硬盘:
# mdadm /dev/md1 --remove /dev/sdb => 在线移除失效硬盘sdb
[root@client ~]# mdadm /dev/md1 --remove /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md1
热插拔增加一个备用盘:
# mdadm /dev/md1 --add /dev/sde => 新添加一块硬盘sde到RAID中,会自动匹配RAID的文件系统类型
[root@client ~]# mdadm /dev/md1 --add /dev/sde
mdadm: added /dev/sde
再查看RAID状态:
# cat /proc/mdstat
[root@client md1]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sde[3](S) sdd[2] sdc[1] => 可以看到硬盘sde已经用作备用盘了
104791040 blocks super 1.2 [2/1] [_U]
[===========>.........] recovery = 59.0% (61897472/104791040) finish=136.1min speed=5248K/sec
unused devices: <none>
RAID 5 实现
添加五块硬盘,三块做数据盘,第四块做备用盘,第五块做热拔插添加
注意:数据盘只能失效 一个,如果数据盘失效两个数据将找不回来
创建RAID 5:
查看硬盘:
# lsblk
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
sdd 8:48 0 100G 0 disk
sde 8:64 0 100G 0 disk
sdf 8:80 0 100G 0 disk
创建RAID 1:
# mdadm --create /dev/md5 --level=5 --raid-devices=3 -x 1 /dev/sd[bcde]
查看RAID状态:
# cat /proc/mdstat
或
# watch -n .5 cat /proc/mdstat => 查看RAID1同步状态,每5秒执行一次 cat /proc/mdstat
直接格式化RAID:需要等待同步完成100%
# mkfs.xfs /dev/md5
挂载使用:
# mkdir /md1
# mount /dev/md1 /md1
查看挂载状态:
# df -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md5 200G 33M 200G 1% /md5
=> 三块数据盘100G/a,但是还有校验信息,所以大小200G没毛病
RAID 5存储数据验证:
- 主要验证md5 input及output数据情况,使用sysstat软件中的iostat
安装sysstat软件:
# yum install sysstat -y
终端1利用"dd"命令创建一个100G的数据:
# dd if=/dev/zero of=/md5/file.img bs=10M count=1000
终端2利用"iostat"命令观察/md0目录的读写速率:
# iostat 1
RAID 5 修复:
- 在线状态下修复
查看RAID状态:
# cat /proc/mdstat => 查看那块是备用盘,(S)标志
[root@client ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sdd[4] sde[3](S) sdc[1] sdb[0] => sde为备用盘
209582080 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
模拟/dev/sdb故障:
# mdadm /dev/md5 --fail /dev/sdb => 此命令用于告知RAID,硬盘/dev/sdb已损坏
再次查看RAID状态:
# cat /proc/mdstat => (F)标志为失效盘
[root@client ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sdd[4] sde[3] sdc[1] sdb[0](F) => sdb已经是失效状态,sde替代上去
209582080 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]
[>....................] recovery = 0.9% (1024000/104791040) finish=15.1min speed=113777K/sec
热拔插移除失效硬盘/dev/sdb:
# mdadm /dev/md5 --remove /dev/sdb => 在线移除失效硬盘sdb
热插拔增加一个备用盘:
# mdadm /dev/md5 --add /dev/sdf => 新添加一块硬盘sdf到RAID中,会自动匹配RAID的文件系统类型
再查看RAID状态:
# cat /proc/mdstat => 查看备用盘是否正常
[root@client ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sdf[5](S) sdd[4] sde[3] sdc[1] => sdf已经当做备用盘了
209582080 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]
[===>.................] recovery = 16.0% (16822528/104791040) finish=20.0min speed=73028K/sec
RAID 1+0 实现
RAID 1+0是RAID 1 和RAID 2 的组合 ,先实现RAID 1 再实现RAID 0
添加六块硬盘,RAID 1 使用到三块硬盘,其中两块用来做镜像使用,第三块用来做备份;RAID 0 就是用两个RAID 1组成一个RAID 0 。也就是说四块硬盘互为镜像盘,两块硬盘位备份盘。
实现RAID 1+0:
查看可用硬盘信息:
# lsblk
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
sdd 8:48 0 100G 0 disk
sde 8:64 0 100G 0 disk
sdf 8:80 0 100G 0 disk
sdg 8:96 0 100G 0 disk
创建RAID 1:
# mdadm --create /dev/md1 --level=1 --raid-devices=2 -x 1 /dev/sd[bcd]
=> 后面输入yes,名称为/dev/md1
再创建一个RAID 1:
# mdadm --create /dev/md11 --level=1 --raid-devices=2 -x 1 /dev/sd[efg]
=> 后面输入yes,名称为/dev/md11
最后创建RAID 0:
# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/md1 /dev/md11
=> 由两个RAID 1 组合创建一个RAID 0
查看RAID状态:
# cat /proc/mdstat
[root@client ~]# cat /proc/mdstat
Personalities : [raid1] [raid0]
md0 : active raid0 md11[1] md1[0]
209448960 blocks super 1.2 512k chunks
md11 : active raid1 sdg[2](S) sdf[1] sde[0]
104791040 blocks super 1.2 [2/2] [UU]
[>....................] resync = 1.8% (1944960/104791040) finish=18.5min speed=92617K/sec
md1 : active raid1 sdd[2](S) sdc[1] sdb[0]
104791040 blocks super 1.2 [2/2] [UU]
[=>...................] resync = 8.2% (8633344/104791040) finish=6.5min speed=243184K/sec
unused devices: <none>
格式化及挂载:
# mkfs.xfs /dev/md0 => 格式化的是最后的RAID 0
[root@client ~]# mkfs.xfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=16, agsize=3272576 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=52361216, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=25568, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# mkdir /md0
# mount /dev/md0 /md0 => 挂载使用的也是RAID 0
查看块设备信息:
# df -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md0 200G 33M 200G 1% /md0
=> 六块硬盘100/个,两组RAID 1 都是两块镜像一块备份,所以只有200G大小,没毛病
RAID与NFS结合应用
OS | IP |
---|---|
NFS | 10.1.1.21 |
远程主机 | 10.1.1.20 |
基于RAID 1+0与NFS结合应用
环境准备:
设置静态ip、关闭防火墙、selinux、Ne
安装NFS服务器:
在NFS上查看RAID1+0挂载目录:
# lsblk
[root@nfs ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
└─md1 9:1 0 100G 0 raid1
└─md0 9:0 0 199.8G 0 raid0 /md0
sdc 8:32 0 100G 0 disk
└─md1 9:1 0 100G 0 raid1
└─md0 9:0 0 199.8G 0 raid0 /md0
sdd 8:48 0 100G 0 disk
└─md1 9:1 0 100G 0 raid1
└─md0 9:0 0 199.8G 0 raid0 /md0
sde 8:64 0 100G 0 disk
└─md11 9:11 0 100G 0 raid1
└─md0 9:0 0 199.8G 0 raid0 /md0
sdf 8:80 0 100G 0 disk
└─md11 9:11 0 100G 0 raid1
└─md0 9:0 0 199.8G 0 raid0 /md0
sdg 8:96 0 100G 0 disk
└─md11 9:11 0 100G 0 raid1
└─md0 9:0 0 199.8G 0 raid0 /md0
安装NFS服务组件:
# yum install rpcbind nfs-utils -y
编写NFS服务配置文件,共享LV挂载目录
# vim /etc/exports
/md0 10.1.1.20/24(rw,sync,no_root_squash)
启动NFS服务:
# systemctl restart rpcbind => 启动rpcbind服务
# systemctl restart nfs => 启动nfs服务
在NFS上查看共享:
# showmount -e => 查看共享
[root@nfs ~]# showmount -e
Export list for nfs:
/md0 10.1.1.20/24
远程客户机挂载RAID:
查看共享:
# showmount -e 10.1.1.20
[root@client ~]# showmount -e 10.1.1.21
Export list for 10.1.1.21:
/md0 10.1.1.20/24
挂载RAID:
# mkdir /nfs_raid10 => 创建挂载目录
# mount.nfs 10.1.1.21:/md0 /nfs_raid10 => 将NFS共享目录挂载使用
查看挂载情况:
# df -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
10.1.1.21:/md0 200G 33M 200G 1% /nfs_raid10
RAID 信息保存
创建raid后重启系统,可能会导致raid名称(/dev/md*
)发生变化,并且启动raid的设备时也会出现问题
为了能够让服务器重启后依旧能够找到raid,所以需要保存raid信息(添加raid配置文件)
手动编写raid的配置文件:
- 此文件不存在,要手动建立,并写上与raid相关的所有设备
查看哪些设备是raid的:
# lsblk
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 100G 0 disk
└─md5 9:5 0 199.9G 0 raid5 /md5
sdd 8:48 0 100G 0 disk
└─md5 9:5 0 199.9G 0 raid5 /md5
sde 8:64 0 100G 0 disk
└─md5 9:5 0 199.9G 0 raid5 /md5
sdf 8:80 0 100G 0 disk
└─md5 9:5 0 199.9G 0 raid5 /md5
手动创建raid配置文件:
# vim /etc/mdadm.conf
DEVICES /dev/sdc /dev/sdd /dev/sde /dev/sdf
或
DEVICES /dev/sd[cdef]
=> "DEVICES" raid设备名称.. 为固定写法
扫描当前raid的信息并加到raid配置文件里:
# mdadm --detail --scan >> /etc/mdadm.conf
选项说明:
--detail:详细信息
--scan:扫描
# cat /etc/mdadm.conf => 可以看到raid信息已经自动添加到配置文件了
[root@client ~]# cat /etc/mdadm.conf
DEVICES /dev/sd[cdef]
ARRAY /dev/md5 metadata=1.2 spares=2 name=client:5 UUID=520b5672:a6a34c3a:7f0f8545:823d8568
RAID 停止:
- 停止raid需要先解挂载
查看RAID挂载情况:
# df -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md5 200G 9.8G 190G 5% /md5
解挂载:
# umount /md5
停止RAID:
# mdadm --stop /dev/md5
选项说明:
--stop:停止raid运行
[root@client ~]# mdadm --stop /dev/md5
mdadm: stopped /dev/md5
查看RAID状态:
# cat /proc/mdstst => 可以看到并没有RAID设备
[root@client ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>
列出所有可用块设备的信息:
# lsblk => 可以看到没有/dev/md*的信息
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
sdd 8:48 0 100G 0 disk
sde 8:64 0 100G 0 disk
sdf 8:80 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
RAID 启动:
有配置文件"/etc/mdadm.conf"情况下:
启动RAID:
# mdadm -A /dev/md5 => 注意:设备/dev/md5必须为创建时的RAID名称
选项说明:
-A:将停止的RAID重新启动
=> 有配置文件时raid的名称与配置文件中一致
查看RAID状态:
# cat /proc/mdstat
[root@client ~]cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sde[3] sdf[5](S) sdd[4] sdc[1]
209582080 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
#l 然后直接挂载使用即可
没有配置文件"/etc/mdadm.conf"情况下:
启动RAID:
# mdadm -A /dev/md500 /dev/sd[cdef]
=> 没有配置文件时raid设备名称可变
=> 且必须指定这个raid是由哪几块硬盘组成
查看RAID状态:
# cat /proc/mdstat
[root@client ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md500 : active raid5 sde[3] sdf[5](S) sdd[4] sdc[1]
209582080 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
#l 然后直接挂载使用即可
RAID 删除:
查看RAID挂载情况:
# df -h
[root@client ~]# df -h
/dev/md500 200G 9.8G 190G 5% /md5
解挂载:
# umounr /md5
查看RAID状态:
# cat /proc/mdstat => 查看该RAID由哪几块硬盘组成
md500 : active raid5 sde[3] sdf[5](S) sdd[4] sdc[1]
将RAID中的硬盘强制失效且移除:
# mdadm /dev/md500 --fail /dev/sdc --remove /dev/sdc => 硬盘sdc 失效且移除
# mdadm /dev/md500 --fail /dev/sdd --remove /dev/sdd => 硬盘sdd 失效且移除
# mdadm /dev/md500 --fail /dev/sde --remove /dev/sde => 硬盘sde 失效且移除
# mdadm /dev/md500 --fail /dev/sdf --remove /dev/sdf => 硬盘sdf 失效且移除
查看RAID状态:
# cat /proc/mdstat => 可以看到RAID还在,但是没有硬盘了
[root@client ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md500 : active raid5 super 1.2 level 5, 512k chunk, algorithm 2 [3/0] [___]
unused devices: <none>
删除RAID:
# mdadm --stop /dev/md500 => 因为raid没有硬盘设备了,所以相当于删除RAID
重新格式化硬盘使用:
假设想重新格式化硬盘使用:
# mkfs.xfs /dev/sdc => 会提示包含raid的文件系统,可以加-f选项强制执行
[root@client ~]# mkfs.xfs /dev/sdc
mkfs.xfs: /dev/sdc appears to contain an existing filesystem (linux_raid_member).
mkfs.xfs: Use the -f option to force overwrite.
# mkfs.xfs /dev/sdc =>格式化成功
[root@client ~]# mkfs.xfs -f /dev/sdc
meta-data=/dev/sdc isize=512 agcount=4, agsize=6553600 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26214400, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12800, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
或者直接擦除raid成员信息,然后mkfs格式化硬盘:
# mdadm --misc --zero-superblock /dev/sd[def] => 擦除硬盘的raid信息
# mkfs.xfs /dev/sdd => 这样就可以不加-f直接格式化硬盘
扩展
MySQL数据库迁移
任务背景:
MySQL数据库占用根文件系统空间导致根分区空间使用率过高,MySQL数据库的数据文件存放在/usr/local/mysql中。现在需要将业务数据和系统数据分开,要将MySQL数据库单独放到另一块硬盘上,并实现逻辑卷管理。
任务要求:
- 保证数据库完整的情况下将MySQL数据库迁移到另一块新添加的磁盘上
- 考虑到数据库增长情况,新磁盘使用LVM逻辑卷管理,方便日后动态扩容
任务拆解:
- 需要有一块可用硬盘
- 使用LVM方式管理磁盘
- 迁移MySQL数据库,业务维护时间(23:00- )
① 停监控(根据情况).
②停前端应用
③停MySQL数据库
④备份数据库(全备)
⑤将原有的数据同步到新的设备存储上(数据同步rsync)
⑥启动数据库
⑦启动前端应用
⑧测试人员测试系统
添加一块硬盘制作逻辑卷:
查看硬盘:
# lsblk
[root@client apache2]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd 8:48 0 100G 0 disk
# pvcreate /dev/sdd => 创建物理卷PV
# vgcreate vgmysql /dev/sdd => 创建卷组VG
# lvcreate -n lvmysql -l 100%free vgmysql => 创建逻辑卷LV
# mkfs.xfs /dev/vgmysql/lvmysql => 格式化LV
# mkdir /lvmysql => 创建挂载目录
# mount /dev/vgmysql/lvmysql /lvmysql/ => 挂载LV
迁移数据库:
第一步:有监控停监控
第二步:停前端应用(中间件)
# bin/apachectl -k stop
[root@client apache2]# bin/apachectl -k stop
第三步:停MySQL数据库
# service mysql stop
[root@client apache2]# service mysql stop
Shutting down MySQL.. SUCCESS!
第四步:备份数据库文件(全备)
数据库的数据文件在"/usr/local/mysql/data"中
查看数据库文件大小:可知添加的硬盘足够存储数据库data目录
# du -sh /usr/local/mysql/
[root@client ~]# du -sh /usr/local/mysql/
1.2G /usr/local/mysql/
全备:
# rsync -av /usr/local/mysql/ /lvmysql => 保留mysql文件属性迁移到新硬盘中
第五步:将原有的数据同步到新的设备存储上(数据同步rsync)
解挂载硬盘:
# umount /lvmysql
将硬盘挂载到mysql中:
# mount /dev/vgmysql/lvmysql /usr/local/mysql
=> 因为已经将mysql的文件迁移到硬盘了,而且文件属性都一致,之
可以直接将硬盘挂载在mysql服务商
查看挂载效果:
#de -h
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgmysql-lvmysql 100G 1.2G 99G 2% /usr/local/mysql
第六步:启动数据库
# service mysql start
# mysql -u root -p => 如果能登录说明启动成功
第六步:启动前端应用
# cd /usr/local/apache2
# bin/apachectl
第七步:打开前端应用测试能否正常发布信息等。
第八步:如果前端测试正常,将原mysql数据库文件数据删除
停前端应用:
# cd /usr/local/apache2
# bin/apachectl -k stop
停mysql数据库:
# service mysql stop
解挂载硬盘:
# umount /usr/local/mysql/
删除原数据库文件:
# cd /usr/local/mysql
# rm -rf *
第九步:重新挂载硬盘于mysql目录
挂载:
# mount /dev/vgmysql/lvmysql /usr/local/mysql
启动前端应用:
# service mysql start
# mysql -u root -p => 如果能登录说明启动成功
启动前端应用
# cd /usr/local/apache2
# bin/apachectl
打开前端应用查看是否正常
基于以上步骤,迁移数据库于新硬盘工作结束