磁盘结构
设备文件
对于硬件设备,在Linux系统中,也是以文件的形式呈现出来的
设备文件:关联至一个设备驱动程序,进而能够与之对应的硬件设备进行通信
#普通文件
[root@ubuntu2204 ~]# ll t*
-rw-r--r-- 1 root root 20 Jul 11 21:17 test
-rw-r--r-- 1 root root 178 Jul 15 09:50 test2.sh
#设备文件
[root@ubuntu2204 ~]# ll /dev/sda
brw-rw---- 1 root disk 8, 0 Jul 29 08:51 /dev/sda
#设备文件
[root@ubuntu2204 ~]# ll /dev/tty0
crw--w---- 1 root tty 4, 0 Jul 29 08:51 /dev/tty0
设备号
设备号 | 英文 | 作用 |
---|---|---|
主设备号 | major number | 标识设备类型 |
此设备号 | minor number | 标识同一类型下的不同设备 |
设备文件类型
设备类型 | 英文 | 文件类型标识字符 | 存储单位 | 典型设备 |
---|---|---|---|---|
块设备 | block | b | 块 | 磁盘 |
字符设备 | char | c | 字符 | 键盘 |
磁盘设备的设备文件命名
设备类型 | 设备文件命名 |
---|---|
SAS,SATA,SCSI,IDE,USB | /dev/sda; /dev/sdb; /dev/sdc; ...... |
nvme协议硬盘 | /dev/nvme0n1; /dev/nvme0n2; /dev/nvme0n3; ...... |
虚拟磁盘 | /dev/vda; /dev/vdb; /dev/xvda; /dev/xvdb; ...... |
添加硬盘,不重启识别
echo '- - -' > /sys/class/scsi_host/host0/scan
echo '- - -' > /sys/class/scsi_host/host1/scan
echo '- - -' > /sys/class/scsi_host/host3/scan
.....
#但是在 ubuntu 中,该目录下的内容太多了
ls /sys/class/scsi_host/
#两种写法,1 循环遍历
for i in `ls /sys/class/scsi_host/`;do echo '- - -' >
/sys/class/scsi_host/$i/scan;done
grep mptspi /sys/class/scsi_host/host*/proc_name
/sys/class/scsi_host/host32/proc_name:mptspi
echo '- - -' > /sys/class/scsi_host/host32/scan
此处是重新扫描 SCSI 总线来添加设备,之所以是 SCSI 总线,是因为我们添加的 SCSI 类型的硬盘
SCSI:(small computer system interface),小型计算机系统接口
SCSI 是常用且重要的数据传输协议之一,它支撑着操作系统对外部设备的i/o操作。实际应用场景中,在 linux系统上添加一个新的 scsi 磁盘是不需要重启的,一般可以通过扫描发现的操作来识别就绪设备
/sys 文件系统是和 /proc 一样,是一个内存文件系统 ,在磁盘上并没有对应的内容。通常称其为 sysfs, 这是内核 “暴露” 给用户空间的一个 驱动模型层次结构的展现。因此,host0, host1 这些 “文件” 是内核 根据设备驱动程序 “发现” 的设备后在内存中创建的对应的 “文件” 和 "文件层次"。
硬盘类型
硬盘接口类型
-
IDE:133MB/s,并行接口,早期家用电脑
-
SCSI:640MB/s,并行接口,早期服务器
-
SATA:6Gbps,SATA数据端口与电源端口是分开的,即需要两条线,一条数据线,一条电源线
-
SAS:6Gbps,SAS是一整条线,数据端口与电源端口是一体化的,SAS中是包含供电线的,而 SATA中不包含供电线。SATA标准其实是SAS标准的一个子集,二者可兼容,SATA硬盘可以插入 SAS主板上,反之不行
-
USB:480MB/s
-
M.2:
注意:速度不是由单纯的接口类型决定,支持Nvme协议硬盘速度是最快的
服务器硬盘大小
-
LFF:3.5寸,一般见到的那种台式机硬盘的大小
-
SFF:Small Form Factor 小形状因数,2.5寸,注意不同于2.5寸的笔记本硬盘
L、S分别是大、小的意思,目前服务器或者盘柜采用sff规格的硬盘主要是考虑增大单位密度内的磁盘容 量、增强散热、减小功耗
机械硬盘和固态硬盘
机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴 上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直 径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径 方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操 作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可以通过相反方式读取。硬盘为精 密设备,进入硬盘的空气必须过滤
固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元 (FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完 全相同,在产品外形和尺寸上也与普通硬盘一致
相较于HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势,SSD传输速率性能是HDD 的2倍
相较于SSD,HDD在价格、容量占有绝对优势
硬盘有价,数据无价,目前SSD不能完全取代HHD
硬盘存储术语CHS
术语 | 英文 | 描述 |
---|---|---|
磁头 | head | 一个盘面对应一个磁头 |
磁道 | track | 盘面上的每一圈就是一个磁道 |
扇区 | sector | 把每个磁道按512bytes大小再进行划分,这就是扇区,每个磁道上的扇区数量 是不一样的 |
柱面 | cylinder | 磁头移动的时候,是一起移动的,如果是6个盘面,则6个磁头对应的磁道是一 致的,这就是柱面 |
查看CHS信息
fdisk -l /dev/sda
识别SSD和机械硬盘类型
#1表示机械,0表示SSD
lsblk -d -o name,rota
区位记录磁盘扇区结构ZBR(Zoned Bit Recording)
磁盘上寻址的两种方式
CHS
-
CHS采用 24 bit位寻址
-
其中前10位表示cylinder,中间8位表示head,后面6位表示sector
-
最大寻址空间 8 GB
LBA(logical block addressing)
-
LBA是一个整数,通过转换成 CHS 格式完成磁盘具体寻址
-
ATA-1规范中定义了28位寻址模式,以每扇区512位组来计算,ATA-1所定义的28位LBA上限达到 128 GiB。2002年ATA-6规范采用48位LBA,同样以每扇区512位组计算容量上限可达128 Petabytes
由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB时,可以使用CHS寻址方 式或是LBA寻址方式;在磁盘容量大于大概8GB时,则只能使用LBA寻址方式
管理存储
使用磁盘空间过程
-
设备分区
-
创建文件系统
-
挂载新的文件系统
磁盘分区
分区的优势
-
优化I/O性能
-
实现磁盘空间配额限制
-
提高修复速度
-
隔离系统和程序
-
安装多个OS
-
采用不同文件系统
分区方式
两种分区方式:MBR,GPT
MBR分区
MBR:Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T
划分分区的单位:
-
CentOS 5 之前按整柱面划分
-
CentOS 6 版本后可以按Sector划分
0磁道0扇区:512bytes
-
446bytes: boot loader 启动相关
-
64bytes:分区表,其中每16bytes标识一个分区
-
2bytes: 55AA,标识位
MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5
为什么不能超过4个主分区?
因为在0磁道0扇区上只留了64bytes空间存储分区表信息,而一个分区的关键信息要占用16个字节来存 放
为什么单分区不能超2T?
一个分区信息占用16个字节,其中记录分区开始位置的空间为4个字节,记录分区结束位置的空间也是4 个字节;
一个字节8位,4个字节是32位,则起始位最小值为32个0,结束位最大值为32个1,
所以一个分区,最大就是2的32次方个扇区,一个扇区512字节,则最大空间是 2^32*2^9 = 2^41 字 节;
2^40是T,那2^41就表示不超过2T
查看分区表信息
hexdump -C -n 512 /dev/sda
GPT分区
-
GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z ( 512Byte/block )64Z ( 4096Byte/block)
-
使用128位UUID(Universally Unique Identifier) 表示磁盘和分区,GPT分区表自动备份在头和尾两 份, 并有CRC校验位
-
UEFI (Unified Extensible Firmware Interface 统一可扩展固件接口)硬件支持GPT,使得操作系统 可以启动
GPT分区结构
GPT分区结构分为4个区域:
-
GPT头
-
分区表
-
PT分区
-
备份区域
ubuntu默认使用gpt分区
BIOS和UEFI
BIOS 是固化在电脑主板上的程序,主要用于开机系统自检和引导操作系统。目前新式的电脑基本上都是 UEFI启动
BIOS(Basic Input Output System 基本输入输出系统)主要完成系统硬件自检和引导操作系统,操作 系统开始启动之后,BIOS的任务就完成了。系统硬件自检:如果系统硬件有故障,主板上的扬声器就会 发出长短不同的“滴滴”音,可以简单的判断硬件故障,比如“1长1短”通常表示内存故障,“1长3短”通常 表示显卡故障
BIOS在1975年就诞生了,使用汇编语言编写,当初只有16位,因此只能访问1M的内存,其中前640K称 为基本内存,后384K内存留给开机和各类BIOS本身使用。BIOS只能识别到主引导记录(MBR)初始化 的硬盘,最大支持2T的硬盘,4个主分区(逻辑分区中的扩展分区除外),而目前普遍实现了64位系 统,传统的BIOS已经无法满足需求了,这时英特尔主导的EFI就诞生了
EFI(Extensible Firmware Interface)可扩展固件接口,是 Intel 为PC 固件的体系结构、接口和服务提 出的建议标准。其主要目的是为了提供一组在 OS 加载之前(启动前)在所有平台上一致的、正确指定 的启动服务,被看做是BIOS的继任者,或者理解为新版BIOS。
UEFI是由EFI1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际 组织 。
UEFI(Unified Extensible Firmware Interface)统一的可扩展固件接口, 是一种详细描述类型接口的标 准。UEFI相当于一个轻量化的操作系统,提供了硬件和操作系统之间的一个接口,提供了图形化的操作 界面。最关键的是引入了GPT分区表,支持2T以上的硬盘,硬盘分区不受限制
BIOS和UEFI区别
BIOS采用了16位汇编语言编写,只能运行在实模式(内存寻址方式由16位段寄存器的内容乘以16(10H) 当做段基地址,加上16位偏移地址形成20位的物理地址)下,可访问的内存空间为1MB,只支持字符操 作界面
UEFI采用32位或者64位的C语言编写,突破了实模式的限制,可以达到最大的寻址空间,支持图形操作 界面,使用文件方式保存信息,支持GPT分区启动,适合和较新的系统和硬件的配合使用
BIOS+MBR与UEFI+GPT
MSDN (Microsoft Developer Network) 指出,Windows 只能安装于 BIOS + MBR 或是 UEFI + GPT 的 组合上,而 BIOS + GPT 和 UEFI + MBR 是不允许的。但是 BIOS + GPT + GRUB 启动Linux 是可以的
管理分区
列出块设备
lsblk [options] [<device> ...]
#常用选项
-a|--all #输出所有设备信息
-b|--bytes #以字节为单位显示设备大小
-d|--nodeps #不显示分区信息
-e|--exclude <list> #以主设备号排除设备
-f|--fs #显示文件系统
-i|--ascii #只使用 ascii 字符输出
-I|--include <list> #仅显示指定的设备
-J|--json #以json格式显示输出
-l|--list #以列表显示
-T|--tree #以树状结构显示,默认项
-m|--perms #显示属主属组及权限
-n|--noheadings #不显示表头
-o|--output <list> #只显示指定列
-O|--output-all #显示所有列
-p|--paths #显示设备全路径
-P|--pairs #以 k=>v 的格式显示输出
-r|--raw #原样输出
-s|--inverse #反向显示关联信息
-S|--scsi #显示scsi设备(small computer system interface
device,小型计算机接口设备)
-t|--topology #显示拓扑信息
#常用字段
NAME #设备名称
MAJ:MIN #主设备号:次设备号
RM #是否是可移动设备
SIZE #设备容量大小
RO #是否是只读设备
TYPE #设备类型
MOUNTPOINT #挂载点
创建分区命令
fdisk #管理MBR分区
gdisk #管理GPT分区
parted #高级分区操作,可以是交互或非交互方式
partprobe #重新设置内存中的内核分区表版本,适合于除了CentOS 6 以外的其它版本 5,7,8
parted 命令(不太推荐)
注意:parted 的操作都是实时生效的,没有交互式确认
格式:
parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]
#常用选项
-l|--list #显示所有硬盘分区信息
-s|--script #不输出提示信息
#常用子命令
align-check TYPE N #检查分区是否满足对齐(最小|最佳)类型的对齐方式
help [COMMAND] #显示命令帮助
mklabel|mktable LABEL-TYPE #指定磁盘的分区类型 gpt|msdos(mbr)
mkpart PART-TYPE [FS-TYPE] START END #新建分区,指定分区类型,文件系统,开始结束位置
name NUMBER NAME #重命名指定分区
print [devices|free|list,all|NUMBER] #显示
quit #退出
rescue START END #空间碎片整理
resizepart NUMBER END #重置分区大小
rm NUMBER #删除指定分区
select DEVICE #选择设备
disk_set FLAG STATE #为设备打标签
disk_toggle [FLAG] #修改flag
set NUMBER FLAG STATE #设置flag
toggle [NUMBER [FLAG]] #修改flag
unit UNIT #设置默认单位, 默认为MB,B|KB|MB|GB|TB
version #显示版本
分区工具fdisk
fdisk [options] <disk>
fdisk [options] -l [<disk>]
#类似于fdisk 的GPT分区工具
gdisk [options] [device...]
#常用选项
-b|--sector-size <size> #指定扇区大小,默认512字节
-L|--color[=color] #显示时是否添加颜色(auto|always|never)默认启用颜色
-l|--list #显示
-o|--output <list> #只显示指定列
-u|--units[=<unit>] #设置显示单位 cylinders|sectors,默认sectors
-s|--getsz #显示设备有多少个扇区
-b|--bytes N #以指定的字节大小来计算扇区数量
-t|--type type #只显示指定类型的分区表
-C|--cylinders N #指定柱面数
-H|--heads N #指定磁头数
-S|--sectors N #指定每条磁道的扇区数
#常用子命令
p #输出分区列表
t #更改分区类型
n #创建新分区
d #删除分区
v #校验分区
u #转换单位
w #保存并退出
q #不保存并退出
x #高级功能(专家模式)
分区工具gdisk
gdisk [ -l ] device
#常用子命令
b #备份分区表到指定文件
c #修改分区名
d #删除分区
i #显示分区详细信息
l #列出所有分区类型
n #新建分区
o #创建新的分区表
p #查看分区
q #退出
r #恢复和转换选项,非专业人士勿用
s #排序
t #修改分区类型,默认 8300,表示普通分区
v #检测硬盘是否有问题
w #保存退出
x #额外功能,专家模式
? #显示帮助
文件系统
文件系统概念
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的 方法。
操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进 行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的 存取,安全控制,日志,压缩,加密等。
查看当前内核支持的文件系统:
ls /lib/modules/`uname -r`/kernel/fs
查看当前系统可用的文件系统:
cat /proc/filesystems
当前系统支持的文件系统和当前系统可用的文件系统是两回事,modules 中的文件系统在编译时选择了 才是可用的,而可用的文件系统包含了默认支持的文件系统,如果需要使用某个文件系统,而该文件系 统又不在proc 中,则需要重新编译内核;
文件系统类型
Linux 常用文件系统
文件系统 | 备注 |
---|---|
ext2 | Extended file system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分 区 |
ext3 | ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复 |
ext4 | ext 文件系统的最新版。有很多新的特性,包括纳秒级时间戳、巨型文件 (16TB)、最 大1EB的文件系统,以及速度的提升 |
xfs | SGI,支持最大8EB的文件系统 |
swap | 交换分区专用的文件系统 |
ios9660 | 光盘文件系统 |
btrFS | Oracle公司开发 |
reiserFS |
Windows 常用文件系统
文件系统 | 备注 |
---|---|
FAT32 | 最多只能支持16TB的文件系统和4GB的文件 |
NTFS | 最多只能支持16EB的文件系统和16EB的文件 |
extFAT |
常用的文件系统特性:
FAT32
最多只能支持16TB的文件系统和4GB的文件
NTFS
最多只能支持16EB的文件系统和16EB的文件
EXT3
-
最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件
-
Ext3目前只支持32000个子目录
-
Ext3文件系统使用32位空间记录块数量和 inode数量
-
当数据写入到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块
EXT4
-
EXT4是Linux系统下的日志文件系统,是EXT3文件系统的后继版本
-
Ext4的文件系统容量达到1EB,而支持单个文件则达到16TB
-
理论上支持无限数量的子目录
-
Ext4文件系统使用64位空间记录块数量和 inode数量
-
Ext4的多块分配器支持一次调用分配多个数据块
-
修复速度更快
XFS
-
根据所记录的日志在很短的时间内迅速恢复磁盘文件内容
-
用优化算法,日志记录对整体文件操作影响非常小
-
是一个全64-bit的文件系统,最大可以支持8EB的文件系统,而支持单个文件则达到8EB
-
能以接近裸设备I/O的性能存储数据
文件系统的组成部分
内核中的模块:ext4, xfs, vfat
Linux的虚拟文件系统:VFS
用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
文件系统选择管理
创建文件系统
mkfs
mkfs [options] [-t <type>] [fs-options] <device> [<size>]
#常用选项
-t|--type=model #指定文件系统类型 (ext2|ext3|ext4|xfs),默认 ext2
-b #指定块 block 大小 (1024|2048|4096)
-L LABEL #设置卷标
-V|--verbose #显示创建过程
-j #同 -t ext3
-i N #为数据空间中每多少个字节创建一个inode;不应该小于block大小
-N N #指定分区中创建多少个inode
-I N #一个inode记录占用的磁盘空间大小,128---4096
-m N #默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...] #启用指定特性
-O ^FEATURE #关闭指定特性
#示例
#创建ext4 文件系统
#mkfs.ext4 /dev/sdc1 等同于 mkfs -t ext4 /dev/sdc1
#查看指定设备
lsblk -f /dev/sda
#查看所有设备
lsblk -f
mke2fs
ext系列文件系统专用管理工具
mke2fs [OPTION]... DEVICE
#常用选项
-t #指定文件系统类型 {ext2|ext3|ext4|xfs}
-b #指定块大小{1024|2048|4096}
-L LABEL #设置卷标
-j #同 -t ext3,mkfs.ext3|mkfs -t ext3|mke2fs -
j|mke2fs -t ext3
-i N #为数据空间中每多少个字节创建一个inode 不应该小于
block大小
-N N #指定分区中创建多少个inode
-I N #一个inode记录占用的磁盘空间大小,128---4096
-m N #默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...] #启用指定特性
-O ^FEATURE #关闭指定特性
查看和管理分区信息
blkid
查看块设备属性信息
blkid [OPTION]... [DEVICE]
#常用选项
-U UUID #根据指定的UUID来查找对应的设备
-L LABEL #根据指定的LABEL来查找对应的设备
e2label
管理ext系列文件系统的LABEL
e2label DEVICE [LABEL]
findfs
查找分区
findfs [options] {LABEL,UUID,PARTUUID,PARTLABEL}=<value>
tune2fs
重新设定ext系列文件系统可调整参数的值
tune2fs [OPTION]... [DEVICE]
#常用选项
-l #查看指定文件系统信息
-L LABEL #修改卷标
-m N #修预留给管理员的空间百分比
-j #将ext2升级为ext3
-O #文件系统属性启用或禁用, -O ^has_journal
-o #调整文件系统的默认挂载选项,-o ^acl
-U UUID #修改UUID号
dumpe2fs
显示ext文件系统信息,将磁盘块分组管理
dumpe2fs [OPTION]... [DEVICE]
xfs_info
显示已挂载的 xfs 文件系统信息
xfs_info mountpoint|devname
文件系统检测和修复
文件系统故障常发生于死机或者非正常关机之后,挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下执行下面命令修复
fsck
fsck: File System Check
fsck [options] -- [fs-options] [<filesystem> ...]
#常用选项
-a #自动修复
-r #交互式修复错误
e2fsck
ext系列文件专用的检测修复工具
e2fsck [options] -- [fs-options] [<filesystem> ...]
#常用选项
-y #自动回答为yes
-f #强制修复
-p #自动进行安全的修复文件系统问题
xfs_repair
xfs文件系统专用检测修复工具
xfs_repair [options] device
#常用选项
-f #修复文件,而设备
-n #只检查
-d #允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot
挂载
挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问 入口的行为
卸载:为解除此关联关系的过程
把设备关联挂载点:mount Point
挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空 进程正在使用中的设备无法 被卸载
挂载文件系统 mount
格式:
mount [-lhV]
mount -a [options]
mount [options] [--source] <source> | [--target] <directory>
mount [options] <source> <directory>
mount <operation> <mountpoint> [<target>]
device:指明要挂载的设备
设备文件:例如:/dev/sda5
卷标:-L 'LABEL', 例如 -L 'MYDATA'
UUID: -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
伪文件系统名称:proc, sysfs, devtmpfs, configfs
mountpoint:挂载点目录必须事先存在,建议使用空目录
挂载规则:
-
一个挂载点同一时间只能挂载一个设备
-
一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏
-
一个设备可以同时挂载到多个挂载点
-
通常挂载点一般是已存在空的目录
mount 常用命令选项
-a|--all #自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
-B|--bind #绑定目录到另一个目录上
-c|--no-canonicalize #不对路径规范化
-f|--fake #空运行;跳过 mount(2) 系统调用
-F|--fork #对每个设备禁用 fork,配合-a 选项一起使用
-T|--fstab path #指定写文件,默认 /etc/fstab
-i|--internal-only #不调用 mount.<type> 辅助程序
-l|--show-labels #显示文件系统的 labels
-n|--no-mtab #不更新/etc/mtab,mount不可见
-o|--options o1,o2 #挂载选项列表,以英文逗号分隔
-O|--test-opts o1,o2 #限制文件系统集合(和 -a 选项一起使用)
-r|--read-only #以只读方式挂载文件系统(同 -o ro)
-t|--types #指定要挂载的设备上的文件系统类型,如:ext4,xfs
--source device #指明源(路径、标签、uuid)
--target mountpoint #指明挂载点
-v|--verbose #显示过程
-w|--rw|--read-write #以读写方式挂载文件系统(默认)
-L LABEL #以卷标指定挂载设备
-U UUID #以UUID指定要挂载的设备
#-o选项值
async #异步模式,内存更改时,写入缓存区buffer,过一段时间再写到磁盘中,效率高,但不安全
sync #同步模式,内存更改时,同时写磁盘,安全,但效率低下
atime/noatime #包含目录和文件
diratime/nodiratime #目录的访问时间戳
auto/noauto #是否支持开机自动挂载,是否支持-a选项
exec/noexec #是否支持将文件系统上运行应用程序
dev/nodev #是否支持在此文件系统上使用设备文件
suid/nosuid #是否支持suid和sgid权限
remount #重新挂载
ro/rw #只读/读写
user/nouser #是否允许普通用户挂载此设备,/etc/fstab使用
acl/noacl #启用此文件系统上的acl功能
loop #使用loop设备
_netdev #当网络可用时才对网络资源进行挂载,如:NFS文件系统
defaults #相当于rw, suid, dev, exec, auto, nouser,async
#--source 选项值
-L|--label label #同 LABEL=label
-U|--uuid uuid #同 UUID=uuid
LABEL=label #用label值指定设备
UUID=uuid #用uuid值指定设备
PARTLABEL=label #按PARTLABEL值指定设备
PARTUUID=uuid #按PARTUUID值指定设备
device #按路径指定设备
directory #绑定式挂载的挂载点(参阅 --bind/rbind)
file #用于设置回环设备的常规文件
卸载文件系统 umount
卸载时:可使用设备,也可以使用挂载点
格式:
umount [-hV]
umount -a [options]
umount [options] <source> | <directory>
查看挂载情况
查看挂载
mount #通过mount命令查看
cat /etc/mtab #通过查看/etc/mtab文件显示当前已挂载的所有设备
cat /proc/mounts #查看内核追踪到的已挂载的所有设备
查看挂载点情况
findmnt [options]
findmnt [options] <device> | <mountpoint>
findmnt [options] <device> <mountpoint>
findmnt [options] [--source <device>] [--target <path> | --mountpoint <dir>]
#默认查看整个系统挂载树
findmnt
#查看指定设备或挂载点
findmnt /dev/sdc1
查看正在访问指定文件系统的进程
klsof MOUNT_POINT
fuser -v MOUNT_POINT
持久挂载
将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载
cat /etc/fstab
每行定义一个要挂载的文件系统,,其中包括共 6 项
-
要挂载的设备或伪文件系统设备文件(LABEL=label | UUID=uuid | /dev/sda1)
-
挂载点:必须是事先存在的目录
-
文件系统类型:ext4,xfs,iso9660,nfs,none
-
挂载选项:defaults ,acl,bind,ro,rw 等
-
转储频率:0 不做备份; 1 每天转储; 2 每隔一天转储
-
fsck检查的文件系统的顺序:0 不自检 ; 1 首先自检,一般只有rootfs才用;2 非rootfs使用 0
添加新的挂载项,需要执行下面命令生效
此命令只针对文件新增行或删除行有效,如果在中间修改了挂载选项,则此命令无效
mount -a
重新挂载
修改了/etc/fstab 文件中的挂载规则,无法通过 mount -a 生效,要重新执行挂载
mount -o remount MOUNTPOINT
处理交换文件和分区
swap 介绍
swap交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据 时会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。
配置过多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄
注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放
交换分区实现过程
-
创建交换分区或者文件
-
使用mkswap写入特殊签名
-
在/etc/fstab文件中添加适当的条目
-
使用swapon -a 激活交换空间
启用swap分区
swapon [options] [<spec>]
#常用选项
-a|--all #激活 /etc/fstab 中的所有交换区
-d|--discard[=policy] #根据条件禁用(once|pages)
-e|--ifexists #自动跳过不存在的设备而不提示
-f|--fixpgsz #必要时重新初始化交换区
-o|--options list #指定选项,swapon -o pri=1,discard=pages,nofail
/dev/sda2
-p|--priority N #指定交换设备的优先级(-1到32767),值越大优先级越高,也可在/etc/fstab第4列指定pri=value
-s|--summary #显示已使用交换设备的摘要
--show[=columns] #以可自定义的表格形式打印摘要 swapon --show|swapon
--show=NAME,TYPE
--noheadings #不打印表头,配合 --show 选项
--raw #使用原生输出格式,配合 --show 选项
--bytes #在 --show 输出中以字节数显示交换区大小
-v|--verbose #显示详细信息
#<spec> 参数:
-L label #同 LABEL=label
-U uuid #同 UUID=uuid
LABEL=label #按交换区标签指定设备
UUID=uuid #按交换区 UUID 指定设备
PARTLABEL=label #按分区标签指定设备
PARTUUID=uuid #按分区 UUID 指定设备
device #要使用设备的名称
filename #要使用文件的名称
#可显示列
NAME #设备文件或分区路径
TYPE #设备的类型
SIZE #交换区大小
USED #已使用字节数
PRIO #交换优先级
UUID #uuid
LABEL #label
禁用swap分区
swapoff [options] [<spec>]
#常用选项
-a|--all #禁用 /proc/swaps 中的所有交换区
-v|--verbose #显示过程
#spec 参数
-L label #要使用设备的标签
-U uuid #要使用设备的 UUID
LABEL=label #要使用设备的标签
UUID=uuid #要使用设备的 UUID
device #要使用设备的名称
filename #要使用文件的名称
创建swap分区
#先创建分区,选择swap类型
#再创建swap文件系统
[root@ubuntu2204 ~]# mkswap /dev/sdc3
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=e08d9c52-98f2-4fed-8f19-5a890bece201
#查看
[root@ubuntu2204 ~]# blkid /dev/sdc3
/dev/sdc3: UUID="e08d9c52-98f2-4fed-8f19-5a890bece201" TYPE="swap"
PARTUUID="a6ea333f-03"
#修改/etc/fstab文件,添加swap行
#查看,比原来多2GB swap空间
[root@ubuntu2204 ~]# free -h
#查看swap分区
#Priority越大,优先级越高,会被优先使用
swapon -s
cat /proc/swaps
修改swap优先级
可以指定swap分区0到32767的优先级,值越大优先级越高
如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没 有用户指定优先级的swap,会给这个优先级减一
添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远 高 于核心缺省指定的优先级(是负数)
移动介质
挂载意味着使外来的文件系统看起来如同是主目录树的一部分,所有移动介质也需要挂载,挂载点通常 在/media 或/mnt下
访问前,介质必须被挂载
摘除时,介质必须被卸载
按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等等)
磁盘常见工具
文件系统查看工具 df
df [OPTION]... [FILE]...
#常用选项
-a|--all #显示所有
-B|--block-size=SIZE #显示时指定块大小
--direct #将挂载点那一列标题显示为文件
-h|--human-readable #以方便阅读的方式显示
-H|--si #以 1000为单位,而不是1024
-i|--inodes #显示inode 信息而非块使用量
-k #同 --block-size=1K
-l|--local #只显示本机的文件系统
--output[=FIELD_LIST] #只显示指定字段
-P|--portability #以Posix兼容的格式输出
--total #最后加一行汇总数据
-t|--type=TYPE #根据文件系统类型过滤
-T|--print-type #显示文件系统类型
-x|--exclude-type=TYPE #根据文件系统类型反向过滤
目录统计工具 du
du [OPTION]... [FILE]...
du [OPTION]... --files0-from=F
#常用选项
-0|--null #输出时以NULL分割,而不是换行
-a|--all #显示所有文件和目录大小
-B|--block-size=SIZE #指定块大小
-b|--bytes #同 --apparent-size --block-size=1
-c|--total #汇总
-d|--max-depth=N #指定最大目录层级
-h|--human-readable #以方便阅读的格式显示
-k #同 --block-size=1K
-m #同 --block-size=1M
--si #友好显示,以 1000 为单位,而不是 1024
-s|--summarize #只显示外层目录
-X|--exclude-from=FILE #根据文件名忽略
--exclude=PATTERN #根据正则表达式忽略
-x|--one-file-system #忽略不在同一个文件系统的目录
文件工具 dd
dd 命令:convert and copy a file
dd [OPERAND]...
dd OPTION
#常用格式
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=N count=N
#常用选项
if=file #从所命名文件读取而不是从标准输入
of=file #写到所命名的文件而不是到标准输出
ibs=size #一次读size个byte
obs=size #一次写size个byte
bs=size #指定块大小(既是是ibs也是obs)
cbs=size #一次转化size个byte
skip=blocks #从开头忽略blocks个ibs大小的块
seek=blocks #从开头忽略blocks个obs大小的块
count=n #复制n个bs
conv=conversion[,conversion...] #用指定的参数转换文件
#conversion 转换参数
ascii #转换 EBCDIC 为 ASCII
ebcdic #转换 ASCII 为 EBCDIC
lcase #把大写字符转换为小写字符
ucase #把小写字符转换为大写字符
nocreat #不创建输出文件
noerror #出错时不停止
notrunc #不截短输出文件
sync #把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
fdatasync #写完成前,物理写入输出文件
RAID
旧称廉价磁盘冗余阵列 (Redundant Array of Inexpensive Disks)
现称独立硬盘冗余阵列( Redundant Array of Independent Disks)
简称磁盘阵列
利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余, 或是两者同时提升。
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。 RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID 功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作。
RAID功能实现
提高IO能力,磁盘并行读写
提高耐用性,磁盘冗余算法来实现
RAID实现的方式
-
外接式磁盘阵列:通过扩展卡提供适配能力
-
内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
-
软件RAID:通过OS实现,比如:群晖的NAS
RAID级别
1.RAID-0
以 chunk 单位,读写数据,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。 但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失
读、写性能提升
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:1+
2.RAID-1
也称为镜像, 两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。
读性能提升、写性能略有下降
可用空间:1*min(S1,S2,...)
磁盘利用率 50%
有冗余能力
最少磁盘数:2+
3.RAID-4
多块数据盘异或运算值存于专用校验盘
可用空间:(N-1)*min(S1,S2,...)
磁盘利用率 (N-1)/N
有冗余能力
至少3块硬盘才可以实现
4.RAID-5
读、写性能提升
可用空间:(N-1)*min(S1,S2,...)
有容错能力:允许最多1块磁盘损坏
最少磁盘数:3, 3+
5.RAID-6
双份校验位,算法更复杂
读、写性能提升
可用空间:(N-2)*min(S1,S2,...)
有容错能力:允许最多2块磁盘损坏
最少磁盘数:4, 4+
6.RAID-10
即RAID-1+0
读、写性能提升
可用空间:N*min(S1,S2,...)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数:4, 4+
7.RAID-01
多块磁盘先实现RAID0,再组合成RAID1
8.RAID-50
多块磁盘先实现RAID5,再组合成RAID0
9.RAID-60
多块磁盘先实现RAID6,再组合成RAID0
逻辑卷管理器(LVM)
LVM介绍
LVM: Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小, 允许在多个物理设备间重新组织文件系统
LVM可以弹性的更改LVM的容量
通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中 的PE加到LV中以加大容量
实现过程
-
将设备指定为物理卷
-
用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent, PE)来定义的
-
在物理卷上创建的逻辑卷, 是由物理区域(PE)组成
-
可以在逻辑卷上创建文件系统并挂载
实现逻辑卷
相关工具来自于 lvm2 包
apt install lvm2
pv管理工具
将块设备创建为物理卷,本质上就是给块设备打一个标签,
块设备数量和物理卷数量是对应的,有几个块设备,就可以创建几个物理卷
块设备容量大小不限,可以跨分区。
显示pv信息
pvs #简要pv信息显示
pvdisplay #显示详细信息
创建pv
pvcreate /dev/DEVICE
删除pv
pvremove /dev/DEVICE
vg管理工具
显示卷组
vgs
vgdisplay
创建卷组
vgcreate [-s Size ] vgname pv1 [pv2...]
#-s 指定PE大小,数字加单位,单位为 k|K|m|M|g|G|t|T|p|P|e|E
管理卷组
vgextend vgname pv1 [pv2...] #往卷组中添加物理卷
vgreduce vgname pv1 [pv2...] #从卷组中移除物理卷
删除卷组
删除vg之前,要先把对应的 pv 解除绑定 (pvmove)
vgremove vgname
扩展vg
#往testvg中增加 pv
vgextend testvg /dev/sdb2
lv 管理工具
显示逻辑卷
lvs
Lvdisplay
创建逻辑卷
lvcreate {-L N[mMgGtT]|-l N} -n NAME VolumeGroup
-L|--size N[mMgGtT] #指定大小
-l|--extents N #指定PE个数,也可用百分比
-n Name #逻辑卷名称
扩展逻辑卷
lvextend {-L N[mMgGtT]|-l N} LV_NAME
#常用选项
-L|--size [+]Size[mMgGtT] #N个单位大小,也可写成+10M
-l|--extents [+]Number[PERCENT] #N个PE,也可以写成+10,表示在原基础上加10个PE大小,+100%free 表示把剩下空间都用完
-r|--resizefs #自动重置文件系统大小
缩减逻辑卷
lvreduce {-L N[mMgGtT]|-l N} LV_NAME
#常用选项
-L|--size [-]Size[mMgGtT] #N个单位大小,也可写成-10M
-l|--extents [-]Number[PERCENT] #N个PE,也可以写成-10,表示在原基础上减10个PE大小
删除逻辑卷
lvremove /dev/VG_NAME/LV_NAME
重设文件系统大小
修改了逻辑卷大小后,要同步文件系统
fsadm [options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] lvname #只支持ext系列文件系统
xfs_growfs /mountpoint #只支持xfs 文件系统
逻辑卷的使用跟硬盘分区使用一样,要先创建文件系统,再进行挂载
扩展和缩减逻辑卷
在线扩展逻辑卷
扩展逻辑卷之前,要先保证卷组上还有空间
两步实现,先扩展逻辑卷,再扩容文件系统
#第一步实现逻辑卷的空间扩展
lvextend -L [+]N[mMgGtT] /dev/VG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/VG_NAME/LV_NAME
#针对xfs
xfs_growfs MOUNTPOINT
缩减逻辑卷
注意:缩减有数据损坏的风险,建议先备份再缩减,不支持在线缩减,要先取消挂载,xfs文件系统不支 持缩减
缩减流程
#取消挂载
umount /dev/VG_NAME/LV_NAME
#文件系统检测,e2fsck可写成fsck
e2fsck -f /dev/VG_NAME/LV_NAME
#缩减文件系统到指定大小
resize2fs /dev/VG_NAME/LV_NAME N[mMgGtT]
#缩减逻辑卷
lvreduce -L [-] N[mMgGtT] /dev/VG_NAME/LV_NAME
#重新挂载
mount /dev/VG_NAME/LV_NAME mountpoint