本文最后更新于 705 天前,其中的信息可能已经有所发展或是发生改变。
偶然间看到逼乎一个讨论:不小心敲了 rm -rf / 后反应是怎样的?作为21世纪新一代年轻人,当然是要有探险精神的。兴趣使然,让我自己来测试一下。
注:以下测试皆在Ubuntu官方docker中进行,请勿在自己的虚拟机甚至真机中进行测试;当然如果你想在老板的生产环境中测试,先提前写好离职申请和找好律师。
胡言乱语
从删库到跑路
首先我们使用
rm -rf /
无事发生,会看到提示说移除根目录下文件是个危险行为,必须使用参数--no-preserve-root
,显而易见rm对根目录有保护,避免手贱。
当然探索不能止步于此,我们加上参数试试:
root@3da0ab4b8f93:/home# rm -rf / --no-preserve-root
rm: cannot remove '/dev/shm': Device or resource busy
rm: cannot remove '/dev/mqueue': Device or resource busy
...
rm: cannot remove '/sys/module/drm/sections/.data': Read-only file system
rm: cannot remove '/sys/module/drm/sections/.altinstr_replacement': Read-only file system
...
rm: cannot remove '/dev/pts/1': Operation not permitted
rm: cannot remove '/dev/pts/0': Operation not permitted
rm: cannot remove '/dev/pts/ptmx': Operation not permitted
大概有三类操作报错,设备或资源正在运行无法删除(Device or resource busy)或者只读文件系统不可写(Read-only file system)或者操作不被允许推测这个时候可能已经移除了操作或者权限关键文件(Operation not permitted)。
这个时候试一下常见的命令,已经长这样了:
也无法进行关机操作,因为被删除了嘛
退出docker后发现容器仍然在运行,尝试连接容器,会告诉你无法连接容器,好家伙,进都进不去了。
尝试关闭容器,发现容器已经无法开机了。
这个时候只能忍痛rm掉容器了,废话,这玩意不删留着还能干什么呢~
如何避免吃牢饭
看了逼友们个个rm -rf */
后抢救的神操作,感叹高手之多,世界之大无奇不有。本菜鸡总结了一下在极端情况下的挽回操作:
- 从命令动手,每次删除都需要一次确认,将误删可能性遏制于摇篮之中。常见的安全rm有
apt install safe-rm
,在.bashrc里配置:
alias rm=safe_rm
export TRASH_DIR={your_path}/.__trash
safe_rm () {
local d t f s
[ -z "$PS1" ] && (/bin/rm "$@"; return)
d="${TRASH_DIR}/`date +%W`"
t=`date +%F_%H-%M-%S`
[ -e "$d" ] || mkdir -p "$d" || return
for f do
[ -e "$f" ] || continue
s=`basename "$f"`
/bin/mv "$f" "$d/${t}_$s" || break
done
echo -e "[$? $t `whoami` `pwd`]$@\n" >> "$d/00rmlog.txt"
- 阻止删除指令
chattr +i /bin
,即使root用户也没有办法改动文件。或者见到了骚操作mv文件到一个目录下,使用crontab定时删除目录。 - 一旦真删除了,最快的还是拉起快照和备份机,丢的数据多少全看备份和打快照间隔早晚。
- 备份快照都没有,将盘挂载到其他操作系统,能抢救多少是多少了。这东西要看手速,进程中断的越快越好。
- 请个好律师,认真准备官司,万一打赢了呢?