Перемещен бин и другие папки! Как вернуть их?

13

Я случайно переместил все папки из корня в подпапку. ( /bin, /etc, /home, /lib, /usr... все переехали) только те , которые не были перемещены, так как они были в использовании, являются /bak, /boot, /dev, /proc, /sys.

Теперь любой команды, которую я пытаюсь выполнить, просто не будет. Я постоянно получаю «Нет такого файла или каталога».

Я подключен через ssh и через ftp, но я не могу переместить файлы через ftp, так как прямой вход в SU отключен. У меня также есть доступ к реальному серверу, если мне нужно что-то сделать прямо оттуда.

Я предполагаю, что мне нужно будет отредактировать файл конфигурации, чтобы указать ему, где найти /binпапку, и это помогло бы мне снова получить доступ, но я не знаю, какой это будет файл или как это сделать (поскольку я не может даже запустить, chmodчтобы изменить разрешения).

Есть ли выход из этого, кроме переустановки?

Я работаю над старой версией CentOS.

Я чрезвычайно новичок в мире Linux, поэтому это действие и вопрос ...

Menelaos
источник
Хотя это не решение вашей проблемы, я рекомендую прочитать это: lug.wsu.edu/node/414 Подобная ситуация, но он фактически удалил / bin.
стрибика

Ответы:

33

Если у вас все еще есть корневая оболочка, у вас может быть шанс восстановить вашу систему. Допустим , что вы переместили все общие каталоги ( /bin, /etc, /lib, /sbin, /usr- это те , которые могли бы сделать восстановление трудного) под /oops.

Вы не сможете выполнить mvкоманду напрямую, даже если вы укажете полный путь /oops/bin/mv. Это потому, что mvон динамически связан ; потому что вы переместили /libкаталог, mvне можете запустить, потому что он не может найти библиотеки, которые составляют часть его кода. На самом деле, это даже хуже: mvне удается найти динамический загрузчик /lib/ld-linux.so.2 (имя может отличаться в зависимости от вашей архитектуры и варианта Unix, а каталог может иметь другое имя, например /lib32или /lib64). Поэтому, пока вы не переместили /libкаталог обратно, вам нужно явно вызывать компоновщик и вам нужно указать путь к перемещенным библиотекам. Вот команда, протестированная на Debian squeeze i386.

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Возможно, вам придется немного изменить это для других дистрибутивов или архитектур. Например, для CentOS на x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Когда вы что-то напортачили /lib, полезно иметь статически связанный набор инструментов. Некоторые дистрибутивы (я не знаю о CentOS) предоставляют статически связанную копию Busybox . Также есть sash , отдельная оболочка с множеством встроенных команд. Если у вас есть один из них, вы можете сделать свое восстановление оттуда. Если вы не установили их до факта, уже слишком поздно.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Если у вас больше нет корневой оболочки, но у вас все еще есть слушающий демон SSH, и вы можете войти в систему как root через ssh, и у вас есть один из этих статически связанных наборов инструментов, вы можете войти в ssh. может работать, если вы переехали /libи /bin, но нет /etc.

ssh root@broken.example.com /oops/bin/sash
root@broken.example.com's password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Некоторые администраторы создают альтернативную учетную запись со статически связанной оболочкой или заставляют корневую учетную запись использовать статически связанную оболочку, просто для такого рода проблем.

Если у вас нет корневой оболочки и вы не приняли мер предосторожности, вам нужно будет загрузиться с живого CD / USB-диска Linux (любой будет работать, если только он достаточно недавний, чтобы иметь доступ к вашим дискам и файловым системам) и переместить файлы обратно.

Жиль "ТАК - перестань быть злым"
источник
1
Спасибо, Жиль. Вы предоставили очень полезную информацию о том, что я должен быть осторожным в будущем.
Менелаос
Спасибо, Жиль! Это спасло меня. Я добавил редактирование для 64-битной Linux-среды. В моем случае 64-битный CentOS 7
CompEng88
@ ComputerEngineer88 Спасибо, но когда вы вносите изменения, не добавляйте маркеры «РЕДАКТИРОВАТЬ» и не добавляйте их в конец поста, к которому они не принадлежат. Держите поток текста. Сообщения имеют историю редактирования, если люди хотят знать, что сообщение содержало раньше. Когда люди читают пост нормально, им все равно, что позже было добавлено немного информации.
Жиль "ТАК - перестань быть злым"
В самом деле? Я всегда сосредоточен на правках. Значит, что-то новое было изучено, и для меня это самое главное. Все равно - до тех пор, пока люди выигрывают!
CompEng88
@ ComputerEngineer88 У меня был тот же рефлекс, когда я начал использовать переполнение стека. Но на самом деле сообщение Stack Exchange во многом ближе к статье в Википедии, чем к сообщению на дискуссионном форуме. Вы ожидаете, что люди будут читать сообщения на форуме вскоре после их публикации, поэтому имеет смысл иметь видимое указание, если они были отредактированы. Но, скажем, кто-то видит эту ветку в 2027 году: им было бы все равно, был ли абзац там с 2011 года или был добавлен в 2019 году.
Жиль "ТАК, перестань быть злым"
11

Вероятно, вы можете восстановить без перезагрузки, поэтому не перезагружайтесь, пока не попробуете другие вещи, потому что он не загружается. Если у вас все еще открыт сеанс SSH, попробуйте следующее:

  • Откуда запускаются программы, задается с помощью переменной $ PATH. Вы можете добавить новое местоположение бина в путь, запустив export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Возможно, вам также понадобится добавить соответствующие каталоги sbin . Вы также можете запускать программы вручную по их полному пути, /path/to/mv [from] [to]например, они должны работать, даже если mv находится в другом месте. Сложность в том, что большинство команд захотят получить доступ к общим библиотекам, и вы говорите, /libчто переехали, поэтому вам нужно установить переменную для этого места.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Как только вы сможете выполнить некоторые основные команды, переместите материал назад! mv /path/to/subfolder/* /было бы в порядке! Как только все вернется на место, система должна вести себя нормально.

Если это не удается, загрузка ЛЮБОГО LiveCD и монтирование диска должны позволить вам переместить папки туда, где они находятся. Вам не нужно переустанавливать или даже использовать дистрибутив livecd, вам просто нужно смонтировать диск и переместить папки обратно в нужное место на диске. Множество аварийных дисков на основе Linux специализируются на предоставлении вам всего лишь нескольких базовых консольных инструментов для такого рода ремонта.

Калеб
источник
Работать через SSH не удалось, поэтому я скачал liveCD и пытаюсь заставить все работать. Я в grub и пытаюсь смонтировать диск, но он не пускает меня, потому что ядро ​​не загружено. и неспособность увидеть точный путь существующих путей явно делает это трудным ...
Menelaos
1
Загрузись, живи, смонтируй свой диск, перемести вещи обратно на свои места, перезагрузись в свою систему ... и удачи.
Калеб
2
Это не достаточно для установки LD_LIBRARY_PATH, вам также нужно явно вызвать динамический загрузчик, например LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Жиль "ТАК - перестань быть злым"
4

Вы должны быть в состоянии перезагрузить компьютер с установочного компакт-диска в однопользовательском режиме, смонтировать корневую файловую систему и переместить файлы обратно в Linux. Я не знаю много centos, но это как RHEL, так что это должно работать.

Jamess
источник
Спасибо. Я загружаю это, как мы говорим. Имеет ли значение, если это живой CD или весь установочный DVD?
Менелаос
@Menelaos: Вы не хотите устанавливать, вы хотите что-то, что вы можете запустить вживую для этого решения. Некоторые установочные диски имеют живые версии, но некоторые просто хотят сразу же это сделать. В некоторых есть режимы «восстановления», что вам и нужно, но есть и специальные диски восстановления Linux. Это не должен быть ваш дистрибутив, это просто что-то, что может монтировать файловую систему linux и перемещать папки назад. Смотри мой ответ.
Калеб
Загляните на sysresccd.org, чтобы увидеть один из спасательных компакт-дисков, если хотите, он имеет обширную документацию, чтобы узнать, как его использовать. Помощь в его использовании для решения этой проблемы может быть затруднена на этом форуме и вне моего свободного времени. Иначе, Centos CD должны помочь. Последний live CD может работать или не работать ... Поэтому, учитывая подобные проблемы, вы всегда должны иметь установочный носитель / iso версии, которую вы установили. Также создайте резервную копию всей файловой системы.
Jamess
2

Большое спасибо Жилю, 5 лет спустя, и ваши посты все же сохранили мой день, если не неделю.

Я имел в виду , чтобы переместить содержимое вложенной папки в текущей папке , но вместо того mv sub/* ., я сделал mv sub /* ., так что я переехал все к текущей папке. К счастью, я нашел этот ответ и смог относительно легко починить свою машину. Однако мне пришлось немного подкорректировать команды, так как я работаю на компьютере x86_64 с Ubuntu 16.04. Я хотел бы оставить инструкции здесь, на случай, если кто-то борется:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /
Ktipr
источник
0

Я хотел бы добавить еще пару команд после применения ответа Ktipr для современных систем (машины x86_64 с Unix), я не смог переместить каталоги и т. Д. С помощью mv, так как он показал ошибку

Error : Directory not empty

поэтому я должен был использовать

rsync -a source_file target_location

чтобы я смог вернуть все в порядок. Если он еще не установлен, вам необходимо установить его в первую очередь.

Ришабх Гупта
источник