意外重命名/ usr后,如何将其重命名?


62

我不小心将目录重命名/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

除了重新安装系统之外,是否可以重命名/usr_bakas /usr


2
这是哪个操作系统?我不知道该如何sudo进入库阶段,它通常处于/usr/bin/并且应该因未找到命令的错误而失败。另外,您是否设置了root密码?
大师

3
@muru这是Ubuntu。您是对的,我之前确实收到了错误not found,所以我将新路径附加/usr_bak/bin到了$PATH,现在我在这里的帖子中得到了错误...
Yves

2
@ user1717828这很复杂。我必须在Ubuntu 16.10上编译在Ubuntu 16.04上开发的项目。因此,我在考虑是否可以简单地复制/usrUbuntu 16.04的版本以覆盖/usrUbuntu 17.10的版本
Yves

6
您是否考虑过使用VM来编译项目而不是进行如此大的更改?
凯文(Kevin)

3
您可以在无头模式下运行virtualbox 。在另一台计算机上设置来宾或获得预先配置的来宾可能是最简单的。
凯文(Kevin)

Answers:


109

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

su -c '/bin/busybox mv /usr_bak /usr'

(虽然Busybox本身也有一个suapplet,但是/bin/busybox二进制文件不是setuid的,因此,除非以root用户身份运行,否则它将不起作用。)

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


73
现在,不要意外重命名/lib
sleblanc '18

5
LD_LIBRARY_PATH因为sudo是setuid,所以不会帮助运行sudo 。如果它的库不在正确的位置,则sudo在root对其进行修复之前将无法工作。
吉尔斯

3
@Yves历史记录:/sbin正是在这种情况下,旧版本的Unix(比Linux早得多)包括一小部分静态链接的二进制文件:“我正在做一些活动,将运行时库混在一起,但是需要仍然操纵文件。” 在发明Busybox之前,基本上采用相同的方法。(以这种方式提供的命令数量非常有限,因为那些静态链接的二进制文件吞噬了磁盘空间。)
Ti Strga,

8
@Yves如果您已重命名/lib,则可能必须重新启动至init=/bin/busybox
muru

3
@Yves:从USB随身碟启动,并提供可以安装文件系统的实时发行版,并且您都已准备好修复任何问题。如果您删除了某些内容,甚至可以从软件包镜像下载替换文件。
彼得·科德斯

33

除了muru的答案

  • 您可能已经使用了一些应急启动USB密钥来修复系统;例如,如果您的系统是Debian或Ubuntu,则以应急模式启动安装USB密钥,然后执行相应的mountand mvumount

  • 要能够修复更容易这样的错误,我一般也安装静电外壳有几个内置命令(尤其是与一些cprmmv样建宏)如sash(它被打包在Debian的和Ubuntu,并且也可作为绦3.8。 tar.gz(原始格式),然后启动并init=/bin/sash传递给Grub。

PS:sash有点越野车,并不完全符合Posix,但仍然非常有用。


您能否解释一下如何使用几个内置命令安装静态shell?有一些手册吗?
伊夫(Yves)

1
在Debian或Ubuntu上:apt-get install sash。但是您也可以下载sash-3.8.tar.gz并进行编译。
Basile Starynkevitch

我用一个自定义的grub条目将hdiso保留在硬盘上,以解决此类问题。无需变得复杂,只需启动实时操作系统并自由操作文件即可:)
FreeSoftwareServers

3

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

比实际上缺少/ usr或/ lib进入雷区更安全。


1
您可以直接从Grub / HDD引导ISO,而无需USB / DVD等。非常漂亮的grub具有呼叫回送功能。
FreeSoftwareServers

0

我遇到了类似的问题,我将其重命名/usr/bin/usr/bin_bkp进行测试,然后我无法重命名(因为该命令sudo在的标准目录中找不到/usr/bin),然后我/usr/bin_bkp手动进入了该目录(使用文件管理器) ),并且右键单击后的大多数功能(包括重命名)均被禁用。

然后我尝试了以下命令,它解决了这个问题

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

我从当前路径中调用了sudo并成功了,现在一切恢复正常。

操作系统:Xubuntu 14.04


-3

我现在无法尝试(不确定是否要这样做),但似乎应该为自己创建一个新的“ / usr”作为硬链接(而非软链接),以“ / usr_bak,然后删除“ / usr_bak”

ln /usr_bak /usr
rm /usr_bak

在文件系统中由“ ln”(不带 “ -s”参数)创建的硬链接应使usr和usr_bak目录同等有效。“ rm”只是删除您要求它删除的一个链接,而不是两个都删除。由于仍然存在指向内容的有效链接,因此应该可以通过“ / usr”中的其余链接来访问它们。


5
我的印象是Linux(或至少是Ubuntu)不允许硬链接到目录。例如,askubuntu.com / questions / 210741 /…
克里斯·

4
@Chris:是的,Linux不允许目录硬链接(.和和除外..,因此目录上的链接数会告诉您一级子目录的数量)。另外,rm不适用于目录,您必须使用rmdir。(lnrm处理到目录的符号链接,但我们正在谈论的是实际目录)。 另外,这并不能解决问题,因为它具有的权限,因此root就像一样需要mv/。如果可以运行此程序,则可以mv像普通人一样运行。
彼得·科德斯

2
大多数(所有?)Unices都不支持到目录的硬链接,因为对于执行递归文件系统爬网的软件来说,检测无限循环太困难了。如果该软件跟踪所有访问的inode并正在爬网inode的文件系统(即,不是FAT32 / NTFS),则有可能,但是检查符号链接而不遍历它们很容易。所需要做的只是快速调用lstat(2)来检查文件类型。
penguin359 '18

2
@Pryftan,我ln(1)在Debian上对-d/ -F/ --directory选项表示:“允许超级用户尝试硬链接目录(注意:即使是超级用户,也可能由于系统限制而失败)”。因此,您可以自由尝试,但是文件系统可能不会允许您。
Toby Speight

1
@TobySpeight另一个想法:另请参见symlink(7),其中:硬链接可能不引用目录(以防止在文件系统树中循环的可能性,这可能会使许多程序感到困惑),并且可能不引用不同文件系统上的文件(因为索引节点编号在文件系统中不是唯一的)。这使我认为硬链接尝试实际上可能是用措辞来表达发生的其他事情的方式,即调用该函数,但由于它是一个目录而导致失败。(文件系统参考是我在另一条评论中想到的)
Pryftan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.