/ bin / sh가 삭제 된 FreeBSD 8.2는 부팅 할 수 없습니다


8

내 서버 중 하나에 대해 잘못된 결정을 내 렸습니다.

삭제했습니다 /bin/sh. 서버를 다시 시작했는데 /bin/shrc 스크립트를 시작 해야 하기 때문에 서버가 실행되지 않습니다 . sh가 필요하기 때문에 단일 사용자 모드에 액세스 할 수 없습니다.

Bourn 쉘을 다시 설치하는 쉬운 방법이 있습니까?

라이브 CD에서 sh를 복사하려고 시도했지만 ld-elf.so.1 라이브러리에서 실패했습니다. 그래서 그것을 livecd에서 내 / 파티션으로 / libexec에 복사했습니다. 그런 다음 libedit.so 라이브러리가 필요하고 / libexec에 복사했지만 이번에는 작동하지 않습니다.

에 대한 심볼릭 링크를 시도 /usr/local/bin/bash했지만 여전히 "sh를 찾을 수 없습니다"유형 오류가 표시됩니다. 나는 /usr그것이 rc 스크립트에서 수행되기 때문에 아직 마운트되지 않았기 때문이라고 가정합니다 .

도움을 주시면 감사하겠습니다.


2
어머. 음, 좋지 않습니다. 마지막 테이프를 당길 시간입니다.
MDMarra

LiveCD 문제는 다른 버전의 FreeBSD이기 때문일 것입니다 (또는 LiveCD는 다른 이름으로 하드 링크 된 / bin / ABunchOfStuff 인 마법의 찌그러진 바이너리를 사용하고 있습니다). 어떤 FreeBSD 버전을 사용하고 있습니까?
voretaq7

herp-derp 버전은 제목에 있습니다. 신경 쓰지 마 커피가 필요합니다.
voretaq7

3
그럼 .. 음 ... 왜 이러지? 의도적 인 것처럼 들립니다.
user606723

답변:


8

/ bin / sh를 무언가 로 바꿔야 합니다 . 그것이 핵심입니다. 시작하는 동안 FreeBSD 로더에 들어갈 수 있다면 ( "ok"프롬프트로) 다음과 같이 해보십시오 :

set init_shell=/bin/csh
unset init_script
unset init_path

FreeBSD 매뉴얼 페이지 (온라인)의 loader (8) 에서이 정보를 얻었습니다 . 나는 이것을하지 않았지만 작동해야합니다 (/ bin / csh가 있고 실행 가능하다고 가정).

FreeBSD 8.2 서버가 설치되어 있고 다른 곳에서 실행중인 경우, 해당 소스에서 / bin / sh를 훔쳐서 필요할 때 시스템에 배치 할 수 있습니다.

또는 정적으로 빌드 된 / bin / sh를 가져 와서 대신 넣으십시오. 정적으로 빌드 된 바이너리에는 라이브러리 문제가 없습니다.

편집 : 주의해야합니다 : / bin / csh로 부팅하면 / bin / sh 대신 사용할 무언가가 있어야합니다. 인터넷을 통해 가져 오거나 다른 CD 나 패키지 또는 다른 것에서 복사 할 수 있습니다. / bin / csh를 사용하여 부팅하면 시스템으로 들어갑니다. 네트워크를 통해 복사하려면 네트워크를 불러 와야합니다. 그렇지 않으면 CDROM에서 복사하십시오.

앞으로 이것을 피하는 가장 좋은 방법 :

  1. / bin에서 삭제하지 마십시오! (그것은 쉬운 부분입니다)
  2. 동적으로 링크되지 않은 정적으로 빌드 된 / bin / sh가 있어야합니다.
  3. /bin/sh.static과 같은 백업 sh가 있어야합니다.

세 가지를 모두하십시오.


또한 "이 문제를 해결할 수 있도록 백업 해주세요"솔루션 (부팅 할 때 LiveCD가 없어도 됨).
voretaq7

6

좋아, 먼저 강의 :

  1. 시스템 바이너리를 사용하지 마십시오 .및FreeBSD의
    모든 항목은단독으로 남겨 두어야합니다. 당신이하고있는 일을 알고 있더라도 (당신이하고있는 것을 알고 있다면 이것들은 홀로 남겨 져야한다는 것을 알고 있습니다. 그들은 정말로 중요합니다-그들 모두!)/bin/sbin/rescue

  2. 삭제 하지 마십시오/bin/sh . 이제까지. 어떤 을 가지고 * NIX 시스템.
    정말. 하지마 LOT 스크립트는에 의존/bin/sh하는 본 쉘 서비스를 제공합니다. 우주를 깨뜨립니다.
    정말로 원한다면Adam Z가 제안한 것과 같은 사본 으로안전하게 대체 할 수bash있지만 그렇게하려면 정적 사본을 정적으로 연결 하고 싶을 것bash입니다. 많은 라이브러리를 가져옵니다. 시스템이 가동/usr/local되어 마운트될 때까지는 없을 수도 있습니다.


이제 혼란을 해결하는 방법? 두 가지 옵션 :

옵션 1 : 다소 고통스러운
에 이상에 머리 http://www.freesbie.org/ (또는 당신의 선택의 FreeBSD의 라이브 CD - 당신은 아마에서 복구 CD 사용할 수 있습니다 http://www.freebsd.org 이를 들어). LiveCD를 잡고 굽고 부팅하십시오.

LiveCD 환경에 들어가면 버스트 된 시스템의 루트 파티션을 마운트 /bin/sh하고 LiveCD에서 컴퓨터로 복사 한 다음 재부팅하십시오.

이것은 해야 당신이 지침을 따르 할 수 있습니다 - 당신이 실행 돌아가 "세계"를 재 구축 하거나 최소한 다시 컴파일에서 /bin/sh실행중인 시스템 불구하고 일치하는 소스 트리에서.

옵션 2 : 고통스럽지 않고 LiveCD
없는 경우 주위에 다른 FreeBSD 상자가 있다면 (또는 다른 방법으로/bin/shFreeBSD 머신을 단일 사용자 모드로 가져 오십시오.) 네트워크를 구성하거나 마운트하십시오. 미디어에 교체 용 셸이있는 모든 미디어)에 넣고 원래 위치에 복사하십시오.

재부팅하면 괜찮을 것입니다. LiveCD와 동일한주의 사항이지만 /bin/sh동일한 머신과 거의 비슷한 머신은 아닙니다.


1
다른 FreeBSD 배포판에서 / bin / bash를 사용하면 공유 라이브러리가 올바른 버전 인 경우에만 작동합니다. 대체 빌드 대신 FreeBSD 8.2에서 직접 제공되는 것을 사용하는 것이 좋습니다. 그러나 FreeBSD 8.x 시스템은 정적으로 빌드 된 쉘을 제공 할 수 있어야합니다.
Mei

@david 좋은 지적- /bin더 이상 정적으로 연결되지 않습니다. 나는 FreeBSD의 적절한 릴리스에 대한 구조 CD는 사용 가능한 쉘이 있다고 생각,하지만 난 하나를 부팅 이후 동안이 지났지 (단지 장소에 버려진 할 수 있습니다 즉, 하나) ...
voretaq7

4

대신 심볼릭 링크의, 당신의 복사 bash로를 /bin/sh. 이 ldd명령을 사용하여 rootfs 이외의 파일 시스템에 상주 할 수있는 라이브러리를 찾아 rootfs에 복사하십시오.


1
이것은 좋은 해결책이지만 나중에 정리해야 할 라이브러리가 약간 혼란스러워집니다.
voretaq7

예, 나중에 정리해야합니다. 한 가지 대안은 정적으로 빌드 된 쉘 바이너리를 사용하는 것입니다.
Adam Zalcman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.