当前机器上的 /dev/null 已经损坏。
错误状态:
-rw-r--r-- 1 root root 0 Jun 2 08:47 /dev/null正常状态应该是:
crw-rw-rw- 1 root root 1, 3 /dev/null区别:
错误:-rw-r--r-- 普通文件
正确:crw-rw-rw- 字符设备
/dev/null 损坏后,很多程序会异常,例如:
git
sudo
ssh
shell
make
编译脚本
systemd 服务
后台程序
典型报错:
fatal: could not open '/dev/null' for reading and writing: Permission denied根本原因不是 Git 仓库损坏,而是系统设备节点 /dev/null 被误改成了普通文件。
本文只描述:
现场物理开关机
进入 GRUB
进入 recovery mode 或 init=/bin/bash
修复 /dev/null
重启系统
验证恢复
不依赖 SSH,不依赖远程登录。
需要现场具备以下条件之一:
显示器 + 键盘
服务器远程控制台
IPMI / iKVM
串口控制台
如果是普通服务器,最直接方式是:
1. 给服务器接显示器
2. 接 USB 键盘
3. 现场按电源键重启
4. 开机时进入 GRUB
如果系统还在运行,先短按一次电源键。
正常情况下,Linux 会收到 ACPI power button 事件,然后执行正常关机。
等待机器关机后,再按电源键开机。
如果短按电源键没有反应,或者系统已经卡住,可以长按电源键强制断电。
一般操作:
长按电源键 5 ~ 10 秒
等待机器完全断电
再按电源键开机
注意:强制断电可能导致未同步的数据丢失,但当前需要进入恢复环境修复系统设备节点。
机器重新上电后,看到主板 Logo 或黑屏刚亮时,马上连续按键。
连续点按:
Esc
按住或连续点按:
Shift
不确定时可以这样操作:
开机后连续点按 Esc
同时可以尝试按住 Shift
看到类似菜单,说明进入了 GRUB:
Ubuntu
Advanced options for Ubuntu
UEFI Firmware Settings
在 GRUB 菜单中选择:
Advanced options for Ubuntu
按回车。
选择带有:
recovery mode
的启动项,例如:
Ubuntu, with Linux 5.10.xxx-generic (recovery mode)
按回车进入。
进入 recovery 菜单后,选择:
root - Drop to root shell prompt
按回车。
如果提示按 Enter 继续,就按 Enter。
进入 root shell 后,先把根文件系统重新挂载为可写:
mount -o remount,rw /删除错误的普通文件 /dev/null:
rm -f /dev/null重新创建正确的字符设备:
mknod -m 666 /dev/null c 1 3设置属主:
chown root:root /dev/null检查结果:
ls -l /dev/null正确结果必须类似:
crw-rw-rw- 1 root root 1, 3 /dev/null测试写入:
echo test > /dev/null如果没有报错,说明 /dev/null 修复成功。
同步磁盘:
sync重启:
reboot -f如果 recovery mode 进不去,或者菜单里没有 recovery mode,可以使用 init=/bin/bash 方式进入最小 root shell。
在 GRUB 主菜单中,选中普通启动项:
Ubuntu
不要回车,按:
e
进入编辑界面。
找到以 linux 开头的那一行,类似:
linux /boot/vmlinuz-xxx root=UUID=xxx ro quiet splash
需要做两处修改。
第一,把:
ro
改成:
rw
第二,在这一行最后加上:
init=/bin/bash
最终类似:
linux /boot/vmlinuz-xxx root=UUID=xxx rw quiet splash init=/bin/bash
按:
Ctrl + X
或者:
F10
启动。
系统会直接进入 root shell。
进入 shell 后执行:
mount -o remount,rw /
rm -f /dev/null
mknod -m 666 /dev/null c 1 3
chown root:root /dev/null
ls -l /dev/null
echo test > /dev/null
sync正确的 /dev/null 应该显示为:
crw-rw-rw- 1 root root 1, 3 /dev/null然后重启:
reboot -f如果 reboot -f 不生效,可以尝试:
exec /sbin/init如果仍然不行,现场短按或长按电源键重启。
有些 Ubuntu 默认隐藏 GRUB 菜单。
可以尝试以下方式:
1. 机器刚上电就连续点按 Esc
2. 如果 Esc 无效,重启后按住 Shift
3. 如果仍然无效,尝试在 BIOS Logo 出现前后反复按 Esc
4. 使用有线 USB 键盘,避免无线键盘在 BIOS 阶段不可用
5. 更换主板后置 USB 口,不要接前置 Hub
如果还是看不到 GRUB,建议使用 Live USB / Rescue 模式修复。
如果 GRUB 无法进入,可以用 Ubuntu Live USB 启动。
进入 Live 系统后,先找到原系统根分区:
lsblk -f假设原系统根分区是 /dev/sda2,挂载它:
sudo mount /dev/sda2 /mnt如果系统有单独的 /boot 分区,也需要挂载:
sudo mount /dev/sda1 /mnt/boot进入原系统根目录:
sudo chroot /mnt修复 /dev/null:
rm -f /dev/null
mknod -m 666 /dev/null c 1 3
chown root:root /dev/null
ls -l /dev/null
echo test > /dev/null
sync
exit卸载并重启:
sudo umount /mnt/boot 2>/dev/null || true
sudo umount /mnt
sudo reboot系统正常启动后,在本地终端或后续 SSH 中执行:
ls -l /dev/null必须看到:
crw-rw-rw- 1 root root 1, 3 /dev/null再执行:
echo test > /dev/null不报错说明正常。
然后回到原来的 Git 仓库:
cd ~/workspace/Rockchip/rk3588/linux/SS-rk3588-linux/ubuntu
git add .如果 git add . 不再报:
fatal: could not open '/dev/null' for reading and writing: Permission denied说明问题已经修复。
mount -o remount,rw /
rm -f /dev/null
mknod -m 666 /dev/null c 1 3
chown root:root /dev/null
ls -l /dev/null
echo test > /dev/null
sync
reboot -f正确结果:
crw-rw-rw- 1 root root 1, 3 /dev/null本问题的核心是:
/dev/null 被错误地变成普通文件,导致系统程序无法正常读写 /dev/null。
正确修复方式是:
删除错误的 /dev/null
重新创建字符设备 c 1 3
权限设置为 666
属主设置为 root:root
现场处理优先级:
1. 物理重启进入 GRUB
2. 优先进入 recovery mode
3. recovery 不行则使用 init=/bin/bash
4. GRUB 进不去则使用 Live USB / Rescue 模式