lnを使用せずにシンボリックリンクを作成する方法は?


31

重要なシンボリックリンクを削除しました- libc.so.6。私はそれが指すはずのファイルを持っていますが、リンクがないために、lnまたはのような基本的なコマンドwgetはもう機能しません。ただし、echoまたは他のBashビルトインは機能します。

このシンボリックリンクを再作成する方法を探しています。


1
@Sebasは、私はあなたがすべての意味だと思うバッシュの組み込みコマンドだけでなく、echo
クリスティアンシウピトゥ14年

@CristianCiupitu多分、それは何ですか?cat無効になっています...実際にはすべてがそうでした。
セバス

1
@Sebas、それcatは外部プログラムだからです。Bashの組み込みコマンドのマニュアルページには、利用可能何ができるかについての詳細を持っています。
クリスチャンシウピトゥ14年

3
他の多くの* nixシステムには、それらの「おっと」瞬間だけ静的にリンクされた標準ユーティリティの「レスキュー」バージョンがあるので、「Unix」と言うとき、GNU / Linuxベースのシステムを意味すると思います。
クリスS

ここでは...私が唯一の解決策になりchrootする考えだ
rubenvbは、

回答:


58

ldconfigを使用すると、シンボリックリンクが再作成されます。

# rm /lib/libc.so.6 
rm: remove symbolic link `/lib/libc.so.6'? y
# ls -l /lib/libc*
ls: error while loading shared libraries: libc.so.6: cannot open shared object file:
# ldconfig 
# ls -l /lib/libc*
[skip]
lrwxrwxrwx. 1 root root      12 May 11 07:59 /lib/libc.so.6 -> libc-2.12.so

あなたが見るように、ちょうどそれをテストしました。


4
そして、便利なことに、/ sbin / ldconfigは静的にリンクされています。ldconfigは、そもそもこれらのシンボリックリンクを担当します。
エーテルフィッシュ

16
それは実際には「便利な」だけではなく、静的にリンクされたバイナリは、動的ライブラリを維持するツールの必要な設計コンポーネントです。しかし、それがこの問題を修正するための理想的なツールであり、私見は唯一の「正しい」方法です。ここでの質問は、削除されたシンボリックリンクに関するものではなく(それらの99.999%は結果なしに削除できます)、「システムの動的ライブラリストアを壊しました」です。@natxoの提案である「そのストアを管理するツールを使用して修正する」ことは明白で賢明です。それ以外(手動でリンクを再作成する)は、ハッキングの回避策です。
FeRD

はい、他の答えも正しかったとしても、これは実際には続行するのがより論理的です。
セバス

(ネクロマンシー、申し訳ありません)これが重要な最大の理由、ところで、シンボリックリンクを削除することが、動的ライブラリストアを台無しにする唯一の方法ではありません。たとえば、/lib/libc-2.12.so上記の例で誤って名前を変更したとします/lib/foobar。まあ、がらくた、これ以上mv。しかし、間違った名前のファイルldconfig -l /lib/foobar/lib/libc.so.6指すのに十分なほどスマートです。(引数が必要であり、デフォルトは「LIB」で始まり、「.soが」含まれていないファイル名を無視します。)これであなたができるポイント戻ってそれを(または、その後、実行しますが、/スマートだ偏執場合)、再びクリーンアップします。ldconfigmvcp -pldconfig
FeRD

44

CentOS 6には通常busybox、にインストールされた静的にリンクされたUnixツールのセットが付属してい/sbinます。次のように実行できます。

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6

1
+1、テストvmでシンボリックリンクを削除した後にテストしました
。centos6.5で動作

+1これは、質問タイトルの一般的な質問にも答えます。
MattBianco

Debian / Ubuntuでは/ bin / busybox
PHZ.fi-Pharazon

23

LD_PRELOADを設定して、関連するライブラリをプリロードします。libpthreadで試してみたところ、うまくいくようです:

root@spirit:~# mv /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libpthread.so.0-bak
root@spirit:~# chattr
chattr: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
root@spirit:~# LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0-bak chattr
Usage: chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files...

興味深いことに、他の人が言ったことで再編成されます。
セバス

21

slnまさにその目的を果たします:シンボリックリンクを壊したために通常のlnを使用できない場合にシンボリックリンクを修正します。そのmanページを引用するには:

説明

  The  sln  program creates symbolic links.  Unlike the ln(1) program, it
  is statically linked.  This means that if for some reason  the  dynamic
  linker  is  not  working,  sln  can  be  used to make symbolic links to
  dynamic libraries.

いいですね、私はこのツールを知りませんでした。それはデフォルトでインストールする必要がありますので、CentOSのでは、glibcのの一部である
アセンホnatxo

8

LD_LIBRARY_PATHreal libc.so.6が存在するディレクトリを含めるように変数を設定できます。

 export LD_LIBRARY_PATH="/dir/for/libc.so.6/:$LD_LIBRARY_PATH"

また、ldconfigそれを実行してリンクを再作成します。これによりコマンドが機能するようになり、コマンドを使用lnしてシステムを修正できるようになります。

別の方法は、LiveCDから起動し、そこにファイルをリンクすることです。


次に、livecdからブートしてchrootでファイルをリンクする唯一の方法。
フープ14年

1
また、libc.so.6ファイルがあるディレクトリを含めるようにLD_LIBRARY_PATHを設定する必要があります。これにより、libが見つかるはずなので、コマンドを使用できます。
フープ14年

申し訳ありませんが、最初はこれを考えていませんでした。
フープ14年

2
リンクされたファイルの名前がlibc.so.6ではないため、機能しません。私の答えのようにLD_PRELOADを設定する必要があります。
デニスカースメーカー14年

1
Fedora 20で試しましたが、うまくいきませんでした。
クリスティアンシウピトゥ14年

-4

scpまたはsftpを使用して、lnの静的にリンクされたバージョンをコピーします。実行可能であることを確認してください。次に、それを使用してファイルを修正します。


1
scpとsftpは、そのファイルもロードできないため機能しません。
フローリンAsăvoaie14年

scp、sftp、ftpはリモートホストから実行されます。これは、故障したマシンのデーモンがすでに実行されていることを前提としています。ファイル転送の他の可能性は、ローカルまたはリモートのいずれかですでにマウントされているファイルシステムです。
ロバートジェイコブス

3
誤報を止めてください。SCPにはscpバイナリが存在する必要があり、両方のホストで実行されます。また、SFTPは、それぞれのバイナリを必要とするOpenSSHから新しいプロセスを起動します。ほとんどのFTPデーモンは同じことを行います。
フローリンアサボアイエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.