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 有什么区别?扩容命令为什么不一样?
考察点:文件系统差异 · 缩容的禁忌
| 对比项 | ext4 | XFS |
|---|---|---|
| 扩容命令 | resize2fs(写设备名) | xfs_growfs(写挂载点) |
| 缩容 | 可以(必须先卸载) | 不支持,只能备份重建 |
| 常见于 | CentOS 6/7、Ubuntu | CentOS 7+ 默认、RHEL 系 |
面试官爱问:「扩完分区了,
df为什么没变?」→ 因为少了"扩文件系统"这一步(resize2fs/xfs_growfs)。分区是"容器",文件系统是"容器里的东西",两个都要扩。