1. 磁盘分区到底在解决什么问题很多人第一次接触 Linux 磁盘管理,都是在装系统那一刻。安装界面弹出一个分区界面,让你选“自动分区”还是“手动分区”,大多数人眼睛一闭就点了自动,然后一路下一步。等到某天/home满了、根目录爆了、想单独挂一块数据盘,才发现自己根本不知道磁盘分区是怎么回事。我先把这个事情说清楚:磁盘分区,本质上是把一块物理磁盘的存储空间,切分成若干个逻辑上独立的区域,每个区域可以单独格式化、单独挂载、单独管理。它解决的问题很实际——让系统文件、用户数据、日志、数据库文件互不干扰,一个区域写满不会拖垮整块盘,一个区域损坏不会连累其他数据。这篇文章面向的是需要在一台 Linux 机器上做磁盘规划的人:可能是刚买了一块新硬盘要挂载,可能是装系统时要手动规划分区,也可能是运维过程中发现某个目录空间不够需要扩容。不管你是刚入门的新手,还是用过几年 Linux 但一直没系统梳理过分区逻辑的老手,这篇内容都能让你把这件事从头到尾搞明白。我会从分区的基本概念讲起,然后落到具体命令操作,再讲实际场景中的分区方案设计,最后把我这些年踩过的坑和排查经验整理出来。全程用真实可复现的命令,你照着敲就能看到结果。2. 分区前必须搞懂的几个核心概念2.1 物理磁盘、分区、文件系统三者的关系很多人分不清“分区”和“格式化”的区别,我用一个生活化的类比来解释。把一块物理磁盘想象成一栋毛坯房。分区就是把这栋房子用隔断墙分成几个独立的房间,每个房间有自己明确的边界,一号房间从这面墙到那面墙,二号房间从这面墙到那面墙。格式化则是给每个房间铺地板、刷墙、装门锁,让它具备住人的条件。文件系统就是这套装修方案的具体标准,比如 ext4、xfs、btrfs 就是不同的装修风格,各有各的优缺点。在 Linux 里,物理磁盘通常表现为/dev/sda、/dev/sdb、/dev/nvme0n1这样的设备文件。分区则是在这些设备名后面加数字,比如/dev/sda1、/dev/sda2、/dev/nvme0n1p1。注意 NVMe 磁盘的分区命名多了一个p,这是很多人第一次接触 NVMe 时容易搞混的地方。文件系统则是建立在分区之上的。一个分区格式化之后,才能被挂载到某个目录,用户才能往里面写数据。挂载这个动作,相当于给房间装了一扇门,门牌号就是挂载点,比如/home、/data。注意:分区和格式化是两个独立步骤,先分区再格式化,顺序不能反。对已有数据的分区做格式化,数据会全部丢失,这个操作不可逆。2.2 MBR 和 GPT:分区表格式怎么选分区表是记录“这块盘被分成了哪几个区、每个区从哪到哪”的一张清单。目前主流的分区表格式有两种:MBR 和 GPT。MBR 是老格式,最大只支持 2TB 的磁盘,而且最多只能有 4 个主分区。如果需要更多分区,得把其中一个主分区做成扩展分区,再在里面划分逻辑分区。这套机制在十几年前够用,但现在动辄几 TB 的硬盘,MBR 就力不从心了。GPT 是新格式,支持超过 2TB 的磁盘,分区数量理论上没有实际限制(通常系统允许 128 个),而且分区表在磁盘头尾各存一份,一份损坏另一份还能恢复。现在新装的系统,只要不是特别老的硬件,一律建议用 GPT。对比项MBRGPT最大磁盘容量2TB极大(远超当前需求)主分区数量最多 4 个通常 128 个分区表备份无头尾各一份引导方式传统 BIOSUEFI 为主适用场景老旧设备新设备首选判断当前磁盘用的是哪种分区表,可以用parted命令:sudo parted /dev/sda print输出里会明确写着Partition Table: gpt或者Partition Table: msdos。msdos 就是 MBR 的另一种叫法。2.3 主分区、扩展分区、逻辑分区的历史包袱这套概念是 MBR 时代的产物。MBR 分区表只有 64 字节用来记录分区信息,每个分区项占 16 字节,所以最多只能记录 4 个分区。为了突破这个限制,设计者想了个办法:拿出一个主分区的位置,把它标记为“扩展分区”,然后在扩展分区内部用链表的方式记录更多的逻辑分区。所以你会看到/dev/sda1到/dev/sda4是主分区或扩展分区的编号,/dev/sda5开始才是逻辑分区。这个编号规则是固定的,即使你只创建了两个主分区,第一个逻辑分区也是从 5 开始编号。GPT 时代已经没有这个限制了,所有分区都是平等的,编号从 1 开始顺序排列。所以如果你用的是 GPT 磁盘,完全不用管主分区、扩展分区这些概念。2.4 挂载点规划:分区方案设计的核心分区本身不是目的,把分区挂载到合适的目录才是。Linux 的目录结构是一棵树,根目录/是起点,所有其他目录都挂在它下面。分区方案设计的核心问题就是:哪些目录应该单独分区?我个人的经验是,以下几类目录值得单独分区:/home:用户数据,独立分区后重装系统不影响个人文件。/var:日志和经常变动的数据,独立分区可以防止日志写满根目录。/tmp:临时文件,独立分区并限制大小,避免临时文件撑爆系统。/data或自定义目录:业务数据、数据库文件,独立分区便于管理和扩容。而/boot是否需要单独分区,取决于你的引导方式。UEFI 引导需要一个 EFI 系统分区,通常挂载在/boot/efi,大小 512MB 左右就够了。传统 BIOS 引导如果用了 LVM 或者加密根分区,建议单独分一个/boot,大小 1GB 左右。3. 动手之前:查看磁盘现状的完整方法3.1 用 lsblk 快速看清磁盘和分区结构lsblk是我最常用的磁盘查看命令,输出清晰,一眼就能看出磁盘、分区、挂载点的对应关系。lsblk典型输出长这样:NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 50G 0 part / └─sda3 8:3 0 49.5G 0 part /home sdb 8:16 0 200G 0 disk从这棵树形结构里,你能直接读出:sda 是一块 100G 的磁盘,分了三个区,分别挂载在/boot/efi、/、/home。sdb 是一块 200G 的磁盘,还没有分区。加上-f参数可以同时看到文件系统类型:lsblk -f这个输出会多出 FSTYPE、UUID、LABEL 等列,UUID 在配置/etc/fstab时非常有用。3.2 用 fdisk 和 parted 查看分区表详情lsblk看的是整体结构,要看分区表的详细参数,得用fdisk或parted。sudo fdisk -l /dev/sda这个命令会列出每个分区的起始扇区、结束扇区、大小、分区类型。起始扇区这个信息在做数据恢复时特别重要,因为分区表损坏后,需要靠起始扇区来重建。parted的输出更偏向人类阅读:sudo parted /dev/sda print它会显示磁盘容量、分区表类型、每个分区的编号、起始点、结束点、大小、文件系统类型和分区标志。分区标志里的boot、esp这些信息,在排查引导问题时很关键。3.3 用 df 和 du 确认空间使用情况分区之前,你得先知道现在的空间是怎么用的。df -h这个命令显示每个已挂载文件系统的总大小、已用、可用、使用百分比和挂载点。-h参数让数字以人类可读的方式显示,比如 50G 而不是 52428800。du -sh /var/logdu用来统计目录占用的空间。-s是汇总,-h是人类可读。当你发现根目录快满了,用这个命令逐层排查是哪个目录在吃空间,非常有效。实操心得:df和du的结果有时会对不上,这通常是因为有进程占用了已被删除的文件。用lsof | grep deleted可以找到这类文件,重启对应进程就能释放空间。4. 用 fdisk 给新磁盘分区的完整流程4.1 场景设定与准备工作假设我们给机器加了一块 200G 的新磁盘/dev/sdb,现在要把它分成两个区:一个 50G 用来放应用数据,一个 150G 用来放备份。第一步永远是确认磁盘设备名,别搞错了盘:lsblk确认/dev/sdb是那块没有分区、没有挂载的新盘。如果这块盘上有数据,分区操作会破坏数据,务必再三确认。注意:对磁盘做分区操作前,一定要确认设备名。我见过有人把/dev/sdb和/dev/sda搞混,结果把系统盘的分区表覆盖了,机器直接起不来。操作前用lsblk和df -h交叉验证,确认无误再动手。4.2 进入 fdisk 交互界面并创建分区sudo fdisk /dev/sdb进入交互界面后,常用命令如下:m:查看帮助p:打印当前分区表n:新建分区d:删除分区t:修改分区类型w:保存并退出q:不保存退出先按p看一下当前状态,确认是空盘。然后按n新建分区: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-419430399, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-419430399, default 419430399): +50G这里我选了主分区,编号 1,起始扇区用默认值(2048,这是对齐到 1MB 边界的推荐值),大小输入+50G。接着创建第二个分区:Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (104857600-419430399, default 104857600): Last sector, +sectors or +size{K,M,G,T,P} (104857600-419430399, default 419430399):第二个分区把剩余空间全部用掉,所以 Last sector 直接用默认值。最后按p确认分区方案,没问题就按w保存退出。4.3 让内核重新读取分区表fdisk保存后,分区表已经写入磁盘,但内核可能还在用旧的分区信息。用下面这个命令强制内核重新读取:sudo partprobe /dev/sdb或者:sudo partx -u /dev/sdb执行完再用lsblk看一下,应该能看到/dev/sdb1和/dev/sdb2了。4.4 格式化分区并选择合适的文件系统分区创建好之后还是“毛坯”,需要格式化才能用。sudo mkfs.ext4 /dev/sdb1 sudo mkfs.xfs /dev/sdb2这里我故意用了两种不同的文件系统,顺便说一下选型逻辑。ext4 是 Linux 上最成熟的通用文件系统,兼容性好,工具链完善,适合大多数场景。xfs 在处理大文件和高并发写入时表现更好,适合数据库、日志、备份这类场景。btrfs 支持快照和压缩,适合需要灵活管理的场景,但稳定性和性能在某些负载下不如前两者。文件系统优势适用场景ext4成熟稳定、兼容性好通用场景、系统分区xfs大文件性能好、并发强数据库、日志、备份btrfs快照、压缩、校验需要灵活管理的场景格式化时可以用-L参数给分区打个标签,方便以后识别:sudo mkfs.ext4 -L appdata /dev/sdb1 sudo mkfs.xfs -L backup /dev/sdb24.5 挂载分区并配置开机自动挂载创建挂载点并挂载:sudo mkdir -p /data/app sudo mkdir -p /data/backup sudo mount /dev/sdb1 /data/app sudo mount /dev/sdb2 /data/backup用df -h确认挂载成功。但这样挂载是临时的,重启后就没了。要开机自动挂载,需要写入/etc/fstab。这里强烈建议用 UUID 而不是设备名,因为设备名可能会变(比如加了一块新盘,sdb 变成 sdc),UUID 是分区的唯一标识,不会变。查 UUID:sudo blkid /dev/sdb1 sudo blkid /dev/sdb2输出类似:/dev/sdb1: LABEL="appdata" UUID="a1b2c3d4-..." TYPE="ext4" /dev/sdb2: LABEL="backup" UUID="e5f6g7h8-..." TYPE="xfs"编辑/etc/fstab,加入两行:UUID=a1b2c3d4-... /data/app ext4 defaults 0 2 UUID=e5f6g7h8-... /data/backup xfs defaults 0 2最后那个数字是 fsck 检查顺序,根分区是 1,其他分区是 2,不需要检查的写 0。注意:改完/etc/fstab后,先用sudo mount -a测试一下,没有报错再重启。如果 fstab 写错了导致系统起不来,就得进救援模式修复,很麻烦。5. 用 parted 处理大磁盘和 GPT 分区5.1 为什么大磁盘要用 partedfdisk对 GPT 的支持是后来才加上的,而且操作体验不如parted直观。对于超过 2TB 的磁盘,或者需要创建 GPT 分区表的场景,parted是更好的选择。parted支持交互式和命令行两种模式。交互式适合手动操作,命令行适合脚本化。5.2 用 parted 创建 GPT 分区表并分区假设有一块 4TB 的新盘/dev/sdc,要创建 GPT 分区表并分一个区。sudo parted /dev/sdc进入交互界面后:(parted) mklabel gpt (parted) mkpart primary ext4 0% 100% (parted) print (parted) quitmklabel gpt创建 GPT 分区表,mkpart创建分区,0% 100%表示从磁盘开头到结尾。parted支持百分比和具体容量两种写法,用百分比更省心。如果要在命令行里一步完成:sudo parted /dev/sdc --script mklabel gpt mkpart primary ext4 0% 100%--script参数让 parted 不进入交互模式,直接执行命令,适合写进自动化脚本。5.3 分区对齐:一个容易被忽略的性能细节现代磁盘(尤其是 SSD)都有“擦除块”的概念,如果分区起始位置没有对齐到擦除块边界,一次写入可能会触发两次擦除操作,性能直接减半。parted默认会做对齐,但如果你手动指定了起始扇区,可能会破坏对齐。用parted的align-check命令可以检查:(parted) align-check optimal 1 1 aligned输出aligned说明对齐没问题,输出not aligned就需要调整。fdisk从较新版本开始也默认对齐到 2048 扇区(1MB 边界),所以用默认值一般没问题。但如果你手动输入了起始扇区,就要留意这个细节。实操心得:对于 SSD,分区对齐对性能影响很明显。我曾经在一块 SSD 上做过测试,未对齐的分区随机写入性能比对齐分区低了将近 40%。所以除非有特殊需求,分区起始位置一律用默认值。5.4 修改分区大小:parted 的 resizepartparted可以在线调整分区大小,但要注意:调整分区大小和调整文件系统大小是两回事。parted只改分区边界,文件系统还得用对应的工具来扩展或收缩。扩展分区:(parted) resizepart 1 100%这会把 1 号分区的结束位置扩展到磁盘末尾。然后还需要扩展文件系统:sudo resize2fs /dev/sdc1对于 xfs 文件系统,用xfs_growfs:sudo xfs_growfs /data注意 xfs 只能扩大不能缩小,这是它的设计限制。6. 分区方案设计:不同场景下的实战思路6.1 个人开发机:简单够用就好个人开发机通常只有一块盘,我的建议是:/boot/efi:512MB,UEFI 引导必需。/:50-100GB,系统和软件。/home:剩余空间,个人文件。swap:内存的 1-2 倍,或者不设 swap 改用 swap 文件。这种方案的好处是简单,重装系统时/home不动,个人配置和文件都保留。6.2 生产服务器:按职责拆分生产服务器的分区方案要考虑隔离性和可维护性:/boot:1GB,独立分区。/:50GB,只放系统。/var:50-100GB,日志和变动数据。/var/log:如果日志量特别大,可以再单独分。/data:剩余空间,业务数据。swap:根据内存和业务特点决定,通常 8-16GB。这样拆分的好处是,日志写满不会影响系统,业务数据独立分区方便做快照和备份。6.3 数据库服务器:IO 隔离是关键数据库服务器对 IO 性能敏感,分区方案要考虑把不同 IO 特性的数据分开:/:50GB,系统。/data/mysql或/data/pgsql:数据文件,用独立磁盘或 SSD。/data/log:数据库日志,用独立磁盘。/backup:备份,用大容量机械盘。如果条件允许,数据、日志、备份放在不同的物理磁盘上,避免 IO 争抢。6.4 LVM:让分区方案具备弹性传统分区一旦划分,调整大小很麻烦。LVM(逻辑卷管理)在磁盘和文件系统之间加了一层抽象,让分区可以动态扩展和收缩。LVM 的三个核心概念:PV(物理卷):一块物理磁盘或分区,加入 LVM 后成为 PV。VG(卷组):一个或多个 PV 组成的存储池。LV(逻辑卷):从 VG 中划分出来的逻辑分区,可以格式化并挂载。用 LVM 的好处是,当某个 LV 空间不够时,只要 VG 里还有剩余空间,就可以在线扩展。VG 空间不够时,可以再加一块盘进 VG。创建 LVM 的基本流程:sudo pvcreate /dev/sdd sudo vgcreate vg_data /dev/sdd sudo lvcreate -L 100G -n lv_app vg_data sudo mkfs.ext4 /dev/vg_data/lv_app扩展逻辑卷:sudo lvextend -L +50G /dev/vg_data/lv_app sudo resize2fs /dev/vg_data/lv_app实操心得:生产环境我强烈建议用 LVM,哪怕一开始觉得用不上。等到某天某个分区满了,LVM 能让你在线扩容,而传统分区只能停机调整,差别巨大。7. 常见问题与排查技巧实录7.1 分区后 lsblk 看不到新分区这是最常见的问题。fdisk保存后,分区表写入了磁盘,但内核还在用缓存的分区信息。解决方法:sudo partprobe /dev/sdb如果partprobe不生效,可以试试:sudo partx -u /dev/sdb实在不行,重启系统一定能解决,但生产环境不方便重启,优先用前两个命令。7.2 挂载时报 "wrong fs type" 或 "bad option"这个错误通常有三个原因:分区没有格式化。用lsblk -f看一下 FSTYPE 列是不是空的。文件系统类型和挂载参数不匹配。比如分区是 xfs,挂载时写了-t ext4。文件系统损坏。用fsck检查修复。sudo fsck /dev/sdb1注意fsck要在分区未挂载的状态下运行,对已挂载的分区运行fsck可能导致数据损坏。7.3 /etc/fstab 写错导致系统无法启动这是新手最容易踩的坑。fstab 写错后,系统启动时会卡在挂载阶段,进入紧急模式。解决方法:在紧急模式下输入 root 密码进入 shell。用mount -o remount,rw /把根分区重新挂载为可写。编辑/etc/fstab,注释掉写错的那一行。重启。预防方法:改完 fstab 后,先执行sudo mount -a,没有报错再重启。7.4 分区表损坏后的恢复思路分区表损坏的表现是lsblk看不到分区,但磁盘容量还在。这时候不要慌,数据大概率还在,只是分区表丢了。恢复思路:用testdisk工具扫描磁盘,尝试重建分区表。如果记得分区的起始扇区,可以用fdisk手动重建分区,起始扇区保持一致。如果分区表有备份(GPT 在磁盘末尾有备份),可以用gdisk的恢复功能。sudo gdisk /dev/sdb进入后按r进入恢复菜单,再按b从备份恢复分区表。注意:分区表损坏后,第一件事是停止对这块盘的一切写操作,避免覆盖原有数据。恢复操作最好在另一台机器上做,或者把盘挂成只读。7.5 常见问题速查表问题现象可能原因解决方法lsblk 看不到新分区内核未重读分区表partprobe 或 partx -u挂载报 wrong fs type未格式化或类型不匹配检查 FSTYPE,重新格式化系统卡在启动阶段fstab 写错紧急模式注释错误行分区表丢失误操作或磁盘故障testdisk 或 gdisk 恢复df 和 du 结果不一致进程占用已删除文件lsof 查找并重启进程SSD 性能异常分区未对齐parted align-check 检查8. 我这些年积累的几个实操心得分区这件事,命令本身不难,难的是方案设计和细节把控。我分享几个自己踩过坑之后总结的经验。第一,永远用 UUID 而不是设备名。我早期配置 fstab 时用/dev/sdb1这种写法,后来加了一块盘,设备名全变了,系统起不来。从那以后,所有 fstab 条目一律用 UUID。第二,分区前先想清楚扩容路径。如果预计数据会增长,一开始就用 LVM,别等到分区满了再想办法。传统分区扩容需要停机,LVM 可以在线扩展,这个差别在关键时刻能救命。第三,swap 不一定要用独立分区。现在很多场景用 swap 文件更灵活,可以随时调整大小,不用重新分区。创建 swap 文件:sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile然后在 fstab 里加一行/swapfile none swap sw 0 0就能开机自动启用。第四,分区操作前一定要备份分区表。用sfdisk可以备份和恢复分区表:sudo sfdisk -d /dev/sda > sda_partition_backup.txt恢复时:sudo sfdisk /dev/sda < sda_partition_backup.txt这个备份文件很小,但关键时刻能省下大量恢复时间。第五,对 SSD 做分区时留意 TRIM。确保文件系统挂载参数里有discard或者定期运行fstrim,否则 SSD 的写入性能会随着使用时间下降。sudo fstrim -av这个命令可以手动触发 TRIM,建议加到定时任务里每周跑一次。磁盘分区是 Linux 系统管理的基本功,但基本功不等于简单。把分区表格式、文件系统选型、挂载配置、扩容方案这几件事串起来理解,你就能在遇到任何磁盘相关问题时,快速定位并给出合理的解决方案。
1. 磁盘分区到底在解决什么问题很多人第一次接触 Linux 磁盘管理,都是在装系统那一刻。安装界面弹出一个分区界面,让你选“自动分区”还是“手动分区”,大多数人眼睛一闭就点了自动,然后一路下一步。等到某天/home满了、根目录爆了、想单独挂一块数据盘,才发现自己根本不知道磁盘分区是怎么回事。我先把这个事情说清楚:磁盘分区,本质上是把一块物理磁盘的存储空间,切分成若干个逻辑上独立的区域,每个区域可以单独格式化、单独挂载、单独管理。它解决的问题很实际——让系统文件、用户数据、日志、数据库文件互不干扰,一个区域写满不会拖垮整块盘,一个区域损坏不会连累其他数据。这篇文章面向的是需要在一台 Linux 机器上做磁盘规划的人:可能是刚买了一块新硬盘要挂载,可能是装系统时要手动规划分区,也可能是运维过程中发现某个目录空间不够需要扩容。不管你是刚入门的新手,还是用过几年 Linux 但一直没系统梳理过分区逻辑的老手,这篇内容都能让你把这件事从头到尾搞明白。我会从分区的基本概念讲起,然后落到具体命令操作,再讲实际场景中的分区方案设计,最后把我这些年踩过的坑和排查经验整理出来。全程用真实可复现的命令,你照着敲就能看到结果。2. 分区前必须搞懂的几个核心概念2.1 物理磁盘、分区、文件系统三者的关系很多人分不清“分区”和“格式化”的区别,我用一个生活化的类比来解释。把一块物理磁盘想象成一栋毛坯房。分区就是把这栋房子用隔断墙分成几个独立的房间,每个房间有自己明确的边界,一号房间从这面墙到那面墙,二号房间从这面墙到那面墙。格式化则是给每个房间铺地板、刷墙、装门锁,让它具备住人的条件。文件系统就是这套装修方案的具体标准,比如 ext4、xfs、btrfs 就是不同的装修风格,各有各的优缺点。在 Linux 里,物理磁盘通常表现为/dev/sda、/dev/sdb、/dev/nvme0n1这样的设备文件。分区则是在这些设备名后面加数字,比如/dev/sda1、/dev/sda2、/dev/nvme0n1p1。注意 NVMe 磁盘的分区命名多了一个p,这是很多人第一次接触 NVMe 时容易搞混的地方。文件系统则是建立在分区之上的。一个分区格式化之后,才能被挂载到某个目录,用户才能往里面写数据。挂载这个动作,相当于给房间装了一扇门,门牌号就是挂载点,比如/home、/data。注意:分区和格式化是两个独立步骤,先分区再格式化,顺序不能反。对已有数据的分区做格式化,数据会全部丢失,这个操作不可逆。2.2 MBR 和 GPT:分区表格式怎么选分区表是记录“这块盘被分成了哪几个区、每个区从哪到哪”的一张清单。目前主流的分区表格式有两种:MBR 和 GPT。MBR 是老格式,最大只支持 2TB 的磁盘,而且最多只能有 4 个主分区。如果需要更多分区,得把其中一个主分区做成扩展分区,再在里面划分逻辑分区。这套机制在十几年前够用,但现在动辄几 TB 的硬盘,MBR 就力不从心了。GPT 是新格式,支持超过 2TB 的磁盘,分区数量理论上没有实际限制(通常系统允许 128 个),而且分区表在磁盘头尾各存一份,一份损坏另一份还能恢复。现在新装的系统,只要不是特别老的硬件,一律建议用 GPT。对比项MBRGPT最大磁盘容量2TB极大(远超当前需求)主分区数量最多 4 个通常 128 个分区表备份无头尾各一份引导方式传统 BIOSUEFI 为主适用场景老旧设备新设备首选判断当前磁盘用的是哪种分区表,可以用parted命令:sudo parted /dev/sda print输出里会明确写着Partition Table: gpt或者Partition Table: msdos。msdos 就是 MBR 的另一种叫法。2.3 主分区、扩展分区、逻辑分区的历史包袱这套概念是 MBR 时代的产物。MBR 分区表只有 64 字节用来记录分区信息,每个分区项占 16 字节,所以最多只能记录 4 个分区。为了突破这个限制,设计者想了个办法:拿出一个主分区的位置,把它标记为“扩展分区”,然后在扩展分区内部用链表的方式记录更多的逻辑分区。所以你会看到/dev/sda1到/dev/sda4是主分区或扩展分区的编号,/dev/sda5开始才是逻辑分区。这个编号规则是固定的,即使你只创建了两个主分区,第一个逻辑分区也是从 5 开始编号。GPT 时代已经没有这个限制了,所有分区都是平等的,编号从 1 开始顺序排列。所以如果你用的是 GPT 磁盘,完全不用管主分区、扩展分区这些概念。2.4 挂载点规划:分区方案设计的核心分区本身不是目的,把分区挂载到合适的目录才是。Linux 的目录结构是一棵树,根目录/是起点,所有其他目录都挂在它下面。分区方案设计的核心问题就是:哪些目录应该单独分区?我个人的经验是,以下几类目录值得单独分区:/home:用户数据,独立分区后重装系统不影响个人文件。/var:日志和经常变动的数据,独立分区可以防止日志写满根目录。/tmp:临时文件,独立分区并限制大小,避免临时文件撑爆系统。/data或自定义目录:业务数据、数据库文件,独立分区便于管理和扩容。而/boot是否需要单独分区,取决于你的引导方式。UEFI 引导需要一个 EFI 系统分区,通常挂载在/boot/efi,大小 512MB 左右就够了。传统 BIOS 引导如果用了 LVM 或者加密根分区,建议单独分一个/boot,大小 1GB 左右。3. 动手之前:查看磁盘现状的完整方法3.1 用 lsblk 快速看清磁盘和分区结构lsblk是我最常用的磁盘查看命令,输出清晰,一眼就能看出磁盘、分区、挂载点的对应关系。lsblk典型输出长这样:NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 50G 0 part / └─sda3 8:3 0 49.5G 0 part /home sdb 8:16 0 200G 0 disk从这棵树形结构里,你能直接读出:sda 是一块 100G 的磁盘,分了三个区,分别挂载在/boot/efi、/、/home。sdb 是一块 200G 的磁盘,还没有分区。加上-f参数可以同时看到文件系统类型:lsblk -f这个输出会多出 FSTYPE、UUID、LABEL 等列,UUID 在配置/etc/fstab时非常有用。3.2 用 fdisk 和 parted 查看分区表详情lsblk看的是整体结构,要看分区表的详细参数,得用fdisk或parted。sudo fdisk -l /dev/sda这个命令会列出每个分区的起始扇区、结束扇区、大小、分区类型。起始扇区这个信息在做数据恢复时特别重要,因为分区表损坏后,需要靠起始扇区来重建。parted的输出更偏向人类阅读:sudo parted /dev/sda print它会显示磁盘容量、分区表类型、每个分区的编号、起始点、结束点、大小、文件系统类型和分区标志。分区标志里的boot、esp这些信息,在排查引导问题时很关键。3.3 用 df 和 du 确认空间使用情况分区之前,你得先知道现在的空间是怎么用的。df -h这个命令显示每个已挂载文件系统的总大小、已用、可用、使用百分比和挂载点。-h参数让数字以人类可读的方式显示,比如 50G 而不是 52428800。du -sh /var/logdu用来统计目录占用的空间。-s是汇总,-h是人类可读。当你发现根目录快满了,用这个命令逐层排查是哪个目录在吃空间,非常有效。实操心得:df和du的结果有时会对不上,这通常是因为有进程占用了已被删除的文件。用lsof | grep deleted可以找到这类文件,重启对应进程就能释放空间。4. 用 fdisk 给新磁盘分区的完整流程4.1 场景设定与准备工作假设我们给机器加了一块 200G 的新磁盘/dev/sdb,现在要把它分成两个区:一个 50G 用来放应用数据,一个 150G 用来放备份。第一步永远是确认磁盘设备名,别搞错了盘:lsblk确认/dev/sdb是那块没有分区、没有挂载的新盘。如果这块盘上有数据,分区操作会破坏数据,务必再三确认。注意:对磁盘做分区操作前,一定要确认设备名。我见过有人把/dev/sdb和/dev/sda搞混,结果把系统盘的分区表覆盖了,机器直接起不来。操作前用lsblk和df -h交叉验证,确认无误再动手。4.2 进入 fdisk 交互界面并创建分区sudo fdisk /dev/sdb进入交互界面后,常用命令如下:m:查看帮助p:打印当前分区表n:新建分区d:删除分区t:修改分区类型w:保存并退出q:不保存退出先按p看一下当前状态,确认是空盘。然后按n新建分区: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-419430399, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-419430399, default 419430399): +50G这里我选了主分区,编号 1,起始扇区用默认值(2048,这是对齐到 1MB 边界的推荐值),大小输入+50G。接着创建第二个分区:Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (104857600-419430399, default 104857600): Last sector, +sectors or +size{K,M,G,T,P} (104857600-419430399, default 419430399):第二个分区把剩余空间全部用掉,所以 Last sector 直接用默认值。最后按p确认分区方案,没问题就按w保存退出。4.3 让内核重新读取分区表fdisk保存后,分区表已经写入磁盘,但内核可能还在用旧的分区信息。用下面这个命令强制内核重新读取:sudo partprobe /dev/sdb或者:sudo partx -u /dev/sdb执行完再用lsblk看一下,应该能看到/dev/sdb1和/dev/sdb2了。4.4 格式化分区并选择合适的文件系统分区创建好之后还是“毛坯”,需要格式化才能用。sudo mkfs.ext4 /dev/sdb1 sudo mkfs.xfs /dev/sdb2这里我故意用了两种不同的文件系统,顺便说一下选型逻辑。ext4 是 Linux 上最成熟的通用文件系统,兼容性好,工具链完善,适合大多数场景。xfs 在处理大文件和高并发写入时表现更好,适合数据库、日志、备份这类场景。btrfs 支持快照和压缩,适合需要灵活管理的场景,但稳定性和性能在某些负载下不如前两者。文件系统优势适用场景ext4成熟稳定、兼容性好通用场景、系统分区xfs大文件性能好、并发强数据库、日志、备份btrfs快照、压缩、校验需要灵活管理的场景格式化时可以用-L参数给分区打个标签,方便以后识别:sudo mkfs.ext4 -L appdata /dev/sdb1 sudo mkfs.xfs -L backup /dev/sdb24.5 挂载分区并配置开机自动挂载创建挂载点并挂载:sudo mkdir -p /data/app sudo mkdir -p /data/backup sudo mount /dev/sdb1 /data/app sudo mount /dev/sdb2 /data/backup用df -h确认挂载成功。但这样挂载是临时的,重启后就没了。要开机自动挂载,需要写入/etc/fstab。这里强烈建议用 UUID 而不是设备名,因为设备名可能会变(比如加了一块新盘,sdb 变成 sdc),UUID 是分区的唯一标识,不会变。查 UUID:sudo blkid /dev/sdb1 sudo blkid /dev/sdb2输出类似:/dev/sdb1: LABEL="appdata" UUID="a1b2c3d4-..." TYPE="ext4" /dev/sdb2: LABEL="backup" UUID="e5f6g7h8-..." TYPE="xfs"编辑/etc/fstab,加入两行:UUID=a1b2c3d4-... /data/app ext4 defaults 0 2 UUID=e5f6g7h8-... /data/backup xfs defaults 0 2最后那个数字是 fsck 检查顺序,根分区是 1,其他分区是 2,不需要检查的写 0。注意:改完/etc/fstab后,先用sudo mount -a测试一下,没有报错再重启。如果 fstab 写错了导致系统起不来,就得进救援模式修复,很麻烦。5. 用 parted 处理大磁盘和 GPT 分区5.1 为什么大磁盘要用 partedfdisk对 GPT 的支持是后来才加上的,而且操作体验不如parted直观。对于超过 2TB 的磁盘,或者需要创建 GPT 分区表的场景,parted是更好的选择。parted支持交互式和命令行两种模式。交互式适合手动操作,命令行适合脚本化。5.2 用 parted 创建 GPT 分区表并分区假设有一块 4TB 的新盘/dev/sdc,要创建 GPT 分区表并分一个区。sudo parted /dev/sdc进入交互界面后:(parted) mklabel gpt (parted) mkpart primary ext4 0% 100% (parted) print (parted) quitmklabel gpt创建 GPT 分区表,mkpart创建分区,0% 100%表示从磁盘开头到结尾。parted支持百分比和具体容量两种写法,用百分比更省心。如果要在命令行里一步完成:sudo parted /dev/sdc --script mklabel gpt mkpart primary ext4 0% 100%--script参数让 parted 不进入交互模式,直接执行命令,适合写进自动化脚本。5.3 分区对齐:一个容易被忽略的性能细节现代磁盘(尤其是 SSD)都有“擦除块”的概念,如果分区起始位置没有对齐到擦除块边界,一次写入可能会触发两次擦除操作,性能直接减半。parted默认会做对齐,但如果你手动指定了起始扇区,可能会破坏对齐。用parted的align-check命令可以检查:(parted) align-check optimal 1 1 aligned输出aligned说明对齐没问题,输出not aligned就需要调整。fdisk从较新版本开始也默认对齐到 2048 扇区(1MB 边界),所以用默认值一般没问题。但如果你手动输入了起始扇区,就要留意这个细节。实操心得:对于 SSD,分区对齐对性能影响很明显。我曾经在一块 SSD 上做过测试,未对齐的分区随机写入性能比对齐分区低了将近 40%。所以除非有特殊需求,分区起始位置一律用默认值。5.4 修改分区大小:parted 的 resizepartparted可以在线调整分区大小,但要注意:调整分区大小和调整文件系统大小是两回事。parted只改分区边界,文件系统还得用对应的工具来扩展或收缩。扩展分区:(parted) resizepart 1 100%这会把 1 号分区的结束位置扩展到磁盘末尾。然后还需要扩展文件系统:sudo resize2fs /dev/sdc1对于 xfs 文件系统,用xfs_growfs:sudo xfs_growfs /data注意 xfs 只能扩大不能缩小,这是它的设计限制。6. 分区方案设计:不同场景下的实战思路6.1 个人开发机:简单够用就好个人开发机通常只有一块盘,我的建议是:/boot/efi:512MB,UEFI 引导必需。/:50-100GB,系统和软件。/home:剩余空间,个人文件。swap:内存的 1-2 倍,或者不设 swap 改用 swap 文件。这种方案的好处是简单,重装系统时/home不动,个人配置和文件都保留。6.2 生产服务器:按职责拆分生产服务器的分区方案要考虑隔离性和可维护性:/boot:1GB,独立分区。/:50GB,只放系统。/var:50-100GB,日志和变动数据。/var/log:如果日志量特别大,可以再单独分。/data:剩余空间,业务数据。swap:根据内存和业务特点决定,通常 8-16GB。这样拆分的好处是,日志写满不会影响系统,业务数据独立分区方便做快照和备份。6.3 数据库服务器:IO 隔离是关键数据库服务器对 IO 性能敏感,分区方案要考虑把不同 IO 特性的数据分开:/:50GB,系统。/data/mysql或/data/pgsql:数据文件,用独立磁盘或 SSD。/data/log:数据库日志,用独立磁盘。/backup:备份,用大容量机械盘。如果条件允许,数据、日志、备份放在不同的物理磁盘上,避免 IO 争抢。6.4 LVM:让分区方案具备弹性传统分区一旦划分,调整大小很麻烦。LVM(逻辑卷管理)在磁盘和文件系统之间加了一层抽象,让分区可以动态扩展和收缩。LVM 的三个核心概念:PV(物理卷):一块物理磁盘或分区,加入 LVM 后成为 PV。VG(卷组):一个或多个 PV 组成的存储池。LV(逻辑卷):从 VG 中划分出来的逻辑分区,可以格式化并挂载。用 LVM 的好处是,当某个 LV 空间不够时,只要 VG 里还有剩余空间,就可以在线扩展。VG 空间不够时,可以再加一块盘进 VG。创建 LVM 的基本流程:sudo pvcreate /dev/sdd sudo vgcreate vg_data /dev/sdd sudo lvcreate -L 100G -n lv_app vg_data sudo mkfs.ext4 /dev/vg_data/lv_app扩展逻辑卷:sudo lvextend -L +50G /dev/vg_data/lv_app sudo resize2fs /dev/vg_data/lv_app实操心得:生产环境我强烈建议用 LVM,哪怕一开始觉得用不上。等到某天某个分区满了,LVM 能让你在线扩容,而传统分区只能停机调整,差别巨大。7. 常见问题与排查技巧实录7.1 分区后 lsblk 看不到新分区这是最常见的问题。fdisk保存后,分区表写入了磁盘,但内核还在用缓存的分区信息。解决方法:sudo partprobe /dev/sdb如果partprobe不生效,可以试试:sudo partx -u /dev/sdb实在不行,重启系统一定能解决,但生产环境不方便重启,优先用前两个命令。7.2 挂载时报 "wrong fs type" 或 "bad option"这个错误通常有三个原因:分区没有格式化。用lsblk -f看一下 FSTYPE 列是不是空的。文件系统类型和挂载参数不匹配。比如分区是 xfs,挂载时写了-t ext4。文件系统损坏。用fsck检查修复。sudo fsck /dev/sdb1注意fsck要在分区未挂载的状态下运行,对已挂载的分区运行fsck可能导致数据损坏。7.3 /etc/fstab 写错导致系统无法启动这是新手最容易踩的坑。fstab 写错后,系统启动时会卡在挂载阶段,进入紧急模式。解决方法:在紧急模式下输入 root 密码进入 shell。用mount -o remount,rw /把根分区重新挂载为可写。编辑/etc/fstab,注释掉写错的那一行。重启。预防方法:改完 fstab 后,先执行sudo mount -a,没有报错再重启。7.4 分区表损坏后的恢复思路分区表损坏的表现是lsblk看不到分区,但磁盘容量还在。这时候不要慌,数据大概率还在,只是分区表丢了。恢复思路:用testdisk工具扫描磁盘,尝试重建分区表。如果记得分区的起始扇区,可以用fdisk手动重建分区,起始扇区保持一致。如果分区表有备份(GPT 在磁盘末尾有备份),可以用gdisk的恢复功能。sudo gdisk /dev/sdb进入后按r进入恢复菜单,再按b从备份恢复分区表。注意:分区表损坏后,第一件事是停止对这块盘的一切写操作,避免覆盖原有数据。恢复操作最好在另一台机器上做,或者把盘挂成只读。7.5 常见问题速查表问题现象可能原因解决方法lsblk 看不到新分区内核未重读分区表partprobe 或 partx -u挂载报 wrong fs type未格式化或类型不匹配检查 FSTYPE,重新格式化系统卡在启动阶段fstab 写错紧急模式注释错误行分区表丢失误操作或磁盘故障testdisk 或 gdisk 恢复df 和 du 结果不一致进程占用已删除文件lsof 查找并重启进程SSD 性能异常分区未对齐parted align-check 检查8. 我这些年积累的几个实操心得分区这件事,命令本身不难,难的是方案设计和细节把控。我分享几个自己踩过坑之后总结的经验。第一,永远用 UUID 而不是设备名。我早期配置 fstab 时用/dev/sdb1这种写法,后来加了一块盘,设备名全变了,系统起不来。从那以后,所有 fstab 条目一律用 UUID。第二,分区前先想清楚扩容路径。如果预计数据会增长,一开始就用 LVM,别等到分区满了再想办法。传统分区扩容需要停机,LVM 可以在线扩展,这个差别在关键时刻能救命。第三,swap 不一定要用独立分区。现在很多场景用 swap 文件更灵活,可以随时调整大小,不用重新分区。创建 swap 文件:sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile然后在 fstab 里加一行/swapfile none swap sw 0 0就能开机自动启用。第四,分区操作前一定要备份分区表。用sfdisk可以备份和恢复分区表:sudo sfdisk -d /dev/sda > sda_partition_backup.txt恢复时:sudo sfdisk /dev/sda < sda_partition_backup.txt这个备份文件很小,但关键时刻能省下大量恢复时间。第五,对 SSD 做分区时留意 TRIM。确保文件系统挂载参数里有discard或者定期运行fstrim,否则 SSD 的写入性能会随着使用时间下降。sudo fstrim -av这个命令可以手动触发 TRIM,建议加到定时任务里每周跑一次。磁盘分区是 Linux 系统管理的基本功,但基本功不等于简单。把分区表格式、文件系统选型、挂载配置、扩容方案这几件事串起来理解,你就能在遇到任何磁盘相关问题时,快速定位并给出合理的解决方案。