用了这么多年Linux,要说哪个问题被问得最多,翻来覆去还是“Linux分区有哪些”。装机时候不知道该怎么分,进系统之后看一溜sda、nvme0n1又不知道各自是干嘛的,给服务器加块硬盘也不确定到底该建几个区、要不要用LVM。别急,这篇文章我就按实际干活的经验,把Linux分区这事从头到尾捋一遍,从最基本的MBR/GPT讲到挂载、LVM、扩容和常见坑,你照着看基本就能自己上手了。
1. 分区的基础概念与老生常谈的MBR/GPT
1.1 分区到底解决什么问题
先想清楚一个问题:为什么硬盘非要分区?一张白纸也能写字,一块裸盘也能存数据,但分区带来了三个实打实的好处。
第一个是隔离。系统和数据分开,如果系统分区崩了、写满了、甚至要重装,数据分区不受牵连。我见过不少朋友把东西全堆在根分区下,结果系统日志一膨胀把整块盘打满,连图形界面都进不去,只能抱着一块Ubuntu启动盘去抢救数据,那种经历一次就够受的。
第二个是约束和配额。某个分区是多大就是多大,应用写爆了也只是爆在它自己的分区里,不会殃及整个系统。比如把/var/log独立出来,日志增长再疯,也不会拖垮其余分区。
第三个是文件系统选择。分区本质上是个边界,不同边界内可以使用不同的文件系统。/boot引导分区可以用简单的ext2,根分区用xfs或者ext4,数据盘可以上btrfs,互不影响。你说我就一块硬盘不想分那么多区也不是不行,但后续要调整就麻烦了。
理解了分区的价值,再去看那些铺天盖地的分区教程,思路就清楚了——每个分区都在干自己的活,而不是机械地照抄别人的方案。
1.2 MBR和GPT的差异与选择
分区之前必须定一个“纲领”:整块硬盘用MBR还是GPT分区表。这俩决定了你最多能给硬盘分多少区、每区最大能做多大。
MBR是老前辈,兼容性极好,BIOS+MBR是老机器的标准组合,但也因此有一个物理极限:MBR分区表本身只有64字节来记录分区信息,每项16字节,所以最多4个主分区。想分更多就得拿一个主分区去做扩展分区,再在扩展分区里切逻辑分区,不仅绕,而且很多工具操作起来很别扭。更麻烦的是MBR使用32位逻辑块地址,一整块盘最大只能认到2TB,超过的部分直接浪费。
GPT则是现代主流方案。它没有4个主分区的限制,默认支持128个分区,单分区容量上限高到你根本用不到——Zettabyte级别。但它需要主板UEFI模式配合,另外GPT磁盘通常需要一个EFI系统分区(ESP)来放引导文件。现在新买的电脑基本都是UEFI启动,所以新装系统优先选GPT,除非你要在十几年前的老古董上装。
怎么快速确认当前磁盘类型?命令很简单:
bash复制lsblk -o NAME,SIZE,TYPE,PARTTYPENAME,MODEL
fdisk -l /dev/sda
fdisk -l输出里如果看到Disklabel type: gpt就是GPT,dos就是MBR。很多人在装系统的时候选的不是分区类型,而是安装程序在GPT磁盘上自动创建了“BIOS boot”或“EFI System”分区,所以后面看到一堆起名奇怪的分区,先看看分区表类型就明白了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Linux系统分区:哪些分区该建,哪些分区可以看情况
2.1 必选分区:/、/boot、EFI、swap
新建一台Linux主机,如果使用传统BIOS+MBR模式启动,最简系统只需要一个“/”和一块swap。现在主流UEFI+GPT安装一般会生成这几个分区:
| 分区 | 典型大小 | 推荐文件系统 | 作用 |
|---|---|---|---|
| EFI系统分区(ESP) | 512MB ~ 1GB | vfat(FAT32) | 存放UEFI引导程序,如grubx64.efi |
| /boot | 1GB ~ 2GB | ext4 / xfs | 内核vmlinuz与initramfs |
| / | 剩余空间 | ext4 / xfs | 系统根目录 |
| swap | 视内存而定 | swap | 虚拟内存、休眠镜像 |
ESP分区有点特殊,它挂载在/boot/efi,是UEFI固件直接读取的引导文件所在地。有些教程把/boot整个放到一个独立分区里,另一部分教程是让/boot就担当ESP,这取决于发行版和引导方式。一般推荐的做法是单独给一个/boot,绝对大小控制在1GB-2GB就够用了。
swap分区就是虚拟内存。现在的服务器内存动辄64GB、128GB,还要不要swap?我的经验是:要,但不用太大。可以建一个4GB~8GB的swap分区,或者直接用一个swap文件,后者在调整大小上更灵活,不用动分区表。在某些场景下,比如嵌入式设备使用Android系统,还会把swap做成zram,用内存压缩来代替磁盘交换,这个又是另一个话题了。
根分区是系统最核心的分区,所有软件、配置、缓存都在这里面。如果硬盘就一块,容量不大,把全部空间都给“/”是最省心的选择,至少不会在安装时纠结半天。但要注意,根分区一旦写满,很多服务会开始报错甚至崩掉,所以线上的服务器要么把/var、/home独立出去,要么至少监控一下根分区的使用率。
2.2 按场景选择:/home、/var、/tmp
很多人分完根分区就结束,但实际上把数据比较集中的目录独立出来,是运维上很实用的习惯。
/home用户目录独立出来,有两个直接好处。第一是数据安全:重装系统时只要保留这个分区,你的个人资料、代码、下载文件全部都在。第二是磁盘配额:多人共用一台服务器时,把每个人限制在固定大小的home分区里,谁把空间吃光了心里都有数。实际大小取决于用户数量和数据量,开发机50GB起步,文件服务器给500GB也不嫌多。
/var是另外一个容易膨胀的重灾区。日志文件、邮件队列、打印任务、docker容器数据都有可能落到/var目录。很多系统管理员都遇到过一个场景:某天发现自己数据库所在的/分区莫名其妙被写满了,查了半天,在/var/log里躺着几百GB的日志。所以线上服务器强烈建议把/var(或者是/var/log)独立挂载,避免日志风暴把根分区打爆。给多大合适?一般留20GB~50GB,如果跑docker或者需要大量缓存,再单独评估。
/tmp目录是系统临时文件存放点,默认情况下很多程序会往这里写一些中间数据,如果不清理,偶尔也能堆很多。如果你的程序依赖这个目录,独立分区可以防止临时文件与系统文件争抢空间,同时还方便在挂载时加noexec限制,防止有人在这里执行脚本。我这里提醒一下:公共服务器上如果允许普通用户跑东西,把/tmp设为noexec,nosuid是非常基础的安全加固手段。
2.3 特殊分区:EFI、恢复分区、persist类分区
除了上面这些常规分区,实际使用中还会看到一些比较特殊、不仔细研究根本不知道是干嘛用的分区。
EFI系统分区前面提过,它是UEFI引导的必需品。如果你在Windows和Linux双系统环境下看到ESP分区还包含Windows的引导文件,千万别格式化。同理,Windows恢复分区(就是很多教程里出现的“WinRE DRV”那个分区)也是Windows恢复环境用的,大小通常几百MB,在Windows的磁盘管理器里查看时没有盘符,也不要轻易去改它。
厂商预置分区需要特别提一下。有些品牌机和移动硬盘出厂时会自带一些隐藏分区,例如Windows下常见的“恢复分区”,移动硬盘预置的备份工具分区(西数、希捷都有类似设计),这些分区在Linux下看起来就是几个匿名分区,没有挂载点。如果你买的移动硬盘想当普通数据盘用,建议用parted或者图形工具比如gparted把整个硬盘重新分区,不要留着那些看不明白的预置分区,后续还可能影响文件系统的识别。
嵌入式设备里的persist、cust和各类定制分区。手机和Android平板上常见一个persist分区,用来存放传感器校准参数、音频配置、WIFI MAC地址等。这些参数是被系统在运行期间反复读写的,如果异常断电时正在写数据,就有可能出现分区损坏。热搜里也出现了“persist分区里面音频校准参数已经被异常断电写坏”的案例,这种问题一般只能通过清空persist分区让系统重新校准,或者用校验过的备份镜像恢复。嵌入式Linux项目(路由器、物联网网关、自动驾驶盒子)的分区布局就更细了:bootloader、dtb、kernel、rootfs、recovery、misc、data一个都不少,每一个都承担独立功能,任意一个坏了都可能影响启动链。这类分区不建议你用通用工具去随意调整,否则很容易把设备变成砖。
3. 分区方案怎么定:三种典型布局与LVM选型
3.1 三种典型布局盘点
日常使用和运维中,我归纳了三种比较典型的分区布局,你可以根据自己的场景直接套。
第一种:单分区加swap。 适合个人电脑、虚拟机、临时测试环境。一块硬盘只分一个“/”加一个swap,最多再加一个ESP。好处是简单,空间利用率高,不用担心哪个分区不够用。坏处是数据都混在一起,系统坏了数据也危险,重装麻烦。
第二种:系统与数据分离。 在单分区基础上把/home、/data或者/var独立出来。这块布局兼顾了灵活与安全,适合做开发机、文件服务器、Web服务器。部署新服务时把数据文件路径指到数据分区里,日志目录指到/var/log,哪个区满了处理哪个区,成本很低但收益很大。
第三种:LVM全盘管理。 服务器最常见。装系统时直接把整块盘做成一个物理卷,卷组下面再划分逻辑卷给/、/home、/var。这种方案的灵活性在所有布局中最高,后面扩展空间不需要关机拆机,直接在LVM层面操作就行。做数据库集群或容器化平台时,强烈建议使用这种布局。
还有一类比较新潮的方式是使用btrfs子卷或ZFS数据集来替代传统分区。在btrfs文件系统里,一个分区挂多个子卷,每个子卷可以独立设置快照和配额,功能上类似分区但比分区更灵活。用openSUSE或者Fedora装系统时默认就是btrfs子卷布局,如果你愿意尝鲜,这也是个方向。
3.2 LVM的逻辑结构与管理思路
LVM(Logical Volume Manager)不区分物理硬盘,它把分区的概念抽象成了三件套:物理卷PV、卷组VG、逻辑卷LV。
物理卷(PV)就是我们实实在在划分出来的一块空间,可以来自一块硬盘、一个分区,也可以来自RAID阵列,甚至直接使用整块裸盘。多个物理卷再组合成一个卷组(VG),相当于一个虚拟的、可以跨硬盘的“空间池”。最后从卷组里切出一个个逻辑卷(LV),格式化后挂载到系统目录上,就对应了我们平时看到的/、/home这些逻辑分区。
打个比方:物理卷是你的银行存款账户,卷组是你的钱包,逻辑卷是钱包里按用途划分的预算——吃饭的、买书的、出行的。预算不够了可以从钱包里挪,钱包不够了可以加银行卡,而且所有操作不用把之前的账单推倒重来。这就是LVM最大的价值:动态扩缩容,跨盘聚合。
日常管理LVM用这么几条命令就够了:
bash复制# 查看物理卷、卷组、逻辑卷
pvs
vgs
lvs
# 查看逻辑卷的当前路径
lvdisplay
如果装系统时没有选LVM,后面想把普通分区转成LVM会比较折腾,一般不建议在生产环境折腾。新服务器规划的时候直接用LVM,之后扩容只需要“新磁盘建PV -> VG扩展 -> LV扩展 -> 文件系统扩展”四步,不用动现在的数据。我在第4.4节会详细演示这个流程。
4. 实操示例:查看、创建与挂载分区
4.1 用lsblk、fdisk、parted查看分区
干活的第一步是看清自己机器上有什么。lsblk是Linux下查看块设备和分区关系最直观的命令,没有之一。
bash复制[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
└─sda3 8:3 0 59G 0 part /data
nvme0n1 259:0 0 512G 0 disk
└─nvme0n1p1 259:1 0 512G 0 part
注意两点:sda这种设备名是按识别顺序分配的,不固定,重启后可能变成sdb;TYPE列中disk代表整块磁盘,part代表磁盘上的分区,lvm代表LVM逻辑卷。查找分区时先看TYPE,别一上来fdisk -l看到一堆分区就慌。
fdisk和parted是两种曲线不同的分区工具。fdisk传统且易用,适合在MBR分区表下操作小分区;parted更强大,支持GPT分区表、支持调整分区大小、支持脚本化操作。现在新硬盘基本都走GPT,所以我习惯用parted做首次分区,用fdisk做简单查看:
bash复制# 查看分区表类型和具体分区信息
fdisk -l /dev/sda
parted /dev/sda print
parted print输出的Partition Table: gpt就是分区表类型。如果你在这个输出里看到Number Start End Size File system Name Flags,这比fdisk -l信息更清晰,特别是能看到分区的Name和Flags(比如boot、esp、lvm),对识别真面目很有帮助。
4.2 用fdisk或parted创建分区
新加了一块硬盘,想建个分区,完整流程是:分区 -> 格式化 -> 挂载。这里用parted举例,在/dev/sdb上创建一个2TB的GPT分区表,然后分一个1TB的分区:
bash复制# 先把磁盘变为GPT分区表
parted /dev/sdb mklabel gpt
# 创建1TB分区,起始1MiB,结束1TiB
parted /dev/sdb mkpart primary 1MiB 1TiB
# 查看结果
parted /dev/sdb print
为什么要从1MiB开始而不是0?因为分区表本身要占用一定的空间,从0开始会警告并且可能对齐出错。现代分区工具都建议分区起始位置至少对齐到1MiB,这样固态硬盘的擦除块不会跨越两个物理块,性能更好。
如果你更喜欢fdisk,在fdisk /dev/sdb交互界面里依次执行:
code复制n 新建分区
p 主分区
分区号默认
起始扇区默认
结束扇区输+800G 或直接回车用满整盘
w 写盘
写盘之后可以执行partprobe让内核重新读取分区表,不需要重启也能看到新分区。这一步很多人会忘记,然后跑去问为什么lsblk看不到新分区。
分区表建好后,格式化一个ext4文件系统:
bash复制mkfs.ext4 /dev/sdb1
注意格式化会清空分区上所有数据,确认几次再动手。另外格式化的时候可以加-L给分区一个卷标,比如mkfs.ext4 -L data /dev/sdb1,以后查看分区的时候更方便识别。
4.3 挂载、卸载与开机自动挂载配置
格式化之后分区还不算“能用”,要把它挂载到某个目录才能读写。Linux的目录树中一切皆文件,一块没有挂载的分区就是一条孤儿记录。
bash复制# 创建挂载点
mkdir /data
# 临时挂载
mount /dev/sdb1 /data
# 查看挂载情况
df -h
lsblk
mount是临时生效,重启就没了,所以要写入/etc/fstab实现开机自动挂载。写之前先用blkid查出分区的UUID,这个信息比设备名更可靠:
bash复制blkid /dev/sdb1
# /dev/sdb1: UUID="8a2a2b8b-..." TYPE="ext4" PARTUUID="..."
然后编辑/etc/fstab,添加一条:
code复制UUID=8a2a2b8b-... /data ext4 defaults 0 2
四个核心字段分别是:设备标识、挂载点、文件系统类型、挂载选项。最后的两个数字,第一列控制dump备份(一般0),第二列是fsck检查顺序:根分区写1,其它分区写2。写错fstab可能导致系统起不来,所以每次改完建议执行一次mount -a,这个命令会按fstab配置把没挂载上的分区挂载一遍,如果报错就说明你的配置有问题,趁重启之前赶紧修。
卸载分区用umount:
bash复制umount /data
如果提示“target is busy”,说明有进程正在使用该目录,处理方法我放在第5.2节。
还有一个细节:U盘、TF卡这类可移动设备插入后,如果桌面环境没有自动挂载,很多新手会一脸懵。其实手动挂载很简单的:
bash复制# 先看识别成什么设备
lsblk
# 创建挂载点并挂载
mkdir -p /media/usb
mount /dev/sdc1 /media/usb
要注意文件系统是NTFS的话,需要内核有ntfs3或ntfs-3g支持;是exFAT的话需要exfatprogs,这些包缺了会报“unknown filesystem type”。国内麒麟、统信这些系统上如果插U盘没自动挂载,多半是桌面环境的挂载服务有问题,手动mount是最直接的兜底办法。
5. 常见问题与排查技巧实录
5.1 U盘/移动硬盘没有自动挂载怎么处理
“U盘需要首先挂载分区”这个问题在麒麟系统上经常出现,其实不光是麒麟,任何精简安装的Linux桌面都可能遇到。插入U盘后没有任何反应,lsblk也看不到设备,或者能看到设备但没有挂载点。
先确认硬件识别没识别到。lsblk看不到、dmesg | tail也没有任何usb信息,那先查线材、接口和驱动。如果能看到sdb、sdc这样的设备但无分区,说明这个U盘没写分区表,可以重新分区。如果能看到sdc1这样的分区但没有挂载点,那就是自动挂载服务没干活,手动挂载即可:
bash复制# 如果不知道文件系统类型,先看
lsblk -f /dev/sdc
# 或直接
file -s /dev/sdc1
mkdir -p /media/usb
mount /dev/sdc1 /media/usb
如果U盘是exFAT或NTFS格式,手动挂载时记得带-o uid=你的用户名,gid=你的用户组,不然普通用户对FAT文件系统默认没有写权限,挂载是挂上了,但拷不进东西也删不掉,那种感觉很崩溃。
5.2 umount提示device is busy怎么解决
umount /data提示target is busy是零基础遇到最多的错误之一。用fuser -vm /data查看哪个进程占用,或者用lsof | grep /data找到占用文件的进程ID,直接处理这些进程之后就可以正常卸载。
但有些时候进程不能杀,比如是数据库还在后台运行。这时候可以用“懒卸载”:
bash复制umount -l /data
-l的意思是Lazy unmount,立即从目录树中摘除挂载点,但等所有打开文件的进程关闭后才真正卸载底层设备。这个操作在升级文件系统、迁移数据等场景下相当实用,不过卸载后你要记得该分区在df下看不到了并不代表设备一定释放,后续最好再确认一下。
如果一直没进程释放,还有一种可能是当前shell的工作目录就在挂载点下面,cd /切出来再卸载就好。这个原因非常不起眼,但实际碰到的概率不比进程占用低。
5.3 LVM报IO错误与异常断电导致分区损坏的排查
系统日志里出现Buffer I/O error on device dm-0、LVM: I/O error这类信息,一般是底层块设备出问题,可能原因包括:磁盘物理坏道、SATA/NVMe线缆接触不良、硬盘休眠后被唤醒失败、LVM元数据所在的PV丢失等。
排查思路从下往上:
- 先看物理盘状态:
smartctl -a /dev/sdb查SMART健康度,dmesg | grep -i error查内核日志。 - 再确认LVM状态:
pvscan、vgscan,如果某些PV显示unknown device,说明物理卷识别失败。 - 查看LV的挂载状态:
dmsetup info、dmsetup table。
如果真的只是LVM元数据异常,但数据没坏,可以尝试vgcfgrestore恢复之前备份的卷组元数据。注意这个操作要求元数据版本和实际状态一致,否则更加麻烦。专业的数据恢复场景必须先把磁盘做成镜像再操作,这条原则适用于任何固态盘数据损坏的情况,异常断电导致的LVM元数据损坏也一样,先备份再动手永远比盲目修复安全。
还有一种很常见的场景是嵌入式设备中persist分区开机后校验失败。如果是因为异常断电导致写入过程被打断,分区上的数据可能处于半写入状态。处理办法是进入recovery模式,用原厂工具重刷对应分区镜像,或者恢复出厂设置让它重新校准。自己写驱动的话,注意写入这类分区时要有掉电保护策略,固件、数据多用双备份或增加校验标记。这些细节在规模量产阶段会直接决定返修率高低。
5.4 分区扩容与数据迁移的正确姿势
服务器跑久了,磁盘空间不够是最常见的运维问题。如果建的是LVM,扩容流程非常清晰:
bash复制# 新硬盘 /dev/sdb 建PV
pvcreate /dev/sdb
# 把PV加入到已有的vg
vgextend centos /dev/sdb
# 给某个LV扩展空间
lvextend -L +100G /dev/mapper/centos-root
# 扩展文件系统(xfs用xfs_growfs,ext4用resize2fs)
xfs_growfs /
注意文件系统类型不同,扩容命令不一样。xfs只能扩大不能缩小,ext4两者都可以。很多人第一次扩容时只做了lvextend没做文件系统扩展,导致df -h看到的容量不变,然后怀疑自己操作错了。其实顺序是先扩LV,再扩文件系统,缺一不可。
如果是普通物理分区,扩容稍微麻烦一点。需要先卸载分区(这决定了线上环境最好别用普通分区),然后用parted调整分区大小,最后再扩展文件系统。在云主机上,流程通常是控制台先把云盘扩了,然后进系统执行growpart和resize2fs。注意云主机的/dev/vda1这类分区扩容前,务必确认是GPT还是MBR分区表,MBR盘扩容遇到2TB边界是会出问题的。
数据迁移这块,DiskGenius里面那个“迁移分区”功能是Windows用户常用的对象,实际原理就是先复制分区内容,再重新生成启动项。Linux下对应的做法有几种:整盘拷贝用dd(慢但完整),智能复制用parted的resizepart加rsync(适合远程迁移),或者直接clonezilla整盘克隆。迁移后的新盘记得用blkid查看UUID,如果和原盘不一致,在/etc/fstab里要同步改,另外双系统环境还要修复一下EFI引导条目,否则开机大概率找不到系统。
写在最后
回过头来看,Linux分区这件事说复杂也复杂,动不动就涉及UEFI、引导链、LVM、文件系统;说简单也简单,核心就是搞清楚“谁负责启动”“谁放系统”“谁存数据”三件事。刚上手的时候没必要追求完美方案,先用“根分区+swap”跑起来,跑明白了再优化布局;重要机器从第一天起就规划好LVM和独立数据分区,后面扩容改路径会省掉大量麻烦。
我自己踩过不少坑,最想提醒大家的一点是:改分区之前一定备份,无论用什么工具,分区表、文件系统、数据的容错能力都比想象中脆弱。真遇到问题也不要慌,lsblk看结构,dmesg看日志,smartctl看健康度,顺着这条线走下来,绝大多数问题都能定位到明确原因。希望这篇把Linux分区方方面面讲透彻的思路,能让你在下次给自己的设备或服务器规划存储时更有底气。
