ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux磁盘管理入门:从分区、格式化到挂载的完整指南

Linux磁盘管理入门:从分区、格式化到挂载的完整指南

1. 先把事情说清楚:分区、挂载、查看到底在解决什么问题

Linux磁盘管理这三件事,听起来是三个独立操作,实际上是一条完整链路:我们拿到一块新硬盘,第一件事是告诉系统这块盘的存在并查看它的状态,然后用分区工具把存储空间划分成可管理的逻辑区域,最后把分区格式化并挂载到目录树中,让应用能真正写入数据。很多新手在这块容易卡住,不是因为命令记不住,而是没搞明白这三者之间到底是怎么协作的。

简单打个比方:磁盘分区就像在毛坯房里面砌隔断墙,把一大块空间分成客厅、卧室、厨房;格式化是给每个房间做硬装——铺地板、刷墙面,让它能放东西;挂载则是给每个房间装上门牌号,让你知道走到哪个目录就进到哪个房间。没有门牌号,装修得再好你也找不着、用不上。这套流程里,查看贯穿始终:买家具前先量空间,入住之前再检查一遍,都是它的事。

这篇内容适合谁?刚接触Linux服务器管理的同学,在云主机或物理机上加过硬盘却发现系统不认的运维新人,以及想系统梳理磁盘命令、避免日后在fstab上翻车的朋友。我会把每一步的原理、命令、常见坑都过一遍,末尾还会附上我实际踩过的几个问题。掌握这些,日常磁盘管理工作基本就够用了。

2. 动手之前先摸清家底:掌握磁盘基本信息

2.1 查看命令家族图谱

Linux下查看磁盘的命令不少,但各有各的用途,选对工具能省不少事。这里讲几个我日常用得最多的,按使用频率排个序。

lsblk是我最推荐新手优先掌握的命令,它会以树状结构列出所有块设备,让人一眼看清磁盘和分区之间的从属关系。它的输出简洁清晰,不仅能显示设备名,还能标出挂载点,比一堆原始数据直观得多。blkid用来查看分区的文件系统类型和UUID,这两项信息写fstab时是必需品。fdisk -l能显示磁盘和分区的详细参数,适合查看分区的起始扇区、大小等底层信息。df -hT则专门看已经挂载好、正在使用的文件系统容量和类型,日常监控磁盘占用率靠它。再有就是parted和/proc/partitions,前者是高阶分区工具,后者是内核直接暴露的磁盘设备列表,排查底层问题时能派上用场。

这几个命令各有所长,新手可以这样记:想快速看结构用lsblk,想知道是谁在用磁盘看df,想获取分区详情和UUID用blkid,摸不清底层设备状态就翻/proc/partitions。

2.2 读懂关键输出

第一次在服务器上敲lsblk,很多人会对那一串sda、sda1、sda2感到困惑。其实命名规则很直白,sd开头的是SCSI/SATA/USB这类设备,后面的小写字母a、b、c表示第几块物理磁盘,数字1、2、3则是这块盘上的第几个分区。例如sda是第一块盘,sdb是第二块,sdb1就是第二块盘的第一个分区。NVMe固态硬盘的命名会换成nvme0n1p1这种格式:nvme0表示控制器编号,n1表示命名空间,p1表示该命名空间下的第一个分区。看到这种名字不要慌,对照规则拆开读就行。

lsblk输出的SIZE列是这个分区的总容量,TYPE列标出了设备类型,disk代表整块物理磁盘,part代表磁盘上的分区,还有rom的光驱、lvm的逻辑卷等等。MOUNTPOINT列如果显示路径,就说明这个分区已经挂载到了对应目录。举个例子,看到└─sda1 500G /data,意思就是第一块盘的第一个分区有500G空间,当前挂载在/data目录下。

df -hT的输出更好理解,Filesystem一列可以用/dev/sda1这样的设备路径,也可能是tmpfs这种内存文件系统,或者overlay这类容器文件系统。Type列标出了文件系统类型,Mounted on是挂载点地址。这里面最需要留神的是Use%列,达到90%以上就该考虑清理或扩容了。

2.3 查看时的几个实用技巧

用lsblk -f可以同时显示UUID和文件系统类型,省得再单独跑一遍blkid。这个参数组合在日常排查中出镜率非常高。df -h里的-h参数是human-readable的意思,能以G、M这样的单位显示大小,不带这个参数的话,默认以1024字节为单位的块数显示,数字大得令人头皮发麻。

我习惯在加完新盘、挂载前先跑一遍lsblk -f,确认分区是否识别、格式化是否成功,再决定要不要写fstab。这个习惯帮我避开过好几次“挂载半天发现没格式化”的尴尬。查看磁盘还有一个隐藏技巧,用lsblk -o NAME,SIZE,TYPE,FSTYPE,UUID,MOUNTPOINT可以自定义输出列,想要哪些信息就留哪些,输出干净整洁,适合写脚本做巡检。

注意:fdisk -l在部分系统上需要root权限才能看到完整信息,普通用户执行时可能只看到部分设备。想看详细参数又不想切root,可以配合sudo执行。

3. 磁盘分区:给硬盘画格子前的关键决策

3.1 选MBR还是GPT,这是个问题

分区前先要确定分区表格式。MBR全称是Master Boot Record,主引导记录,最大支持2TB磁盘,主分区最多4个,想再多就要把其中一个扩展分区拆成逻辑分区,操作繁琐,限制又多。GPT则是GUID Partition Table,全局唯一标识符分区表,属于新一代标准,最大支持9.4ZB容量,分区数量理论上没有限制,还带了备份分区表头,容错性更好。

这几年新装的服务器,无论物理机还是云主机基本都采用GPT格式了。遇到2TB以上大盘,或者需要大于4个主分区的情况,直接选GPT不要犹豫。UEFI启动模式下,GPT更是事实标准。老旧的MBR只有在兼容老系统、老引导器这类极端场景里才会用到。我个人的选择标准很简单:新环境一律GPT,只有明确要跑某些老工具链才考虑MBR。

3.2 用fdisk处理小于2TB的磁盘

fdisk是老牌分区工具,交互式操作,适合处理2TB以下的磁盘。场景举例:某公司给一台应用服务器加了一块500G数据盘,识别出来是/dev/sdb,计划分成一个区挂载到/data。操作流程如下。

先进入交互界面:

sudo fdisk /dev/sdb

输入n创建新分区,fdisk会让你选分区类型,GPT分区表下会有Partition number和First sector的提问,因为这块盘全新,一路回车选默认值即可。分区大小按需填,例如+200G代表200G,直接回车则代表使用剩余全部空间。若这块盘还留有一部分空间备用,可以用这个参数精确定界。输完w写入分区表,退出。

写入完成后,新分区通常立即出现在/proc/partitions中。少数情况下内核没刷新,可以用partprobe /dev/sdb通知内核重新读取分区表,比重启系统稳妥得多。用lsblk验证一下就能看到新分区/dev/sdb1了。

3.3 用parted处理大容量磁盘

磁盘超过2TB,fdisk就力不从心了,此时用parted更为合适。parted既支持命令行非交互模式,也支持交互模式,脚本批量操作时用非交互模式非常方便。以一块8TB数据盘为例,需要全部分给一个分区:

sudo parted /dev/sdc --script mklabel gpt sudo parted /dev/sdc --script mkpart primary 1MiB 100%

第一行将磁盘的分区表设置为GPT,第二行创建一个从1MiB开始、使用剩余全部空间的主分区。这里从1MiB而不是0开始,是因为磁盘前部需要保留空间给分区表、对齐引导扇区,这也是新版本fdisk默认的起始位置。接下来用parted /dev/sdc print查看分区是否创建成功。分区完成后,格式化、挂载的流程就和其他分区一样了。

从1MiB起其实还关系到分区对齐的问题。机械硬盘和SSD都有物理块概念,起始扇区不对齐会造成性能下降和多余写入。现代磁盘的扇区多为4K物理扇区,1MiB这个值能确保分区对齐到4K边界,对于SSD尤其重要。如果发现之前手写的分区起始扇区不是8的倍数,可以删了重建,这钱省不得。

4. 格式化与挂载:从“一块盘”到“一个可用目录”

4.1 文件系统怎么选

分区只是把空间划分好,想让Linux向里面写数据,还得建立文件系统。每种文件系统的定位不尽相同:ext4是老牌选手,稳定性极高,日志机制完善,是绝大多数Linux发行版的默认选择,通用性最强;xfs在大型文件和高并发写入场景下表现出众,是很多数据库和大数据集群的标配;btrfs支持快照、压缩、校验和等高级功能,适合对数据管理有更高要求的场景。此外还有面向SSD优化的f2fs,以及跟ZFS生态绑定的OpenZFS等,不过日常使用中,ext4和xfs基本覆盖了九成需求。

选型建议很直接:拿不准就选ext4,跨平台兼容性最好。数据量特别大、或者跑着对写入性能敏感的服务,优先考虑xfs。特别说明一下,xfs不支持缩小,只有扩容能力,容量规划时需要提前留足余量。btrfs这类新秀,除非你明确用得上它的快照功能,否则生产环境还是稳字当头。

格式化命令以ext4为例:

sudo mkfs.ext4 /dev/sdb1

mkfs是make filesystem的缩写,后面跟的文件系统类型决定了具体调用哪个工具。格式化会彻底清空分区数据,执行前务必确认盘符没有写错。我见过有人把/dev/sdb当成/dev/sdb1直接格式化整块磁盘的,损失不可挽回。格式化过程中如果出现设备正忙的提示,多半是分区已被挂载,先卸载再操作。

4.2 手动挂载的操作细节

单次挂载用mount命令就能搞定。以之前500G的那块盘为例,格式化完先创建挂载点目录,再挂载:

sudo mkdir -p /data sudo mount /dev/sdb1 /data

执行完df -h /data,如果看到容量和分区大小一致,就说明挂载成功。原生命令还可以用UUID挂载,mount UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /data,这种写法在建fstab时更常见。再补充一个细节,mount -o remount,rw /data可以重新挂载并修改挂载选项,改错了配置想快速恢复时非常有用。

挂载选项里有一堆参数可以按需开启,比如noatime可以关掉访问时间更新,减少不必要的磁盘写入,对SSD的寿命和性能都有帮助;defaults则是大多数场景下的默认组合。比如要以读写方式挂载并启用noatime:

sudo mount -o rw,noatime /dev/sdb1 /data

4.3 开机自动挂载的终极方案:fstab

mount命令挂载完重启就失效了,想让它每次开机自动挂载,必须配置/etc/fstab文件。这也是Linux磁盘管理中最容易翻车的地方,配置错了,轻则分区不挂载,重则系统启动进入emergency模式。

fstab每行有六个字段,空格或Tab分隔:第一列是设备标识,推荐填UUID而不是/dev/sdb1这类设备路径,因为设备盘符在重启后可能变化,而UUID相对稳定;第二列是挂载点目录;第三列是文件系统类型;第四列是挂载选项,一般填defaults即可;第五列是dump备份标记,0表示不备份,我们一般填0;第六列是fsck检查顺序,根文件系统通常填1,其他填0或2,其中0代表开机不做磁盘检查。

给上面的/data分区写一个配置项,先查UUID:

sudo blkid /dev/sdb1

拿到UUID后写入fstab:

UUID=xxxx-xxxx-xxxx-xxxx /data ext4 defaults 0 2

写完配置别急着重启,用一条命令测试配置是否正确:

sudo mount -a

这条命令会按照fstab内容将尚未挂载的分区全部挂载一遍。执行后如果没有任何报错,再用df -h确认挂载成功,基本就稳了。凡是提示错误或者挂载不上,重新检查UUID、文件系统类型字段,改好再试。如果出现“wrong fs type, bad option, bad superblock on /dev/sdb1”这类报错,优先检查第三列的文件系统类型是否填对了——ext4写成了xfs,挂载铁定失败。

注意:修改fstab前最好先做个备份:sudo cp /etc/fstab /etc/fstab.bak。摔过跟头的人都知道,有备份才能在出错时快速恢复。

5. 实战复盘:一个完整的磁盘管理案例

拿一个具体场景走一遍完整流程。某应用服务器的数据盘空间告急,运维人员新加了一块1TB的NVMe盘,识别为/dev/nvme0n1,要求挂载到/srv/appdata作为应用数据目录。

第一步:查看新盘状态。

lsblk # 输出中可以看到 nvme0n1 整块盘,下面没有任何分区,也没有挂载点

第二步:直接用parted创建GPT分区。虽然1TB用fdisk也能干,但统一用parted可以避免以后换大容量盘时还得换工具的麻烦:

sudo parted /dev/nvme0n1 --script mklabel gpt sudo parted /dev/nvme0n1 --script mkpart primary 1MiB 100% sudo partprobe /dev/nvme0n1

第三步:格式化。应用目录通常有很多小文件写入,这里选了ext4,稳定性至上。

sudo mkfs.ext4 /dev/nvme0n1p1

第四步:挂载并设置开机自动挂载。

sudo mkdir -p /srv/appdata sudo mount /dev/nvme0n1p1 /srv/appdata sudo blkid /dev/nvme0n1p1 # 拿到UUID后写入 /etc/fstab echo 'UUID=xxxx-xxxx-xxxx-xxxx /srv/appdata ext4 defaults 0 2' | sudo tee -a /etc/fstab sudo mount -a

第五步:验证。

df -h /srv/appdata lsblk -f

看到新分区容量正常显示在挂载点下,验证通过,收工。整个过程不超过五分钟,但每一步背后都有对应原理,出了问题时,这些原理就是排查的线索。

6. 常见问题与排查技巧实录

6.1 卸载分区时提示“target is busy”

卸载一个正在使用中的分区,系统大概率会提示“target is busy”。这多半意味着有进程正在读写这个分区上的文件。排查思路很清晰,找到占用进程,处理完再卸载:

sudo fuser -mv /mnt/data

这个命令会列出正在使用该目录的进程PID。拿到PID之后,确认可以终止就执行kill -9,或者先停掉相关服务再执行卸载。还有一种暴力方式叫懒卸载:

sudo umount -l /mnt/data

加了-l参数,系统会立刻从目录树中摘除该挂载点,等所有占用进程结束再真正清理底层的挂载关系。这个操作适合文件系统本身无故障、只是有进程占用的场景。注意它并不能解决文件系统本身的问题,如果是I/O错误导致的busy,懒卸载也救不了。

6.2 fstab配置出错导致系统进入emergency mode

这可以说是Linux运维圈最经典的翻车事故之一。fstab写错了,系统启动时发现某个分区挂载不上,就会进入emergency mode。此时系统处于只读状态,处理起来要格外小心。

处理分几步:输入root密码进入维护模式,执行mount -o remount,rw /把根分区切成读写模式,然后查看fstab内容,排查问题字段。先看UUID对不对,再看设备路径存在不存在,再看文件系统类型匹配不匹配,然后执行mount -a测试。改好之后,直接reboot验证。

已故障的挂载项可以在对应行首加#注释掉,先保证系统正常启动,再回头慢慢排查。一定要记得,fstab修改后要做mount -a测试,这是规避此类事故最有效的手段。

6.3 系统重启后分区没有自动挂载

fstab没写错,但重启后分区就是没挂载,这种情况一般有两个原因:第一,fstab里用的是/dev/sdb1这种设备路径,而重启后盘符变了。比如之前是sdb,加了一块新盘之后变sdc了,系统按旧盘符找当然找不到。第二,UUID写的不对,或者复制的时候少了一位。这种问题排查方法还是靠blkid核对设备真实UUID,然后统一改成用UUID挂载。

同理,如果用的是设备路径这类写法,维护多盘机器时还会遇到插拔顺序导致盘符调换的问题。杜绝这个隐患就一条原则:fstab只认UUID。

6.4 磁盘空间明明没满却写不进文件

遇到这个现象,先看inode是不是先满了。df只看得到空间占用,但文件系统还得有足够的inode来记录文件元数据。小文件特别多的目录最容易把inode耗尽。

df -i /data

IUse%这一列如果接近100%,就是inode耗尽。解决方案也很直接,清掉大量不必要的小文件,或者重新规划分区时给文件系统预留更多inode。部分文件系统支持动态分配inode,但ext4这类在格式化时就已经划定了inode数量,规划容量时要把这个因素考虑进去。

6.5 误删分区或格式化之后的挽救

误操作之后不要慌,更不要继续写入数据。若只是删除了分区表,可以选择testdisk这类工具尝试恢复分区表。若是格式化了,extundelete可以尝试找回部分文件,但这完全取决于运气和后续写入量。最稳妥的兜底方案还是备份备份再备份。无论什么场景,重要数据必须异地备份,这是磁盘操作最底层的原则。

7. 那些命令行之外的经验之谈

说几个实际运维中总结出来的体会。

新盘上线前,务必要在非生产环境做一次完整的格式化、挂载、重启验证。这样能提前暴露盘符不稳定、fstab写错等的隐患。真到生产环境动手,心理压力完全不同,操作容易变形。

分区命名上,给服务器做规范。单盘用sda,数据盘按用途挂载到明晰的目录,比如/data、/backup、/logs。机器多了之后,能靠目录名一眼识别每个分区的用途,排查问题时能省很多功夫。

有条件的话,把磁盘巡检自动化。写一个简单的脚本,定时执行df -h和df -i的检查,空间或inode使用率超过阈值就告警。磁盘是慢变量,等到发现问题往往已经晚了,自动巡检就能在甜点时间介入。

最后分享一个小技巧:对大分区做格式化之前,先用wipefs -a /dev/sdb1清理掉旧的签名信息。旧文件系统残余会让新文件系统在识别时出现莫名其妙的问题,这条命令能把磁盘环境彻底清干净,后续挂载顺利得多。

磁盘管理是Linux入门的必修课,也是生产事故的高发区。多动手实践、多复盘翻车经历,经验都是这样一点点累积起来的。遇到看不懂的输出不要怕,顺着lsblk、blkid、df这几条主线查下去,问题一般跑不掉。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进