文件系统与磁盘分区/lvm逻辑卷及实战
一、文件系统和磁盘
VMware虚拟机添加硬盘
//一般添加完成之后,如果想要能够识别,需要重启虚拟机,不过这里也可以通过命令的方式识别
root@base~]#echo"---">>
/sys/class/scsi_host/host0/scan
[root@base~]#echo"---">>
/sys/class/scsi_host/host1/scan
[root@base~]#echo"---">>
/sys/class/scsi_host/host2/scan
[root@base~]#fdisk-l
...
Disk/dev/sdb:21.5GB,21474836480bytes,41943040
sectors
Units=sectorsof1*512=512bytes
Sectorsize(logical/physical):512bytes/512bytes I/Osize(minimum/optimal):512bytes/512bytes
磁盘的构成
硬盘的物理构成:
扇区(sector)、磁道(track)、磁头、柱面(cylinder)
分区:就是记录每一个分区的起始柱面和结束柱面。分区信息存放在0柱面0磁头1扇区上:MBR主引导记录(446字节)+DPT磁盘分区表(64字节)
+结束标志(2个字节)
硬盘的主引导记录(MBR)是不属于任何一个操作系统的,它先于所有的操作系统而被调入内存,并发挥作用,然后才将控制权交给主分区(活动分区)内的操作系统,并用主分区信息表来管理硬盘。
文件系统:是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。
基本概念
block :数据存储的最小单元。
inode:索引节点,全局唯一编号,除了记录文件的属性外,同时还具有指针功能,指向文件内容放置的块。
(里面保存的是文件的权限,所有者,所属主等基本信息)
1、文件的拥有者与用户组(owner/group)
2、文件的访问模式(read/write/excute)
3、文件的类型(type)
4、文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改时间(mtime)
5、文件的大小
6、定义文件属性的标志(flag),如setUID…
7、文件真正内容的指针(pointer)
文件系统
完整的文件系统图:
也称为boot sector。
它位于分区上的第一个块,占用1024字节,并非所有分区都有这个
boot sector,只有装了操作系统的主分区和装了操作系统的逻辑分区才有。里面存放的也是boot loader,这段boot loader称为VBR(主分区装操作系统时)或EBR(扩展分区装操作系统时),这里的Boot loader 和mbr上的boot loader是存在交错关系的。开机启动的时候,首先加载mbr中的bootloader,然后定位到操作系统所在分区的boot serctor 上加载此处的boot loader。
group description(组描述):
既然文件系统划分了块组,那么每个块组的信息和属性元数据又保存在哪里呢?ext文件系统为每一个块组信息使用32字节描述,这32个字节称为块组描述符,所有块组的块组描述符组成块组描述符表
GDT(group descriptor table)。但是不是每个块组中都存放了块组描述符。ext文件系统的存储方式是:将它们组成一个GDT,并将该GDT 存放于某些块组中,存放GDT的块组和存放superblock和备份
superblock的块相同,也就是说它们是同时出现在某一个块组中的。读取时也总是读取Group0中的块组描述符表信息。
superblock(超级块):
记录整个文件系统相关信息
1、block与inode的总量
2、未使用和已使用的inode/block数量
3、文件系统的载入时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
4、有效位的值,已载入为0,未载入为1
block bitmap(块位图):
此处记录block是否使用
在向硬盘存储数据时,文件系统需要知道哪些块是空闲的,哪些块是已经占用了的,位图只使用0和1标识对应block是空闲还是被占用,0 和1在位图中的位置和block的位置一一对应,第一位标识第一个块,第二个位标识第二个块,依次下去直到标记完所有的block。1G的文件只需要128个block做位图就能完成一一对应。通过扫描这100多个
block就能知道哪些block是空闲的,速度提高了非常多。但是要注
意,bmap的优化针对的是写优化,因为只有写才需要找到空闲block 并分配空闲block。对于读而言,只要通过inode找到了block的位置,cpu就能迅速计算出block在物理磁盘上的地址
inode bitmap(inode位图):
此处记录inode是否使用
标识inode号是否被分配的位图称为inode bitmap简称为imap。这时要为一个文件分配inode号只需扫描imap即可知道哪一个inode号是空闲的
inode table(inode表):
为每个inode的数据存放区
一个文件系统中可以说有无数多个文件,每一个文件都对应一个inode,难道每一个仅128字节的inode都要单独占用一个block进行存储吗?更优的方法是将多个inode合并存储在block中,对于128字节的inode,一个block存储8个inode,对于256字节的inode,一个block 存储4个inode。这就使得每个存储inode的块都不浪费。在ext文件系统上,将这些物理上存储inode的block组合起来,在逻辑上形成一张inode表(inode table)来记录所有的inode。
block group
对用户是不可见的,子逻辑区域,有个超级标示区
为了解决bmap、inode table和imap太大的问题,引入块组概念,在物理层面上的划分是将磁盘按柱面划分为多个分区,即多个文件系统;在逻辑层面上的划分是将文件系统划分成块组。每个文件系统包含多个块组,每个块组包含多个元数据区和数据区:元数据区就是存储bmap、inode table、imap等的数据;数据区就是存储文件数据的区域。
data block(数据块):
为每个block的数据存放区
软连接和硬链接:
链接:硬链接和软链接(符号链接),多个文件指向同一个iNode,硬链接;符号连接,指向的是源文件的路径,而不是文件块
硬链接
硬链接:在某个目录下的block中增加一个文件关联数据,不会用到inode 与磁盘空间
只能对文件进行创建,为了避免循环引用
不能跨文件系统,可以在不同目录下
创建硬链接可以增加文件被连接的次数
软连接
软连接(符号链接):建立一个独立的文件,这个文件会让数据的读取指向它连接的文件内容
可以对目录创建
可以跨文件系统
不会增加被链接文件的链接次数
其大小为指定路径所包含的字符个数
二、磁盘分区
传统的硬盘分区都是MBR格式,MBR分区位于0扇区,他一共512字节,前446字节是grub引导程序,中间64字节是分区表,每个分区需要16个字节表示,因此主分区和扩展分区一共只能有4个分区,超过4个的分区只能从扩展分区上再设置逻辑分区来表示。每个分区的大小无法超过2T。 MBR 的最后2个字节是结束符号。
GPT格式,打破了MBR的限制,可以设置多达128个分区,分区的大小根据操作系统的不同有所变化,但是都突破了2T空间的限制。支持高达
18EB (1EB=1024PB,1PB=1024TB) 的卷大小,允许将主磁盘分区表和备份磁盘分区表用于冗余,还支持唯一的磁盘和分区 ID (GUID)。与 MBR 分区的磁盘不同,GPT的分区信息是在分区中,而不象MBR一样在主引导扇区。为保护GPT不受MBR类磁盘管理软件的危害,GPT在主引导扇区建立了一个保护分区 (Protective MBR)的MBR分区表,这种分区的类型标识为0xEE,这个保护分区的大小在Windows下为128MB,Mac OS X下为
200MB,在Window磁盘管理器里名为GPT保护分区,可让MBR类磁盘管理软件把GPT看成一个未知格式的分区,而不是错误地当成一个未分区的磁盘
在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。
分区工具:
fdisk(创建MBR分区)
用来管理分区
[root@base~]#fdisk/dev/sdb
p: 显示当前硬件的分区,包括没有保存的改动
n: 创建一个新的分区
d:删除一个分区
w: 保存并退出
q: 不保存退出
t: 修改分区类型(文件系统类型)
l: 显示所支持的所有类型
分区实例:
//我们可以发现,创建分区都是按柱面来划分,其实柱面到结束柱面。那么下边我们来划分一个分区。
//查看分区情况
//如果你有4个主分区之后,即便你硬盘还有空间,但是不会允许你继续创建分区的,这是在哪里决定的?MBR里bootloarder的64个标识分区。每16位一个。所以我们通常会把第四个分区创建为扩展分区。
//创建完成之后,发现它的格式色extended,扩展分区,它是不能够直接使用的,为什么那?前边我们说过,它其实就是一个指针,直接指向后边真实的空间的。所以我们还得再重新编辑分区。
//到这一步就完了么?很显然没有,因为内核还尚未识别
gdisk(创建GPT分区)
LVM逻辑卷
对于普通的分区,扩展度不高,一旦分区格式化完成,很难灵活的再增加或者减少分区大小。为了解决这个问题,可以使用LVM(逻辑卷)。基本过程是把物理磁盘或者分区初始化称为物理卷(PV),然后把PV加入
VG(卷组),最后在VG上划分逻辑的分区(LVM),LVM可以当做普通的分区进行格式化和挂载。
LVM:可以动态调整分区大小。
PV:(physical volume)物理卷
VG:(volume Group)卷组
LV:(logical volume)逻辑卷
三、测试创建lvm:
环境准备
1、使用4个分区,每个分区容量均为1GB,且system ID 为8e.
2、全部的分区整合成为一个 VG,VG 名称设置为 vgbdqn;且 PE 的大小为 16MB;
3、创建一个名为 lvyjs 的 LV,容量大约 2G
4、最终这个 LV 格式化为 xfs 的文件系统,且挂载在 /bdqn/yjs 中
准备:看要求要用的物理卷的要求,创建对应分区。
1、创建PV
pvcreate :将实体 partition 创建成为 PV ;
pvscan :搜寻目前系统里面任何具有 PV 的磁盘;
pvdisplay :显示出目前系统上面的 PV 状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性
//直接就是pvcreate就可以将分区转化成PV,注意这条指令的大括号和…用途。
这就分别显示每个 PV 的信息与系统所有 PV 的信息。尤其最后一行,显示的是:
整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量
2、创建VG
vgcreate :创建 VG 的
vgscan :搜寻系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;vgextend :在 VG 内增加额外的 PV ;
vgextend :在 VG 内增加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :设置 VG 是否启动(active);
vgremove :删除一个 VG;
//VG创建格式
vgcreate [-s N[mgt]] VG名称 PV名称选项与参数:
-s :后面接 PE 的大小(size),单位可以是 m, g, t (大小写均可)
与 PV 不同的是, VG 的名称是自订的!我们知道 PV 的名称其实就是partition 的设备文件名,但是这个 VG 名称则可以随便你自己取
//将刚创建的4个PV中3个PV创建成一个VG,并且指定PE为16MB.
//这里可以看到刚刚创建的PV /dev/sdb8还没有被使用。
//刚才我们说过,我们要做4个PV创建,所以这里我们再把刚才没有用到的/dev/sdb8添加进去。
3、创建LV
lvcreate :创建 LV
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态
lvextend :在 LV 里面增加容量!
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV !
lvresize :对 LV 进行容量大小的调整!
//创建LV格式
lvcreate [-L N[mgt]] [-n LV名称] VG名称lvcreate [-l N] [-n LV名称] VG名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
-l :后面可以接 PE 的“个数”,而不是数量。若要这么做,得要自行计算 PE 数。
-n :后面接的就是 LV 的名称
//由于本实验中每个 PE 为 16M ,如果要用 PE 的数量来处理的话,那使用下面的指令也可以!
4、格式化
//格式化LV,这里注意一点,LV的平成必须使用全名。如/dev/vg/lv
5、挂载
LVM扩展
LVM最大的特点就是弹性调整磁盘容量大小,那么我们就来先分析一下,如果我们要扩展LV的容量的话,需要怎么做。
首先,如果VG空间还足够的话,直接LVextend就可以了,我们暂且不说,我们要考虑的是,如果VG空间不够的话,我们应该怎么做。我们都知
道,VG那是用物理卷来组成的,也就是说,想要扩展你的VG容量,前提就是有足够的物理卷,物理卷我们这里是虚拟机,直接添加,那么到公司以后就是购买了,当物理磁盘添加成功之后,就是转化成PV,然后那,用
VGextend把创建好的PV加进来。
那么VG空间足够,想要扩展LV,直接就是LVextend,然后lvresize直接添加还有一种那是关于文件系统的增大与缩小,比如说ext2,3,4这个家族,还有xfs,那么这里不是重点,而且一般也不会去改,大家就是知道一下就行
了。
那么接上面的实验,我们想要把刚才的LV /dev/vgbdqn/lvbdqn 挂载目录是 /bdqn/yjs空间增加500M,应该怎么做那?
//首先我们要考虑VG空间是否够用。
//确定了VG空间够用,那么我们直接来扩展。
//注意的是大写的L 后面直接跟容量大小,也可以用小l后面跟PE的倍数。
//LV是扩大了,但我们再看,挂载目录下文件系统的容量并没有增加,那么我们需要一条命令,让系统重新加载一下文件系统的大小。
在上表中,注意看两次 xfs_info 的结果,你会发现到 1)整个 block group (agcount)的数量增加一个!那个 blockgroup 就是纪录新的设备容量之文件系统所在!而你也会 2)发现整体的 block 数量增加了!这样整个文件系统就给他放大了!同时,使用 df 去查阅时,就真的看到增加的量
了!
最后,请注意!目前的 XFS 文件系统中,并没有缩小文件系统容量的设
计!也就是说,文件系统只能放大不能缩小喔!如果你想要保有放大、缩小的本事,那还请回去使用 EXT 家族最新的 EXT4 文件系统啰!XFS 目前是办不到的!
好的,到这里先做一下练习,文件系统格式先用xfs的,然后练习一下扩容,做一个PV,一个VG,然后做成LV
ext4格式缩容
(必须先缩减逻辑卷的逻辑边界,再缩减物理边界)
注意:
1、不能在线缩减,得先卸载;
2、确保缩减后的空间大小依然能存储原有的所有数据;
3、在缩减之前应该先强行检查文件,以确保文件系统处于一致性状态。
现在,将上述LV空间缩容至8G
//对lv强制执行文件系统检测
//使用resize2fs对lv逻辑卷的逻辑边界空间大小调整为缩减后的大小
//使用lvreduce对lv逻辑卷的物理边界进行缩减
//然后继续对lv进行挂载操作
实战一 lvm /根盘扩容
添加一块300G硬盘,我这里是没有磁盘空间,所以我拿20G做演示
1、查看新添加的盘符名字
lsblk
2、划分分区
fdisk /dev/sdb <<EOF
n
p
1
t
8e
w
EOF
3、创建pv
pvcreate /dev/sdb1
4、查看已有卷组
vgscan
5、添加pv到卷组
vgextend centos /dev/sdb1
6、查询系统lv状态
lvdisplay
7、将所有卷组大小分配给lv
lvresize -l 100%VG /dev/centos/root
8、LV是扩大了,但我们再看,挂载目录下文件系统的容量并没有增加,那
么我们需要一条命令,让系统重新加载一下文件系统的大小
xfs_info /
xfs_growfs /
9、查看磁盘是否扩容成功
lsblk
df -h
实战二 新建lvm
这里不做过多简述
fdisk /dev/vdb <<EOF
n
p
1
t
8e
w
EOF
pvcreate /dev/vdb1
vgcreate datavg /dev/vdb1
lvcreate -l 100%VG -n datalv datavg
mkfs.xfs /dev/datavg/datalv
mkdir -p /data
echo "/dev/datavg/datalv /data xfs defaults 0 0" >>/etc/fstab
mount -a
实战三 gpt新建lvm
parted /dev/vdb
mklabel gpt
mkpart primary xfs 0 -1
toggle 1 lvm
quit
partprobe
pvcreate /dev/sdb1 //普通磁盘转换成PV
pvs //查看VG组信息
vgcreate vgdata /dev/sdb1 //创建VG卷组
vgextend vgdata /dev/sdb1 //加入VG组,vgdata要加入VG组名,/dev/sdc1新PV
vgdisplay //查看VG卷组详细信息
#ext4方式
resize2fs /dev/centos/root
#xfs_growfs方式使用
xfs_growfs /dev/mapper/centos-root
查看VG卷组信息
vgs
#创建LV
#lvcreate -n 指定逻辑卷的名称 -L指定LV的大小SIZE(M,G) -l: 指定LE的数量 vganme
lvcreate -n lvdata -L 500G vgdata
#查看逻辑卷信息
lvs
#格式化文件磁盘挂载
mkdir /data
mkfs.xfs /dev/vgdata/lvdata
mount /dev/vgdata/lvdata /data
#加入开机启动项
cat /etc/fstab
实战四 单独挂载一块磁盘,并设置挂载目录/home/xx
1、查看新增磁盘
lsblk
2、查看文件系统类型
df -hT
3、格式化磁盘
mkfs.xfs -f /dev/sdc
4、查看uuid
blkid
5、创建挂载目录
mkdir -p /home/xx
6、设置永久挂载
vim /etc/fstab
UUID="07b72995-e9dc-4556-814b-5c23cedc911b" /home/xx xfs defaults 0 0
7、挂载
mount -a
8、查看是否成功挂载
df -h