概述:
上篇已经介绍了一些磁盘和文件系统管理的基础概念,对磁盘的硬件构造,文件系统的基础概念部分有了一个大致的了解。本篇就分享一些关于磁盘和文件系统管理的一些高级应用,具体包含:
1、swap交换分区的管理
2、挂载移动介质及dd及相关命令的补充
3、磁盘配额的管理
4、RAID管理
5、LVM逻辑卷管理
6、btrfs文件系统管理
7、高级磁盘管理实战演练
第一章 swap交换分区管理
交换分区是用于当物理内存空间不够用时,将内存中的数据,按照LSU算法,将最近最少使用的一些数据展示存储到交换分区里面,充当内存的补充,inux上的交换分区必须使用独立的文件系统,且文件系统的system ID 必须为82
1、交换分区的创建:
利用fdisk命令,创建一个分区,并将分区类型修改为82,也就是swap类型,出于读写速度考虑,建议将交换分区创建为一个独立磁盘的起始柱面开始的分区(一般为第一个分区),因为按照磁盘物理结构来看,起始柱面处于盘片的最外圈,读写速率相对较高
2、格式化交换分区
创建了交换分区之后,可利用mkswap命令来创建文件系统,格式为:mkswap DEVICE
3、启用禁用交换分区
启用: swapon
swapon [OPTION]… [DEVICE]
-a:激活所有的交换分区,实际是去读/etc/fstab文件
-s 显示swap的分区状况
-p PRIORITY:指定优先级
禁用:swapoff /DEVICE
4、挂载交换分区,让交换分区能够开启自动挂载
编辑/etc/fstab文件添加关于swap分区的挂载条目
5、管理交换分区
交换分区的优先级:
用户可以给某个swap指定一个0到32767的优先级
如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一。
先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)。
调整swap优先级的方法:
1、 在swapon -p 指定优先级(重启后失效)
2、 在fstab中默认挂载选项中定义pri=优先级(永久有效,要想立即生效,需要swapoff,然后再swapon)
6、利用文件(而不是分区)当做交换分区使用
先创建一个合适大小的文件,然后mkswap格式化为swap的文件系统,然后启用之
也支持将配置写入/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 /* 显示根下每个目录的大小
第三章 磁盘配额的管理
Linux是多用户的操作系统,同一时间可能有多个用户登录到系统上进行相关操作,用户在操作的时候,可能会写入很多数据,占用大量磁盘空间,导致其他用户想写数据的时候,没有磁盘空间可用,如何限定某个用户对磁盘的使用空间大小,以及可使用的inode多少,也就是限定可创建多少个文件,这就是磁盘配额管理的作用。
磁盘配额管理的是针对一个独立的分区文件系统进行管理,不能跨分区,如果我们希望对某个目录进行磁盘配额管理,则需要将该目录单独挂载至某个独立的分区
磁盘配额管理的设定流程:
1、启用分区挂载选项usrquota、grpquota,根据需要,只针对用户启用或只针对组启用,也可以两个都启用
注意修改挂载选项后执行重新挂载
2、初始化quota数据库
quotacheck -cu|-cg|-cug /DIR
针对某个分区的挂载目录初始化quota数据库,可以针对用户创建、针对组创建、或者两个都创建,看第一步挂载选项启用的那些都创建那些
初始化数据块后,会在被执行磁盘配额的目录下生成相关的数据库文件,该文件无法通过vi等编辑器查看
3、启用磁盘配额功能
quotaon /DIR
关闭用 quotaoff
quotaon -p /DIR 查看某目录磁盘配额是否启用
4、编辑具体配额信息
edquota USERNAME 进入交互式界面定义配额
或setquota USERNAME 软容量 硬容量 软数量 硬数量 /DIR
或根据现有用户的配置来设置别的用户
edquota -p USER1 USER2 根据user1设置user2
5、验证配额情况
quota USERNAME 查看某用户配额信息
repquota /DIR 查看挂载点的整体配额信息
quotaon -p /DIR 查看某目录磁盘配额是否启用
第四章 RAID管理
1、RAID概述:
多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供
提高IO能力:磁盘并行读写
提高耐用性;磁盘冗余来实现
RAID级别:多块磁盘组织在一起的工作方式有所不同
RAID实现的方式:
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
Software RAID:利用软件实现RAID功能
2、常见RAID级别及其相关属性
RAID的级别仅仅代表磁盘组织方式的不同,不代表先进性
0:代表条带技术(一份分成多分存储,提升读写速率)
性能表现:读写性能提升
冗余能力(容错能力):无
空间利用率:n倍,每个raid0存储量取决于几块盘中最小的容量
至少2块盘
1:代表镜像技术(一份复制多分存储,提升容错率)
性能表现:写下降,读提升
冗余能力:有
空间利用率:1/2,每个raid1存储量取决于几块盘中最小的容量
至少2块盘
5:校验码技术
性能表现:读写提升
冗余能力:有,只能同时坏一块盘
空间利用率:(n-1)/n,每个raid5存储量取决于几块盘中最小的容量
至少3块盘
01:先做0,后做1
性能表现:读写提升
冗余能力:有
空间利用率:1/2
至少4块盘
10:先做1,后做0;实际公司一般用这种,实用性比01好(底层是1,上层是0)
性能表现:读写提升
冗余能力:有,每组镜像对多只能坏一块
空间利用率:1/2,每个raid10存储量取决于几块盘中最小的容量
至少4块盘
50:
性能表现:读写提升
冗余能力:有
空间利用率:(n-2)/2
至少6块盘
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
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来实现数据的转移
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
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
扩展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系列文件系统)
注意:
扩展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有丢失数据风险,需要谨慎
当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
第六章 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]}
执行效果如下:
2、创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录
步骤:
<1>fdisk创建三个大小为1G的分区,修改分区类型为fd,过程略过,结果如下
<2>利用mdadm -C /dev/md2 -n 2 -x 1 -l 1 -a yes /dev/sd{b,c,d}1
<3>导出raid配置文件
<4>格式化创建文件系统
<5>挂载,写入/etc/fstab,注意要使用blkid看到的UUID进行挂载
3、创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录
步骤:
<1>fdisk创建3个1G的磁盘,更改分区格式为fd,过程略过,效果如下:
<2>mdadm -C /dev/md5 -n 3 -l 5 -c 256 -a yes /dev/sd{b,c,d}1 创建raid设备
<3>导出raid的配置文件,放置系统重启或停止raid后重载raid时无法识别
<4>格式化文件系统
<5>编辑开机自动挂载配置文件,实现自动挂载,注意用blkid识别到的UUID进行挂载
4、创建和扩展逻辑卷
环境:centos6.8,利用sdb1和sdc一个分区,一个完成的磁盘组建pv
步骤:
<1>利用fdisk对sdb进行分区,将分区类型改为8e
<2>创建pv
<3>创建vg
<4>创建lv
<5>格式化创建文件系统
<6>挂载使用
<7>扩展逻辑卷(支持在线扩展,确保vg里面有空间供lv扩展,否则就要加pv,扩展vg再扩展lv)
先扩展逻辑卷大小
再扩展逻辑卷上文件系统大小
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
评论列表(1条)
文章对当天所学的知识进行了详细的总结与梳理,通过练习巩固了学到的东西,整篇博客能让人看到很多专业性所在,也能看出很用心的地方,革命尚未成功,同志仍需努力啊,加油!