CentOS 误删 /dev 目录救援方案


文章目录

  • 前言
  • [一、场景 1:系统仍在运行(未重启,最优场景)](#一、场景 1:系统仍在运行(未重启,最优场景))
    • [1.1 步骤 1:强制触发 udev 设备枚举(核心操作)](#1.1 步骤 1:强制触发 udev 设备枚举(核心操作))
  • 二、场景二:进入单用户模式修复
    • [2.1 进入单用户模式](#2.1 进入单用户模式)
    • [2.2 挂载根分区为可读写](#2.2 挂载根分区为可读写)
    • [2.3 重建标准 IO 设备文件(核心操作)](#2.3 重建标准 IO 设备文件(核心操作))
    • [2.4 修复 SELinux 上下文(关键!)](#2.4 修复 SELinux 上下文(关键!))
    • [2.5 重置服务状态并重启 udevd](#2.5 重置服务状态并重启 udevd)
    • [2.6 验证修复结果](#2.6 验证修复结果)

前言

CentOS 系统中误删了/dev目录下的部分设备文件(而非整个目录),核心救援思路是利用 Linux 的udev(设备管理守护进程)自动重新枚举并创建缺失的设备文件 ------ 因为/dev是基于devtmpfs的内存文件系统,大部分设备文件可由系统自动重建,无需手动逐个创建(仅紧急场景需手动补全关键文件)。

核心前提说明

/dev下的设备文件分为两类,修复逻辑不同:

  • 动态设备文件(如/dev/sda、/dev/tty、/dev/eth0):由udev自动管理,触发扫描即可重建;
  • 静态核心设备文件(如/dev/null、/dev/zero、/dev/random):系统基础依赖,若缺失需优先手动创建(兜底)。

一、场景 1:系统仍在运行(未重启,最优场景)

此时devtmpfs仍挂载在/dev,仅部分文件被删,直接触发udev重新扫描即可自动重建:

1.1 步骤 1:强制触发 udev 设备枚举(核心操作)

根据 CentOS 版本执行对应命令,让udev重新识别所有硬件并创建缺失的设备文件:

bash 复制代码
# CentOS 7/8/9(systemd-udevd)
udevadm trigger --action=add  # 触发所有设备的"添加"事件
udevadm settle                # 等待udev完成所有设备文件的创建
systemctl restart systemd-udevd  # 重启udev服务(可选,确保生效)

# CentOS 6(传统udev)
service udev restart
udevadm trigger --action=add

如果在执行systemctl restart systemd-udevd命令时出现如下错误:

这个错误核心是系统无法找到 /dev/tty 这个关键的终端设备文件,这和你之前误删 /dev 目录直接相关 ------polkit(Linux 权限管理组件)需要访问 /dev/tty 来创建文本认证代理,但该设备文件缺失,导致权限认证流程失败。

  • 场景 1:系统仍能执行基本命令(未完全卡死)
    如果还能输入命令,按以下步骤快速恢复 /dev/tty 并修复认证问题:
    • 手动创建 /dev/tty 设备文件(兜底)
      若挂载后 /dev/tty 仍未自动生成,手动创建(/dev/tty 是字符设备,主设备号 5,次设备号 0):
bash 复制代码
mknod /dev/tty c 5 0
chmod 666 /dev/tty  # 赋予正确权限(所有用户可读写)

二、场景二:进入单用户模式修复

如果场景一(系统运行中)通过触发udev重新扫描自动重建时报错,如通过命令systemctl status systemd-udevd查看报错:

  • 遇到的核心问题是 systemd-udevd.service 启动失败,退出码为 208/STDIN(标准输入异常),且因重启频率过高被 systemd 限制 ------ 这和之前 /dev 目录误删直接相关:systemd-udevd 进程启动时需要访问 /dev/stdin(标准输入)等核心 IO 设备文件,但这些文件缺失 / 无法访问,导致进程无法读取 STDIN 而退出。
  • 因为 systemd-udevd 依赖的核心 IO 设备缺失,正常命令行操作可能受限,优先进入单用户模式修复:

2.1 进入单用户模式

  • 开机在 GRUB 菜单选中 CentOS 内核,按 e 进入编辑模式;
  • 找到 linux 开头的行,行尾添加 init=/bin/bash;
  • 按 Ctrl+X 启动,进入单用户命令行(根分区默认只读)。

2.2 挂载根分区为可读写

bash 复制代码
mount -o remount,rw /

2.3 重建标准 IO 设备文件(核心操作)

/dev/stdin/stdout/stderr 是指向 /dev/fd/0/1/2 的符号链接,先重建 /dev/fd 和相关设备:

bash 复制代码
# 1. 先挂载 devtmpfs(确保 /dev 基础结构)
mount -t devtmpfs none /dev

# 2. 重建 /dev/fd(文件描述符目录,依赖 /proc/self/fd)
mkdir -p /dev/fd
mount -t tmpfs -o mode=755,nosuid,nodev none /dev/fd
ln -s /proc/self/fd /dev/fd

# 3. 重建标准IO符号链接(stdin/stdout/stderr)
ln -sf /dev/fd/0 /dev/stdin
ln -sf /dev/fd/1 /dev/stdout
ln -sf /dev/fd/2 /dev/stderr

# 4. 重建核心终端设备(兜底)
mknod /dev/tty c 5 0 && chmod 666 /dev/tty
mknod /dev/null c 1 3 && chmod 666 /dev/null

2.4 修复 SELinux 上下文(关键!)

若系统开启 SELinux,/dev 设备文件重建后 SELinux 标签会丢失,导致 systemd-udevd 无法访问,需恢复上下文:

bash 复制代码
# 检查 SELinux 状态(enforcing 表示开启)
getenforce

# 恢复 /dev 目录的 SELinux 上下文
restorecon -Rv /dev

# 恢复 systemd-udevd 可执行文件的上下文
restorecon -v /usr/lib/systemd/systemd-udevd

2.5 重置服务状态并重启 udevd

  • 清除 systemd-udevd 的失败状态(解除启动频率限制):
bash 复制代码
systemctl reset-failed systemd-udevd
  • 启动 systemd-udevd 服务:]
bash 复制代码
systemctl start systemd-udevd
  • 触发 udev 全量扫描(重建 /dev 所有设备文件):
bash 复制代码
udevadm trigger --action=add
udevadm settle

2.6 验证修复结果

  • 检查 systemd-udevd 服务状态(显示 active (running) 即成功):
bash 复制代码
systemctl status systemd-udevd
  • 检查标准 IO 设备是否正常:
bash 复制代码
ls -l /dev/{stdin,stdout,stderr}
# 正常输出(符号链接指向 /dev/fd/0/1/2):
# lrwxrwxrwx 1 root root 15 1月 19 22:00 /dev/stdin -> /proc/self/fd/0
# lrwxrwxrwx 1 root root 15 1月 19 22:00 /dev/stdout -> /proc/self/fd/1
# lrwxrwxrwx 1 root root 15 1月 19 22:00 /dev/stderr -> /proc/self/fd/2
  • 退出单用户模式,正常启动系统:
bash 复制代码
exec /sbin/init
相关推荐
七七powerful2 小时前
docker 部署dirsearch并进行目录遍历扫描
运维·docker·容器
小码吃趴菜2 小时前
mysql
linux·运维·服务器
呉師傅2 小时前
东芝3525AC彩色复印机打印配件寿命和打印错误记录方法【实际操作】
运维·服务器·网络·windows·电脑
霖霖总总2 小时前
[小技巧37]解构 my.cnf:[client] 与 [mysql] 背后的加载逻辑与优先级
运维·mysql
慾玄2 小时前
第一次渗透
linux
信创工程师-小杨2 小时前
项目实战:国产银河麒麟SP3服务器部署WordPress博客
运维·服务器
物理与数学3 小时前
Linux 内核 TLB 优化
linux·linux内核
啟明起鸣3 小时前
【Linux 项目管理工具】GDB 调试是现成 C/C++ 项目的 “造影剂”,用来分析项目的架构原理
linux·c语言·c++
物理与数学3 小时前
linux 交换分区(Swap)
linux·linux内核