在从 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
检查创建的命令,然后在相关机器上执行它们。