/bin을 지워버렸다.

VPS로 빌리고 있는 서버에서 백업을 하려다 고생했다.

문제의 시작

Backup script1를 만들어서 테스트하고 있었는데,
같은 command를 실행한 결과가 terminal에 직접 입력해서 실행할 때하고,
script file을 만들어서 실행할 때하고 결과가 달라져서 머리를 싸매고 있었다.

위와 같은 script를 terminal에서 직접 실행하면 의도한대로 동작하는데, script file에 넣어서 실행하면 exclude 옵션을 무시하는 것이다.

문제의 발생

도대체 뭐가 문제인지 몰라가지고 조금씩 바꿔가면서 시행착오 중,
쓸데없이 생성된 /backup/bin 디렉토리를 지우려다가 실수로 /bin을 지워버렸다.
당연히 /backup/bin 디렉토리에 같은 내용물이 남아있을테니까 이걸 /bin으로 이동(mv)시키면 된다고 생각했는데,
바로 그 mv/bin안에 있었기에 실행 불가능하다는 것을 깨달았다.

고난의 연속

다행히도 wget2은 사용할 수 있어서, 다른 server에 mv를 올려놓고 내려받으려고 했는데,
운이 나빴는지 접속하고 있던 터미널이 freeze. 다시는 로그인조차 할 수 없게 되었다.
login/bin 안에 있었을 줄이야…
결국, 직접 해결할 수 있는 모든 방법을 잃어버린 후 VPS 관리자에게 연락, /bin 폴더의 복구를 부탁했다.

/bin 복구는 VPS 관리자에게 맞겨야 하지만, script가 실행이 되지 않는 문제는 내가 풀어야 했다.
그런데 desktop에서 문제를 재현·분석하다가, desktop에서도 /bin을 지워버렸다.
뭐 desktop이야 내가 직접 restart하고 다른 system에서 복구할 수 있으니까 문제없지만.

원인을 분석

원인은, script file을 실행할 때 습관적으로 sh backup.sh를 쓰고 있었는데,
이놈의 sh, 정확히는 dash가 뒤의 exclude 옵션을 무시하고 제 맘대로 해석한 것 같다.
Script 첫행에는 bash 쓰라고 써놓고서 테스트는 sh로 한 건 내 잘못이려나.

bash backup.sh로 실행하니까 잘만 되고, ./backup.sh에 실행권한을 주고 실행해도 잘 되고.

결국, 타자하기 쉽다고 sh backup.sh와 같이 실행했던 것이 문제.
Ubuntu에서 shdash로 되어있다는 사실은 어딘가에서 슬쩍 본 기억이 있어서 다행이었다.
안 그랬으면 도저히 이유를 알 수 없어서, 완전히 영구미제문제가 될 뻔했음.

후일담

P.S.1 11월에 VPS 서버의 RAID1이 통째로 고장 났다고 한다.
복구업체에서도 데이터의 완전한 복원은 불가능했다고…
덕분에 위에서 한 고생이 엄청나게 보람 있었음.
/bin 안의 내용은 쉽게 복원할 수 있지만, 잃어버린 data는 영원히 찾을 수 없으니까.
RAID1이라도 고장 날 때는 고장 나니까, 중요한 data는 2중·3중의 backup을 꼭 하고 볼 일이다. 돈이 없어서 못하지만.

P.S.2 나중에 생각해보니까, mv를 다른 데서 내려받을 필요 없이, 그냥 /backup/bin/mv를 실행하면 됬다는 것을 깨닫고 후회 중.
지금 생각하면 너무나 당연한 방법이지만, 그때는 당황해서 이런 해결책을 생각하지 못한 듯하다.


  1. backup script라고 할 정도는 아니고, rsync에 log file을 지정한 정도이다. 

  2. wget. Cafe24 웹호스팅을 사용하던 당시 wget이라는 문자열이 표시되는 것을 server가 차단, 이 문자열 자체가 표시되지를 않았다.
    설마 모든 종류의 string을 다 검사해서 sanitizing할 줄은 몰랐다.
    각종 해킹에 대한 대책이 잘 되어있는 점은 칭찬하고 싶지만, 문제는 충분한 설명이 없어서 한동안 왜 표시되지 않는지 몰랐다. 

변경 이력:

CC BY-NC-ND 4.0 This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.