UNIX-意外将根目录下的所有内容移动到/ old-Solaris 10


13

正如标题所述,在Solaris 10计算机上,将根目录(/)下的所有重要的或几乎所有重要的根目录都移至/ old。所以现在尝试的典型故障时运行时,命令Cannot find /usr/lib/ld.so.1(改变$PATH,也试图改变$LD_LIBRARY_PATH$LD_LIBRARY_PATH_64$LD_RUN_PATH和出口,但他们没有,这似乎改变实际库路径)。昨天进行了很大的尝试,寻找了可能有帮助的东西,但没有发现任何东西可以改变Solaris 10的库路径,crle但也许自此之后就无法运行Cannot find /usr/lib/ld.so.1

找到了很多针对Linux的root或/ usr / bin恢复技巧等,但是有关Solaris 10 / Unix的信息并不多且非常稀疏。

不能运行cplnmkdirmvCannot find /usr/lib/ld.so.1。既不能与其他会话一起登录到计算机。尽管仍可以使用一个会话,并且该窗口已被暂停while true; do date; echo hej 1234567; done。我们已经讨论了使用Solaris引导CD以及USB驱动器上的Linux发行版的解决方案。我们已经讨论了将硬盘驱动器磁盘切换到另一个机架的解决方案。

/.../static/.../mv解决方案已经过测试,但是没有用。

仍然可以使用的命令(有可能是可以使用多个命令): ,echo<>>>|,。pwdcd

有没有一种方法可以创建目录或文件夹mkdir?有什么方法可以使用echoand >echoand >>恢复/usr/lib/ld.so.1?我知道/usr/lib/ld.so.1为了使命令正常工作,可能还需要恢复更多内容。

非常感谢您的阅读,并祝您有美好的一天=)


2
使用什么命令在/ old下移动东西?
schaiba

Solaris标准mv。或更确切地说:shopt -s extglob; mv !(old) /old
宣传

1
目前正在运行什么shell?一些炮弹具有内置命令
Ferrybig

如果可以的ln话,您可以使用修复它。
大卫·施瓦茨

2
“ /.../static/.../mv解决方案已经过测试,但是没有用。” 发生了什么?它是否给出了加载程序错误?究竟什么“没用”?static如果您不想引导临时媒体,则其中的二进制文件正是针对此类问题。
Ti Strga '17

Answers:


19

如果您不再具有以root用户身份运行的Shell,则必须重新启动进入应急媒体。只要能够以读写方式挂载根文件系统,任何操作都可以。

如果您仍然可以以root用户身份运行命令,那么一切都将是无用的。将环境变量设置LD_LIBRARY_PATH为指向包含基本系统工具使用的库的目录。至少/usr/lib在32位Solaris上,/usr/lib/64在64位Solaris上,可能在其他目录上(我现在无法访问Solaris 10进行检查)。要运行可执行文件,请在运行时链接程序前面加上前缀:(/usr/lib/ld.so.1对于32位可执行文件)或/usr/lib/64/ld.so.1(对于64位可执行文件),现在已移至/old。因此,您应该能够通过以下方式恢复:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /

聪明地使用装载机。如果整个层次结构都没有移到/old,我对Peschke自己的评论在这里也是有效的。mv不应使用,而是保留现有层次结构的命令,例如paxtar等等。
jlliagre

1
非常感谢您的耐心配合和抽出宝贵的时间来撰写本文。它现在运行像命令/old/usr/lib/ld.so.1 /old/usr/bin/mv/old/usr/lib/ld.so.1 /old/usr/bin/cp等。我会看到我能做什么,现在的问题是我的空间不足,但是我可能可以解决这个问题。
宣传

@propatience太糟糕了,您和Gilles没考虑我的评论……
jlliagre

1
是的,上帝!我设法移动与先回一切/old/usr/lib/ld.so.1 /old/usr/bin/mv/old/usr/lib/ld.so.1 /old/usr/bin/cp,但没有空间,所以不能使用/old/usr/lib/ld.so.1 /old/usr/bin/cp。然后进行编辑$PATH,然后使用文件夹逐个mv更改$PATH。现在所有内容都移回了,所以我可以再次登录并输入df -h和所有内容。非常感谢大家。真的,非常感谢@Gilles!谢谢StackExchange!
宣传

1
LD_LIBRARY_PATH如果需要进行设置,那么在Solaris上进行设置会有一些危险,因此可以同时运行32位和64位可执行文件。最好使用LD_LIBRARY_PATHSolaris中可用的32位和64位特定版本。在这种情况下: LD_LIBRARY_PATH_32=/old/usr/libLD_LIBRARY_PATH_64=/old/usr/lib/64请参见ld.so.1手册页:“每个环境变量都可以用_32或_64后缀指定。这使环境变量分别特定于32位或64位进程。”
安德鲁·亨利

16

仅使用shell内置命令就无法创建目录或复制二进制文件(尽管Gilles 在他的答复中描述了一个聪明的潜在解决方法)。

最好的选择是在外部介质(DVD,U盘)上引导Solaris,安装或导入文件系统,并使用以下方法修复混乱情况:

  • 引导Solaris安装盘,然后选择运行Shell。

  • 将旧的根目录(以及所有其他文件系统,如果有的话)挂载在/mnt或目录下/a。Solaris引导磁盘在检测到现有文件系统时可能会帮助您执行此操作。

  • 使用以下命令将文件放回原始位置(假设所有文件都安装在下/mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • 重新启动系统

    init 6
    

如果您正在使用ZFS并且存在最近的快照,/old则也可以选择将目录备份到其他位置,然后还原到最后一个快照。


好答案。引导至应急USB,挂载文件系统,然后执行类似操作mv /mountpoint/old/* /mountpoint
Peschke

1
@Peschke谢谢,尽管盲目运行建议的mv命令不是我的建议。OP写道“所有或几乎所有 ”。在第二种情况下,移动将破坏仍然存在的目录。我可能会使用像一个工具tarpaxcpio保留目标目录层次结构。
jlliagre

非常感谢您快速回复,也非常感谢您的回复。我明天可以试试看。
宣传

绑定到可能的快照(ZFS或UFS),如果使用实时升级,则可以启动到备用BE。 lustatus 而且不要惊慌。所有数据仍然存在于磁盘上。
sleepyweasel

0

Solaris包括了静态生成的基本工具(cplnmvrcp,和tar中)/usr/sbin/static,您可以使用修复与可用性的任何问题/usr/lib/ld.so.1,防止使用常规的动态链接的/usr/bin版本。

没有mkdir提供任何静态文件,但是您可以使用该静态ln文件临时链接包含lib/ld.so.1在目录中的任何目录/usr,然后使用标准文件mkdir创建所需的目录。您可以使用static重命名已经存在的目录mv


这至少可以追溯到Solaris 2.5.1,在那里我发现,ld.so.1如果您尝试手动运行股票segfault,如Gilles的示例所示
rakslice
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.