文章目录
- 硬盘结构
- 硬盘类型
- # Raid 技术、Raid卡
- 引导
- # MBR(Master boot record)主引导记录
- # GPT(GUID Partition Table)全局唯一标识磁盘分区表
- # 扩展:efi,uefi和bios三种主板固件的区别
- 文件系统
- 磁盘管理
- # 查看可用存储设备
- # 对磁盘分区
- # 对分区格式化
- # mount 创建一个挂载点
- ⭐️ # 查看挂载情况
- 扩展:df 命令
- 扩展:lsblk 命令
- ⭐️ # 查看占用挂载设备的进程
- ⭐️ # 自动挂载
- @例子:给/home扩容
- # 自动挂载(光盘)
- # 挂载光盘镜像
- # 只读挂载
- # 卸载分区
- LVM
- # 介绍 PV、VG、LV
- # LVM 创建
- # LVM 删除
- ⭐️ # 扩充vg(卷组)
- ⭐️ # 拉伸 LV(逻辑卷)
- # 缩小一个逻辑卷
- # 缩小卷组
- loop(伪设备)
- overlayfs
- # 基本规则
- # 例子
- END
硬盘(Hard Disk Drive ,简称HDD)是计算机常用的存储设备之一
硬盘结构
物理结构
- 盘片:硬盘有多个盘片,每个盘片2面
- 磁头:每面一个磁头
数据结构
- 扇区(sector):磁盘上的每个磁道被分为若干个弧段,这些弧段便是硬盘的扇区。硬盘的第一个扇区,叫做引导扇区。
e.g. - 磁道:当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。
- 柱面:在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面。
存储容量
硬盘类型
硬盘类型有以下几种
- SAS硬盘
广泛应用与企业的硬盘
(是新一代的scSI技术,和sATA硬盘相同,都是采取序列式技术以获得更高的传输速度,可达到 6Gb/s) - SATA硬盘
我们常常所谓的机械硬盘
(抗干扰性强,支持热插拔等功能,速度快,纠错能力强) - ATA硬盘
并口数据线连接主板与硬盘,抗干扰性太差,且排线占用空间较大,不利电脑内部散热,已逐渐被 SATA 所取代 - SSD硬盘
固态硬盘(性能比传统硬盘好,通常做系统盘) - SCSI硬盘
现在少用(2020年09月06日)
(小型机系统接口,SCSI硬盘广为工作站级个人电脑以及服务器所使用,资料传输时CPU占用率较低,转速快,支持热插拔等) - IDE硬盘
老古董,能卖钱
💡 提示
关于磁盘接口,这里有详细描述:
- 《【扫盲】硬盘接口『 SATA 、 mSATA 、 m.2 ( NGFF )、PCI-E ( PICe 、 PCI Express ) 』及其协议 『 NVMe 、 AHCI 』
# Raid 技术、Raid卡
RAID 是英文 Redundant Array of Independent Disk 的首字母缩写,中文意思是:独立磁盘冗余阵列。
通俗的讲就是把多块硬盘组成一个独立的磁盘阵列进行管理。
实现raid技术的radi卡
(当然也可以软件实现,但是性能必然没有硬件实现的好)文字: 各种 RAID 详解 视频:怎么组 RAID?其实很简单!
引导
引导即引导计算机如何识别硬盘。硬盘的引导分MBR和GPT两种
三分钟告诉你MBR和GPT的区别 http://www.360doc.com/content/18/0901/23/11935121_783145790.shtml
# MBR(Master boot record)主引导记录
MBR是IBM公司早年间提出的,它是存在于磁盘驱动器开始部分的一个特殊的启动扇区。
位置:
MBR扇区的具体位置在磁盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。由三个部分组成:
- 主引导程序
- 磁盘分区表DPT(Disk Partition table)
- 分区有效标志(55AA)
大小:
MBR扇区(主引导扇区),大小共512字节
其中:
- 主引导程序(boot loader)占用446个字节
- 分区表(Partition table,即DPT)占64个字节
(硬盘中分区有多少以及每个分区的大小都记在其中,其中一个分区占用16个字节,所以主分区+扩展分区最多4个)(16*4=64
)
其中,
扩展分区
不能直接存储数据,需要通过在扩展分区上创建逻辑分区才能存储数据。且逻辑分区没有数量限制,所以我磁盘能有4个以上的分区
- 第三部分是分区有效标识(magic number),结束标志字,占2个字节,固定位55AA(称为“魔数” magic number)
(55AA是一个固定的值,不能变,一旦变了分区就失效了。)
# GPT(GUID Partition Table)全局唯一标识磁盘分区表
由于磁盘空间越来越大,而mbr分区最多只支持2T的磁盘,于是提出的新的磁盘组织方案。
gpt不在有分区的概念,所有CDEF盘都在一段信息中存储。因为兼容问题,gpt其实在引导的最开始部分也有一段mbr引导,也叫做“保护引导”,为了防止设备不支持uefi。
GPT和MBR的区别
- mbr最多支持2T,而gpt理论上是无限制的
- mbr最多支持四个主分区,gpt没有限制
- gpt由uefi启动的,mbr由bios启动。
如何选择
如果你的硬盘超过2T,那么你必须选择GPT+UEFI,2t以下就无所谓了;
但毕竟gpt代表了未来,可以预见早晚uefi会会替代掉bios。
# 扩展:efi,uefi和bios三种主板固件的区别
BIOS(Basic Input Output System 基本输入输出系统)是个程序,存储在主板BIOS芯片中。它保存着计算机最重要的基本输入输出的程序,主要功能是从 CMOS 中读写系统设置的具体信息,为计算机提供最底层、最直接的硬件设置和控制。
简单来说,BIOS 是计算机启动时加载的第一个软件。
EFI或UEFI的一部分也是存储在一个主板芯片中,由于它们在功能上和BIOS差不多,所以习惯上也把存储EFI/UEFI的芯片叫做EFI/UEFI BIOS芯片,EFI/UEFI也叫做EFI/UEFI BIOS,但在实际上它们和BIOS根本是不一样的,所以最好还是把后面的“BIOS”尾巴去掉为好,下面就来具体谈一下BIOS、EFI和UEFI。
⭐️下面谈一下BIOS启动计算机的具体过程⭐️
- 稳定电压
当按下电源开关时,电源就开始向主板和其他设备供电,这时电压还不稳定,在早期的南北桥主板上,由主板北桥向CPU发复位信号,对CPU初始化;稳定电压后复位信号便撤掉。而对于现在的单南桥主板,则由CPU自身调整稳定电压达到初始化的目的,当电压稳定后,CPU便在系统BIOS保留的内存地址处执行跳转BIOS起始处指令,开始执行POST自检。- POST自检(Power On Self Test)
在POST自检中,BIOS只检查系统的必要核心硬件是否有问题,主要是CPU、640K基本内存、显卡是否正常,PS/2键盘控制器、系统时钟是否有错误等等。由于POST检查在显卡初始化以前,因此在这个阶段如发生错误,是无法在屏幕上显示的,不过主板上还有个报警扬声器,而且如果主板的8255外围可编程接口芯片没有损坏的话,POST报警声音一定是会出来的。可以根据报警声的不同大致判断错误所在,一般情况下,一声短“嘀”声基本代表正常启动,不同的错误则是不同的短“嘀”声和长“嘀”声组合。POST自检结束后,BIOS开始调用中断完成各种硬件初始化工作。- 硬件初始化
硬件初始化工作中,主要说明两点,首先经过POST检测后,电脑终于出现了开机启动画面,这就是已经检测到了显卡并完成了初始化。
但是请注意
- 由于BIOS是在16位实模式运行,因此该画面是以VGA分辨率(640*480,纵横比4:3)显示的,因为实模式最高支持的就是VGA。以前的小14-17寸CRT显示器由于都是4:3比例,最高分辨率也比较低,因此这个开机启动画面没有什么违和感,但现在的液晶显示器基本上都是宽屏16:9的,分辨率也较高,因此在这样的显示屏下,启动画面上的一切东西显示都可以说“惨不忍睹”——图形被拉长,字体很大很模糊,可以很明显看到显示字体的锯齿。
- BIOS只识别到由主引导记录(MBR)初始化的硬盘,之所以说明这点,是因为后续的EFI或UEFI采用了一种新的GUID磁盘分区系统(GPT)格式,这种硬盘在BIOS下是无法识别的。
硬件全部初始化完毕后,接下来进入更新ESCD阶段。
- ESCD更新阶段中
(Extended System Configuration Data 扩展系统配置数据)
在ESCD更新阶段中,BIOS将对存储在CMOS中和操作系统交换的硬件配置数据进行检测,如果系统硬件发生变动,则会更新该数据,否则不更新保持原状不变,ESCD检测或更新结束后,BIOS将完成最后一项工作,就是启动操作系统。- 启动操作系统
最后这一步中,BIOS根据CMOS中用户指定的硬件启动顺序,读取相应设备的启动或引导记录,引导相应设备上的操作系统启动,进入操作系统,此后便由操作系统接替BIOS负责硬件和软件间的相互通信。如果发现所有硬件都没有能引导操作系统的记录,则会在屏幕上显示相应错误信息,并将电脑维持在16位实模式。⭐️EFI、UEFI的发展⭐️
.
虽然BIOS作为电脑加电启动所必不可少的部分,但是从其于1975年诞生之日起近30余年,16位汇编语言代码,1M内存寻址,调用中断一条条执行的理念和方式竟然一点都没有改变,虽然经各大主板商不懈努力,BIOS也有了ACPI、USB设备支持,PnP即插即用支持等新东西,但是这在根本上没有改变BIOS的本质,而英特尔为了迁就这些旧技术,不得不在一代又一代处理器中保留着16位实模式(否则根本无法开机的)。
.
但是,英特尔在2001年开发了全新的安腾处理器,采用IA-64架构,并推出了全新的EFI。后来证明,安腾处理器、IA-64架构没有推广开来,而EFI和后继的UEFI却发扬光大,成为现在电脑的主要预启动环境。
.
EFI(Extensible Firmware Interface 可扩展固件接口),它是用模块化、高级语言(主要是C语言)构建的一个小型化系统,它和BIOS一样,主要在启动过程中完成硬件初始化,但它是直接利用加载EFI驱动的方式,识别系统硬件并完成硬件初始化,彻底摒弃读各种中断执行。EFI驱动并不是直接面向CPU的代码,而是由EFI字节码编写成,EFI字节码是专用于EFI的虚拟机器指令,需要在EFI驱动运行环境DXE下解释运行,这样EFI既可以实现通配,又提供了良好的兼容。
.
此外,EFI完全是32位或64位,摒弃16位实模式,在EFI中就可以实现处理器的最大寻址,因此可以在任何内存地址存放任何信息。另外,由于EFI的驱动开发非常简单,基于EFI的驱动模型原则上可以使EFI接触到所有硬件功能,在EFI上实现文件读写,网络浏览都是完全可能的。
.
BIOS上的的CMOS设置程序在EFI上是作为一个个EFI程序来执行的,硬件设置是硬件设置程序、而启动管理则是另一个程序,保存CMOS又是另一个程序,虽然它们在形式的Shell上是在一起的。
.
EFI在功能上完全等同于一个轻量化的OS,但是EFI在制定时就定位到不足以成为专业OS的地位上,有下面几个原因:
- 它只是一个硬件和操作系统间的一个接口
- EFI不提供中断访问机制,EFI必须用轮询的方式检查并解释硬件,较OS下的驱动执行效率较低
- EFI只有简单的存储器管理机制,在段保护模式下只将存储器分段,所有程序都可以存取任何一段位置,不提供真实的保护服务。
.伴随着EFI,一种全新的GUID磁盘分区系统(GPT)被引入支持:
- 传统MBR磁盘只能存在4个主分区,只有在创建主分区不足4个时,可以建立一个扩展分区,再在其上建立被系统识别的逻辑分区,逻辑分区也是有数量的,太多的逻辑分区会严重影响系统启动,MBR硬盘分区最大仅支持2T容量,对于现在的大容量硬盘来说也是浪费。
- GPT支持任意多的分区,每个分区大小原则上是无限制的,但实际上受到OS的规定限制不能做到无限,不过比MBR的2T限制是非常重要的进步。GPT的分区类型由GUID表唯一指定,基本不可能出现重复,其中的EFI系统分区可以被EFI存取,用来存取部分驱动和应用程序,虽然这原则上会使EFI系统分区变得不安全,但是一般这里放置的都是些“边缘”数据,即使其被破坏,一般也不会造成严重后果,而且也能够简单的恢复回来。
.当EFI发展到1.1的时候,英特尔决定把EFI公之于众,于是后续的2.0吸引了众多公司加入,EFI也不再属于英特尔,而是属于了Unified EFI Form的国际组织,EFI在2.0后也遂改称为UEFI(Unified EFI 统一的可扩展固件接口 ),与前身EFI相比,UEFI主要有以下改进:
- UEFI具有完整的图形驱动功能,之前的EFI虽然原则上加入了图形驱动,但为了保证EFI和BIOS的良好过渡,EFI多数还是一种类DOS界面(仍然是640480VGA分辨率),只支持PS/2键盘操作(极少数支持鼠标操作),不支持USB键盘和鼠标。到了UEFI,则是拥有了完整的图形驱动,无论是PS/2还是USB键盘和鼠标,UEFI一律是支持的,而且UEFI在显卡也支持GOP VBIOS的时候,显示的设置界面是显卡高分辨率按640480或1024*768显示,因此画面虽小但很清楚,但是这样会导致屏幕周围大片留黑,不过鱼和熊掌不可兼得,除非UEFI默认窗口大小也是最高分辨率。
- UEFI具有一个独特的功能,安全启动,而EFI是没有安全启动的,安全启动(Secure Boot),实际上通俗的解释是叫做固件验证。开启UEFI的安全启动后,主板会根据TPM芯片(或者CPU内置的TPM)记录的硬件签名对各硬件判断,只有符合认证的硬件驱动才会被加载,而Win8以后的Windows则是在操作系统加载的过程中对硬件驱动继续查签名,符合Windows记录的硬件才能被Windows加载,这在一定程度上降低了启动型程序在操作系统启动前被预加载造成的风险,但是这也会造成系统安装变得垄断。
.
无论EFI还是UEFI,都必须要有预加载环境、驱动执行环境、驱动程序等必要部分组成,为了支持部分旧设备(如在UEFI下挂载传统MBR硬盘,不支持UEFI启动的显卡在UEFI下仍然支持运行等),还需要一个CSM兼容性支持模块、EFI或UEFI都是仅支持GPT磁盘引导系统的⭐️下面就具体谈一下EFI或UEFI启动计算机的过程。⭐️
- 预加载环境(≈稳定电压+POST自检)
一般地,预加载环境和驱动执行环境是存储在UEFI(UEFI BIOS)芯片中的,当打开电源开关时,电脑的主要部件都开始有了供电,与BIOS不同的是,UEFI预加载环境首先开始执行,负责CPU和内存(是全部容量)的初始化工作,这里如出现重要问题,电脑即使有报警喇叭也不会响,因为UEFI没有去驱动8255发声,不过预加载环境只检查CPU和内存,如果这两个主要硬件出问题,屏幕没显示可以立即确定,另外一些主板会有提供LED提示,可根据CPU或内存亮灯大致判断故障。- 驱动执行环境(DXE)载入(≈硬件初始化)
CPU和内存初始化成功后,驱动执行环境(DXE)载入,当DXE载入后,UEFI就具有了枚举并加载UEFI驱动程序的能力,在此阶段,UEFI会枚举搜索各个硬件的UEFI驱动并相继加载,完成硬件初始化工作,这相比BIOS的读中断加载速度会快的多,同样如加载显卡的UEFI驱动成功,电脑也会出现启动画面,硬件驱动全部加载完毕后,最后同BIOS一样,也得去启动操作系统。- 启动操作系统
在启动操作系统的阶段,同样是根据启动记录的启动顺序,转到相应设备(仅限GPT设备,如果启动传统MBR设备,则需要打开CSM支持)的引导记录,引导操作系统并进入,这里需要注意的是,UEFI在检测到无任何操作系统启动设备时,会直接进入UEFI设置页面,而不是像BIOS那样黑屏显示相关信息。
综上对BIOS和UEFI启动计算机过程的叙述,可以概括为:
- BIOS先要对CPU初始化,然后跳转到BIOS启动处进行POST自检,此过程如有严重错误,则电脑会用不同的报警声音提醒,接下来采用读中断的方式加载各种硬件,完成硬件初始化后进入操作系统启动过程;
- 而UEFI则是运行预加载环境先直接初始化CPU和内存,CPU和内存若有问题则直接黑屏,其后启动PXE采用枚举方式搜索各种硬件并加载驱动,完成硬件初始化,之后同样进入操作系统启动过程。
此外,寻址空间:
- BIOS是16位汇编语言程序,只能运行在16位实模式,可访问的内存只有1MB
- 而UEFI是32位或64位高级语言程序(C语言程序),突破实模式限制,可以达到要求的最大寻址。
最后,它们三兼容性的区别:
- BIOS支持MBR、不支持GPT
- EFI兼容MBR、支持GPT
- UEFI同EFI
文件系统
文件系统类型决定了向分区中存放、读取文件数据的方式和效率,在对分区进行格式化时需要选择使用的文件系统类型。
最常用的文件系统主要包括以下几种格式:
EXT4
:第4代扩展文件系统,用于存放文件和目录数据的分区,是 Linux系统中默认使用的文件系统。
是典型的日志型文件系统,其特点是保存有磁盘存取记录的日志数据,便于恢复,在存取性能和稳定性方面更加出色。SWAP
:交换文件系统,用于为Linux系统建立交换分区。交换分区的作用相当于虚拟内存,能够在一定程度上缓解物理内存不足的问题。
一般建议将交换分区的大小设置为物理内存的 1.5~2倍。
例如,对于拥有512MB物理内存的主机,其交换分区的大小建议设置为1024NB。如果服务器的物理内存足够大(如 8GB以上),也可以不设置交换分区。交换分区不用于直接存储用户的文件和目录等数据。XFS
:是一种高性能的日志文件系统,特别擅长于处理大文件,可支持上百万T字节的存储空间。
由于XFS文件系统开启日志功能,所以即便发生宕机也不怕数据遭到破坏,这种文件系统可以根据日志记录在短时间内进行数据恢复。- Linux系统还广泛支持其他各种类型的文件系统:
如JFS、FAT16、FAT32、NTFS 等。 - Centos 6默认使用EXT4而Centos 7默认使用XFS
磁盘管理
添加设备、分区、格式化(创建文件系统)、创建挂载点、修改配置文件
# 查看可用存储设备
fdisk -l
[root@localhost ~]#fdisk -l
磁盘 /dev/sda:64.4 GB, 64424509440 字节,125829120 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00090272
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 9414655 4194304 82 Linux swap / Solaris
/dev/sda3 9414656 125829119 58207232 83 Linux
磁盘 /dev/sdb:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4b3de2b9
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 41945087 20971520 83 Linux
上面输出信息中包含了各硬盘的整体情况和分区情况:
-
Decice
:分区的设备文件名称 -
Boot
:是否引导分区。是,则有“*
”标识 -
Start
:该分区在硬盘中的起始位置(柱面数) -
End
:该分区在硬盘中的结束位置(柱面数) -
Blocks
:分区的大小,以Blocks(块)为单位,默认的块大小为1024字节 -
Id
:分区对应的系统ID号。83表示Linux 中的EXT4分区、8e 表示LVM逻辑卷 -
System
:分区类型
# 对磁盘分区
fdisk /dev/sda
a toggle a bootable flag #设置启动分区
d delete a partition #删除分区
m print thie menu #打印帮助界面
n add a new partition #新建一个分区
p print the partition table #打印分区表
q quit without saving changes #退出不保存
w wite table to disk and exit #退出并保存
如果出现下面这种情况:
是说当前磁盘正在被使用,修改记录只有在重启后才能生效。(或者输入指令强制生效)
生产上不能重启,因此多用强制指令:
partprobe /dev/sda
注:如果是RHEL6操作系统,使用
partx -a /dev/sda
重新获取分区表。
# 对分区格式化
RHEL(Red Hat Enterprise Linux)系列
mkfs.ext3 /dev/sdb1 或 mkfs -t ext3 /dev/sdb1 #RHEL5格式化
mkfs.ext4 /dev/sdb1 或 mkfs -t ext4 /dev/sdb1 #RHEL6格式化
# RHEL7文件系统改为了xfs
mkfs.xfs /dev/sda5 或 mkfs -t xfs /dev/sda5 #RHEL7格式化
-t ext4
表示将分区格式化成ext4文件系统类型。ubuntu 20.4
# mount 创建一个挂载点
⭐️ # 查看挂载情况
很多命令可以完成
# 如下三选一
lsblk # (list block)更好看 详细介绍:http://ipcmen.com/lsblk
df -h
mount | grep sda5 # mount信息过多,必须过滤
扩展:df 命令
不带选项及参数的mount 命令可以显示分区的挂载情况,若要了解系统中已挂载的文件系统磁盘使用情况,如剩余磁盘空间比例等,可以使用 df 命令。
命令格式如下:
df [选项] [文件] 或[设备]
常用选项如下:
格式 | 说明 |
-i | 显示inode信息而非块使用量 |
-h | 以容易理解的格式印出文件系统大小,例如136KB、2 4MB、21GB |
-T | 显示文件系统类型 |
-l | 计算所有的文件大小,对硬链接文件则计算多次 |
-k | 以1024字节为单位列出磁盘空间使用情况 |
扩展:lsblk 命令
lsblk 命令能列出系统上所有的磁盘
命令格式如下:
lsblk [参数]
常用选项和参数如下:
格式 | 说明 |
-a | 显示所有设备 |
-b | 以bytes方式显示设备大小 |
-d | 仅列出磁盘本身,并不会列出该磁盘的分区数据 |
-e | 排除设备 |
-f | 同时列出该磁盘内的文件系统名称 |
-h | 显示帮助信息 |
-m | 显示权限信息 |
-i | 使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用) |
-p | 列出该设备的完整文件名!而不是仅列出最后的名字而已。 |
-t | 列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等 |
⭐️ # 查看占用挂载设备的进程
查看占用挂载设备的进程
fuser -v 挂载点
fuser -km 挂载点
问题:卸载时,磁盘busy怎么办
当卸载一个文件系统时,如果出现如下信息,表示该设备有人正在使用。
[root@zibbix ~]# umount /dev/sda5
umount: /mnt/sda5: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
先查看
[root@zibbix ~]# fuser -c /mnt/sda5
/mnt/sda5: 13796c
[root@zibbix ~]# fuser -c /mnt/sda5/find/
/mnt/sda5/find/: 13796c
杀死正在使用该文件系统的用户,然后才能进行卸载
[root@zibbix ~]# fuser -km /mnt/sda5
/mnt/sda5: 13796c
⭐️ # 自动挂载
需要修改一个配置文件 /etc/fstab
(开机读取)
sudo vim /etc/fstab
位置 | 名称 | 值 | 默认值 |
1 | 挂载的目录 (file system) | 通过 | |
2 | 挂载点 (mount point) | ||
3 | 文件系统类型 (type) | ||
4 | 属性 (options) | ||
5 | 是否备份(fs_dump) | 是否要备份(也可以使用dump命令备份) 0:从不备份 1:每日备份 2:每隔一天备份 | |
6 | 是否校验(fs_pass) | 该字段被fsck命令用来决定在启动时是否需要被扫描的文件系统顺序 (通常: 0: 不自检 1:首先自检,通常只能被/使用; 2:等数字为1的自检完成后,再进行自检 |
UUID作用
UUID是一个标识你系统中的存储设备的字符串,其目的是帮助使用者唯一的确定系统中的所有存储设备,不管它们是什么类型的。它可以标识DVD驱动器,USB存储设备以及你系统中的硬盘设备等。
特点
它是正真唯一标识符(随机生成一个,重复的几率小于中彩票,因此认为唯一标识)
Linux中的许多关键功能现在linux赖于UUID注意
注意
注意
注意
注意修改完/etc/fstab文件后,运行
sudo mount -a
验证配置是否正确,配置不正确可能会导致系统无法正常启动。
@例子:给/home扩容
扩容前:/home
是 /dev/mapper/ubuntu-lv--root
下的文件夹
扩容后:/dev/mapper/ubuntu-lv--home
挂载在 /home
,并且释放 /dev/mapper/ubuntu-lv--root
中原来 /home
占据的空间
实现:
# 复制文件
mkdir /tmp/t1
mount /dev/mapper/ubuntu-lv--home /tmp/t1
cp -adp /home/* /tmp/t1/
# cp 参数:
# -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
# -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
# -f:覆盖已经存在的目标文件而不给出提示。
# -i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
# -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
# -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
# -l:不复制文件,只是生成链接文件
# 自动挂载配置
echo "/dev/mapper/ubuntu-lv--home /home ext4 defaults 0 0
" >> /etc/fstab
# 挂载
mount -a
# 重启(测试新挂载修改是否有问题)
reboot
# 如果没问题,可以释放原来home的磁盘空间
mount /dev/mapper/ubuntu-lv--root /tmp/t1
rm /tmp/t1/home -rf
# 自动挂载(光盘)
vim /etc/fstab
写入
/dev/sr0 /mnt iso9660 defaults 0 0
或者
/dev/cdrom /mnt iso9660 defaults 0 0
因为常识,
cdrom
是一个软连接,指向sr0
# 挂载光盘镜像
比如挂载镜像rhel-server-7.2-x86_64-dvd
mount -o loop rhel-server-7.2-x86_64-dvd /mnt
# 只读挂载
前提是 /sda5 这个目录已经挂载过了。
mount -o remount,ro /sda5
# 卸载分区
卸载分区
umount /dev/sda5
或者卸载挂载点
umount /sda5
如果有人在使用挂载目录,或出现无法卸载的情况。
看提示信息可知道处理方法
1.1
lsof /sda5
查看正在使用的情况
1.2. 可以通过杀死
PID
进程方式终止分区的使用。
2.1 或者使用
fuser
LVM
参考:https://zhuanlan.zhihu.com/p/126309480
LVM Logical Volume Manager 逻辑卷管理是针对磁盘管理的一项技术,与 RAID 有很多的相似点,也是把多个物理磁盘组合起来使用,LVM 甚至可以把多个 RAID 逻辑分区组合起来使用。
好处就是:LVM 管理的磁盘灵活性高,磁盘逻辑空间可以根据实际需要扩大或者缩小。
# 介绍 PV、VG、LV
介绍 LVM 的使用之前我们先来看几个和 LVM 使用相关的概念。
- PV(Physical Volume)物理卷
物理卷可以是一块硬盘、一个物理硬盘的分区、RAID 逻辑分区等 - VG(Volume Group)卷组
卷组是由一个或者多个 PV 组成,可动态扩展和缩小存储空间的一种逻辑上的概念。VG 的存储空间可以被分割为 LV。 - LV(Logical Volume)逻辑卷
我们使用 LVM 技术将硬盘空间组成 VG 卷组后是不能直接使用的,就像我们把硬盘组成 RAID 之后也是不能直接使用的,要通过划分逻辑分区才能使用,LV 就是我们组好 VG 后划分出来的逻辑卷,逻辑卷就和硬盘的分区概念差不多,所以 LV 是可以格式化为具体的文件系统的。
- PE(Physical extent)物理范围
PE 有点类似于磁盘的扇区,通过 LVM 技术组成的 PV 物理卷可以被划分为 PE,它是 LVM 技术中存储的基本单元,具有唯一的编号,用于对存储在硬盘中的数据进行寻址,它也是可以被 LVM 寻址的最小单元,默认大小是 4MB,当然这个大小是可以修改的。- LE(Logical extent)逻辑范围
LE 和 PE 类似,PE 是物理上的 LVM 最小寻址单元,LE 是逻辑上的 LVM 最小寻址单元,在同一个 VG 卷组中,LE 的大小和 PE 的大小是相同的,并且是一一对应的。
LVM 本质就是把一堆物理硬盘逻辑的组合在一起,然后再逻辑的进行分区然后使用。
我们安装系统的时候可以选择使用 LVM 技术对磁盘进行管理,这样我们就可以动态的扩容或者减少硬盘的容量。LVM 技术虽然能够动态的扩容或者减少容量,但是它本身是没有容错机制的,所以我们只有结合 RAID 技术来做 LVM 的容错。还需要注意的是 LVM 组成的逻辑卷不适合用于分区给 /boot 和 swap 分区使用,这两个分区还是应该直接使用物理的磁盘分区。
在安装系统的过程中使用 LVM 技术的视频:LVM 磁盘逻辑卷组管理技术在安装系统中的使用
接着,是长达两个小时的理论视频,个人觉得能填补很多空缺。
# LVM 创建
均在root权限下操作,所以要小心
- 查看新加的硬盘
fdisk -l
看到两块大小10G的硬盘 /dev/sdb /dev/sdc
- 创建物理卷pv
pvcreate /dev/sdb /dev/sdc
查看物理卷信息:
pvdisplay # 详细pvs
- 创建卷组vg
vg用于管理pv空间
# 创建名字为linuxcost的卷组
vgcreate linuxcost /dev/sdb /dev/sdc
后续也能往卷组中添加pv
查看卷组信息
vgdisplay # 详情vgs
- 创建逻辑卷lv
# -n 逻辑卷名
# -L 逻辑卷大小
# 从 linuxcost 卷组中获取空间
lvcreate -n mylv -L 2G linuxcost
查看逻辑卷信息
lvdisplay # 详细lvs
每创建成功一个逻辑卷,就会在 /dev 目录下多出一个所属卷组的逻辑卷文件夹
如/dev/linuxcost/mylv
就是/dev
下的属于/linuxcost
卷组的/mylv
逻辑卷
- 格式化逻辑卷,建立文件系统
mkfs.ext4 /dev/linuxcost/mylv
- 挂载使用
mount /dev/linuxcost/mylv /mnt
mount 命令查看挂载情况
我们可以看到,逻辑卷挂载的分区实际位置在
/dev/mapper
目录下(只是为了方便我们使用,给了一个链接路径)
# LVM 删除
注意,一定要按着 LV 》VG 》PV 的顺序删除
- 删除LV
lvremove /dev/linuxcost/mylv
- 删除VG
vgremove linuxcost
- 删除物理卷
pvremove /dev/sdb
⭐️ # 扩充vg(卷组)
如果在拉升lvm的第一步,查看vg中的空闲空间不够了,怎么办?
这时候需要扩充vg(卷组)
- 查看vg是否有空闲的物理卷
vglisplay
- 将要添加到vg的硬盘格式化为pv
pvcreate /dev/sdd
- 将新的pv添加到指定卷组中
vgextend linuxcost /dev/sdd
最终可以看到,现在多出了10g 可用
⭐️ # 拉伸 LV(逻辑卷)
- 保证VG中有足够的空闲空间
vgdisplay
可以看到,有一个lv(逻辑卷)大小是2g,并且已经挂载了
可以看到,我们的vg(卷组)还有17g的空间
- 扩充逻辑卷
lvextend -L +1G /dev/linuxcost/mylv
执行后,提示已经成功拉伸逻辑卷。
- 查看扩充后的LV大小
lvdisplay
看到逻辑卷大小确实扩充了,mount还在线,数据也没有丢失
但是,df -h 查看到, /dev/mapper/linuxcos-mylv 大小还是2G
原因是,逻辑卷是个底层的东西,操作系统使用任何底层的东西,都要先进行格式化(也就是说创建文件系统)。
我们在逻辑卷上创建的文件系统是2g,现在拉升后,没有更新文件系统,所以文件系统显示出来的还是2g。
- 更新文件系统
resize2fs /dev/linuxcost/mylv
问题:
Linux LV扩容时resize2fs: Bad magic number in super-block while trying to open问题
解决:
不同格式的文件需要使用不同命令df -T
查看文件系统格式
如果是xfs系统格式,需要用xfs_growfs命令xfs_growfs /dev/linuxcost/mylv
- 查看更新后的文件系统
df -h
# 缩小一个逻辑卷
逻辑卷的缩小是无法在线执行的,必须要离线
- 卸载已经挂载的逻辑卷
umount /dev/linuxcost/mylv
- 缩小文件系统
# 文件系统的空间缩小1G
resize2fs /dev/linuxcost/mylv 1G
上面的命令行中,第一次执行没有成功,而是提示要执行命令,进行磁盘校验
resize2fs -f /dev/linuxcost/mylv
之后再次执行下面命令,才能成功
resize2fs /dev/linuxcost/mylv 1G
centos 7 lvm 扩容刷新lv 报错Couldn’t find valid filesystem superblock.的解决
df -Txfs_growfs /dev/centos/root
- 缩小lv
lvreduce -L -1G /dev/linuxcost/mylv
命令执行过程中,有提示 this may destroy your data
是因为不同工具的单位换算可能不一样,因此尽量要留有缓冲空间,如文件系统缩小10G,而逻辑卷只缩小9G。
- 查看缩小后的lv
lvdisplay
- 挂载
mount /dev/linuxcost/mylv /mnt
# 缩小卷组
要确保vg(卷组)中的空闲空间比要拿走的硬盘的空间要大
- 将一个PV从制定卷组中移除
vgreduce linuxcost /dev/sdd
- 查看缩小后的卷组大小
vgdisplay
可见,当前的物理卷也从三块变成了两块
- 移除物理卷
pvremove /dev/sdd
loop(伪设备)
在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。
它能使我们像块设备一样访问一个文件。
即:
如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来
例如:
CD 或 DVD 的 ISO 光盘镜像文件
或者是软盘(硬盘)的 *.img 镜像文件
通过这种 loop mount (回环mount)的方式,这些镜像文件就可以被 mount 到当前文件系统的一个目录下。
loop 含义:
对于第一层文件系统,它直接安装在我们计算机的物理设备之上;
而对于这种被 mount 起来的镜像文件(它也包含有文件系统),它是建立在第一层文件系统之上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为 loop。
losetup命令
losetup [ -e encryption ] [ -o offset ] loop_device file
losetup [ -d ] loop_device
-e 表示加密的方式
-o 设置数据偏移量
-d 卸载设备
loop_device 循环设备名,在 linux 下如 /dev/loop0 , /dev/loop1 等。
file 要与循环设备相关联的文件名,这个往往是一个磁盘镜象文件,如 *.img
使用举例
# 创建空的磁盘镜像文件,这里创建一个1.44M的软盘
dd if=/dev/zero of=floppy.img bs=512 count=2880
# 使用 losetup将磁盘镜像文件虚拟成快设备
losetup /dev/loop1 floppy.img
# 挂载块设备
mount /dev/loop0 /tmp
# 经过上面的三步之后,我们就可以通过/tmp目录,像访问真实快设备一样来访问磁盘镜像文件floppy.img。
# 卸载loop设备
umount /tmp
losetup -d /dev/loop1
overlayfs
mount -t overlay -o <options> overlay <mount point>
# <mount point> 是最终overlay的挂载点。
# 其中overlay的options有如下:
# lowerdir=<dir>
# 指定用户需要挂载的lower层目录
# lower层支持多个目录,用“:”间隔,优先级依次降低。最多支持500层。
# upperdir=<dir>
# 指定用户需要挂载的upper层目录,upper层优先级高于所有的lower层目录。
# workdir=<dir>
# 指定文件系统挂载后用于存放临时和间接文件的工作基础目录。
# default_permissions
# redirect_dir=on/off
# 开启或关闭redirect directory特性
# 开启后可支持merged目录和纯lower层目录的rename/renameat系统调用。
# index=on/off
# 开启或关闭index特性,开启后可避免hardlink copyup broken问题。
下面将lower和upper进行overlay,挂载到merge目录,临时workdir为work目录
mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merge
如下同样将lower和upper进行overlay到merge,但是merge为只读属性
mount -t overlay -o lowerdir=upper:lower overlay merge
# 基本规则
在使用如上mount进行OverlayFS合并之后,遵循如下规则:
- lowerdir和upperdir两个目录存在同名文件时,lowerdir的文件将会被隐藏,用户只能看到upperdir的文件。
- lowerdir低优先级的同目录同名文件将会被隐藏。
- 如果存在同名目录,那么lowerdir和upperdir目录中的内容将会合并。
- 当用户修改mergedir中来自upperdir的数据时,数据将直接写入upperdir中原来目录中,删除文件也同理。
- 当用户修改mergedir中来自lowerdir的数据时,lowerdir中内容均不会发生任何改变。因为lowerdir是只读的,用户想修改来自lowerdir数据时,overlayfs会首先拷贝一份lowerdir中文件副本到upperdir中。后续修改或删除将会在upperdir下的副本中进行,lowerdir中原文件将会被隐藏。
- 如果某一个目录单纯来自lowerdir或者lowerdir和upperdir合并,默认无法进行rename系统调用。但是可以通过mv重命名。如果要支持rename,需要
CONFIG_OVERLAY_FS_REDIRECT_DIR
。
# 例子
#!/bin/sh
create() {
mkdir -p lower/common-dir lower/lower-dir upper/common-dir upper/upper-dir merge work
touch lower/common-dir/lower-file lower/lower-dir/lower-file upper/common-dir/upper-file upper/upper-dir/upper-file
echo "From lower." > lower/common-file
echo "From upper." > upper/common-file
echo "From lower." > lower/lower-file
echo "From upper." > upper/upper-file
mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merge
# mount -t overlay -o lowerdir=upper:lower overlay merge
}
delete() {
umount merge
rm -rf lower upper merge work
}
case $1 in
create)
create
;;
delete)
delete
;;
esac
通过 sudo ./overlayfs_test.sh create/delete
创建测试环境或者清空。
├── lower
│ ├── common-dir
│ │ └── lower-file
│ ├── common-file
│ ├── lower-dir
│ │ └── lower-file
│ └── lower-file
├── merge
│ ├── common-dir
│ │ ├── lower-file
│ │ └── upper-file
│ ├── common-file
│ ├── lower-dir
│ │ └── lower-file
│ ├── lower-file
│ ├── upper-dir
│ │ └── upper-file
│ └── upper-file
├── overlayfs_test.sh
├── upper
│ ├── common-dir
│ │ └── upper-file
│ ├── common-file
│ ├── upper-dir
│ │ └── upper-file
│ └── upper-file
└── work
└── work [error opening dir]
如上的脚本构建的OverlayFS结果如下:
- 两者共同目录common-dir内容进行了合并;
- 重复文件common-file为uppderdir中的common-file。
更多,增删查改的结果参考:
《OverlayFS初识以及使用 》
END