不小心重命名 /usr 后,如何将其重命名?

Yve*_*ves 65 ubuntu sudo mv

我不小心将目录重命名/usr为/usr_bak.

我想改回去,所以我追加的路径/usr_bak/bin,以$PATH允许系统查找命令sudo。

但现在sudo mv /usr_bak /usr给了我错误:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

除了重装系统,有没有办法重命名/usr_bakas /usr?

mur*_*uru 112

由于您已经为 root 设置了密码,因此在 Ubuntu 中默认安装了su和busybox。所有su必需的库都在/lib. Busybox 是一组静态链接的实用程序,因此缺少库应该不是问题。做:

su -c '/bin/busybox mv /usr_bak /usr'
Run Code Online (Sandbox Code Playgroud)

(虽然 Busybox 本身也有一个su小程序,但/bin/busybox二进制文件不是 setuid,因此除非以 root 身份运行,否则它无法工作。)

如果您没有 root 密码,您可能可以使用 Gilles 的解决方案LD_LIBRARY_PATH,或者(Gilles 说这不适用于像 sudo 这样的 setuid 二进制文件)重新启动并编辑 GRUB 菜单以init=/bin/busybox作为内核参数启动并移动文件夹回来。

  • 现在,不要意外重命名`/lib`。 (76认同)
  • @Yves 如果你重命名了 `/lib`,那么你可能必须重新启动到 `init=/bin/busybox` (8认同)
  • `LD_LIBRARY_PATH` 不会帮助运行 sudo,因为 `sudo` 是 setuid。如果它的库不在正确的位置,则在 root 修复它之前 sudo 将无法工作。 (5认同)
  • @Yves 历史笔记:Unix 的旧版本(比 Linux 老得多)在`/sbin` 中包含了一小部分静态链接的二进制文件,正是这种情况:“我正在做 _some 活动,其中运行时库将被玩弄_但仍需要操作文件。” 与 Busybox 发明之前的方法基本相同。(以这种方式可用的命令数量非常有限,因为那些静态链接的二进制文件会占用磁盘空间。) (3认同)
  • @Yves:从 USB 记忆棒启动,带有可以挂载文件系统的实时发行版,您已经准备好修复任何问题。如果您删除了某些内容,甚至可以从包镜像下载替换文件。 (3认同)
  • @TiStrga 我经常想知道`/sbin` 是什么......我假设/看到过类似_“安全”二进制文件_的东西。现在我知道它是_静态二进制文件_。 (3认同)
  • @sleblanc 大声笑...说真的,如果我不小心重命名了`/lib`怎么办?我可以用同样的方法修复它吗? (2认同)
  • 如果你的 `/lib` 是一个指向 `/usr/lib` 的符号链接,它会变得更有趣:) `LD_LIBRARY_PATH` 和 `PATH` 来拯救这一天。[或者busybox也应该可以工作] (2认同)

Bas*_*tch 35

除了穆鲁的回答:

  • 您可以使用一些救援启动 USB 密钥来修复您的系统;例如,如果你的系统是Debian的一些或Ubuntu,引导救援模式下安装USB钥匙,并做适当的mount和mv和umount。

  • 为了能够更轻松地修复此类错误,我通常还会安装一个带有几个内置命令(特别是一些类似cp, rm, mv-like 的内置命令)的静态 shell,例如sash(它打包在 Debian 和 Ubuntu 中,也可以作为sash-3.8 使用。 tar.gz源代码)并init=/bin/sash通过传递给 Grub启动。

PS:sash有点小问题,不完全符合 Posix,但仍然非常有用。


小智 5

我认为最安全的方法是使用 USB、CD 或 DVD 引导的操作系统(Debian、Ubuntu、Suse 等)重新启动。然后挂载包含问题的驱动器并进行重命名。

比在 /usr 或 /lib 有效丢失的情况下启动到雷区更安全。