说实话,磁盘管理这事儿,是每个玩Linux的人都绕不开的坎儿。
我刚接触Linux那会儿,拿到一台新服务器,看着一块空盘,脑子是懵的——这玩意儿怎么分区?怎么格式化?怎么挂载?后来踩了不少坑,也慢慢摸索出了一套门道。今天就把这些年的经验,一次性给你捋清楚。
这篇文章是「Linux运维系列教程」的第10期。前面我们已经聊过文件权限、用户管理、网络配置等等,这次咱们把目光转向磁盘——这个你天天用,但可能一直没搞明白的"老伙计"。
废话不多说,直接上干货。
一、lsblk:先看看你的磁盘长啥样
操作磁盘之前,第一步永远是——搞清楚你有哪些磁盘,每个磁盘有多大,已经分了多少区。
lsblk 就是干这个的。它的名字是 list block devices 的缩写,列出所有块设备。
lsblk
输出大概是这样的:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 512M 0 part /boot
└─sda2 8:2 0 499.5G 0 part
├─vg0-root 253:0 0 100G 0 lvm /
├─vg0-home 253:1 0 200G 0 lvm /home
└─vg0-swap 253:2 0 16G 0 lvm [SWAP]
sdb 8:16 0 1T 0 disk
你看,这个树状结构是不是特别直观?sda 是第一个硬盘,500G,分了两个区:sda1 挂载到 /boot,sda2 用了 LVM 又分了 root、home 和 swap。sdb 是第二块硬盘,1T,还没分区。
几个常用的参数:
• lsblk -f:显示文件系统信息(UUID、文件系统类型)
• lsblk -l:列表格式输出,不用树状图
• lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT:自定义显示列
小贴士:当你刚接手一台服务器,第一件事就是跑一下 lsblk,心里就有数了。
二、fdisk:最经典的分区工具
fdisk 是Linux上最老牌的分区工具,几乎每台机器上都有。它支持 MBR 分区表,最多支持 4 个主分区(或者 3 主分区 + 1 扩展分区)。
什么是 MBR? MBR(Master Boot Record)是传统的分区表格式,最大支持 2TB 的磁盘。如果你的磁盘超过 2TB,得用后面要讲的 parted(GPT 分区表)。
基本用法
fdisk /dev/sdb
进入交互模式后,你会看到一个命令提示符。常用的命令有:
• m:显示帮助(忘了命令的时候按这个)
• p:打印当前分区表
• n:新建分区
• d:删除分区
• t:修改分区类型
• w:保存并退出(注意:只有按 w 才会真正写入磁盘!)
• q:不保存退出
实操演示:给一块新盘分区
假设你新加了一块 /dev/sdb,想把它分成一个 500G 的区:
然后依次输入:新建分区 → 选主分区 → 第1个分区 → 起始位置用默认 → 大小输入 +500G → 再建一个分区把剩余空间全给它 → 按 p 查看 → 按 w 保存退出。
分完区之后,别忘了通知内核重新读取分区表:
partprobe /dev/sdb
三、parted:支持大磁盘的分区工具
前面说了,fdisk 的 MBR 分区表最大只支持 2TB。现在磁盘动不动就 4T、8T、16T,MBR 就不够用了。这时候就得用 GPT 分区表,而 parted 就是管理 GPT 的最佳工具。
基本用法
parted /dev/sdc
(parted) mklabel gpt # 创建 GPT 分区表
(parted) mkpart primary ext4 0% 100% # 创建一个分区,占满整块盘
(parted) print # 查看分区情况
(parted) quit
非交互用法(适合脚本)
parted /dev/sdc mklabel gpt --script
parted /dev/sdc mkpart primary ext4 0% 100% --script
小贴士:如果你的磁盘小于 2TB,fdisk 和 parted 都能用。但个人建议统一用 parted + GPT,省得以后换大磁盘还要迁移。
四、格式化:给分区穿上文件系统
分区只是把磁盘切成了几块,每块还得格式化成文件系统才能用。Linux 常用的文件系统有 ext4、xfs、btrfs。
ext4(经典之选)
mkfs.ext4 /dev/sdb1
xfs(高性能之选)
mkfs.xfs /dev/sdb1
ext4 vs xfs 怎么选?
• ext4:成熟稳定,兼容性好,小文件场景表现不错
• xfs:大文件性能更强,支持更大的文件和文件系统,Oracle 和 RedHat 都推荐
• 个人建议:一般用途 ext4 够用,大数据/数据库场景选 xfs
格式化完之后,可以用 blkid 查看分区的 UUID:
blkid /dev/sdb1
# 输出:/dev/sdb1: UUID="a1b2c3d4-..." TYPE="ext4"
五、mount:把分区挂到目录树上
Linux 的文件系统是一棵大树,根是 /。新分区得用 mount 命令"挂"到某个目录上,才能读写。
手动挂载
mkdir /data
mount /dev/sdb1 /data
常用挂载参数(用 -o 指定)
• noatime:不更新文件的访问时间(提升性能)
• nodiratime:不更新目录的访问时间
• ro:只读挂载
• rw:读写挂载(默认)
• defaults:默认参数
卸载
umount /data
注意:是 umount 不是 unmount!这个拼写坑了不少人。
如果提示 "device is busy",说明有进程正在使用这个目录:
lsof /data # 查看哪些进程在用
fuser -km /data # 强制杀掉这些进程
六、df:看看磁盘还剩多少空间
df(disk free)用来查看文件系统的磁盘使用情况。
df -h
-h 是 human-readable 的意思,用 GB、MB 这种人类能看懂的单位显示。
实用场景
磁盘报警了,想看看哪个分区快满了:
df -h | grep -E "(9[0-9]%|100%)"
这条命令会过滤出使用率超过 90% 的分区,运维监控脚本里经常这么用。
七、du:看看目录占了多少空间
df 看的是整个分区,du(disk usage)看的是具体目录或文件占了多少空间。
查看当前目录的总大小
du -sh .
# 输出:2.3G .
找出最大的子目录
du -h --max-depth=1 /var | sort -hr | head -10
这条命令会列出 /var 下面每个子目录的大小,按从大到小排序,取前 10 个。磁盘快满的时候,这是定位"罪魁祸首"的利器。
小贴士:du 和 ls -lh 显示的大小可能不一样。du 显示的是磁盘实际占用的块大小(通常是 4K 的整数倍),ls 显示的是文件的逻辑大小。
八、dd:磁盘复制神器(也是炸弹)
dd 是一个底层的数据复制工具,能直接读写磁盘设备。它功能强大,但也很危险——用错了,数据说没就没。
基本语法
dd if=输入源 of=输出目标 bs=块大小 count=块数
常用场景
1. 备份整个磁盘分区
dd if=/dev/sdb1 of=/backup/sdb1_backup.img bs=4M status=progress
2. 制作启动U盘
dd if=ubuntu-22.04.iso of=/dev/sdc bs=4M status=progress && sync
⚠️ 警告:of=/dev/sdc 是 U盘的设备名,千万别写错成你的系统盘!dd 不会问你确认,写错了数据直接覆盖,神仙也救不回来。
3. 清空磁盘
dd if=/dev/zero of=/dev/sdb bs=4M status=progress
血的教训:我第一次用 dd 的时候,把 if 和 of 搞反了,把系统盘覆盖了一部分。那台服务器的系统直接起不来了。从那以后,我每次执行 dd 之前,都会把命令复制到一个文本文件里,逐字检查三遍才敢回车。
九、LVM:灵活的磁盘管理方案
前面的分区方式都是"死"的——分好了大小,想扩容就得卸载、调整、重新挂载,麻烦得很。
LVM(Logical Volume Manager)就是为了解决这个问题而生的。它把物理磁盘抽象成"卷组",再从卷组里划分"逻辑卷"。逻辑卷的大小可以动态调整,不用停机。
LVM 的核心概念
• PV(Physical Volume):物理卷,就是实际的磁盘分区
• VG(Volume Group):卷组,把多个 PV 合并成一个资源池
• LV(Logical Volume):逻辑卷,从 VG 里切出来的"可用空间",相当于传统分区
打个比方:PV 是一块一块的砖,VG 是用砖砌成的一面墙,LV 是墙上开的一扇门。
创建 LVM 实操
# 1. 创建物理卷
pvcreate /dev/sdb1 /dev/sdc1
# 2. 创建卷组
vgcreate vg_data /dev/sdb1 /dev/sdc1
# 3. 创建逻辑卷
lvcreate -L 500G -n lv_data vg_data
# 4. 格式化并挂载
mkfs.ext4 /dev/vg_data/lv_data
mkdir /data
mount /dev/vg_data/lv_data /data
LVM 最爽的地方:动态扩容
假设 /data 快满了,你想扩容:
# 1. 扩展逻辑卷(加 100G)
lvextend -L +100G /dev/vg_data/lv_data
# 2. 扩展文件系统
resize2fs /dev/vg_data/lv_data # ext4 用这个
xfs_growfs /data # xfs 用这个
不用卸载!不用重启!在线扩容!
如果卷组空间不够了,还可以加新磁盘:
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1
lvextend -L +500G /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data
小贴士:LVM 虽然灵活,但也有代价——多了一层抽象,排查问题时稍微复杂一点。另外,LVM 不支持对 boot 分区使用(GRUB 读不了 LVM),所以 /boot 还是得用传统分区。
十、/etc/fstab:让挂载开机自动生效
前面讲的 mount 都是临时的,重启就没了。想让挂载永久生效,得写 /etc/fstab。
fstab 的格式
<设备> <挂载点> <文件系统类型> <选项> <dump> <fsck>
举个例子
UUID=a1b2c3d4-... /data ext4 defaults,noatime 0 2
• 第一列:设备标识,推荐用 UUID(设备名 /dev/sdb1 可能会变,UUID 不会)
• 第二列:挂载点
• 第三列:文件系统类型
• 第四列:挂载选项
• 第五列:dump 备份标志(0=不备份,1=备份)
• 第六列:fsck 检查顺序(0=不检查,1=第一个检查,2=第二个检查)
写完之后别忘了验证
mount -a
这条命令会挂载 fstab 里所有还没挂载的设备。如果报错,说明 fstab 写错了,赶紧改,不然重启进不去系统!
血的教训:fstab 写错了导致重启后系统进不去,只能进单用户模式或者用 LiveCD 修复。我有个同事就干过这事儿,fstab 里多了一个空格,服务器重启后直接卡在 initramfs 界面。从那以后,我改完 fstab 一定会跑 mount -a 验证。
总结一下
咱们把今天的内容串一遍:
lsblk → 查看磁盘和分区,先看看有啥盘
fdisk → MBR 分区(≤2TB),经典分区工具
parted → GPT 分区(>2TB),大磁盘必备
mkfs → 格式化分区,穿上文件系统
mount/umount → 挂载/卸载,把分区挂到目录树
df → 查看磁盘空间,还剩多少
du → 查看目录大小,谁占了空间
dd → 底层数据复制,强大但危险
lvm → 逻辑卷管理,灵活扩容
fstab → 开机自动挂载,永久生效
几个核心建议:
1. 新服务器到手,先 lsblk 看看有哪些磁盘
2. 磁盘 ≤ 2TB 用 fdisk,> 2TB 用 parted + GPT
3. 一般用途 ext4 够用,大文件场景选 xfs
4. 挂载完记得写 /etc/fstab,但一定要 mount -a 验证
5. 需要频繁扩容的场景,上 LVM
6. dd 虽好,但千万小心,别把 if 和 of 搞反了
磁盘管理这事儿,说难不难,说简单也不简单。核心就是多练、多踩坑、多总结。下次你拿到一块新盘,别慌,按这篇文章的步骤来,稳得很。
这是「Linux运维系列教程」的第10期。如果觉得有帮助,欢迎转发给你的同事和朋友。下期我们聊 RAID 配置,不见不散!