원격 업그레이드 하다가 뻑난 시스템 복구하기

흐흐.. 여전히 야근하고 바로 외근갔다가 또 집에서 잠자고 출근해서 야근하고 또 외근가는 루프를 돌고 있는 중이라 블로그를 계속 쓸 여유가 잘 안 나네요;; 흐흐

바이오에 프비를~

오늘은 이번에 산 랩탑에다가 윈도우쪽 세팅은 완료하고, 프비를 인스톨했습니다~ 그런데, 갖고 있는 프비 씨디가 4.0 4.1 4.8 4.9 5.1 뭐 이런 상황이라;; 어쩔 수 없이 5.1을 깔았습니다. -o- 일단 설치는 깔끔하게 잘 되고 속도도 빨랐습니다~ (역시 바이오! … ;;) 다 깔고 나서, 5-STABLE로 올리려고 빌드를 해 놓고 놀러 나갔다 그냥 퇴근 해서는.. 이제 집에서 월드와 커널을 인스톨하고 그놈 빌드하려고 들어가서.. 무심코make installkernel installworld… 하고서는 TV에서 하는 이종격투기를 보고 있었는데, 흘끗 터미날을 봤더니으아아앗!!!Bus error.. 헉. 5.1과 5.3은 바이너리 호환성이 없다는 것을 깜빡하고 그냥 설치를 해 버렸군요. 우어.

=.= 바이너리 비호환의 위력

덕분에, 덮여 씌워진 libc, libutil등 기본 라이브러리와 /bin /sbin등으로 인해 ls, sh, cat, ftp, fetch 를 비롯해 거의 대부분의 바이너리가 안 되는 상황..;; ls도 안 되는 상황이라echo /usr/bin/*해서, 할 수 있는 일이 뭔지 대충 실행을 해 보니.. 되는 것이라고는 gzip, cc, gunzip, tar 정도 밖에.. uudecode나 cat도 없었기에 다른데서 바이너리를 터미널에 붙여넣기 해서 써 넣을 수도 없는 노릇이고.. 혹시나 해서 sysinstall에서 바이너리 재인스톨을 해 보았지만, 1메가를 읽은 뒤에 write error가.. =.=;;

그래 복구엔 고양이!

  • 그래서, 일단 네트워크 접근이 가능한 가장 작은 프로그램 중의 하나인 netcat을 돌릴 방법을 곰곰히 생각해 보니.. 소스를 붙여넣어서 cc로 컴파일을 하면 될 것 같았습니다.

  • 그런데! netcat조차도 소스가 2000라인이 넘기 때문에 echo”소스”> netcat.c 해서 붙여넣기엔 제법 압박이..; 그래서 우선 cat를 복구하기로 했는데, cat도 소스가 한 300라인 되는데”랑’가 있어서 여러모로 echo로 붙여넣기엔 불편했;;

  • 결국은 우선은 4줄 정도로 20000바이트를 stdin에서 읽어서 stdout으로 뿌리는 프로그램을 만들어서 echo로 붙여 넣은 다음에 (나름대로 minicat;;) cat을 컴파일해 넣었습니다.

  • 우선 cat을 복구했으니 그 다음엔 netcat을 붙여넣기 해서 netcat을 빌드했습니다.[FreshPorts]net/netcat에 있는 소스를 make patch한 다음에 netcat.c와 generic.h를 붙여넣어서.. 흐흐;

  • 그 다음에는 5.1-RELEASE의 바이너리를 풀어서 전송을 하려고 했는데, 이리저리 찾아보니 ftp.tw.freebsd.org 가 거의 유일한 5.1이 살아있는 미러군용.

  • 그래서 우선 복구할 바이오에서는nc -l -p 8888 | tar -C / -xzvf -하고, 보내는 호스트에서cat base.[ab]* | nc 호스트명 8888해서 /bin /sbin /usr/lib/ /usr/bin /usr/sbin을 복구했습니다.

  • 이제 정상으로 ㅠ.ㅠ

므흐흐. 5.3-RELEASE!

그래서 이제 복구된 곳에서 tar로 한꺼번에 복사하기 수법으로 installworld를 해서 이제 5.3-RELEASE가 됐습니다~ 흐흐흐 +_+

8 thoughts on “원격 업그레이드 하다가 뻑난 시스템 복구하기”

  1. 5.3 stable release된 건가요? 이미지는 RC2까지밖에 없던 데요.
    Announcement도 안 올라온 거 같구요..

  2. [code]그런데! netcat조차도 소스가 2000라인이 넘기 때문에 echo “소스” > netcat.c 해서 붙여넣기엔 제법 압박이..; 그래서 우선 cat를 복구하기로 했는데, cat도 소스가 한 300라인 되는데 “랑 ‘가 있어서 여러모로 echo로 붙여넣기엔 불편했;;

    결국은 우선은 4줄 정도로 20000바이트를 stdin에서 읽어서 stdout으로 뿌리는 프로그램을 만들어서 echo로 붙여 넣은 다음에 (나름대로 minicat;;) cat을 컴파일해 넣었습니다.
    [/code]
    인 소스좀 살짝 공개해주시죠.(샘플이라도 –;;)
    저두 그래서 한번 다시 프비밀은적이 잇어요. –;;

  3. 그렇다면 5.1에서 5.3 으로 업그레이드를 하려면 어떻게 해야 버스에러안타고
    할 수 있을까요? 중간 빼놓고 처음-끝만 말씀해주셔서 저와 같은 Newbie 는…
    아~ 그렇구나… 하고 배울점은 없었네요, 답글 달아주시는 센스~ 😉

  4. 아.. 너무 오래된 얘기라서 저도 이 뒤에 어떻게 됐는지는 기억이 안 나네요; -O-;;
    오래된 버전에서 업그레이드하는 방법은 공식적으로는 바이너리 설치를 하도록 되어 있습니다.
    제가 쓴 방법은 그냥 제가 처한 상황에는 적절할 지 모르겠지만, 상황에 따라서 완전히 달라질 수도 있고 일반화가 될 수가 없는 문제라서 newbie를 위한 방법으로 만들 수가 없습니다. 안전하게 바이너리 인스톨러로 깔아서 업데이트하시는 것을 추천합니다. 🙂

  5. 감사합니다 퍼키님, 오래된 질문에도 답글을 달아주셔서 ^^
    로컬머신에서 5.1->5.4 실패 (인위적인) 이후 바이너리 업그레이드 성공~
    로컬머신에서 5.1->5.5 실패 (bus error) 이후 바이너리 업그레이드 성공~

  6. 5.1>5.4로 업글할때는 5.4의 bin들이 전부 static 이라 별문제 없었는데
    5.1>5.5로 업글할때는 5.5의 bin들이 dynamic link 되어있어서
    문제가되는 /bin /sbin /usr/bin /usr/sbin 의 dynamic link binary를
    5.1이나 5.4의 static bin들로 바꿔놓은후 바이너리들을 새로 빌드한것으로
    갈아치워야 정상적으로 작동 하더군요… 이래저래 많은 공부 되었습니다 😉

Comments are closed.