主题:磁盘排查 · 重定向与标准流 · 软链接与硬链接 标注说明:★★★ 表示高频考点
目录
- 一、经典命令场景
- [1. df 与 du 的区别](#1. df 与 du 的区别 "#1-df-%E4%B8%8E-du-%E7%9A%84%E5%8C%BA%E5%88%AB")
- [2. 重定向与标准流](#2. 重定向与标准流 "#2-%E9%87%8D%E5%AE%9A%E5%90%91%E4%B8%8E%E6%A0%87%E5%87%86%E6%B5%81")
- [二、软链接与硬链接(★★★ 高频)](#二、软链接与硬链接(★★★ 高频) "#%E4%BA%8C%E8%BD%AF%E9%93%BE%E6%8E%A5%E4%B8%8E%E7%A1%AC%E9%93%BE%E6%8E%A5-%E9%AB%98%E9%A2%91")
- [Q6 硬链接和软链接有什么区别?](#Q6 硬链接和软链接有什么区别? "#q6-%E7%A1%AC%E9%93%BE%E6%8E%A5%E5%92%8C%E8%BD%AF%E9%93%BE%E6%8E%A5%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB")
- [Q7 什么是软链接?](#Q7 什么是软链接? "#q7-%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E9%93%BE%E6%8E%A5")
- 速记卡
一、经典命令场景
1. df 与 du 的区别
df 看的是分区还剩多少空间 ,du 看的是目录占了多少空间。
排查磁盘满的标准顺序:先用 df 定位是哪个分区,再用 du 逐层找大目录。
bash
df -h # 看每个挂载点的 Use%
du -sh /var/log # 看 /var/log 总共多大
du -sh /* 2>/dev/null | sort -h # 找出哪个一级目录最大
记忆点 :df = disk free(文件系统视角);du = disk usage(目录视角)。
补充追问 :如果
df显示满了、du加起来却对不上,通常是已删除但仍被进程占用的文件 ,用lsof | grep deleted查。
2. 重定向与标准流
2.1 三个标准流
| 编号 | 名称 | 默认位置 |
|---|---|---|
| 0 | 标准输入(stdin) | 键盘 |
| 1 | 标准输出(stdout) | 屏幕 · 正常结果 |
| 2 | 标准错误(stderr) | 屏幕 · 报错信息 |
2.2 >、>> 与 2>&1
| 操作符 | 含义 |
|---|---|
> |
覆盖重定向 |
>> |
追加重定向 |
2> |
重定向标准错误 |
2>&1 |
把标准错误重定向到标准输出当前所在的位置 |
易错点 :
&1里的1指的是文件描述符 1 ,不是名为1的文件;而且顺序不能反,必须写成> file 2>&1。
2.3 两个真实场景
bash
# 1) 把命令的输出和错误都记到日志(cron 里最常用)
/shell/backup.sh >> /var/log/backup.log 2>&1
# 2) 屏蔽一堆无用的权限报错
find / -name "*.conf" 2>/dev/null
二、软链接与硬链接(★★★ 高频)
Q6 硬链接和软链接有什么区别?
考察点 :inode · 文件系统 · 链接计数 来源:面经① 第 6 题(已会);面经② 第 4 题(问的是软链接)
bash
ln a.txt hard.txt # 硬链接
ln -s a.txt soft.txt # 软链接(-s = symbolic)
ls -li a.txt hard.txt soft.txt # -i 查看 inode 编号
核心对比
| 对比 | 硬链接 | 软链接 |
|---|---|---|
| 本质 | 同一个文件的另一个名字 | 存放路径的快捷方式 |
| inode 编号 | 相同 | 不同 |
| 删除源文件后 | 还能用(数据还在) | 失效(指向的路径没了) |
| 能否跨分区 | 不能 | 能 |
| 能否指向目录 | 不能 (.、.. 除外) |
能 |
| 类比 | 同一个人有两个户口本 | 桌面上的快捷方式 |
怎么判断是哪种链接
bash
ls -l soft.txt
# lrwxrwxrwx ... soft.txt -> a.txt
# 开头是 l,并且有 -> 箭头,就是软链接
标准答法(背这一句)
硬链接和源文件指向同一个 inode ,相当于给文件起了个新名字,删掉源文件数据还在;软链接存的是路径,是一个快捷方式,删掉源文件就失效了。软链接可以跨分区、可以指向目录,硬链接不行。
四个底层推论(追问时用)
| 追问 | 怎么答 |
|---|---|
| 为什么硬链接不能跨文件系统 | inode 编号只在单个文件系统内唯一,跨分区找不到对应 inode |
| 怎么看出还有几个硬链接 | ls -l 的第二列就是链接计数,减到 0 数据才真正释放 |
| 目录能做硬链接吗 | 不能(. 和 .. 除外),否则目录树会出现环路 |
| 软链接存的是什么 | 一段路径字符串,内核访问时重新解析 |
Q7 什么是软链接?
考察点 :软链接的边界情况 · 断链 · 权限位 被追问的原因 :只说「快捷方式」不够,要说出断链、权限位、怎么覆盖。
被追问时的 5 个细节
| 追问 | 怎么答 |
|---|---|
| 软链接的权限位有意义吗 | 没有 。软链接永远是 lrwxrwxrwx,能不能访问看目标文件的权限 |
| 写成相对路径会怎样 | 相对路径是相对链接文件所在目录解析的;把链接挪到别处就断了(跨目录一般写绝对路径) |
| 什么是断链(dangling link) | 目标被删或移走后:ls -l 一般显示成红色,file 报 broken symbolic link;此时 test -L 为真、test -e 为假 |
| 怎么覆盖已有的链接 | ln -sf 目标 链接名(-f = 覆盖);不加 -f 会报 File exists |
| 怎么知道它指向哪 | ls -l 看 -> 箭头;readlink 链接;readlink -f 链接 解析成最终绝对路径 |
实战场景(说出来比背定义有用)
版本发布常用软链接切流:
/opt/app/current -> /opt/app/v1.2,回滚就是把链接指向 v1.1;Nginx 的sites-enabled也是指向sites-available的软链接。
速记卡
| 关键词 | 一句话 |
|---|---|
df vs du |
df 看分区剩余,du 看目录占用 |
2>&1 |
把 stderr 指到 stdout 当前所在的位置 |
| 硬链接 | 同 inode,删源可用,不能跨分区、不能指目录 |
| 软链接 | 存路径,删源即断,可跨分区、可指目录 |