Linux内核之磁盘和分区
https://www.dell.com/community/数据存储和保护-资料文档/AIX主机逻辑卷管理器-LVM-概念详解-卷组-物理-逻辑卷-分区/ta-p/7183538
首先磁盘我们都知道,是真正的用来存储数据的,当然帮我们往里面写的软件就是磁盘驱动了
但是,磁盘写了擦擦了写,就会诞生很多不连续的物理空间,
于是,诞生了逻辑分区,即在逻辑层面模拟了磁盘分区,划分的单位称为逻辑卷,即一个逻辑上连续的逻辑卷可能地下连着多个不连续的物理空间
为了描述实现这种映射,于是诞生了物理卷等的概念,所以说所谓"物理"是相对于"逻辑"而言,其实是先有逻辑卷后有物理卷
此时帮上层应用往逻辑卷中写数据的就是"逻辑卷驱动"了
磁盘: 由很多个盘片组成的柱状设备,其他器件比如主轴,控制器,磁头等协作工作将数据写到磁盘中。
参考链接: https://mp.weixin.qq.com/s?src=11×tamp=1591758659&ver=2391&signature=O9LSbW4ID2jVfPIcd3RLiBMfKnS-L*19FBttwHx0laKOuYe4gqnJQUK7H8jNvGY4*Wx08F8KYdjkkj-DZNhbvugrrV6lwHpMpl1bdpnvDLvTMWhoc2fchuRqllZFMQ0i&new=1
platter:盘片
wxy: 难道还存在有3个磁头的?
wxy: 其作用貌似就是用于划分的,即我就是分"圈圈"维度的分割符
wxy: 我的理解称为磁柱更合适,因为无论是从其英文的含义还是划分方式,都可以看做是一个空心的水桶,
磁盘是多个水桶套水桶,当然水桶也是有厚度的,这就跟扇区有关系了,下面会说。
另外,为了理解的方便往往称之为"圈",即内外圈....
wxy: 查了一些资料,sector即扇区确实是指每个磁柱的横截面上被切分的小区域,切分者是半径,
所以这里其实还隐藏一个新的概念: 扇面, 顾名思义就是指横截面被半径切分得到的像蛋糕一样的一个"小面",称为"扇面"
track 和 扇面的结合就得到了 sector
之前,外圈的扇区面积比内圈的大,但是因为使用的磁物质密度不同,所以内外圈(即内外cylinder)上的扇区大小都相同。
现在,内外圈已经采用相同密度物质来存储数据,但是内外圈扇区数量不同
wxy: 内外圈大小不同,划分数量又不同,就表示有可能每个扇区大小相同
磁盘的容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数。
=有几面(比如一般都是2面) × 从圆心向外一共有多少层 × 每一层有多少个小扇面单元 × 每一个单元中有多少字节
二. 分区
硬件是死的,想要能用起来就需要驱动,操作系统这些软件的操作,于是从安装系统开始来讲讲到底是怎么使用这一坨"死的"存储设备
所以接下来的概念,就有软件层面的元素注入了。
0. windows的分区
首先,一块物理硬盘是没有什么分区的概念的,但是为了众所周知的原因需要分成一块一块分区,如何分呢?谁来分呢?
在装机(安装操作系统)之前就需要利用单独的软件为其分区,然后将分区的信息保存在主引导记录(Master Boot Record,MBR)中,
之后开始安装系统,相当于将操作系统程序放到一个分区中,然后将启动程序(用来启动操作系统的启动程序)也放到MBR中
所以,MBR:这是一块存在于磁盘驱动器开始部分的一个特殊的启动扇区,正如上面所说的,MBR有两个作用:记录分区情况和启动程序
最后,再回到分区,有以下几个特性
1, 分区只能分成主分区和扩展分区,其实就是只能划分出来一个或几个主分区,剩下的就叫做扩展分区。所以之有主分区才是真正官方圈出的地盘,也才是可以安装操作系统的
2,主分区最多有4个,因为MBR中只能容纳4条记录
3,扩展分区里可以再在操作系统层面进行划分成若干逻辑分区
4,当然分区后还是不能直接安装操作系统的,和Linux一样要格式化,也就是安装文件系统。
5,一般我们的划分都是一个主分区(第一分区),有了操作系统后就是C盘,然后操作系统会 在剩下的扩展分区中划分出DEF...盘符
分区是硬件,盘符是操作系统即软件层面的东西,所谓分配盘符,就相当于挂载......
6,据说现在使用机械硬盘,所以没有划分分区的必要了,具体也没有深究....
硬盘为什么要分区,这就像整理房间一样,东西都要分门别类,所以我们就提前规划好这一区域做什么那一区域做什么,而在这里"区域"就是"分区"
学院派说:
- 提升数据的安全性(一个分区的数据损坏不会影响其他分区的数据)
- 支持安装多个操作系统
- 多个小分区对比一个大分区会有性能提升
- 更好的组织数据
称为第1分区,占用刚好1个扇区,硬盘的重要信息都在这一分区中,包含三部分
1)MBR(Master Boot Record)区:
规定专门用来存放开机引导程序,占用446byte,因为主机上电后首先就是从这里读取数据,这样才能进行操作系统的启动。
硬盘分区表,记录硬盘上的分区元信息,占用64byte,每条分区记录占用16字节,所以一块磁盘最多只能分4个,这样的分区我们通通称之为"主分区(primary partition)"。
用2个字节存放一个固定值:0x55AA,用来标识这个是第一分区
主要用来存放数据,分为2类分区: 主分区 和 逻辑分区
为什么这么划分,那是为了能够不受只能分4区所限。
试想一下,如果一块磁盘就划分成4个分区,那么如果一旦我又插入一个磁盘,我该将他分到哪里了?你又不能去变更划分好的分区吧(wxy:为什么不能)
所以,我就牺牲一个主分区将其变成一个扩展分区,类似于二级指针这种,可以在这个分区里可以进一步划分成逻辑分区(Logical partitions)
1) 扩展引导记录,类似于DPT,只不过不用包含MBR,就只有扩展分区表和0x55AA结束符
2) 扩展基本分区/逻辑分区(Logical Partion):也是两部分,引导扇区和数据扇区
为了实现逻辑分区的划分,每个逻辑分区都需要软件层面的支持即"逻辑驱动器"
- 1 - 4号都是给主分区和扩展分区用的,5号之后才是给逻辑分区使用;
- 主分区是实实在在的分区,而扩展分区类似是指针的存在,其指向的下一级才是真正代表存储介质的分区;
- 主分区可以有多个,但是扩展分区要么没有(都是主分区), 要么只有一个(用来指向下一级)
# fdisk -l ---查看所有磁盘,以及磁盘的分区情况
磁盘 /dev/sda:1000.2 GB, 1000204886016 字节,1953525168 个扇区 -----第一个磁盘:/dev/sda, 1000G的硬盘
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x000809ff
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 104859647 52428800 83 Linux ----这个磁盘的第1主分区,MBR
/dev/sda2 104859648 1953523711 924332032 8e Linux LVM ---磁盘的第2分区,id 为8e,代表是逻辑卷,LVM
磁盘 /dev/mapper/cl-root:53.7 GB, 53687091200 字节,104857600 个扇区 -----第二个磁盘: 53.7G
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘 /dev/mapper/cl-swap:34.4 GB, 34359738368 字节,67108864 个扇区 ------第三个磁盘
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘 /dev/mapper/cl-home:858.5 GB, 858464976896 字节,1676689408 个扇区 ------第四个磁盘
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
3. 分区格式化与挂载
物理磁盘分区好之后,如下想要真正被使用,还需要进行格式化,即安装上文件系统,从软件层面将硬件纳入到软件层面的管理中来
详细的原理参见另一篇博文
https://www.cnblogs.com/shuiguizi/p/12100859.html
- 为了解决分区空间不够用或者分区空间绰绰有余的情况.
- 解决基本磁盘分区的边界是不能随意扩展的问题,分区大小是在刚刚划分分区的时候就决定了。
1. 灵活的容量.
当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多个磁盘或磁盘分区成单一的逻辑卷.
2.可伸缩的存储池.
你可以使用简单的命令来扩大或缩小逻辑卷大小,不用重新格式化或分区磁盘设备.
3.在线的数据再分配.
你可以在线移动数据,数据可以在磁盘在线的情况下重新分配.比如,你可以在线更换可热插拔的磁盘.
4. 方便的设备命名
逻辑卷可以按你觉得方便的方式来起任何名称.
5.磁盘条块化.
你可以生成一个逻辑盘,它的数据可以被条块化存储在2个或更多的磁盘上.这样可以明显提升数据吞吐量.
6.镜像卷
逻辑卷提供方便的方法来镜像你的数据.
7.卷快照
使用逻辑卷,你可以获得设备快照用来一致性备份或者测试数据更新效果而不影响真实数据.
2.实现原理
【核心思想】:
将整个存储空间在逻辑上划分成一个一个卷称为逻辑卷,为了方便和底层硬件映射,又将物理存储介质统一用一个一个卷来划分称为物理卷
而管理这种映射关系的称为LVM。这个实现可以用如下的一张图进行阐述。
注意: 物理卷实际是逻辑层面的抽象,只不过是对物理介质的抽象而已,实际上并不存在物理卷。所以按照这样的思路我们自上而下的开始研究。
它建立在卷组之上,于是引入VG的概念。
wxy: 其实很好理解这个概念,把底层分布在各处的物理扇区整合成一个个物理卷然后集合在一起成为一个池子,最后就可以将其划分成整块的逻辑卷。
PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。(当PV没有加入卷组的时候 这时候PV的PE是未定的,
当PV加入卷组,PV的PE大小与卷组设定的PE大小相同)
wxy:我的理解是让逻辑层面的物理卷并不是直接一对一对应到物理存储介质,而是用PE来作为度量衡,然后这个度量衡还可配置。
例如上面的图中,一个物理设备驱动而能属于不同的PV,也就是说为了收集各个磁盘设备上的零散分区,用小单元去丈量。
PhysicalStorageMedia:物理存储介质,指系统的物理存储设备,如磁盘(/dev/hda、/dev/sda)等,是存储系统最底层的存储单元。
· 位于一个物理卷
· 跨越一个卷组的多个物理卷
· 多个镜像位于同一卷组的不同物理卷
用如下的一张图可以阐述这个过程
3. 快照
作用:
对某一时刻数据状态的备份提供另一条访问路径,通过快照来备份数据到其它位置,备份完成后,快照就没用了,卸载和移除该快照卷。快照空间的大小取决于数据改变的频度和所需要使用的时间长度,即有限的时间内原文件数据改变的空间大小。
保存数据某一时刻的状态。快照刚刚建立的时候,它的大小是空的。快照是访问原文件的另一条路径。快照是在数据改变之前将数据原封不动的保存到快照空间里面。注意数据变化的幅度不能超过给定快照空间的大小,否则快照将崩溃。
wxy: 还是不是很理解,反正就是一个思想是: 类似于git,如果发现数据写错了可以退回去。然后具体应用场景和用法可以等之后接触到了再补充。
[root@k8s220 ~]# dmsetup table cl-swap: 0 6291456 linear 202:2 2048 cl-root: 0 54517760 linear 202:2 6293504
[root@k8s220 ~]# ll /dev |grep xvda
brw-rw----. 1 root disk 202, 0 11月 24 14:17 xvda
brw-rw----. 1 root disk 202, 1 11月 24 14:17 xvda1
brw-rw----. 1 root disk 202, 2 11月 24 14:17 xvda2
解析: 有两个逻辑分区,存储情况如下
分区cl-swap, 6291456个扇区大小( 对应逻辑设备的0 ~ 6291456-1号扇区),
以线性映射的方式对应到物理设备202:2(代表/dev/xvda2)的第2048号开始的扇区( 结束于 2048 + 6291456 - 1= 6293503 )
分区cl-root, 54517760 个扇区大小(对应逻辑设备的0 ~ 54517760 -1 号扇区),
以线性映射的方式对应到物理设备202:2(代表/dev/xvda2)的第6293504号开始的扇区 ( 结束于 6293504 + 54517760 - 1= 60,811,263 )
2) 从磁盘信息的角度查看
[root@k8s220 ~]# fdisk -l 磁盘 /dev/xvda:32.2 GB, 32212254720 字节,62914560 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000bfce9 设备 Boot Start End Blocks Id System /dev/xvda1 * 2048 2099199 1048576 83 Linux ---主分区,可以直接使用 /dev/xvda2 2099200 62914559 30407680 8e Linux LVM ---扩展分区,不可直接使用, 需要再划分才可以使用, 共60,815,359个扇区。id 为8e代表是逻辑卷 磁盘 /dev/mapper/cl-root:27.9 GB, 27913093120 字节,54517760 个扇区 ---mapper路径下,为逻辑分区1, Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/mapper/cl-swap:3221 MB, 3221225472 字节,6291456 个扇区 ----mapper路径下,为逻辑分区2 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
解析:
# pvdisplay --- Physical volume --- PV Name /dev/xvda2 ###这个物理卷来自xvda2 VG Name cl ###物理卷组是c1 PV Size 29.00 GiB / not usable 3.00 MiB ###占用的磁盘的29G的空间 Allocatable yes (but full) PE Size 4.00 MiB Total PE 7423 Free PE 0 Allocated PE 7423 PV UUID dj2nJv-PCac-vgHl-Tdht-FpGV-B1Nh-yMZsc3
4) 回头看看逻辑卷,在设备列表中,是以什么形态呈现的
[root@k8s220 mapper]# ll /dev/mapper/
总用量 0
lrwxrwxrwx. 1 root root 7 11月 24 14:17 cl-root -> ../dm-0
lrwxrwxrwx. 1 root root 7 11月 24 14:45 cl-swap -> ../dm-1
crw-------. 1 root root 10, 236 11月 24 14:17 control
[root@k8s220 mapper]# ll /dev/ |grep dm
crw-------. 1 root root 10, 60 11月 24 14:17 cpu_dma_latency
brw-rw----. 1 root disk 253, 0 11月 24 14:17 dm-0
brw-rw----. 1 root disk 253, 1 11月 24 14:45 dm-1
crw-------. 1 root root 1, 12 11月 24 14:17 oldmem
解析:
虽然认为是"设备",但实际上虚拟出来的,待逻辑层面(用户侧)看是设备dm-0和dm-1, 但实际上其就是/dev/xvda2这块设备,
更确切的说是磁盘xvda的第二块分区。
[root@k8s220 /]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root xfs 26G 11G 16G 41% / devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev tmpfs tmpfs 3.7G 0 3.7G 0% /dev/shm tmpfs tmpfs 3.7G 380M 3.3G 11% /run tmpfs tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup /dev/xvda1 xfs 1014M 121M 894M 12% /boot tmpfs tmpfs 746M 0 746M 0% /run/user/0 overlay overlay 26G 11G 16G 41% /var/lib/docker/overlay2/ba835bf0837a7c3e88a0b3898f1376a839525d1492493837a684a3569b231158/merged shm tmpfs 64M 0 64M 0% /var/lib/docker/containers/de050fb946e9362930426fb98d5b2c11aa4daca18f9aa24ba7a483cb7852663a/shm
解析:
第一块物理分区: /dev/xvda1,安装的是xfs类型的文件系统,被挂载到了/boot目录下
第二块物理分区/dev/xvda2,其中一块被映射成/dev/mapper/cl-root(假)设备, 安装的是xfs类型的文件系统,被挂载到了根目录下
四:一个例子
... 磁盘 /dev/xvde:75.2 GB, 75161927680 字节,146800640 个扇区 ----新增的磁盘 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
[root@tmp-82 ~]# pvdisplay --- Physical volume --- PV Name /dev/xvda2 VG Name cl ----根目录使用的逻辑卷所属的卷组的名称 PV Size 29.00 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 7423 Free PE 0 Allocated PE 7423 PV UUID dj2nJv-PCac-vgHl-Tdht-FpGV-B1Nh-yMZsc3
【基本思路】
首先,因为都是使用的逻辑卷方式(Device Mapper)挂载到的根目录,
然后,同样将新增的磁盘虚拟化,即映射成逻辑卷,
最后,将新卷扩充到根目录中
【操作步骤】
1. 将物理磁盘直接添加到物理卷组中
[root@tmp-82 ~]# vgextend cl /dev/xvde Physical volume "/dev/xvde" successfully created. Volume group "cl" successfully extended [root@tmp-82 ~]# 结果: [root@tmp-82 cl]# pvdisplay --- Physical volume --- PV Name /dev/xvda2 VG Name cl PV Size 29.00 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 7423 Free PE 0 Allocated PE 7423 PV UUID dj2nJv-PCac-vgHl-Tdht-FpGV-B1Nh-yMZsc3 --- Physical volume --- PV Name /dev/xvde VG Name cl PV Size 70.00 GiB / not usable 4.00 MiB ----注:总共70G, 但是其中有4M不能用 Allocatable yes PE Size 4.00 MiB Total PE 17919 Free PE 17919 Allocated PE 0 PV UUID Z6H0y5-9Ajl-5to6-Q7Bk-2rbN-sNZQ-3OUssC
2. 物理卷池子中空间增大了,于是可以通知为逻辑卷添加空间
[root@tmp-82 cl]# lvextend -L +70g /dev/cl/root Insufficient free space: 17920 extents needed, but only 17919 available 解析:差一块,原因是有4M不能用 [root@tmp-82 cl]# lvextend -L +65g /dev/cl/root Size of logical volume cl/root changed from 26.00 GiB (6655 extents) to 91.00 GiB (23295 extents). Logical volume cl/root successfully resized. 或 lvextend -L +65g /dev/mapper/cl-root
说明:之所以扩充的的如上的目录s,是因为有如下的对应关系
[root@tmp-82 cl]# ll /dev/mapper/cl-root lrwxrwxrwx 1 root root 7 11月 9 10:21 /dev/mapper/cl-root -> ../dm-0 [root@tmp-82 cl]# ll /dev/cl/root lrwxrwxrwx 1 root root 7 11月 9 10:21 /dev/cl/root -> ../dm-0 [root@tmp-82 cl]# ll |grep dm lrwxrwxrwx 1 root root 7 11月 9 10:21 root -> ../dm-0 lrwxrwxrwx 1 root root 7 11月 9 10:21 swap -> ../dm-1 即: /dev/mapper/cl-root = ../dm-0 = /dev/cl/root
3. 逻辑卷池子增大了,于是可以通知为文件系统增加空间了
# xfs_growfs /dev/mapper/cl-root meta-data=/dev/mapper/cl-root isize=512 agcount=4, agsize=1703680 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=6814720, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=3327, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 6814720 to 23854080
注:
resize2fs 命令 针对的是ext2、ext3、ext4文件系统
xfs_growfs 命令 针对的是xfs文件系统
4. 结果, 从26 + 65 = 91
[root@tmp-82 cl]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/cl-root xfs 91G 16G 76G 18% /
....