ITPub博客

首页 > 应用开发 > IT综合 > Linux存储系统解析:从物理硬盘到文件系统的完整工作流程

Linux存储系统解析:从物理硬盘到文件系统的完整工作流程

投稿 IT综合 作者:bhluo 时间:2025-12-19 15:55:39 0 删除 编辑

# Linux存储系统解析:从物理硬盘到文件系统的完整工作流程


## 物理硬盘的底层结构


现代硬盘的物理结构是存储系统的起点。机械硬盘(HDD)由旋转的盘片和磁头组成,而固态硬盘(SSD)则基于NAND闪存芯片。无论哪种类型,硬盘的基本管理单元都是**扇区**,通常每个扇区大小为512字节或4KB。


```bash

# 查看硬盘物理信息

$ sudo fdisk -l /dev/sda

Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors

Disk model: ST2000DM008-2FR1

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 4096 bytes

I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Disklabel type: gpt

Disk identifier: 12345678-ABCD-EF01-2345-6789ABCDEF01

```


Linux通过块设备接口抽象物理硬盘。内核将硬盘识别为`/dev/sdX`(SCSI/SATA设备)或`/dev/nvmeXnY`(NVMe设备),这些设备文件是用户空间访问存储设备的基础入口。


## 分区表:硬盘空间的逻辑划分


分区表定义了硬盘空间的逻辑划分方式。现代Linux系统主要使用GPT(GUID Partition Table),替代传统的MBR(Master Boot Record)。


```bash

# 创建GPT分区表

$ sudo parted /dev/sda mklabel gpt


# 查看分区信息

$ sudo parted /dev/sda print

Model: ATA ST2000DM008-2FR1 (scsi)

Disk /dev/sda: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags: 


Number  Start   End     Size    File system  Name  Flags

 1      1049kB  1075MB  1074MB  fat32        efi   boot, esp

 2      1075MB  64.2GB  63.1GB  ext4         root

 3      64.2GB  128GB   63.9GB  ext4         home

 4      128GB   2000GB  1872GB  ext4         data


# 查看详细分区信息

$ lsblk -f /dev/sda

NAME   FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT

sda                                                                      

├─sda1 vfat         67E3-17ED                              1024M     0% /boot/efi

├─sda2 ext4         12345678-abcd-ef01-2345-6789abcdef01     50G    25% /

├─sda3 ext4         87654321-fedc-ba10-9876-543210fedcba    45G    15% /home

└─sda4 ext4         abcdef12-3456-7890-abcd-ef1234567890   1.7T     5% /data

```


分区表的关键作用是将连续的物理空间划分为逻辑上独立的部分,每个分区可以格式化为不同的文件系统,满足不同的存储需求。


## 逻辑卷管理:灵活的存储抽象


LVM(Logical Volume Manager)在物理分区之上提供更灵活的存储管理,实现了存储空间的逻辑抽象。


```bash

# LVM配置流程示例

# 1. 创建物理卷

$ sudo pvcreate /dev/sda3

  Physical volume "/dev/sda3" successfully created.


# 2. 创建卷组

$ sudo vgcreate vg_data /dev/sda3

  Volume group "vg_data" successfully created.


# 3. 创建逻辑卷

$ sudo lvcreate -L 500G -n lv_home vg_data

  Logical volume "lv_home" successfully created.


# 4. 扩展逻辑卷

$ sudo lvextend -L +100G /dev/vg_data/lv_home

  Size of logical volume vg_data/lv_home changed from 500.00 GiB (128000 extents) to 600.00 GiB (153600 extents).

  Logical volume vg_data/lv_home successfully resized.


# 查看LVM结构

$ sudo pvs

  PV         VG      Fmt  Attr PSize   PFree  

  /dev/sda3  vg_data lvm2 a--  931.51g 331.51g


$ sudo vgs

  VG      #PV #LV #SN Attr   VSize   VFree  

  vg_data   1   1   0 wz--n- 931.51g 331.51g


$ sudo lvs

  LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

  lv_home vg_data -wi-ao---- 600.00g

```


LVM的核心优势在于支持在线调整大小、快照功能和条带化等高级特性,为存储管理提供了极大的灵活性。


## 文件系统:数据的组织架构


在分区或逻辑卷之上,文件系统负责数据的组织和存储。Linux支持多种文件系统,其中Ext4是最常用的选择。


### Ext4文件系统结构


```bash

# 创建Ext4文件系统

$ sudo mkfs.ext4 /dev/vg_data/lv_home

mke2fs 1.46.5 (30-Dec-2021)

Creating filesystem with 157286400 4k blocks and 39321600 inodes

Filesystem UUID: 12345678-1234-1234-1234-123456789012

Superblock backups stored on blocks: 

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632


# 查看文件系统详细信息

$ sudo tune2fs -l /dev/vg_data/lv_home

Filesystem volume name:   <none>

Last mounted on:          <not available>

Filesystem UUID:          12345678-1234-1234-1234-123456789012

Filesystem magic number:  0xEF53

Filesystem revision #:    1 (dynamic)

Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum

Filesystem flags:         signed_directory_hash 

Default mount options:    user_xattr acl

Filesystem state:         clean

Errors behavior:          Continue

Filesystem OS type:       Linux

Inode count:              39321600

Block count:              157286400

Reserved block count:     7864320

Free blocks:              151234567

Free inodes:              39212345

First block:              0

Block size:               4096

Fragment size:            4096

```


### 文件系统的挂载


挂载是将文件系统连接到Linux目录树的过程:


```bash

# 手动挂载文件系统

$ sudo mount /dev/vg_data/lv_home /mnt/home


# 查看挂载信息

$ mount | grep home

/dev/mapper/vg_data-lv_home on /mnt/home type ext4 (rw,relatime)


# 通过/etc/fstab实现自动挂载

$ cat /etc/fstab

# <file system>             <mount point>  <type>  <options>         <dump>  <pass>

/dev/mapper/vg_data-lv_home /home          ext4    defaults,noatime  0       2

UUID=12345678-1234-1234-1234-123456789012 /home ext4 defaults 0 2

mobile.daojubao.com>liangry.daojubao.com>sweet.daojubao.com>


# 测试fstab配置

$ sudo mount -a

```


## 数据写入的完整路径


理解数据从应用程序到物理硬盘的完整路径至关重要:


```c

// 简化的数据写入流程

// 1. 应用程序调用write()系统调用

ssize_t write(int fd, const void *buf, size_t count);


// 2. 内核将数据复制到页面缓存

// 3. 文件系统层处理写入请求

// 4. 块设备层将请求加入I/O队列

// 5. 设备驱动处理实际硬件操作

```


```bash

# 查看I/O调度器设置

$ cat /sys/block/sda/queue/scheduler 

[mq-deadline] kyber bfq none


# 修改I/O调度器

$ echo "bfq" | sudo tee /sys/block/sda/queue/scheduler

```


## 性能优化与监控


### 文件系统参数调优


```bash

# 调整Ext4挂载参数

$ sudo mount -o noatime,nodiratime,data=ordered /dev/sda2 /mnt/data


# 修改文件系统保留空间比例

$ sudo tune2fs -m 1 /dev/sda2

tune2fs 1.46.5 (30-Dec-2021)

Setting reserved blocks percentage to 1% (393216 blocks)


# 启用或禁用日志功能

$ sudo tune2fs -O ^has_journal /dev/sda3  # 禁用日志

$ sudo tune2fs -O has_journal /dev/sda3   # 启用日志

```


### 存储性能监控


```bash

# 使用iostat监控磁盘I/O

$ iostat -x 1

Linux 5.15.0-91-generic (hostname)     01/19/2024     _x86_64_    (8 CPU)


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           8.45    0.01    2.34    0.12    0.00   89.08


Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util

sda             45.23   23.45   1812.34    938.45     0.12     1.23   0.27   4.98    0.56    1.23   0.02    40.05    40.01   0.85   5.78


# 使用iotop查看进程级I/O

$ sudo iotop

Total DISK READ:       1.23 M/s | Total DISK WRITE:       0.98 M/s

Current DISK READ:       1.23 M/s | Current DISK WRITE:       0.98 M/s

    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND

  12345 be/4 mysql        1.23 M/s    0.00 B/s  0.00 % 25.67 % mysqld --daemonize

  12346 be/4 www-data     0.00 B/s    0.98 M/s  0.00 %  5.67 % apache2 -k start

```


## 故障排查与数据恢复


### 文件系统检查与修复


```bash

# 强制检查文件系统

$ sudo umount /dev/sda2

$ sudo fsck.ext4 -f /dev/sda2

e2fsck 1.46.5 (30-Dec-2021)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/sda2: 123456/3932160 files (0.5% non-contiguous), 9876543/15728640 blocks


# 恢复超级块备份

$ sudo mkfs.ext4 -n /dev/sda2  # 查看备份位置

$ sudo e2fsck -b 32768 /dev/sda2  # 使用备份恢复

```


### RAID与LVM故障处理


```bash

# LVM故障恢复示例

# 1. 扫描物理卷

$ sudo pvscan

# 2. 激活卷组

$ sudo vgchange -ay vg_data

# 3. 修复逻辑卷

$ sudo lvconvert --repair /dev/vg_data/lv_home

house.daojubao.com>fan.daojubao.com>dyabld.daojubao.com>

```


## 现代存储技术演进


### NVMe与高性能存储


```bash

# NVMe设备管理

$ sudo nvme list

Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  

---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------

/dev/nvme0n1     ABCDEF123456789     Samsung SSD 970 EVO Plus 1TB             1           1.00  TB /   1.00  TB    512   B +  0 B   2B2QEXM7


# NVMe性能测试

$ sudo nvme perf /dev/nvme0n1

```


### 软件定义存储趋势


现代Linux存储正在向软件定义存储(SDS)和容器化存储方向发展,如Ceph、GlusterFS等分布式文件系统,提供了更高的可扩展性和灵活性。


## 总结:构建可靠的存储架构


从物理硬盘到文件系统的完整路径体现了Linux存储系统的分层设计思想。每一层都提供了特定的抽象和功能:


1. **物理层**:管理实际的存储介质

2. **分区层**:逻辑划分存储空间

3. **逻辑卷层**:提供灵活的存储管理

4. **文件系统层**:组织数据结构

5. **挂载层**:集成到统一的目录树


在实际应用中,应根据具体需求选择合适的存储方案。对于关键业务系统,建议采用RAID+LVM+Ext4的组合,配合定期备份和监控,构建可靠、可维护的存储架构。理解这个完整的过渡流程,有助于更好地设计、优化和故障排除Linux存储系统。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3105715/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933971