在我们的生产服务器中,它突然/dev/null
变成了一个常规文件,因此 sshd 服务停止了,无法登录服务器。我们还尝试了以下步骤来配置回字符设备文件,
rm -rf /dev/null
mknod /dev/null c 1 3
一旦我们运行该rm
命令,它/dev/null
就会被重新创建为常规文件,然后mknod
才能运行。我们无法弄清楚这是怎么发生的,以及哪个组件正在创建此文件。因此,在我们解决这个问题之前,我们无法将其创建/dev/null
为字符设备文件。
答案1
当您删除 (rm) /dev/null 时,任何正在运行且需要 ">/dev/null" 或等效文件的程序/脚本都将重新创建一个具有该名称的新 (常规) 文件。这些文件可以随时生成 (有些文件还可能不断写入)
打败他们的方法:
你创建一个新的 /dev/null 特殊文件(使用不同的名字)
mknod /dev/newnull c 1 3
chmod 777 /dev/newnull
然后你以 root 身份将其移到连续创建的目录中:
mv -f /dev/newnull /dev/null
然后你才能重新启动(如果没有正确的 /dev/null 文件就不要重新启动……这通常并不容易)[我忘了这一步,当然这是必要的。感谢@Random832 的提醒!]
最后你需要重新启动,以摆脱现有的程序,该程序仍然会打开“/dev/null”,并且仍然会写入文件系统,即使你之后替换了它,一点一点地填满那个文件系统)(事实上,就像删除文件时一样,任何仍然打开该文件描述符的程序仍然能够写入前一个 inode,即使文件名现在指向新的 inode)
答案2
您可以运行lsof /dev/null
并查看是否有一个进程已打开,但它不会显示实时发生的情况。
另一种选择是制造该设备并将其移动到位。
mknod /dev/null.tmp c 1 3 && mv /dev/null.tmp /dev/null
但我首先想知道是什么破坏了系统。您最近是否更改了可能导致此问题的任何内容?
答案3
您无法重新创建的原因/dev/null
可能是某些东西正在不断地向其写入这样的信息:
echo "foo" > /dev/null
检查文件的内容将告诉您它可能是什么进程。
要立即修复您的系统,请按照以下说明操作:
- 关闭系统
- 启动
init=/bin/bash
- 重新挂载/可写
- 创建字符设备
- 重启
我强烈建议对系统进行彻底检查,以确定 /dev/null 是如何被删除的。确保您的系统没有受到损害,彻底检查系统日志。
答案4
我在我的 archlinux 系统上找到了原因并进行了修复。
如果您使用 bash 并且环境中存在 HISTFILE=/dev/null,则您执行的命令不应超过 $HISTFILESIZE 或 $HISTSIZE。如果您在 Bash 上执行的命令多于 $HISTFILESIZE,而 HISTFILE 为 /dev/null 并且您退出了 Bash,则 Bash 会将 /dev/null 移动到其他位置,并将 /dev/null 重新创建为具有权限 600 的常规文件。
如果您在 emacs 24.4 上使用 tramp,tramp-sh.el 会将 HISTFILE 设置为 /dev/null。因此,如果 bash 是 root 的 shell,并且您在 emacs 24.4 上使用 tramp 执行大量 root 操作,则当您终止 emacs 时,tramp 会使 bash 删除 /dev/null。
请检查 .bashrc 或 emacs 24.4 等程序中 HISTFILE 是否设置为 /dev/null。
就我而言,将 shell 更改为 zsh 可以解决 tramp 导致 bash 在 emacs 24.4 上删除 /dev/null 的问题。