
1. 先搞懂Linux是怎么“命名”一块磁盘的很多刚接触Linux的朋友第一次敲lsblk或者fdisk -l的时候看到/dev/sda、/dev/nvme0n1这种设备名完全摸不着头脑。Windows下你看到的是“磁盘0”“磁盘1”“C盘”“D盘”Linux下则是一堆/dev开头的路径这个差异本身就是新手理解磁盘管理的第一道坎。实际上Linux的磁盘命名规则非常规律你只要知道这几点以后再看到任何设备名都能猜个大概/dev/sda第一块 SCSI/SATA 接口的磁盘。/dev/sdb第二块 SCSI/SATA 接口的磁盘字母 a、b、c 依次增加。/dev/nvme0n1NVMe 固态硬盘这个稍微复杂一点——nvme0代表第一个 NVMe 控制器n1代表该控制器下的第一块命名空间通常就是第一块盘。/dev/vda虚拟化环境下的 VirtIO 磁盘云服务器上最常见的就是这种。/dev/mmcblk0eMMC 存储多见于开发板、部分嵌入式设备。再看分区磁盘名后面跟数字就是分区。/dev/sda1就是第一块 SCSI 磁盘的第一个分区/dev/nvme0n1p1就是 NVMe 磁盘的第一个分区——注意 NVMe 分区分隔符是p不是直接加数字这个细节新手很容易搞混。还有一个物理概念需要先理清楚磁盘disk、分区partition、文件系统filesystem是三个完全不同的层次。磁盘是一块物理硬件分区是在磁盘上划分的逻辑区域文件系统是在分区之上建立的存储格式ext4、xfs、btrfs 这些。你平时说的“把文件存进 /home 目录”本质上是文件写入挂载在 /home 的那个分区里的文件系统。理解这一条线后面所有操作都有了基础。提示Linux 里一切皆文件磁盘也不例外。你操作/dev/sda就是在操作物理设备这种设计让很多底层操作变得统一但也意味着权限要求极高——后面讲实操的时候你会体会到为什么动不动就要sudo。2. 动手前的摸底三个命令看清磁盘全貌在动任何磁盘之前先学会“看”。很多人一上来就fdisk直接分区最后把数据搞没了其实绝大多数灾难都可以通过事前的查看命令避免。2.1 lsblk最直观的磁盘树状视图lsblk是我使用频率最高的磁盘命令没有之一。它把磁盘和分区的从属关系以树状结构展示出来一眼就能看明白lsblk输出大概是这样的NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 80G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 30G 0 part / └─sda3 8:3 0 49G 0 part /home看到没有sda下面分支出了三个分区每个分区挂载在哪个目录也直接标出来了。这就是整台机器存储布局的“全景地图”。lsblk有几个常用参数我建议新手直接养成习惯用lsblk -flsblk -f这个命令会额外显示每个分区的文件系统类型比如 ext4、xfs和 UUID。UUID 后面讲挂载的时候会用到是非常关键的信息。2.2 df看“用了多少”还得靠它lsblk告诉你磁盘被划分成了什么样子df告诉你每个分区现在装了多少东西df -h-h参数表示 human-readable用人类能直接读的 G、M 单位显示。输出类似Filesystem Size Used Avail Use% Mounted on /dev/sda2 30G 12G 16G 43% / /dev/sda3 49G 20G 26G 44% /home哪个分区快满了一目了然。df应该是你日常排查“磁盘满了导致服务异常”的第一排查命令很多人习惯去看监控平台其实登录机器先敲一个df -h反而最快。2.3 fdisk -l 和 blkid查看磁盘身份细节如果需要看更底层的磁盘信息比如磁盘的总容量、扇区大小、分区表类型用sudo fdisk -lblkid则是查看分区的 UUID 和文件系统类型sudo blkid输出的 UUID 是一长串唯一的标识符这个值在配置开机自动挂载的时候是“身份证”级别的关键信息。我的实操习惯是任何磁盘操作之前先lsblk -f拍个照再df -h确认空间现状记录下当前所有分区的 UUID。这样哪怕操作失误也知道自己把系统从什么状态改成了什么状态。3. 分区与格式化实操从零创建一个可用磁盘接下来进入正题。假设你新加了一块 100G 的磁盘/dev/sdb系统里已经能看到它了但完全不能用——没有分区没有文件系统。你要做的有三步分区、格式化、挂载。3.1 用 fdisk 创建分区表先明确一个概念一块全新的裸盘第一步要做的是建立分区表。分区表只有两种主流类型MBR也叫 dos 类型和 GPT。MBR 最多只支持 2T 以下的磁盘、最多 4 个主分区GPT 没有这两个限制。2024 年了新磁盘我基本无脑选 GPT除非你有特殊兼容性需求。开始分区sudo fdisk /dev/sdb进入交互界面后操作顺序是这样的输入g创建 GPT 分区表。输入n新建分区按提示选择分区号默认回车即可、起始扇区默认回车、结束扇区输入你要的大小比如50G或者直接回车用满整块盘。输入w写入并退出。整个过程屏幕上会有英文提示新手不用怕关键是记住分区操作在输入w之前都是“纸面”操作不会真正写入硬盘。这是 fdisk 设计得很人性化的一点——你可以随便试只要不按w磁盘毫发无损。3.2 格式化到底做了什么分区完成后/dev/sdb1这个设备节点就出现了但这时候你还是不能存文件因为上面没有文件系统。文件系统你可以理解成仓库的“货架规则”——同样一批货用什么规则摆放决定了你怎么存取最高效。Linux 下最常用的格式化工具有这些文件系统适用场景格式化命令特点ext4绝大多数通用场景mkfs.ext4成熟稳定兼容性最好xfs大文件、高并发写入mkfs.xfs性能强悍但不能缩容btrfs需要快照、压缩的场景mkfs.btrfs功能丰富但复杂度高swap交换分区mkswap特殊用途不是普通存储对新手来说拿不定主意就选 ext4这个选择在任何场景下都不会出大错sudo mkfs.ext4 /dev/sdb1格式化命令执行后屏幕上会刷出一堆信息。看到Writing superblocks and filesystem accounting information就意味着格式化成功了。注意格式化是不可逆操作这个命令会清空该分区的所有数据。实际操作中尤其是在生产服务器上我见过太多人把/dev/sdb1写成了/dev/sda1然后整个系统数据全部蒸发。规避方法是格式化前反复对照lsblk的输出确认你操作的设备号没错最好是先在机器上用标签给磁盘做好标注。3.3 为什么 mkfs 执行完之后还不能直接存文件这是新手特别容易懵的一个点分好区、格式化好了但你去/dev/sdb1里建文件根本建不了。原因很简单——这个分区还没有“接入”你的目录树。Linux 的文件访问逻辑是一切文件都要通过根目录/逐级找过去。一块新盘如果不挂载到某个目录下那它就是一个游离在系统之外的孤岛里面的文件无法通过正常路径访问到。所以下一步就是挂载。4. 挂载这步才是真正“接上”磁盘挂载命令是mount把分区关联到指定目录这个目录叫作“挂载点”sudo mkdir -p /data sudo mount /dev/sdb1 /data执行完再df -h你就能看到/dev/sdb1挂载到了/data下面往/data里写文件实际上就是在写这块新盘。4.1 拿 UUID 绑定挂载别直接用设备名上面的挂载命令有个隐患用的是/dev/sdb1这个设备名。设备名的分配顺序并不保证稳定比如你下次重启后系统里多了一块盘原来的/dev/sdb可能变成了/dev/sdc那么/etc/fstab里的配置就全乱了。解决方式是使用 UUID 挂载。先用blkid查出分区的 UUIDsudo blkid /dev/sdb1然后挂载时用 UUID 代替设备名sudo mount UUID你的UUID字符串 /data4.2 编辑 /etc/fstab 实现开机自动挂载mount命令挂载的分区重启后就失效了要让系统开机自动挂载需要写进/etc/fstab这个配置文件。格式是固定的六列UUIDxxxx /data ext4 defaults 0 2六列分别代表设备标识、挂载点、文件系统类型、挂载参数、是否备份、是否开机自检。一般defaults参数就够了最后两个数字固定填0 2就行。写 fstab 有一个极其重要的验证技巧编辑完以后先执行sudo mount -a测试一下配置是否正确。这个命令会重新加载 fstab 中所有条目如果配置有错它会在当前会话就报错你还有机会修复。如果配置错误就直接重启系统可能会因为找不到挂载分区而卡在紧急模式emergency mode新手这时候往往一脸懵。注意fstab 写错是 Linux 运维里非常经典的“重启即翻车”事故。我的习惯是改完 fstab 之后先不重启而是mount -a验证 df -h确认挂载成功确认无误才允许重启。4.3 挂载点选在哪里有讲究很多新手喜欢把数据盘挂到根目录下的某个自定义文件夹这没问题。但有一些约定俗成的规范值得遵守新盘建议挂到/data、/opt、/srv这类专门放业务数据的目录。不要把数据盘挂到/home下再用除非你确实是想扩展用户目录。挂载点目录必须是空目录非空目录会被原内容“遮挡”——挂载后你原来的文件还在磁盘上但通过这个目录看不到了。还有一个分区规划的经验如果你装系统的时候能自己决定分区方案一定要把/home用户数据、/var日志和缓存独立出来。这样以后系统盘出问题要重装用户数据不会跟着遭殃。这也是为什么很多老手不建议新手装系统时“一键全自动分区”多花五分钟手动安排好分区后面能省很多麻烦。5. 实战场景磁盘爆满、扩容、无法删除文件怎么救理论说得再多不如来几个真实场景。这三个故障我几乎每个月都会遇到尤其是“磁盘爆满”类问题是 Linux 服务器排障的高频入口。5.1 磁盘 100% 了但du看来看去没找到大文件这是经典骗局。df -h显示/已经 100%但你du -sh /*一个个目录查加起来却远远不到磁盘总容量。问题大概率出在这几个地方第一被删除但还被进程占用的文件。进程打开了一个文件你把文件删了但进程没有关闭文件句柄磁盘空间就不会真正释放。排查方法lsof | grep deleted找到对应的进程 PID重启那个进程或者确认能不能重启服务空间就回来了。第二inode 耗尽了。df -h看的是块空间还有 40% 剩余但要查 inodedf -i如果 IUsed 达到 100%那磁盘上全是小碎文件把 inode 表撑爆了同样无法写入任何新文件。这种情况一般是邮件队列、session 临时文件、Docker 日志这类大量小文件堆积导致的找到对应目录批量清理即可。第三日志文件被吞了。有些应用写日志的姿势比较特殊日志文件删了但它还在持续写入这种时候你看着空间没释放其实是文件被占住了。排查思路就是按照“占用 → deleted → 真正删除”这条线走大多数空间诡异消失的问题都能揪出来。5.2 WSL 里删了文件Windows 磁盘空间却没释放这是 Windows WSL 用户非常常见的问题。你在 WSL 里删了一个大文件回到资源管理器一看磁盘剩余空间根本没变化。原因在于 WSL 的虚拟磁盘ext4.vhdx机制WSL 的 Linux 文件系统是封装在一个虚拟磁盘镜像文件里的删除文件后镜像内部的可用空间变多了但镜像文件本身不会自动缩小它只会继续膨胀。所以你在 WSL 里感觉“删了 50G”实际上 Windows 上的那个 vhdx 文件大小纹丝不动。解决方法是压缩虚拟磁盘。在 PowerShell 里用管理员权限执行wsl --shutdown diskpart # 进入 diskpart 后 select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit压缩完成后vhdx 文件会真正变小。这个操作适合 WSL2 用户定期做一次否则磁盘会被越撑越大。5.3 磁盘扩容分区表变了但文件系统没变怎么办虚拟机环境下给系统盘扩容流程一般是先在虚拟化平台比如 PVE、VMware、ESXi把磁盘容量调大然后进入系统让分区表和文件系统去“吃掉”新增的空间。注意这一步不能直接 fdisk 删了重建分区否则数据全毁。正确步骤是用lsblk确认磁盘总容量已经变大但分区还是原来的大小。用growpart扩展分区sudo growpart /dev/sda 2/dev/sda 2的意思是扩展第一块磁盘的第二个分区把分区扩展到物理磁盘的最大可用空间。扩展文件系统# ext4 用 sudo resize2fs /dev/sda2 # xfs 用 sudo xfs_growfs /ext4 和 xfs 在扩容时的命令不一样这是很多人搞错的地方。ext4 是用resize2fs指定分区设备xfs 是用xfs_growfs指定挂载点。搞反了就会报错。扩容完成后df -h就能看到根分区变大了。整个过程不需要重启也不影响正在运行的服务——这也是 Linux 在线扩容机制非常优秀的一点。6. 新手最容易踩的四个磁盘管理坑最后把我这些年见过的、自己踩过的高频坑集中列一下。每一条都是真实事故不是课本上的理论。坑一把挂载信息写错 fstab 后直接重启。后果是系统起不来卡在 maintenance mode。破解办法是输入 root 密码进入修复模式注释掉出错的那一行再重启。防患于未然的办法就是我前面说的改完先mount -a。坑二用dd或者cat直接操作/dev/sda整块盘。dd if某个镜像 of/dev/sda这种命令会把整块盘覆盖连分区表一起干掉。很多新手以为自己在“写镜像”实际上是“毁盘”。操作前一定确认of写的是分区如/dev/sdb1还是整盘如/dev/sdb两者区别巨大。坑三df -h看到空间没了直接rm -rf日志目录了事没有处理被进程占用的文件句柄。结果就是空间依然没了还把日志文件删了没法回溯问题。正确做法是先lsof找占用进程。坑四格式化错了盘。重复强调一次任何mkfs命令执行前必须lsblk确认设备号。可以在另一终端开着watch -n 1 lsblk格式化前再对比一遍。磁盘管理这门基本功看起来命令不多但每一条命令背后都有“为什么”和“什么时候不能这么用”。把上面这些点吃透了你在 Linux 服务器上遇到磁盘问题就不会再手足无措——先查lsblk看结构再df -h看用量最后根据报错定位到具体操作整个排障链路就很清晰了。