磁盘、存储、扩容

1 阅读5分钟

1:df 和 du 有什么区别?

命令看什么
df -h分区 / 文件系统的容量和使用率(还剩多少)
du -sh 目录目录 / 文件实际占用了多少
df -h                  # 看每个挂载点的 Use%(使用率)
du -sh /var/log        # 看 /var/log 总共多大
du -sh /* | sort -h    # 找出哪个一级目录最大
lsblk                  # 看有哪些磁盘和分区(硬件视角)
df -i                  # 看 inode 使用率(空间没满却写不进时查它)

标准答法:「df 看的是分区还剩多少空间,du 看的是目录占了多少空间。排查磁盘满的时候先用 df 定位是哪个分区,再用 du 逐层找大目录。」

为什么 df 和 du 会对不上

比如:

df -h /
# Filesystem  Size  Used Avail Use% Mounted on
# /dev/sda1    50G   40G   7.5G  85% /

du -sh /* 2>/dev/null
# 加起来大概 15G

df 说这块盘用了 40G,du 把每个目录加起来只有 15G —— 差了 25G,这就是"对不上"。

原因说明怎么确认
文件被删但进程还持有句柄目录里看不到,但 inode 和数据块还被占用lsof | grep deleted、lsof +L1
目录被新挂载覆盖挂载是覆盖行为,原数据还在但看不见mount 看挂载点、先 umount 再看
ext4 默认给 root 预留 5%普通用户看到的可用空间比 df 少tune2fs -l /dev/sda1(看 Reserved block count)
inode 用尽空间还有,但创建不了新文件df -i

找大文件的组合拳:

du -ah /data | sort -h | tail -10
find / -size +1G -mtime -7                          # 7 天内、大于 1G 的
find /data -type f -size +500M -exec ls -lh {} +    # 列出来看

2:给服务器新装一块磁盘,会有哪些初始化步骤?

「识别新盘 → 分区 → 刷新分区表 → 格式化 → 挂载 → 写 fstab 开机自挂 → mount -a 验证。」

# 1) 先在虚拟机/云控制台添加一块磁盘(关机加最稳;热添加后需要重新扫描)
echo "- - -" > /sys/class/scsi_host/host0/scan      # 热添加后手动触发扫描

# 2) 确认系统识别到了新盘(关键:看清盘符,别搞错盘!)
lsblk                         # 树状列出所有盘和分区
fdisk -l                      # 更详细(容量、分区表类型)
dmesg | tail                  # 看内核有没有识别到新盘的日志

# 3) 分区(新盘 /dev/sdb,无分区)
fdisk /dev/sdb                # 交互式:n → p → 1 → 回车 → 回车 → w
partprobe /dev/sdb            # ★ 刷新分区表,让内核认到 /dev/sdb1(最容易漏的一步)
lsblk /dev/sdb                # 验证:能看到 sdb1 了

# 4) 格式化:在"分区"上建文件系统
mkfs.ext4 /dev/sdb1           # 或 mkfs.xfs /dev/sdb1(★ 格式化会清空数据)
blkid /dev/sdb1               # 看新分区的 UUID 和文件系统类型

# 5) 挂载(先建目录再挂)
mkdir -p /data
mount /dev/sdb1 /data
df -h /data                   # 验证:容量对不对、挂载点对不对

# 6) 开机自动挂载:写 /etc/fstab(用 UUID,不要用 /dev/sdb1)
cp /etc/fstab /etc/fstab.bak.$(date +%F)          # 改之前先备份
# 在 fstab 里加一行(内容如下),然后验证:
#   UUID=xxxx-xxxx  /data  ext4  defaults,nofail  0  2
mount -a                      # ★ 验证:不报错才算对

# 7) 按需给目录权限
chown -R app:app /data
chmod 750 /data
关键词为什么重要
partprobe不做的话分区建好了但 /dev/sdb1 不出现,mkfs 会报找不到设备
blkid 取 UUID盘符可能变(加盘、换控制器),UUID 不会
nofail挂不上也不阻塞开机(数据盘强烈建议加)
mount -a改完 fstab 必须验证,否则重启起不来

3:虚拟机扩盘的详细步骤和指令?

考察点:系统识别 → 分区 → 文件系统 全链路

注意区分两个场景:A 是加一块新盘;B 是原来那块盘变大了。

场景 B:把已有分区「变大」(云盘扩容 / 虚拟机扩容量)

普通分区(非 LVM):

# 1) 控制台把盘扩容(比如 40G → 100G)
lsblk                       # 确认盘变大了,但分区还没变

# 2) 扩分区(两条路)
growpart /dev/sda 3         # ★ cloud-utils 工具,最省事(推荐)
# 或 fdisk /dev/sda:d 删掉分区 → n 重建 → ★起始扇区必须和原来一致 → w
partprobe /dev/sda

# 3) 扩文件系统(★ 命令不同,必考)
resize2fs /dev/sda3         # ext4 —— 写【设备名】
xfs_growfs /data            # xfs  —— 写【挂载点】

df -h /data                 # 验证

XFS 只能扩、不能缩(要缩容只能备份 → 重建 → 恢复);ext4 可以缩,但必须先卸载。

LVM 在线扩容:移步 LVM高阶操作复盘总结

LVM 是什么、有什么好处:普通分区建好就改不了大小,LVM 可以「在线扩容」(还能做快照)。这也是为什么生产上数据库盘一般建在 LVM 上。

扩 swap(顺带记):

swapon --show                  # 看当前 swap
# 方式一:加 swap 文件(不用分区,最方便)
fallocate -l 4G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 方式二:新分区 → mkswap /dev/sdb2 → swapon /dev/sdb2 → 写 fstab

4:ext4 和 XFS 有什么区别?扩容命令为什么不一样?

考察点:文件系统差异 · 缩容的禁忌

对比项ext4XFS
扩容命令resize2fs(写设备名)xfs_growfs(写挂载点)
缩容可以(必须先卸载)不支持,只能备份重建
常见于CentOS 6/7、UbuntuCentOS 7+ 默认、RHEL 系

面试官爱问:「扩完分区了,df 为什么没变?」→ 因为少了"扩文件系统"这一步(resize2fs / xfs_growfs)。分区是"容器",文件系统是"容器里的东西",两个都要扩。