ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Linux磁盘管理实战:lsblk、fdisk与mkfs.xfs从入门到挂载

Linux磁盘管理实战:lsblk、fdisk与mkfs.xfs从入门到挂载 Linux磁盘管理里lsblk、fdisk、mkfs.xfs 这三条命令基本就是必须掌握的基础组合。平时排查磁盘的时候先 lsblk 看设备信息再用 fdisk 或 gdisk 分区最后用 mkfs.xfs 或 mkfs.ext4 格式化文件系统这是服务器运维里非常标准的流程。如果你刚接触 Linux或者正在准备运维面试建议把这条流程完整跑一遍不只要记住命令还要理解每个步骤为什么存在、什么情况下容易出错。先说结论磁盘管理工作不是单一命令就能完成的。lsblk 负责“看”fdisk 负责“切”mkfs.xfs 负责“建文件系统”后面还要加 mount 挂载和 /etc/fstab 持久化才算真正能在业务里使用。很多新手容易卡在单条命令上比如 fdisk 交互界面不敢按 wmkfs.xfs 报错就以为是磁盘坏了。接下来我会把从查看磁盘信息到分区、格式化、挂载的完整过程拆开讲同时把我自己实测时踩过的问题也放进去。1. 先建立一条磁盘管理主线别把三个命令当孤立的工具1.1 从物理磁盘到可写文件系统中间经历了什么磁盘管理的完整链路可以简单理解为物理磁盘 → 分区表 → 文件系统 → 挂载点。物理磁盘只是一个能读写扇区的设备系统不知道哪段空间属于哪个目录也不知道文件名叫什么。分区表解决“磁盘空间如何切分”的问题比如整块盘切成一个分区还是切成 /data 和 /backup 两个分区。文件系统解决“分区内部如何存放文件”的问题比如 inode、数据块、目录结构。挂载点把文件系统接到系统目录树上业务程序才能正常读写。在这个链路里lsblk 是排查链路最常用的查看工具查看磁盘、分区、挂载点、文件系统类型。fdisk 是分区表编辑工具也可以查看分区表但它的核心动作是“改”。mkfs.xfs 是把某个分区初始化为 XFS 文件系统的命令属于“建”的动作。理解了这条链路再看命令就不容易混淆。比如你问“磁盘格式化以后看不到”那就可能是分区没生效或者文件系统没写进去或者挂在别的位置不能只用一条命令去猜。1.2 在什么环境里练手最安全练习磁盘管理最怕一件事把系统盘搞坏。所以我一般会建议先找一块独立的数据盘或者在虚拟机里加一块空磁盘来练手。不同练习环境的注意点如下环境是否适合练习要注意的问题VMware/VirtualBox 虚拟机适合新加一块空磁盘后要重启或做 SCSI 扫描才能看到云厂商服务器适合如果有系统盘和数据盘只操作新增的数据盘不要动系统盘U盘可以但风险高会清空盘上数据做之前必须备份且有热插拔被占用的可能物理机系统盘不建议一旦分区或格式化错误可能直接导致系统无法启动虚拟机是最稳妥的环境。你可以在里面反复创建空磁盘练习 fdisk 分区、mkfs.xfs 格式化、mount 挂载甚至故意制造错误来观察报错。等流程熟练了再上生产环境操作真磁盘。2. 用 lsblk 查看磁盘信息重点不在“能看到几块盘”2.1 默认输出每一列的含义和快速判断技巧lsblk 的默认输出很直观。先看一个典型例子[rootlocalhost ~]# 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 / vdb 8:16 0 100G 0 disk └─vdb1 8:17 0 100G 0 part默认列含义如下NAME内核识别的设备名sda 是 SCSI/SATA 类磁盘vdb 是虚拟化磁盘nvme0n1 是 NVMe 固态盘。MAJ:MIN主设备号和次设备号排查设备映射时会用。RM是否为可移除设备1 表示能拔出比如 U 盘。SIZE设备大小默认会换算成 G 或 M。RO是否只读1 表示只读设备。TYPEdisk 表示整块磁盘part 表示磁盘上的分区lvm 表示 LVM 逻辑卷rom 是光驱。MOUNTPOINT当前挂载点空着说明这个分区还没有挂载。看输出时我习惯先看 TYPE。如果是 disk说明下面通常还有子级如果是 part可以直接看它的 MOUNTPOINT 是否为空。一个常见判断方法是新加了一块 100G 磁盘但 lsblk 里没有对应设备那就先不要做分区操作先解决设备识别问题。2.2 加参数看文件系统、UUID 和完整路径默认输出并不会显示文件系统类型和 UUID。实际规划磁盘时我更习惯用带 -f 参数的 lsblklsblk -f /dev/sda输出会多出 FSTYPE、LABEL、UUID、FSAVAIL、FSUSE%、MOUNTPOINT 几列。比如NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs a3f8-... /boot └─sda2 xfs 8b7d-... /这些信息非常关键。/etc/fstab 里挂载建议使用 UUID而不是 /dev/sda1 这种设备名因为系统重启后设备名可能变化。用 lsblk -f 能直接看到 UUID省得再单独执行 blkid。如果只需要设备链路不想看子分区可以用 -d 参数lsblk -d -o NAME,SIZE,TYPE,TRAN,MODELTRAN 和 MODEL 能看出磁盘接口类型和型号对判断“为什么速度慢”“是不是 SSD/机械盘”比较有用。在脚本里也可以用lsblk -n -o NAME,SIZE /dev/vdb-n 去掉标题行方便直接读取结果。2.3 新磁盘没出现在 lsblk 里先查链路再查系统新加了一块磁盘lsblk 却看不到这种问题我遇到过很多次。不要着急重启一般按下面顺序排查云服务器先到控制台确认数据盘确实已挂载没有挂载自然不会出现在系统里。看内核日志dmesg | grep -i sd或dmesg | tail -50确认有没有类似 sdb、vdb 的设备插入记录。如果不支持热插拔在虚拟机里可以重新扫描 SCSI 总线ls /sys/class/scsi_host/ echo - - - /sys/class/scsi_host/host0/scan echo - - - /sys/class/scsi_host/host1/scan如果装了 lsscsi直接执行lsscsi能比较清楚地看到磁盘列表。这里有一个重要判断如果宿主机的磁盘确实已添加但系统一直没有识别先扫描 SCSI 总线再考虑重启。盲目重启会影响线上的其他服务所以顺序很重要。3. fdisk 分区很容易难在分区表类型和修改之后会不会生效3.1 fdisk 交互式命令的最小操作集fdisk 是“交互式”工具刚接触时容易因为界面陌生而卡住。其实绝大多数场景只需要记住几个键p 显示分区表n 新建分区d 删除分区t 修改分区类型w 保存退出q 不保存退出。以一块 100G 的空数据盘 /dev/vdb 为例进入 fdiskfdisk /dev/vdb此时会进入交互界面。建议先按 p 看当前分区表确认这是空盘避免误操作。新建分区的典型过程输入 n回车。分区类型默认选 p主分区直接回车。分区编号默认是 1直接回车。起始扇区默认是磁盘第一个可用扇区直接回车。结束扇区如果只想分一个区直接回车表示用满整个磁盘也可以写成 50G 表示 50G。再次按 p 查看新的分区结构。确认无误后按 w 保存退出。如果中间发现有误直接按 q 退出不保存。这一点很重要q 只能保证本次操作不落盘只要还没按 w分区表就不会被修改。我一般会在写 w 前再执行一次 p。多看一眼当前磁盘名、大小、分区结构能在很大程度上避免格式化错盘。3.2 MBR 和 GPT超过 2TB 或超过 4 个主分区时必须换方案fdisk 在传统模式里默认生成 MBRDOS分区表。MBR 有两个限制磁盘容量超过 2TB 时空间管理不完整主分区最多只能有 4 个。当代服务器数据盘经常超过 2TB所以这块内容几乎是常考、常踩点的地方。针对性解决办法有两种使用 gdisk 或 parted 创建 GPT 分区表。新版 fdisk 也支持在空盘上输入 g 来创建 GPT 分区表然后继续用 n、p、w 流程。实际中我用 parted 创建 GPT 分区表更多一些parted -s /dev/vdb mklabel gpt parted -s /dev/vdb mkpart primary xfs 0% 100%这条命令会在空盘上直接创建 GPT 分区表并创建一个占满整块盘的分区。如果想手动控制起始点也可以把 0% 100% 换成对应的扇区或大小。怎么判断用哪种磁盘容量大于 2TB或者未来可能扩容超过 2TB用 GPT。UEFI 启动的系统盘用 GPT并且通常需要单独的 EFI 分区。传统 BIOS 启动的小容量数据盘MBR 也可以但如果没有特殊兼容要求新环境直接 GPT 更省事。3.3 分区创建后没有立即生效这里有一个常见误区很多人分区完按 w就顺手去格式化结果报“找不到设备”或者“设备不存在”。原因不是分区没创建成功而是内核还没有重新读取分区表。在 Linux 上可以执行下面任一命令让内核识别新分区partprobe /dev/vdb或者partx -u /dev/vdb然后执行 lsblk确认 vdb1 已经出现再进行 mkfs 格式化。需要特别注意的是生产环境里对正在使用中的磁盘执行 partprobe有可能影响已有挂载关系和文件系统状态。所以稳妥做法是fdisk 操作完毕后先 lsblk 看一下如果已经识别就直接走下一步如果没识别才考虑 partprobe。如果这台机器本来就允许重启也可以重启后确认。4. mkfs.xfs 格式化前必须把数据和参数边界想清楚4.1 一条最常用的格式化命令和它背后的默认行为分区创建完成后真正的格式化通常在 XFS 场景下是mkfs.xfs /dev/vdb1执行前系统可能会提示该设备后面是什么大小然后开始写入 XFS 结构。格式化完成后可以用 blkid 或 lsblk -f 验证blkid /dev/vdb1 lsblk -f /dev/vdb1mkfs.xfs 常用参数如下参数作用示例-f强制覆盖已有文件系统mkfs.xfs -f /dev/vdb1-L设置文件系统标签mkfs.xfs -L data /dev/vdb1-b指定块大小mkfs.xfs -b size4096 /dev/vdb1-n ftype1配合某些容器/overlayfs 场景mkfs.xfs -n ftype1 /dev/vdb1-m reflink1开启 reflink 支持mkfs.xfs -m reflink1 /dev/vdb1默认情况下mkfs.xfs 会自动根据设备配置选择合适的 block size最常见是 4K。如果底层的磁盘物理扇区是 4K 或全闪存阵列4K 块大小通常能保持较好性能。但块大小越大处理大量小文件时空间浪费可能越多所以不要无脑调大。生产环境中我很少直接跑 mkfs.xfs 不加任何参数一般会先想清楚是否需要标签、reflink、n ftype 这些特性因为有些特性在格式化时决定后期很难改。4.2 XFS 适合什么场景ext4 和 swap 怎么选很多人一听到 Linux 就默认用 ext4但在 RHEL、CentOS 系列里XFS 已经是系统默认文件系统之一。两者选型时没有绝对优劣主要看你关注什么。文件系统适合场景优点边界XFS大文件、高并发写入、虚拟机镜像、数据库数据目录高扩展性、大文件性能好、支持 reflink文件系统收缩比较困难ext4通用场景、小规模服务器、嵌入式兼容性好、工具成熟、缩容相对灵活大文件高并发下扩展性不如 XFSswap内存交换分区不属于文件系统用于 swap 缓存使用 mkswap 和 swapon不会用 mkfs.xfs实际判断可以这样简化如果系统默认是 XFS或者磁盘主要承载大文件、大日志、虚拟机镜像就继续用 XFS。如果是普通小规模文件服务器ext4 也没有问题而且网上教程多、排错资料多。Linux swap 分区则用 mkswap 创建不能拿 mkfs.xfs 去格式化。有一个容易让人误解的点XFS 支持在线扩容可以直接执行 xfs_growfs但 XFS 文件系统无法安全缩小。所以在一开始规划分区大小时要给 XFS 留足余量否则后面改起来很麻烦。这和 ext4 有一定差异面试和实操里都是高频话题。4.3 格式化是不可逆操作这个检查顺序要刻进肌肉记忆mkfs.xfs 最大的风险不是命令不会敲而是敲在错误的设备上。格式化会永久清除分区上的数据没有回收站也不会有二次确认弹窗。我自己在格式化前一定会走一遍下面的检查顺序lsblk 确认设备名比如 /dev/vdb1 是不是计划中的那块盘。df -hT 看这块分区当前是否已经挂载如果挂载在某个业务目录绝不能直接格式化。blkid /dev/vdb1 看上面是否已有文件系统如果已有重要数据先备份或者先确认确实可以删除。如果有分区表检查分区类型和容量是否匹配。最后再执行 mkfs.xfs。列成命令就是lsblk df -hT blkid /dev/vdb1 mkfs.xfs /dev/vdb1 lsblk -f /dev/vdb1如果把设备名写错比如把 /dev/vda1 当成 /dev/vdb1后果就是系统盘被清空。所以在 mv、fdisk、mkfs 这一类专业操作里我始终坚持“先看一遍再敲一遍最后再看一遍”。5. 格式化之后不能算完成挂载、持久化和验证才算落地5.1 mount、df -hT、lsblk -f 的验证顺序格式化完成只是第一步。一个文件系统只有挂载到目录树上业务程序才能使用。先创建挂载点再执行挂载mkdir -p /data mount /dev/vdb1 /data然后按顺序验证df -hT /data lsblk -f /dev/vdb1 findmnt /datadf -hT 能看到文件系统类型、容量、已用和挂载点lsblk -f 能看到 MOUNTPOINT 不再是空findmnt 能更明确地显示这个目录对应哪个设备。验证不只是看挂载状态还要写入测试touch /data/test_file echo disk test /data/test_file cat /data/test_file如果文件能正常写入、读取说明从分区到文件系统到挂载点整条链路是通的。用 U 盘或其他可移动设备练手时完成后可以通过 umount /data 卸载。5.2 写入 /etc/fstab 实现开机自动挂载但不建议盲目追加mount 命令只能保证当前开机状态下生效。如果服务器重启这个挂载关系就没了。要让系统开机自动挂载需要把信息写进 /etc/fstab。最稳妥的写法是用 UUID而不是 /dev/vdb1。先取出 UUIDblkid /dev/vdb1把输出里的 UUID 复制下来然后在 /etc/fstab 末尾加一行UUIDxxxx-xxxx-xxxx /data xfs defaults,noatime 0 0四个字段的含义分别是设备标识这里用 UUID。挂载点/data。文件系统类型xfs。挂载选项defaults 表示默认属性noatime 表示不更新访问时间能降低写盘频率。修改完成后并不直接重启。先执行 mount -a让系统重新读取 /etc/fstab 并挂载所有配置项看有没有报错mount -a lsblk -f /data也可以执行 findmnt --verify它会检查 fstab 里的条目。如果在实际服务器上直接改 fstab 后重启一旦写错设备标识或挂载选项系统启动阶段可能会进入异常等待或者无法挂载根目录所以一定先验证再重启。5.3 在虚拟机上完整复现一次从空数据盘到挂载成功把上面的步骤串在一起就是在虚拟机里做一次的完整记录。在 VMware 或 VirtualBox 中给虚拟机添加一块新磁盘比如 100G系统识别为 /dev/vdb。之后依次执行# 1. 查看磁盘 lsblk # 2. 分区MBR 场景一个主分区 fdisk /dev/vdb # 交互里按 n、p、回车、回车、回车、p、w # 3. 让内核识别新分区 partprobe /dev/vdb # 4. 确认分区 lsblk /dev/vdb # 5. 创建 XFS 文件系统 mkfs.xfs /dev/vdb1 # 6. 挂载 mkdir -p /data mount /dev/vdb1 /data # 7. 验证 df -hT /data lsblk -f /dev/vdb1 echo test /data/test cat /data/test # 8. 持久化 blkid /dev/vdb1 vi /etc/fstab # 添加一行 UUIDxxxx /data xfs defaults,noatime 0 0 mount -a到这里你已经完成了从查看磁盘信息到格式化、挂载、持久化的完整流程。这套顺序在绝大多数 Linux 发行版上基本通用只是包管理器和默认文件系统有差异。6. 常见报错、误操作场景和运维排查链路6.1 “device is busy” 和其他“设备被占用”问题的处理顺序格式化或卸载时最常遇到的报错之一是 device is busy。比如执行umount /data报错 target is busy或者执行 mkfs.xfs 时提示设备忙。原因通常是某个进程正在使用该设备或挂载点。排查顺序建议如下先看挂载点是否有进程占用lsof /data fuser -v /data确认占用进程。如果只是测试文件可以直接 kill 对应进程。确认没有进程占用后再执行 umount。如果确实无法卸载但业务可以临时中断谨慎使用懒卸载umount -l /data懒卸载会先解除挂载关系让正在使用该目录的进程继续使用旧文件系统等进程退出后再真正清理。这个操作属于“非常情况下的备用方案”正常场景不推荐优先使用。如果 mkfs 提示设备忙不要为了绕过问题直接加 -f那样可能强制覆盖正在使用的文件系统。先查占用、先确认设备这是基本原则。6.2 磁盘能格式化不代表能长期使用容量、inode 和块大小也要看格式化成功只是一个开始长期稳定性看三个东西。第一是容量监控。df -hT 能看磁盘剩余空间但只说“磁盘使用率高”不一定能定位到是哪个目录。真正排查时先用 du -sh /data/* 从挂载点逐层放大定位最大目录。如果只是临时扩容需求还要考虑分区容量和文件系统是否支持在线扩容。第二是 inode 是否耗完。磁盘还有空间但程序报 No space left on device很可能是 inode 用满了。执行 df -i看 IUse% 是不是 100%。inode 满常见于大量小文件场景比如邮件队列、临时文件、docker overlay 目录。发现 inode 满后要清理小文件而不是调整块大小。第三是块大小。mkfs.xfs 默认块大小通常是 4K。如果存大量 1K 左右的小文件每个文件可能都会浪费一部分块空间。要提前根据业务类型设计文件系统参数而不是等运行一段时间后再换。6.3 面试和运维实战里常追问的延伸点围绕 lsblk、fdisk、mkfs.xfs 这套流程面试和实际排障中经常出现以下延伸点fdisk -l 和 lsblk 有什么区别。fdisk -l 更侧重分区表本身lsblk 更侧重树状结构和挂载关系。MBR 和 GPT 怎么选。大于 2TB 用 GPTUEFI 用 GPT。mkfs.xfs 和 mkfs.ext4 怎么选。大文件、高并发写入优先 XFS通用小场景 ext4 也可。为什么 /etc/fstab 里推荐用 UUID。设备名可能随启动顺序变化UUID 更稳定。格式化错误了怎么办。没有实际办只能从备份恢复。所以格式化前检查备份是第一步。磁盘满了怎么查。df -hT 看哪个挂载点再 du -sh 往下找大目录。很多看起来像磁盘损坏的问题最后查下来其实是分区表类型不对、挂载点没对上、inode 满了或者文件系统参数选错。所以排查时不要一上来就认为是硬件故障先按“识别设备 → 查看分区表 → 确认文件系统 → 检查挂载状态 → 查看容量和 inode”的顺序走通常能省掉不少折腾。个人更推荐的做法是在虚拟机里准备一块空盘把上面这套流程完整练习三遍以上第一遍照打命令第二遍故意制造错误比如写错设备名、漏掉 partprobe、fstab 写错 UUID第三遍不看笔记直接从头做完。这样以后再遇到真实服务器的磁盘管理需求至少不会慌。
返回列表