После случайного переименования / 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
Какая это ОС? Интересно, как sudoдаже дойти до стадии библиотеки, она обычно находится /usr/bin/и должна была завершиться с ошибкой «команда не найдена». Кроме того, у вас есть пароль root?
Муру
3
@muru Это Ubuntu. Вы правы, я и раньше получал сообщение об ошибке, not foundпоэтому я добавил новый путь /usr_bak/binк нему, $PATHи теперь я получаю сообщение об ошибке в своем посте здесь ...
Ив
2
@ user1717828 это сложно. Я должен скомпилировать проект, разработанный на Ubuntu 16.04, на Ubuntu 17.10. Поэтому я думаю, смогу ли я просто скопировать /usrUbuntu 16.04, чтобы перезаписать /usrUbuntu 17.10 ...
Ив
6
Рассматривали ли вы использование виртуальной машины для компиляции проекта вместо таких радикальных изменений?
Кевин
3
Вы можете запустить Virtualbox в режиме без головы . Возможно, проще всего настроить гостя на другом компьютере или получить предварительно настроенный.
Кевин

Ответы:

109

Поскольку вы установили пароль для пользователя root, используйте suи busybox, установленный по умолчанию в Ubuntu. Все suнеобходимые библиотеки находятся в /lib. Busybox - это набор статически связанных утилит, поэтому отсутствие библиотек не должно быть проблемой. Делать:

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

(Хотя в самом Busybox также есть suапплет, /bin/busyboxбинарный файл не имеет setuid и поэтому не работает, если не запускается от имени пользователя root.)

Если у вас нет пароля root, вы, возможно, могли бы использовать решение Gilles, используя здесьLD_LIBRARY_PATH , или (Gilles говорит, что это не будет работать с бинарными файлами setuid, такими как sudo), перезагрузиться и отредактировать меню GRUB для загрузки init=/bin/busyboxв качестве параметра ядра и переместить папка обратно.

Мур
источник
73
Теперь не случайно переименовать /lib.
sleblanc
5
LD_LIBRARY_PATHне поможет запустить sudo, так как sudoэто setuid. Если его библиотеки не в нужном месте, sudo не будет работать, пока root не исправит его.
Жиль "ТАК - перестань быть злым"
3
Историческая справка @Yves: старые версии Unix (которые намного старше, чем Linux) включали небольшую коллекцию статически связанных двоичных файлов /sbinименно для такого сценария: «Я выполняю какое-то действие, когда библиотеки времени выполнения будут перетаскиваться, но нужно еще манипулировать файлами. " В основном такой же подход до изобретения Busybox. (Количество команд, доступных таким образом, было очень ограничено, потому что эти статически связанные двоичные файлы поглощают дисковое пространство.)
Ti Strga
8
@ Да, если вы переименуете /lib, то вам, вероятно, придется перезагрузить компьютерinit=/bin/busybox
muru
3
@ Yves: загрузка с USB-накопителя, с живым дистрибутивом, который может монтировать ваши файловые системы, и вы готовы все исправить. Даже скачивание файлов замены с зеркал пакетов, если вы что-то удалили.
Питер Кордес
33

В дополнение к ответу Муру :

  • вы могли бы использовать какой-нибудь USB-ключ для восстановления вашей системы; Например, если в вашей системе установлен Debian или Ubuntu, загрузите установочный USB-ключ в режиме восстановления и выполните соответствующие действия mountи mvи umount.

  • чтобы иметь возможность более легко ремонтировать такие ошибки, как правило , я также установить статическую оболочку с несколькими встроенных командами ( в частности , с некоторыми cp, rm, mv-подобным) встроенными функциями, такими как 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 и скомпилировать его.
Василий Старынкевич,
Я держу liveiso на жестком диске с пользовательской записью grub для подобных проблем. Не нужно усложнять, просто загрузите live os и свободно
управляйте
3

Я думаю, что самый безопасный способ - это перезагрузить компьютер, используя ОС, загруженную с USB, CD или DVD (Debian, Ubuntu, Suse и т. Д.). Затем подключите диск, содержащий проблемы, и выполните переименование.

Безопаснее, чем загрузка в минное поле с отсутствующими / usr или / lib.

Larry
источник
1
Вы можете загрузить ISO напрямую с Grub / HDD без необходимости 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. ( lnи rmработаем над символическими ссылками на каталоги, но мы говорим о реальном каталоге). Кроме того, это не решает проблему, потому что это требует rootточно так же mv, из-за разрешений на/ . Если бы вы могли запустить это, вы могли бы бежать mvвместо этого, как нормальный человек.
Питер Кордес
2
Жесткие ссылки на каталоги не поддерживаются в большинстве (всех?) Unices, потому что программному обеспечению слишком сложно выполнять рекурсивный обход файловой системы, чтобы обнаружить бесконечные циклы. Это возможно, если программное обеспечение отслеживает все посещенные inode и сканирует файловую систему с поддержкой inode (т.е. не FAT32 / NTFS), но проверка на символические ссылки и их обход не намного проще. Все, что нужно, это быстрый вызов lstat (2) для проверки типа файла.
penguin359
2
@Pryftan, my ln(1)on Debian, говорит об этом для опции -d/ -F/ --directory: «разрешить суперпользователю пытаться жестко связать каталоги (примечание: возможно, произойдет сбой из-за системных ограничений, даже для суперпользователя)» . Так что вы можете попробовать, но ваша файловая система, вероятно, не позволит вам.
Тоби Спейт
1
@TobySpeight Еще одна мысль: см. Также symlink (7), в которой говорится: « Жесткие ссылки могут не ссылаться на каталоги (чтобы исключить возможность появления петель в дереве файловой системы, что может привести к путанице во многих программах) и могут не ссылаться на файлы в разных файловых системах (поскольку номера инодов не уникальны для файловых систем). Это заставляет меня думать, что попытка жесткой ссылки может фактически быть способом формулировки чего-то еще, что происходит, а именно, что функция вызывается, но она терпит неудачу именно потому, что это каталог. (Ссылка на файловую систему - это то, о чем я думал в другом комментарии)
Pryftan