先抛一个很常见的场景你在维护一台 Linux 服务器磁盘空间告警了想加一块新盘进去或者怀疑某块数据盘分区表有问题。此时你手头需要的不是花哨的监控面板而是几个能快速确认“磁盘叫什么名字、有没有分区、是什么文件系统、能不能直接挂载”的命令。本文围绕lsblk、fdisk、mkfs.xfs这三个命令完整梳理从查看磁盘信息到创建分区、格式化为 XFS 文件系统、挂载使用的全过程。新手可以把它当作 Linux 磁盘管理的入门路线有经验的开发或运维也可以直接跳到第 6 节看完整实操流程再对照第 7 节的排查清单。1. 背景与核心概念1.1 为什么需要了解 Linux 磁盘管理Linux 服务器的数据最终都要落在磁盘上无论是系统盘、数据盘、云盘还是本地盘。磁盘管理是 Linux 运维、开发环境搭建、虚拟化实验中最基础也最高频的操作之一。很多刚接触 Linux 的开发者在图形化界面里“磁盘管理”可能只是打开一个工具点一点但到了服务器环境绝大多数情况下只有命令行可用。你需要知道当前系统识别到了哪些磁盘磁盘容量、型号、设备名是什么磁盘是否已经分区分区上是否已经创建文件系统如何把新的空白磁盘变成可用的数据目录。这就是lsblk、fdisk、mkfs.xfs这类命令存在的意义。它们不依赖图形界面可以在最小化安装的 Linux 系统上直接使用也是很多 Linux 运维笔试、面试里高频出现的命令。1.2 三个核心命令的分工这几个命令虽然经常在同一个场景中出现但职责完全不同。命令作用操作对象lsblk查看磁盘和分区信息以树状结构展示只读查看不修改磁盘fdisk交互式创建、删除、查看分区修改磁盘分区表mkfs.xfs在分区或磁盘上创建 XFS 文件系统格式化分区简单理解lsblk负责“看”不改变磁盘内容fdisk负责“切”把一块物理磁盘划分成多个逻辑分区mkfs.xfs负责“装修”把分区变成可以被 Linux 挂载使用的文件系统。在实际项目中这三者经常按顺序使用先用lsblk确认新磁盘设备名再用fdisk分区最后用mkfs.xfs格式化并挂载。1.3 磁盘、分区、文件系统之间的关系很多新手会把磁盘、分区、文件系统混为一谈这里先理清概念。磁盘Disk物理存储设备例如/dev/sda、/dev/vdb、/dev/nvme0n1。分区Partition把一块磁盘划分成若干个区域例如/dev/sda1、/dev/sda2。分区记录在分区表里常见分区表格式有 MBR 和 GPT。文件系统Filesystem分区上建立的组织文件的格式例如 XFS、ext4、vfat、btrfs。Linux 通过挂载mount把文件系统和某个目录关联起来。可以这样类比磁盘是一套毛坯房分区是划分成客厅、卧室文件系统则是把每个房间装修成可以住人的状态。lsblk能看到这间房子当前是什么状态fdisk负责砌墙分割mkfs.xfs负责装修。2. 环境准备与版本说明2.1 操作系统与磁盘环境本文所有命令示例在 Linux 发行版上均可执行常见的如 CentOS 7/8、RHEL 7/8/9、Rocky Linux、AlmaLinux、Ubuntu Server20.04、22.04 等都可以采用相同思路。命令本身属于util-linux和xfsprogs包绝大多数服务器发行版默认已集成。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。如果你的系统是 Ubuntu 等 Debian 系发行版命令和概念基本通用只有个别包管理器安装命令不同。为了便于演示建议使用虚拟机或云主机额外挂载一块空白数据盘。生产环境中也可以把本文方法用于新数据盘初始化。以下示例环境为一个最少化的 Linux 系统新增一块 50GB 的虚拟磁盘系统盘为/dev/sda新磁盘为/dev/sdb。设备名会根据虚拟化平台和磁盘类型变化例如云服务器上可能是/dev/vdbNVMe 磁盘可能是/dev/nvme0n1但操作流程一致。2.2 确认命令行工具可用在开始之前先确认环境里已经有我们需要的命令。打开终端执行which lsblk which fdisk which mkfs.xfs如果系统提示找不到命令可以根据发行版安装。比如# CentOS / RHEL / Rocky 等 sudo yum install -y util-linux xfsprogs # Ubuntu / Debian sudo apt update sudo apt install -y util-linux xfsprogs其中util-linux提供lsblk、fdisk等基础磁盘工具xfsprogs提供mkfs.xfs等 XFS 文件系统管理工具。2.3 查看内核认到的磁盘列表进入正题前先看一下系统当前有哪些磁盘块设备lsblk示例输出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 199G 0 part / sdb 8:16 0 50G 0 disk新添加的sdb已经出现了但是还没有分区、没有文件系统、没有挂载点所以TYPE是disk下面也没有part子项。这就说明可以开始对它做分区格式化了。如果你在云服务器上看到的设备名是vda、vdb或者在 NVMe SSD 上看到的是nvme0n1、nvme0n2不要紧张这只是 Linux 对不同总线类型磁盘设备的命名规则不同。设备名可能不同但分区、格式化、挂载的思路完全一样。3. 用 lsblk 查看磁盘和分区信息3.1 lsblk 是什么lsblk是list block devices的缩写用来列出所有可用的块设备。它会把磁盘、分区、逻辑卷组织成树状结构信息一目了然。它默认读取 sysfs 文件系统不需要额外权限也不会对磁盘造成修改。基础命令lsblk输出字段含义NAME设备名sda表示一块磁盘sda1表示这块磁盘上的第一个分区MAJ:MIN设备的主设备号和次设备号RM是否可移动设备0 表示否1 表示是SIZE容量大小RO是否只读0 表示可读写TYPE设备类型常见有disk整块磁盘、part分区、lvm逻辑卷、rom只读光驱MOUNTPOINT挂载点如果为空说明该设备还没有挂载。这个命令最大的优点是输出直观新手也能一眼看出磁盘当前是什么状态。3.2 常用参数速查lsblk有一些参数在工作中非常实用下面逐个说明。3.2.1 查看文件系统信息lsblk -f-f参数会额外显示文件系统类型、UUID、挂载点。这在排查“为什么挂载不上”“文件系统是 ext4 还是 XFS”时非常有用。示例输出NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs a1b2c3d4-.... /boot └─sda2 xfs e5f6a7b8-.... / sdbFSTYPE表示文件系统类型UUID是文件系统的全局唯一标识后面设置开机自动挂载时会用到。3.2.2 只列出磁盘不显示分区lsblk -d-d表示只显示磁盘本身不展开分区信息适合快速确认系统里有哪些物理磁盘。3.2.3 显示完整设备路径lsblk -p-p会在设备名前加上/dev/完整路径例如/dev/sda、/dev/sdb。在脚本里处理设备节点时比较常用。3.2.4 自定义输出列lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT-o可以根据需要指定输出列。列名可以通过lsblk --help查看常见的有NAME、SIZE、TYPE、FSTYPE、MOUNTPOINT、UUID、MODEL、SERIAL等。3.2.5 查看磁盘型号和序列号lsblk -d -o NAME,MODEL,SERIAL,SIZE对于物理服务器这个命令可以帮助确认磁盘对应的硬件型号避免误操作。3.3 常见使用场景场景一查看某块盘下面有哪些分区。lsblk /dev/sdb场景二想看新加的盘有没有被系统识别。lsblk | grep sd场景三想确认当前系统盘的文件系统类型。lsblk -f /dev/sda4. 用 fdisk 创建和管理分区4.1 fdisk 基础介绍fdisk是 Linux 下的分区工具名称来自 “fixed disk” 或 “format disk”。它支持交互式操作也可以用脚本参数批量执行。对于小于 2TB 的磁盘使用 MBR 分区表对于大于 2TB、或者需要更多分区数量的磁盘推荐使用 GPT 分区表。fdisk最常用的用法是直接跟上磁盘设备名进入交互式操作界面sudo fdisk /dev/sdb进入后会出现类似如下提示Welcome to fdisk (util-linux 2.37.4). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x.... Command (m for help):注意fdisk的修改并不会立即写入磁盘所有操作都先在内存中记录只有输入w后才会真正写入分区表。在这个阶段如果你想放弃输入q退出即可磁盘不会发生任何变化。这个设计对生产环境非常友好但也意味着如果你忘了w前面的操作等于白做。4.2 fdisk 交互命令速查在fdisk交互界面中常用的单字符命令如下命令含义m显示帮助菜单p打印当前分区表n新建分区d删除分区t修改分区类型w保存并退出q不保存直接退出4.3 创建新分区的完整步骤假设我们要把/dev/sdb整块盘创建一个分区/dev/sdb1步骤如下。第一步进入fdisksudo fdisk /dev/sdb第二步输入p查看当前分区表。新磁盘通常会显示无分区。第三步输入n新建分区。此时会询问分区类型Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p):这里直接回车选择p主分区即可。第四步设置分区编号和起始扇区。一般直接回车使用默认值即可Partition number (1-4, default 1): First sector (2048-104857599, default 2048): Last sector, /-sectors or /-size{K,M,G,T,P} (2048-104857599, default 104857599):分区编号默认是 1起始扇区默认是 2048这是为了对齐现代磁盘的物理扇区结束扇区如果不填默认使用磁盘末尾也就是分区占满整块磁盘。如果只想用一部分空间可以输入20G表示创建 20GB 的分区。第五步输入p查看即将写入的分区表确认无误后输入w保存。Command (m for help): w The partition table has been altered. Syncing disks.此时分区创建完成。可以再执行lsblk验证sudo lsblk /dev/sdb预期输出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 50G 0 disk └─sdb1 8:17 0 50G 0 part4.4 分区已创建但内核未重新读取在某些旧系统或者某些场景下分区创建后lsblk可能还是看不到新分区。原因是内核还没有重新读取分区表。解决办法有两种。方法一使用partprobe命令通知内核重新读取sudo partprobe /dev/sdb方法二重启系统。生产环境中如果设备比较重要可以安排在维护窗口重启。sudo reboot4.5 关于 GPT 分区的说明fdisk默认创建的是 DOSMBR分区表。如果磁盘大于 2TB或者你想创建超过 4 个主分区建议改用 GPT 分区表。在fdisk交互界面中输入g可以新建 GPT 分区表然后按照同样的n、w流程创建分区。sudo fdisk /dev/sdb # 输入 g 创建 GPT 分区表 # 输入 n 创建分区 # 输入 w 保存也可以用gdisk命令专门管理 GPT 分区表但是fdisk在较新的 util-linux 版本中也已经支持 GPT日常使用足够。5. 用 mkfs.xfs 格式化分区5.1 为什么选择 XFS 文件系统XFS 是一个高性能的 64 位日志文件系统由 SGI 开发后来被移植到 Linux。它在大型文件、高并发写入、大容量存储方面表现优秀也是 RHEL/CentOS 7 及以后版本的默认文件系统。相比 ext4XFS 的特点包括支持超大文件和超大文件系统元数据操作性能好支持在线扩容对多线程并发写入优化较好可使用xfs_growfs在挂载状态下扩展文件系统。如果你的磁盘用于存放数据库数据、日志文件、大文件备份XFS 是一个可靠的选择。如果某些特殊业务要求使用 ext4也可以用mkfs.ext4替代但本文重点讲mkfs.xfs。5.2 mkfs.xfs 基础用法mkfs.xfs是 XFS 文件系统的创建工具。最基本用法sudo mkfs.xfs /dev/sdb1执行时会输出类似信息meta-data/dev/sdb1 isize512 agcount4, agsize3276800 blks sectsz512 attr2, projid32bit1 crc1 finobt1, sparse1, rmapbt0 reflink1 data bsize4096 blocks13107200, imaxpct25 sunit0 swidth0 blks naming version 2 bsize4096 ascii-ci0, ftype1 log internal log bsize4096 blocks6400, version2 sectsz512 sunit0 blks, lazy-count1 realtime none extsz4096 blocks0, rtextents0这段输出看着很长其实信息量很丰富agcountAllocation Group 数量XFS 把文件系统分成多个分配组bsize块大小默认 4096 字节blocks总块数internal log日志存放在文件系统内部。默认参数已经适合绝大多数场景生产环境一般不需要手动调整。下面介绍几个常用参数。5.2.1 指定块大小sudo mkfs.xfs -b size4096 /dev/sdb1块大小 4096 是默认值也是通用推荐值。5.2.2 指定 inode 大小sudo mkfs.xfs -i size512 /dev/sdb1inode 是文件系统存储文件元数据的结构。对于需要存储大量小文件的场景可以调整 inode 相关参数但普通业务使用默认值即可。5.2.3 强制格式化已有内容的分区sudo mkfs.xfs -f /dev/sdb1-f参数用于在已有文件系统的分区上强制覆盖格式化。这是一个有风险的操作会把分区上的所有数据清空务必确认对象是正确的分区后再执行。5.3 格式化并验证文件系统格式化完成后使用blkid或lsblk -f验证sudo blkid /dev/sdb1sudo lsblk -f /dev/sdb1预期会看到类似输出sdb1 xfs 8b7a3d2e-.... /其中 UUID 是文件系统的唯一标识之后挂载或写/etc/fstab时可以用它来替代设备名避免设备名变化导致挂载失败。5.4 挂载分区文件系统有了还要把分区挂载到目录才能使用。sudo mkdir -p /data sudo mount /dev/sdb1 /data挂载后执行df -h /data预期输出Filesystem Size Used Avail Use% Mounted on /dev/sdb1 50G 0G 50G 0% /datadf可以看到挂载点对应的文件系统容量信息确认挂载成功。如果要开机自动挂载需要把挂载信息写入/etc/fstab。建议使用 UUID 而不是设备名因为设备名在重启后可能变化。先查看 UUIDsudo blkid /dev/sdb1然后编辑/etc/fstabsudo vim /etc/fstab在文件末尾添加一行UUID你的UUID /data xfs defaults 0 0字段含义依次是UUID、挂载点、文件系统类型、挂载参数、是否备份、是否开机检查。defaults表示使用默认挂载参数。添加完成后可以执行以下命令验证 fstab 配置是否正确sudo mount -a如果没有任何输出说明配置没有语法错误。为了更加保险建议重启系统再次验证确认/data能正常自动挂载。6. 完整实战从新磁盘到可用的 XFS 目录这一节把前面所有内容串起来演示一次“新磁盘从识别到使用”的完整流程。假设环境里新增了一块 50GB 数据盘设备名是/dev/sdb我们需要把它格式化并挂载到/data目录。6.1 查看新磁盘执行lsblk确认/dev/sdb存在且当前没有任何分区。NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 199G 0 part / sdb 8:16 0 50G 0 disk6.2 使用 fdisk 创建分区sudo fdisk /dev/sdb交互过程Welcome to fdisk (util-linux 2.37.4). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-104857599, default 2048): Last sector, /-sectors or /-size{K,M,G,T,P} (2048-104857599, default 104857599): Created a new partition 1 of type Linux and of size 50 GiB. Command (m for help): p Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 104857599 104855552 50G 83 Linux Command (m for help): w The partition table has been altered. Syncing disks.执行lsblk确认分区sudo lsblk /dev/sdbNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 50G 0 disk └─sdb1 8:17 0 50G 0 part6.3 使用 mkfs.xfs 格式化为 XFS 文件系统sudo mkfs.xfs /dev/sdb1预期输出关键部分如下meta-data/dev/sdb1 isize512 agcount4, agsize3276800 blks data bsize4096 blocks13107200, imaxpct25 log internal log bsize4096 blocks6400, version2验证文件系统sudo lsblk -f /dev/sdb1NAME FSTYPE LABEL UUID MOUNTPOINT sdb1 xfs a1b2c3d4-e5f6-7890-1234-5678abcdef /data6.4 挂载并写入测试创建挂载点并挂载sudo mkdir -p /data sudo mount /dev/sdb1 /data写入测试文件echo hello disk | sudo tee /data/test.txt cat /data/test.txt预期输出hello disk查看磁盘占用df -h /data6.5 设置开机自动挂载获取分区 UUIDsudo blkid /dev/sdb1编辑/etc/fstab追加一行sudo vim /etc/fstabUUIDa1b2c3d4-e5f6-7890-1234-5678abcdef /data xfs defaults 0 0执行验证sudo mount -a如果没有任何报错说明挂载配置正常。重启后/data会自动挂载。至此一块全新的磁盘已经变成可用的 XFS 数据目录。7. 常见问题与排查思路7.1 lsblk 看不到新磁盘问题现象常见原因解决思路lsblk没有显示新磁盘虚拟化平台/云控制台未挂载磁盘到云控制台或虚拟化平台确认磁盘已挂载lsblk没有显示新磁盘内核没有扫描到新设备执行echo 1 /sys/block/sda/device/rescan或重启系统磁盘存在但无/dev/sdX驱动或总线问题检查dmesg、lspci确认驱动加载7.2 fdisk 创建分区后 lsblk 看不到问题现象常见原因解决思路fdisk保存分区后lsblk没显示内核还没读取新分区表执行sudo partprobe /dev/sdb或重启系统提示设备正忙分区正在被使用先umount相关挂载点再操作7.3 mkfs.xfs 时提示文件系统已存在问题现象常见原因解决思路mkfs.xfs拒绝执行分区上已有文件系统确认磁盘无误后使用-f强制覆盖但务必先备份数据挂载后无法写数据挂载参数或权限问题检查/etc/fstab挂载参数确认目录权限7.4 开机后 /data 挂载失败问题现象常见原因解决思路重启后目录为空/etc/fstab配置有误执行mount -a查看报错检查 UUID 是否填写正确文件系统变成只读fstab 检查顺序或磁盘异常查看/etc/fstab最后一列为 0 或 1避免在检查时卡住找不到设备使用了/dev/sdb1这类设备名设备名变化改用 UUID 挂载7.5 误格式化后的自救思路如果误执行了mkfs.xfs先立即停止对该分区的写入操作数据恢复难度会明显降低。可以尝试使用xfs_repair、xfs_metadump、xfs_db等 XFS 工具排查但恢复成功率无法保证。生产环境更应重视备份任何格式化、删除操作前都要确认设备名和挂载点。8. 最佳实践与工程建议8.1 操作前的确认习惯在对磁盘执行分区、格式化等不可逆操作前形成一个固定确认习惯先用lsblk -f和df -h查看当前磁盘、文件系统、挂载点确认目标设备名不是系统盘使用sudo blkid检查目标分区是否已有数据有条件时先做备份或快照。不要凭记忆操作尤其是服务器上有多块同型号磁盘时设备名容易混淆。使用lsblk -d -o NAME,MODEL,SERIAL,SIZE结合硬件序列号确认真实物理磁盘是避免误操作的重要手段。8.2 fdisk 操作安全性建议fdisk的所有变更在w之前只保存在内存中养成先p查看再w确认的习惯生产环境尽量避免对系统盘重新分区如果是云盘扩容建议优先使用厂商提供的扩容流程而不是在操作系统内删除重建分区。8.3 XFS 文件系统的使用建议XFS 支持在线扩容分区扩容后使用xfs_growfs扩展文件系统不需要卸载XFS 不支持缩小文件系统规划分区大小时要留出余量对数据库等高频写入场景关注sunit、swidth等对齐参数但普通业务默认值足够定期使用xfs_repair -n做只读检查及时发现文件系统潜在问题。8.4 挂载配置的工程化建议在/etc/fstab中优先使用 UUID而不是设备名修改/etc/fstab前先备份sudo cp /etc/fstab /etc/fstab.bak每次改完执行sudo mount -a以及重启验证再部署到生产对重要数据目录考虑设置noatime挂载参数减少不必要的访问时间记录写入延长磁盘寿命并提升性能。UUID... /data xfs defaults,noatime 0 08.5 从命令到自动化脚本当需要为多台机器批量初始化数据盘时可以编写一个简化脚本但要在脚本里加入确认和日志机制。以下是一个“分区前检查设备是否存在”的思路片段#!/bin/bash # 用法./init_disk.sh /dev/sdb /data DISK$1 MOUNT_POINT$2 if [ ! -b $DISK ]; then echo 错误$DISK 不是有效的块设备 exit 1 fi if mount | grep -q $DISK; then echo 错误$DISK 已挂载拒绝操作 exit 1 fi echo 准备初始化 $DISK 到 $MOUNT_POINT自动化脚本尤其要防止误操作建议加入设备名白名单、确认输入、执行日志等功能。没有把握时宁可比人工操作多写几层保护。9. 最后的几点经验磁盘管理是 Linux 运维中最常被忽略、又最容易出问题的环节。很多人只记住lsblk、fdisk、mkfs.xfs三个命令能完成基本操作却在真正面对生产环境时缺少整体流程意识。这里再强调几条适用于日常工作的经验。第一先看后动。不管是新机器还是老机器先执行lsblk -f把当前磁盘、分区、文件系统、挂载点全部搞清楚再做后续操作。信息是避免误操作的第一步。第二区分设备名和真实文件系统。不要在设备名上想当然。/dev/sda不一定永远是系统盘/dev/sdb可能是数据盘也可能在某次重启后因为 BIOS/驱动加载顺序发生变化而产生设备名漂移。因此关键配置里多以 UUID 为准。第三格式化之前问自己一句这个分区上有没有正在使用的数据如果答案是“不确定”就停下来做备份和确认。第四XFS 文件系统适合大多数通用场景尤其是大文件和高并发写入。如果业务对超大分区、在线扩容有硬性要求XFS 是比 ext4 更适合的选择。但要记住 XFS 不能缩小规划容量时要留足余量。第五把操作流程变成自己的“肌肉记忆”lsblk查看 -fdisk分区 -partprobe刷新 -mkfs.xfs格式化 -mkdir创建挂载点 -mount挂载 - 写入/etc/fstab并验证。每一步都有明确目的任何一步出现异常都应当停下来排查而不是继续往下执行。把这篇教程里的命令在多台虚拟机或实验环境里多跑几遍尤其是故意制造一些错误场景比如在已有文件系统的分区上执行格式化、在分区未刷新时查看lsblk你会对 Linux 磁盘管理有更深的理解。实际项目里遇到磁盘告警、扩容、迁移时这些基础能力会让你的操作更加从容。
