执行 rm 后恢复 /dev

执行 rm 后恢复 /dev

在从 livesvd 安装 gentoo 的过程中,有一个步骤是创建一个 dev 目录,稍后将在安装目标的 chroot 中使用

就是这样做的

mount --rbind /dev /mnt/gentoo/dev

在安装过程中,我决定重新开始...所以我就这么做了

rm -fr /mnt/gentoo/*

没多想(“只需再次解压 stage3 tar 包”)我从我的实际 /dev 中删除了大多数设备文件,因为 chroot 中的文件只会绑定到真实设备。

现在,简单的解决方案是:重启。我知道如果我重启,它们会再次出现。但这是一个没有持久性的 LiveDVD。所以如果我重启,我将失去大约 1 小时的固件准备时间等等,

现在我将重新启动。但如果这种情况再次发生,我想了解如何恢复 /dev(因为现在我需要知道,即使我永远不会再使用它)


更新:刚想起来关于 LFS。阅读 Linux 从头开始​​的文档,我认为最简单的解决方法是调用

 /etc/init.d/udev restart

现在大多数文件似乎都在那里。

答案1

2014 年更新:最新的 udev 版本根本不创建设备节点,而是依靠内核的 devtmpfs 来创建。因此,如果您的发行版有最新的 udev,那么旧答案将停止工作。使用 devtmpfs,唯​​一的自动化方法可能是重新启动。


/dev 在大多数 Linux 发行版中由 udev 管理,因此

udevadm trigger

应该有帮助。

完全重新启动 udev 也可以,但这不是必需的,并且命令高度依赖于所使用的发行版。

注意:在该命令起作用之前,您必须手动创建一些项目。/dev/{zero,null}

答案2

由于似乎没有办法/dev通过重新启动来自动恢复所有文件,因此:

# mknod -m 666 /dev/null c 1 3 
# mknod -m 666 /dev/ptmx c 5 2

上述两个命令恢复了工作终端(新选项卡)和启动新 GUI 应用程序(包括新终端窗口)的能力。从https://tldp.org/LDP/lfs/LFS-BOOK-6.1.1-HTML/chapter06/devices.html“Linux From Scratch - 版本 6.1.1、6.8。填充 /dev”。据我所知,整体上已经过时,但部分内容有用。

答案3

以下是 Alex Martian 的答案的扩展:

我还发现 udevadm 不会恢复所有文件。我陷入了 mknod 的困境,并编写了一个脚本来更完整地恢复 /dev。首先,创建 /dev 的备份:

 find /dev | xargs stat > devstat.txt

(当然最好在事故发生前的同一台机器上创建备份,但我所做的是在“足够相似”的机器上创建备份)

然后运行以下脚本,它将输出恢复 /dev 内容的命令:

#!/bin/bash

c=0
l=0
d=0

while IFS= read -r line
do
        if [[ $line =~ File:\ (.*) ]]; then
                file=${BASH_REMATCH[1]}
        fi  
        if [[ $line =~ File:\ (.*)\ -\>\ (.*) ]]; then
                file=${BASH_REMATCH[1]}
                link=${BASH_REMATCH[2]}
        fi  
        if [[ $line =~ Device\ type:\ ([0-9a-f]+),([0-9a-f]+) ]]; then
                major=${BASH_REMATCH[1]}
                minor=${BASH_REMATCH[2]}
        fi  
        if [[ $line =~ character\ special\ file ]]; then
                c=1 
        fi  
        if [[ $line =~ symbolic\ link ]]; then
                l=1 
        fi  
        if [[ $line =~ directory ]]; then
                d=1 
        fi  
        if [[ $line =~ Access:\ \(([0-7]+)/c[rwx-]+\) ]]; then
                perm=${BASH_REMATCH[1]}
        fi  
        if [[ $line =~ Uid:\ \(\ *[0-9]+/\ *([a-z]+)\) ]]; then
                uid=${BASH_REMATCH[1]}
        fi  
        if [[ $line =~ Gid:\ \(\ *[0-9]+/\ *([a-z]+)\) ]]; then
                gid=${BASH_REMATCH[1]}
        fi  
        if [[ $line =~ Birth ]]; then
                if [[ $c -eq 1 ]]; then
                        echo mknod -m $perm $file c 0x$major 0x$minor
                        echo chown $uid:$gid $file
                fi  
                if [[ $l -eq 1 ]]; then
                        echo ln -s $link $file
                        echo chown $uid:$gid $file
                fi  
                if [[ $d -eq 1 ]]; then
                        echo mkdir -m $perm $file
                        echo chown $uid:$gid $file
                fi  
                c=0 
                l=0 
                d=0 
        fi  
done < devstat.txt

检查创建的命令,然后在相关机器上执行它们。

相关内容