解析Linux磁盘
磁盘方面
磁盘分区
分区概念
在linux系统中,磁盘分区是一种物理硬盘分割成多个逻辑部分的方法,每个分区可以独立地进行管理和使用通常会分为
- 主分区:每个磁盘最多可以有四个主分区。需要更多地分区可以使用扩展分区。
- 扩展分区: 扩展分区本身不能直接用于存储数据,但可以包含多个逻辑分区。
- 逻辑分区: 位于扩展分区内地分区,可以超过四个限制。
分区职责
- 主分区:用于安装操作系统,存储数据,以及引导系统
- 扩展分区:是用于包含逻辑分区的一个容器,解决主分区的限制,创建多个逻辑分区
- 逻辑分区:可以用来存储操作系统,应用程序和数据。
常见目录
目录 | 描述 |
---|---|
/ |
根目录,包含系统中所有文件和目录的起点。 |
/bin |
基本命令的二进制文件,如 ls 、cp 、mv 等。 |
/boot |
存放启动加载器相关的文件和内核文件。 |
/dev |
设备文件目录,包含所有设备的接口文件(如硬盘、终端)。 |
/etc |
配置文件目录,包含系统和应用程序的所有配置文件。 |
/home |
用户家目录,每个用户都有一个单独的子目录,用于存放个人文件和配置。 |
/lib |
系统库文件目录,包含基本系统库和内核模块。 |
/media |
自动挂载的可移动媒体设备(如CD-ROM、USB驱动器)。 |
/mnt |
临时挂载文件系统的挂载点。 |
/opt |
可选软件包目录,用于安装附加的第三方应用程序。 |
/proc |
虚拟文件系统,提供系统和进程信息。 |
/root |
超级用户(root)家目录。 |
/run |
运行时数据,存放系统启动后产生的临时文件(如进程ID文件)。 |
/sbin |
系统管理员命令的二进制文件,如 fdisk 、ifconfig 等。 |
/srv |
服务数据目录,存放特定服务的数据(如Web服务器文件)。 |
/sys |
虚拟文件系统,提供内核设备和驱动程序信息。 |
/tmp |
临时文件目录,存放临时文件,系统重启后可能会清空。 |
/usr |
用户程序目录,包含二进制文件、库文件、文档等(如 /usr/bin 、/usr/lib )。 |
/var |
可变数据文件目录,存放日志文件、邮件、临时文件等(如 /var/log 、/var/mail )。 |
MBR (Master Boot Record)
- MBR是一种传统的磁盘分区表格式,它位于磁盘的第一个扇区。
- MBR分区表最多支持4个主分区,如果需要更多分区,必须将其中一个主分区转换为扩展分区,再在扩展分区内创建逻辑分区。
- 由于使用32位地址,MBR最多支持2TB的磁盘。
逻辑结构
主引导记录 (Master Boot Record)
- 位于磁盘的第一个扇区(LBA 0)。
- 大小为512字节。
主引导代码 (Boot Code)
- 前446字节存储主引导代码,用于启动操作系统。
分区表 (Partition Table)
- 紧随其后64字节(每个分区条目16字节,共4个条目)。
- 描述最多四个主分区或一个扩展分区的起始位置和大小。
签名 (Signature)
- 最后2字节为磁盘签名(0x55AA),标志主引导记录的结束。
扩展分区
- 如果需要超过四个分区,可以创建一个扩展分区(Extended Partition)。
- 扩展分区包含一个扩展引导记录 (EBR),每个逻辑分区包含一个EBR。
GPT (GUID Partition Table)
- GPT是一种现代的磁盘分区表格式,取代了传统的MBR。
- GPT使用64位地址,可以支持超过8ZB的磁盘容量。
- GPT最多可以支持128个主分区,没有扩展分区的限制。
- GPT分区表有冗余备份和CRC校验,提高了数据的安全性和可靠性。
逻辑结构
保护性MBR (Protective MBR)
- 位于磁盘的第一个扇区(LBA 0),防止旧版工具误读GPT磁盘。
主GPT头 (Primary GPT Header)
- 位于LBA 1,描述GPT分区表的总体信息。
- 包含GPT版本、头部大小、CRC32校验和等。
主分区表 (Primary Partition Table)
- 紧随其后,从LBA 2开始,一般占用32个扇区。
- 每个分区条目128字节,通常最多支持128个分区条目。
分区条目 (Partition Entries)
- 每个条目描述一个分区的GUID、类型GUID、起始LBA、结束LBA、属性标志等。
用户分区
- 从主分区表结束位置开始,存储实际的数据和文件系统。
备份分区表 (Backup Partition Table)
- 位于磁盘末尾,用于恢复主GPT头和分区表。
备份GPT头 (Backup GPT Header)
- 位于磁盘倒数第二个扇区,记录备份分区表的信息。
Legacy / BIOS 引导
Legacy/BIOS(Basic Input/Output System)引导是一种传统的计算机启动模式。它是PC兼容系统的早期固件接口,负责初始化硬件并引导操作系统。以下是详细的说明:
工作原理
电源自检(POST):
- 计算机启动时,BIOS首先进行电源自检(Power-On Self-Test),检查和初始化系统硬件,如内存、CPU、硬盘和外设。
- 如果POST过程中检测到错误,BIOS会通过蜂鸣声或屏幕错误信息提示用户。
查找引导设备:
- POST完成后,BIOS会根据预设的引导顺序查找可启动设备(如硬盘、光盘、U盘等)。
- 引导顺序通常可以在BIOS设置界面中配置。
加载引导扇区:
- 一旦找到一个可引导的设备,BIOS会读取该设备的主引导记录(MBR,Master Boot Record),这通常是设备的第一个扇区(512字节)。
- MBR包含了启动加载程序的初始部分以及分区表信息。
执行引导加载程序:
- BIOS将控制权交给MBR中的引导加载程序。这个程序进一步加载操作系统或更多的引导代码(例如,GRUB、LILO等引导加载程序)。
启动操作系统:
- 引导加载程序最终加载操作系统内核,并将控制权交给它,操作系统开始初始化并进入用户模式。
特点和限制
- 地址空间限制: BIOS模式只能使用传统的32位地址模式,无法利用超过4GB的内存空间。
- MBR分区限制: MBR分区表限制最大支持4个主分区,每个分区最大只能是2TB。
- 兼容性: 由于其长期存在,BIOS模式具有广泛的硬件和软件兼容性。
设置和配置
- 进入BIOS设置: 通常通过在启动时按下特定的键(如F2、Del、Esc)进入BIOS设置界面。
- 配置引导顺序: 在BIOS设置界面中,用户可以配置引导设备的优先级。
- 启用/禁用设备: 可以在BIOS中启用或禁用某些硬件设备,以优化系统性能或解决兼容性问题。
UEFI
UEFI(统一可扩展固件接口)是一种现代固件接口,用于替代传统的BIOS。它提供更强大的功能和更灵活的引导方式。以下是详细的UEFI启动流程和相关设置的教学:
UEFI 启动流程
电源开启和硬件初始化:
- 计算机启动时,UEFI固件首先进行硬件初始化和电源自检(POST,Power-On Self-Test)。
- 检查CPU、内存、存储设备和外设,确保它们工作正常。
进入UEFI固件界面:
- 在启动过程中,用户可以按特定的键(如F2、Del、Esc)进入UEFI固件设置界面。
查找EFI系统分区(ESP):
- UEFI固件会查找包含EFI系统分区(ESP)的存储设备。ESP是一个特殊的分区,用于存储EFI引导加载程序和相关文件。
- ESP通常格式化为FAT32文件系统,并且标记为“EFI System Partition”。
加载EFI引导加载程序:
- 在ESP中,UEFI固件查找引导加载程序文件,通常位于
\EFI\Boot\bootx64.efi
(对于64位系统)。 - 用户可以在UEFI设置中指定特定的引导加载程序路径或更改引导顺序。
- 在ESP中,UEFI固件查找引导加载程序文件,通常位于
执行引导加载程序:
- UEFI将控制权交给引导加载程序。这个程序进一步加载操作系统的引导程序或内核。
- 常见的引导加载程序包括Windows Boot Manager、GRUB、Clover等。
启动操作系统:
- 引导加载程序加载操作系统内核并将控制权交给它,操作系统开始初始化并进入用户模式。
设置和配置UEFI
进入UEFI设置界面:
- 重启计算机,在启动过程中按下特定的键(如F2、Del、Esc)进入UEFI设置界面。
- 不同品牌的主板可能有不同的按键,具体请参考主板或计算机手册。
配置引导顺序:
- 在UEFI设置界面中,找到“Boot”或“启动”选项卡。
- 配置引导设备的优先级,将希望首先引导的设备设置为第一优先级。
- 如果需要从特定的EFI引导文件启动,可以手动指定路径。
启用/禁用设备:
- 在“Advanced”或“高级”选项卡中,可以启用或禁用某些硬件设备。
- 例如,启用/禁用USB端口、网卡、SATA接口等。
安全启动(Secure Boot):
- 安全启动是一项UEFI功能,用于防止加载未签名或未经授权的操作系统引导程序。
- 在“Security”或“安全”选项卡中,可以启用或禁用安全启动。
- 如果需要安装非官方签名的操作系统,可能需要暂时禁用安全启动。
保存和退出:
- 完成设置后,选择“Save & Exit”或“保存并退出”选项。
- 保存设置后,系统将重新启动并应用新的设置。
sar
sar
(System Activity Reporter)是一个强大的工具,用于在Linux系统上收集、报告和保存系统活动信息。它可以提供有关系统性能的详细数据,包括CPU、内存、网络、磁盘I/O等多个方面。sar
命令通常与sysstat
软件包一起使用。下面是如何使用sar
命令来监控磁盘活动的步骤:
安装sysstat包
在大多数Linux发行版中,可以通过包管理器安装sysstat
包:
# 对于基于Debian的系统(如Ubuntu) |
启用和配置sysstat
安装完成后,确保sysstat
服务已启用并正在运行:
# 启用sysstat服务 |
使用sar监控磁盘I/O
sar
可以通过-d
选项来监控磁盘I/O活动:
# 实时监控磁盘I/O,每1秒报告一次,共报告10次 |
常用选项
-d
:报告磁盘I/O统计信息。-p
:将设备名称从设备编号翻译为设备名称。-r
:报告内存和交换空间使用情况。-n
:报告网络统计信息(如-n DEV
报告网络接口统计信息)。-u
:报告CPU使用情况。
查看历史数据
sar
命令可以查看过去的系统性能数据,这些数据通常保存在/var/log/sa/
目录中:
# 查看特定日期的磁盘I/O活动(例如2024年7月5日) |
示例输出解读
以下是sar -d
命令的示例输出及其含义:
tps
:每秒传输数(读+写)。rd_sec/s
:每秒读取的扇区数。wr_sec/s
:每秒写入的扇区数。avgrq-sz
:平均请求大小(扇区)。avgqu-sz
:平均请求队列长度。await
:每个I/O操作的平均等待时间(毫秒)。svctm
:每个I/O操作的平均服务时间(毫秒)。%util
:设备的I/O使用百分比。
使用sar
工具可以帮助系统管理员深入了解系统性能瓶颈并进行相应的优化。
RAID
RAID(Redundant Array of Independent Disks,即独立磁盘冗余阵列)是一种将多个物理硬盘驱动器组合成一个逻辑单元的存储技术。其主要目的是提高数据存储的性能、容量和可靠性。RAID技术通过不同的配置(称为RAID级别)来实现这些目标。以下是几种常见的RAID级别:
RAID 0:
- 条带化(Striping):数据在多个磁盘上分割并并行写入。
- 优点:提高读写速度。
- 缺点:没有冗余,任何一个磁盘故障都会导致数据丢失。
RAID 1:
- 镜像(Mirroring):每个数据块都在两个或多个磁盘上复制。
- 优点:提供高冗余,数据安全性高。
- 缺点:磁盘利用率低(50%),只使用了一半的存储容量。
RAID 5:
- 分布式奇偶校验(Distributed Parity):数据和奇偶校验信息分布在所有磁盘上。
- 优点:平衡了性能、容量和数据安全性,至少需要3个磁盘。
- 缺点:写操作较慢,因为需要计算和写入奇偶校验数据。
RAID 6:
- 双奇偶校验(Double Parity):类似RAID 5,但有两组奇偶校验数据,容忍两块磁盘同时故障。
- 优点:更高的数据安全性。
- 缺点:写操作更慢,磁盘利用率较低。
RAID 10(或1+0):
- 条带化和镜像结合:先进行镜像,再进行条带化。
- 优点:结合了RAID 0和RAID 1的优点,高性能和高冗余。
- 缺点:需要较多的磁盘,成本较高。
RAID 50(或5+0):
- 条带化和分布式奇偶校验结合:将RAID 5阵列条带化。
- 优点:提高了性能和冗余,适合大规模存储需求。
- 缺点:复杂度增加,需要更多磁盘。
fdisk
fdisk 是用于操作磁盘分区的工具,适用于 MBR 分区表。
命令 | 描述 | 使用说明 |
---|---|---|
m | 显示帮助菜单 | 显示所有可用命令的列表和简要说明。 |
p | 显示当前分区表 | 列出指定磁盘上的所有分区信息。 |
n | 添加一个新分区 | 根据提示选择主分区或逻辑分区,并设置分区的开始和结束位置。 |
d | 删除一个分区 | 选择要删除的分区编号。 |
l | 列出已知分区类型 | 显示支持的所有分区类型代码和说明。 |
t | 更改一个分区的系统ID | 选择分区后,输入新的类型代码。 |
a | 切换启动标志 | 设置或取消某个分区的启动标志(使其可引导)。 |
w | 写入分区表并退出 | 将对分区所做的更改写入磁盘,并退出fdisk。 |
q | 不保存更改并退出 | 退出fdisk而不保存对分区表的任何更改。 |
创建新分区
- 输入
n
创建新分区。 - 选择分区类型(主分区
p
或逻辑分区e
)。 - 指定分区号(例如
1
)。 - 指定分区的起始扇区和结束扇区。
- 输入
w
保存并退出。
删除分区
- 输入
p
查看当前分区表。 - 输入
d
删除分区。 - 输入要删除的分区编号(例如
1
)。 - 输入
w
保存并退出。
更改分区类型
- 输入
t
更改分区类型。 - 输入分区编号(例如
1
)。 - 输入新的类型代码(例如
83
用于Linux分区)。 - 输入
w
保存并退出。
parted
fdisk 是用于操作磁盘分区的工具,适用于 GPT分区表。
命令 | 描述 | 使用说明 |
---|---|---|
mklabel | 创建新的磁盘标签(分区表) | 格式:mklabel <label> ,其中label 可以是gpt 、msdos 等。 |
mkpart | 创建新分区 | 格式:mkpart <part-type> <fs-type> <start> <end> ,例如mkpart primary ext4 1MiB 500MiB 。 |
rm | 删除分区 | 格式:rm <number> ,其中number 是分区编号。 |
显示分区表 | 列出指定磁盘上的所有分区信息。 | |
name | 给分区命名 | 格式:name <number> <name> ,给指定编号的分区命名。 |
set | 设置分区标志 | 格式:`set |
resizepart | 调整分区大小 | 格式:resizepart <number> <end> ,将分区调整到新的结束位置。 |
move | 移动分区 | 格式:move <number> <start> <end> ,移动分区到新的位置。 |
mkfs | 创建文件系统 | 格式:mkfs <number> <fs-type> ,例如mkfs 1 ext4 。 |
align-check | 检查分区对齐 | 格式:align-check <opt> <number> ,例如align-check optimal 1 。 |
rescue | 尝试恢复丢失的分区 | 格式:rescue <start> <end> ,尝试在指定范围内恢复分区。 |
quit | 退出parted | 退出parted交互模式。 |
unit | 设置显示单位 | 格式:unit <unit> ,其中unit 可以是s (扇区)、MB 、GB 等。 |
启动parted
sudo parted /dev/sdb |
创建新的分区表(GPT)
(parted) mklabel gpt |
创建新分区
创建一个从1MiB开始,500MiB结束的主分区,文件系统类型为ext4:
(parted) mkpart primary ext4 1MiB 500MiB |
删除分区
删除刚才创建的第一个分区:
(parted) rm 1 |
调整分区大小
假设重新创建了一个分区,现在调整其大小到1000MiB:
(parted) mkpart primary ext4 1MiB 500MiB |
设置分区标志
设置第一个分区的启动标志:
可设置的标识有:
boot
:引导分区
esp
:EFI系统分区(通常用于UEFI引导)
lvm
:逻辑卷管理
raid
:RAID分区
swap
:交换分区
(parted) set <分区编号> <标识> on |
显示分区表
显示当前的分区表:
(parted) print |
给分区命名
给第一个分区命名:
(parted) name 1 my_partition |
创建文件系统
在第一个分区上创建ext4文件系统:
(parted) mkfs 1 ext4 |
文件类型
ext4:
- 目前最广泛使用的Linux文件系统,ext4具有良好的性能、稳定性和兼容性,支持大文件和大容量存储,适用于大多数应用场景。
XFS:
- XFS是一个高性能的日志文件系统,擅长处理大文件和高并发环境,常用于需要高性能和可扩展性的服务器和存储系统。
Btrfs:
- Btrfs(B-tree FS)支持快照、压缩、多设备存储池、在线文件系统检查和修复等高级功能,适用于需要高级数据管理和灵活性的环境。
**ZFS on Linux (ZoL)**:
- ZFS具有高度的数据完整性、快照和复制等高级特性,适用于高存储要求的环境,如服务器和大型存储系统。
检查分区对齐
检查第一个分区的对齐情况:
(parted) align-check optimal 1 |
尝试恢复丢失的分区
假设分区丢失,尝试在指定范围内恢复分区:
(parted) rescue 1MiB 1000MiB |
退出parted
退出parted:
(parted) quit |
验证操作
为了验证这些操作,可以使用lsblk
或fdisk -l
来查看分区表:
sudo lsblk |
系统中没有parted工具,可以通过以下命令安装:
sudo apt-get install parted # Debian/Ubuntu |
LVM
LVM 是一种逻辑卷管理器,允许对硬盘和其他存储设备进行灵活的分区管理。
ps: 逻辑卷是由LVM创建和管理的虚拟存储单元,可以跨越多个物理磁盘或分区。逻辑卷是建立在物理卷之上,物理卷可以是整个磁盘分区或RAID设备。
为什么要用到LVM
有工具就是因为有需求,传统的分区因为固定分区大小,需要停机调整分区,影响服务可用。所以需要用到LVM,在线扩展逻辑卷的大小无需停机,只需要添加新的物理硬盘到卷组(VG)中,然后扩展逻辑卷(LV)大小。除此之外,还能够快速创建备份,不需要传统的长时间锁定数据库,还能够整合多个磁盘设备成为一个存储池,能够在数据迁移阶段,避免长时间停机。
怎么查看逻辑卷
了解大概的可用块设备
这张图片显示了lsblk
命令的输出,列出了系统中的所有块设备及其挂载点。以下是对这张图片的详细描述:
loop设备:
- loop0: 111.9M, 类型为loop,挂载在
/snap/lxd/24322
- loop1: 87M, 类型为loop,挂载在
/snap/lxd/28373
- loop2: 53.3M, 类型为loop,挂载在
/snap/snapd/19457
- loop3: 38.8M, 类型为loop,挂载在
/snap/core20/1974
- loop4: 63.9M, 类型为loop,挂载在
/snap/core20/2318
- loop5: 63.9M, 类型为loop,挂载在
/snap/core20/2456
- loop0: 111.9M, 类型为loop,挂载在
物理磁盘:
sda
: 25G, 类型为disk
- sda1: 1M, 类型为part,没有挂载点(这可能是BIOS引导分区或其他用途的特殊分区)
- sda2: 2G, 类型为part,挂载在
/boot
- sda3: 23G, 类型为part,没有挂载点(这可能是LVM物理卷)
逻辑卷管理器(LVM):
- ubuntu–vg-ubuntu–lv: 12.5G, 类型为lvm,挂载在
/
- ubuntu–vg-ubuntu–lv: 12.5G, 类型为lvm,挂载在
光驱设备:
- sr0: 2G, 类型为rom,没有挂载点
loop设备:这些是虚拟设备,通常用于挂载磁盘映像文件。
sda
:这是系统中的一个物理磁盘,包含三个分区(sda1, sda2, sda3)。
- sda1:非常小,只有1M,通常用于系统引导或其他特殊用途。
- sda2:挂载在
/boot
,通常用于存放启动加载程序和内核。 - sda3:较大,为23G,可能用于LVM管理。
LVM逻辑卷:
ubuntu--vg-ubuntu--lv
是一个逻辑卷,挂载在根目录/
。这表示LVM在管理这个分区的存储。光驱设备(sr0):显示为2G,未挂载。
扩展逻辑卷大概步骤
- 添加新物理硬盘
- 将新的物理硬盘初始化为物理卷(PV)
- 将PV添加到现在的卷组VG
- 扩展逻辑卷LV的大小
- 示例: 创建一个逻辑卷
创建物理卷 |
实操
创建lvm分区以及扩容
- 首先增加物理盘
- 然后查询存储块
- 为物理盘建立分区
- 创建PV,VG,LV
- 格式化lv
![image-20240709115309348](https://gcore.jsdelivr.net/gh/Kalyan-zitiu/TyporaIMG/img/image-20240709115309348.png)
- 创建挂载目录(也可挂载在你想挂载的地方),并进行挂载(ps:记得修改etc/fstab文件,不然重启会丢失mount点)