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
相关推荐
HalvmånEver1 天前
Linux:线程互斥
java·linux·运维
番茄灭世神1 天前
Linux应用编程介绍
linux·嵌入式
wdfk_prog1 天前
[Linux]学习笔记系列 -- [drivers][mmc][mmc_sdio]
linux·笔记·学习
Forsete1 天前
LINUX驱动开发#9——定时器
linux·驱动开发·单片机
JY.yuyu1 天前
Docker常用命令——数据卷管理 / 端口映射 / 容器互联
运维·docker·容器
森G1 天前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
驱动探索者1 天前
linux mailbox 学习
linux·学习·算法
lpruoyu1 天前
【Docker进阶-06】docker-compose & docker swarm
运维·docker·容器
China_Yanhy1 天前
入职 Web3 运维日记 · 第 8 日:黑暗森林 —— 对抗 MEV 机器人的“三明治攻击”
运维·机器人·web3
艾莉丝努力练剑1 天前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann