誤って/ 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_bak/usr、システムを再インストールする以外には?


2
これはどのOSですか?どうやっsudoてライブラリのステージにたどり着いたのだろうか、それは通常入っ/usr/bin/ていて、command-not-foundエラーで失敗するはずだった。また、rootパスワードが設定されていますか?
ムル

3
@muruそれはUbuntuです。あなたは正しいです、私はnot found前にエラーを取得しましたので、新しいパスを追加/usr_bak/bin$PATH、今ここで私の投稿にエラーが表示されます
Yves

2
@ user1717828それは複雑です。Ubuntu 16.04、Ubuntu 17.10で開発されたプロジェクトをコンパイルする必要があります。/usrUbuntu 16.04を単純にコピーして/usrUbuntu 17.10 を上書きできるかどうか考えています...-
Yves

6
このような大幅な変更の代わりに、VMを使用してプロジェクトをコンパイルすることを検討しましたか?
ケビン

3
virtualboxをヘッドレスモードで実行できます。別のマシンでゲストをセットアップするか、事前に構成されたゲストを取得するのが最も簡単な場合があります。
ケビン

回答:


109

rootのパスワードを設定しているため、Ubuntuにデフォルトでインストールされているsuおよびを使用busyboxします。すべてsuの必須ライブラリはにあり/libます。Busyboxは静的にリンクされたユーティリティのコレクションであるため、ライブラリがなくても問題はありません。行う:

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

(Busybox自体にもsuアプレットがありますが、/bin/busyboxバイナリはsetuidではないため、rootとして実行しない限り機能しません。)

ルートパスワードを持っていない場合は、おそらくここを使用してGillesのソリューションを使用LD_LIBRARY_PATHするか、(Gillesはsudoのようなsetuidバイナリでは動作しないとリブートし、GRUBメニューを編集init=/bin/busyboxしてカーネルパラメーターとして起動して移動します)フォルダーを戻します。


73
誤っての名前を変更しないでください/lib
sleblanc

5
LD_LIBRARY_PATHsudosetuidであるため、sudoを実行するのに役立ちません。ライブラリが適切な場所にない場合、ルートが修復するまでsudoは機能しません。
ジル 'SO-悪であるのをやめる'

3
Unixの古い味(Linuxのよりずっとずっと年上であること)で静的にリンクされたバイナリの小さなコレクションに含ま:歴史的なノートを@Yves /sbinシナリオの正確その種のために:「私はやっているランタイムライブラリは、周りのジャグリングされるいくつかの活動をが、まだファイルを操作する必要があります。」Busyboxが発明される前は、基本的に同じアプローチです。(この方法で使用できるコマンドの数は非常に限られていた。これらの静的にリンクされたバイナリがディスクスペースを
食い尽くすからだ

8
@Yvesの名前を変更した場合/lib、おそらく再起動する必要がありますinit=/bin/busybox
-muru

3
@Yves:USBスティックから起動し、ファイルシステムをマウントできるライブディストリビューションを使用して、何でも修正する準備ができました。何かを削除した場合は、パッケージミラーから置換ファイルをダウンロードすることもできます。
ピーター

33

muruの答えに加えて:

  • レスキューブートUSBキーを使用してシステムを修復することもできます。たとえば、システムがDebianまたはUbuntuである場合、インストールUSBキーをレスキューモードで起動し、適切なmountand mvおよびを実行しますumount

  • より容易にそのような誤りを修復することができるように、私は一般的に、いくつかの組み込みコマンドと静的シェルをインストール(特にいくつかとcprmmv様組み込みコマンド)などsash(それはパッケージ化のDebianとUbuntuの中に、そしてなども利用可能サッシ-3.8。 tar.gzをソース形式で)、ブートinit=/bin/sashしてGrubに渡します。

PS:sashわずかにバグがあり、Posixに完全に準拠しているわけではありませんが、非常に便利です。


いくつかの組み込みコマンドを使用して静的シェルをインストールする方法を説明してください。マニュアルはありますか?
イヴ

1
DebianまたはUbuntuの場合:apt-get install sash。ただし、sash-3.8.tar.gzをダウンロードしてコンパイルすることもできます。
バジルスタリンケビッチ

このような問題のために、カスタムgrubエントリを使用してhddにliveisoを保持します。複雑になる必要はありません。ライブOSを起動してファイルを自由に操作するだけです。)
FreeSoftwareServers

3

最も安全な方法は、USB、CD、またはDVDブートOS(Debian、Ubuntu、Suseなど)を使用して再起動することです。次に、問題のあるドライブをマウントし、名前を変更します。

/ usrまたは/ libが事実上欠落している地雷原から起動するよりも安全です。


1
USB / DVDなどを必要とせずに、Grub / HDDから直接ISOを起動できます。かなり気の利いたトリック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を呼び出して動作しましたが、すべて正常に戻りました。

OS:Xubuntu 14.04


-3

私は今、この権利をしようとしていない(と私はしたいと思いますわからない)、それはのように思えるできるはずと自分自身に「USR /」新しいを作成するために動作するようにハードリンク(ないソフトリンク)あなた」へ/ usr_bak、次に「/ usr_bak」を削除します

ln /usr_bak /usr
rm /usr_bak

(との「LN」により作成されたハードリンクがないファイルシステムに「-s」引数)は、両方のusrとusr_bakディレクトリ問題のディレクトリにも同様に有効なリンクを作成する必要があります。「rm」は、両方を削除するのではなく、削除を要求した1つのリンクを削除するだけです。コンテンツへの有効なリンクがまだあるため、「/ usr」にある残りのリンクからアクセス可能なままにしておく必要があります。


5
Linux(または少なくともUbuntu)はディレクトリへのハードリンクを許可しないという印象を受けました。例えば、askubuntu.com/questions/210741/...
クリス・ブシャール

4
@Chris:そうですね、Linuxはディレクトリのハードリンクを許可していません(と以外の場合.、ディレクトリのリンク..数は第1レベルのサブディレクトリの数を示します)。また、rmディレクトリでは機能しませんrmdir。使用する必要があります。(lnそしてrmディレクトリへのシンボリックリンクを作成しますが、実際のディレクトリについて話します)。 また、これは問題を解決しませんrootmv/というのは、の権限のためにのよう必要になるからです。これを実行できれば、mv代わりに普通の人のように実行できます。
ピーター

2
ディレクトリへのハードリンクは、ほとんどの(すべて?)ユニックスでサポートされていません。これは、ソフトウェアが再帰的なファイルシステムクロールを実行して無限ループを検出するのが難しすぎるためです。ソフトウェアがアクセスされたすべてのiノードを追跡し、iノード対応ファイルシステム(FAT32 / NTFSではない)をクロールしている場合は可能ですが、シンボリックリンクをチェックしてそれらをトラバースしない方がはるかに簡単です。必要なのは、ファイルの種類を確認するためにlstat(2)をすばやく呼び出すことだけです。
ペンギン359

2
@ Pryftan、ln(1)Debianのmy は、これを-d/ -F/ --directoryオプションについて次のように述べています。だからあなたは自由に試してみることができますが、おそらくあなたのファイルシステムはあなたを許さないでしょう。
トビースパイト

1
@TobySpeight別の考え:symlink(7)も参照してください:ハードリンクはディレクトリを参照しないことがあり(多くのプログラムを混乱させるファイルシステムツリー内のループの可能性を防ぐため)、異なるファイルシステム上のファイルを参照しないことがあります(なぜならiノード番号は、ファイルシステム間で一意ではありません)。これは、ハードリンクの試みが実際に発生する何か他の言葉遣いの方法、つまり、関数が呼び出されるが、それがディレクトリであるために失敗することを表現する方法であると考えさせます(ファイルシステムの参照は、別のコメントで私が考えていたものです)
Pryftan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.