avicom의 신변잡기

rpm db 복구 방법 본문

LiNux / sTorAge

rpm db 복구 방법

avicom 2007. 3. 26. 18:39

http://cafe.naver.com/servermento.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=31 에서 발췌

/var/lib/mysql 디렉토리만 삭제한다는 것이 실수로 /var/lib 디렉토리를 통채로 지워버려서
rpm DB(/var/lib/rpm 디렉토리에 있음)를 모두 날려버려 복구한 방법을 소개한다.

급한 사람은 모두 읽지 말고 '1. rpm DB 복구 준비 작업'과 '방법 1'
그리고 '3. 복구 후 필요한 작업'을 읽어보기 바란다.

0. 시작하기 전

복구한 후에 아래 글을 쓰기 위해 다시 확인 과정을 거쳤다.

기본 상황은 이렇다. (시간 흐름대로)

1) 이 서버는 며칠 전에 새로 설치한 것임 (아는 분이 함, 아는 분의 서버임)
up2date로 패치지는 최신 것으로 업데이트 됨
2) 새벽 4시에 cron(/etc/cron.daily/rpm)으로 새벽 4시까지 설치된 패키지 목록은
/var/log/rpmpkgs에 저장되어 있음
참고로 rpmpkgs 에는 다음과 같은 형태로 되어 있다.

--------------------------------------------------------------
... 생략 ...
bash-2.05b-20.1.i386.rpm
bc-1.06-12.i386.rpm
bind-9.2.1-16.i386.rpm
bind-utils-9.2.1-16.i386.rpm
binutils-2.13.90.0.18-9.i386.rpm
... 생략 ...
--------------------------------------------------------------

3) 잘 못 설치한 rpm 패키지가 많아서 여러 패키지를 지우고, 새로운 패키지를 설치함
4) 각종 설정 및 여러 가지를 새로 컴파일해서 설치함
5) /var/lib가 모두 지워짐 ^^
6) 서버를 새로 설치하는 것보다는 rpm DB를 복구하는게 더 빠르다고 판단
(또한 ext3 파일시스템으로 돈 안들이고 삭제한 파일을 복구(undelete)하기는 힘들었음)

1. rpm DB 복구 준비 작업

--------------------------------------------------------------
# mkdir /var/lib (없는 경우만)
# rpm --initdb (/var/lib/rpm 디렉토리가 생성되고 DB 파일이 새로 생성됨)
--------------------------------------------------------------

1) 레드햇 설치할 때 사용한 CD 3장(7.x은 2장) 필요

2) up2date했거나 직접 업데이트한 패키지 필요
http://ftp.redhat.com/pub/redhat/linux/updates/9/en/os/ 에서 up2date했을 것 같은
모든 패키지를 받아서 임의의 한 디렉토리에 넣는다.
i386, i686, noarch 디렉토리에 있는 것을 FTP를 통해 모두 받는게 가장 편할 것이다.

3) 설치된 rpm 목록 수정
(/var/log/rpmpkgs가 현재 설치된 것과 거의 동일한 상황이면 이과정은 필요없음)

저의 경우는 기본 상황에서 말한대로 rpmpkgs에 저장된 목록과 실제 설치된 rpm과는 상당한
차이가 있다는 것이다.
redhat-config-packages을 실행(물론 설치된 패키지는 [0/0]으로 표시될 것임)하여 기억을
더듬어 rpmpkgs를 수정했다. 이 때 패키지명(예 lynx)을 보고 레드햇 CD 3장의 rpm 파일명
(예 lynx-2.8.5-11.i386.rpm)과 대응되는 것을 적는다.

2. 복구하기

방법 1. recover_rpm_db.sh 스크립트를 이용하는 방법 (편함)

http://www.tuxfan.homeip.net:8080/hacks/recover_rpm_db.sh
( http://coffeenix.net/doc/system/recover_rpm_db.sh.txt 에도 받아두었다.)

Michael Fratoni이 만든 recover_rpm_db.sh는 복구를 돕는 스크립트이다.
물론 기존에 설치되어 있는 rpm 파일 목록(이를테면 /var/log/rpmpkgs)은 있어야 한다.
사용법은 아주 간단하다.

--------------------------------------------------------------
# chmod 700 recover_rpm_db.sh
# ./recover_rpm_db.sh -f /var/log/rpmpkgs -p /mnt/cdrom/Redhat/RPMS 이외_rpm있는_디렉토리_나열
... 중략 ...
You have been warned! Shall I continue? [ yes / no ]: yes
... 중략 ...
Located bash-2.05b-20.1.i386.rpm, adding to database.
경고: RPM-update//bash-2.05b-20.1.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중... ########################################### [100%]
Located bc-1.06-12.i386.rpm, adding to database.
경고: RPM/bc-1.06-12.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중... ########################################### [100%]
... 생략 ...
--------------------------------------------------------------

위와 같이 하면 -f의 rpmpkgs 파일목록과 지정한 디렉토리내의 rpm파일을 비교해서 일치하는
것만 골라 DB 목록을 만들어준다. 실제 설치하지 않고 단지 rpm DB만 복구를 하는 것이다.

3장의 CD를 번갈아가면서 mount하여 스크립트를 여러번 실행하면 되고, 업데이트나 별도로
설치한 rpm들이 있는 디렉토리를 지정하여 작업하여도 좋다.

방법 2. 필요한 rpm을 모두 한 디렉토리에 넣고 복구하는 법

--------------------------------------------------------------
# mkdir rpm-all
--------------------------------------------------------------

레드햇 CD 3장의 모든 rpm을 한 디렉토리(여기서는 rpm-all)에 넣어둔다.
또한 위의 1-2)에서 받아둔 패키지도 같은 디렉토리에 넣는다.

자~ 이젠 복구를 시작하자.
--------------------------------------------------------------
# cd rpm-all
# rpm -ivh --nodeps --force --justdb `cat /var/log/rpmpkgs`
준비 중... ########################################### [100%]
--------------------------------------------------------------

-ivh 또는 -Uvh를 사용해야 한다. -Fvh는 안된다.
--justdb 옵션은 실제로 rpm을 설치하지 않고 DB만 생성해준다.

시간이 좀 걸릴 것이다.
만약 /var/log/rpmpkgs 목록에 있는 rpm 파일이 rpm-all 디렉토리내에 없다면 정상적으로
설치되지 않을테니 rpmpkgs목록에서 삭제하거나 rpm 파일을 구하거나 해야 한다.

방법 3. 설치된 rpm 목록이 없는 경우 (가장 난감하며 제대로 복구하기 힘듬)

새벽 4시에 cron에 의해 /var/log/rpmpkgs가 생성되는데 클라이언트용으로 사용하는 경우에
이 시간에 켜있는 경우는 드물 것이다. 따라서 설치된 rpm 목록이 없는 경우는 정확한 복구가
어렵다.

이 작업은 해본적이 없으니 이론적인 내용이 될 듯 싶다.

1) 시스템 설치할 때 생성된 /root/install.log 파일이 있다면 이 파일을 수정한 후 방법 1
이나 2를 이용해서 복구를 한다.

2) 또 다른 방법으로 CD에 있는 rpm 패키지를 가져다가
--------------------------------------------------------------
# rpm -qlp rpm파일 |head
--------------------------------------------------------------
해서 나열된 파일들이 실제 시스템에 있다면 이 패키지는 설치한 적이 있는 패키지이다.

이 작업은 시간이 많이 걸리므로 차라리 스크립트(비교작업을 대신 하여 목록을 생성해주는
스크립트)를 작성하는게 더 나을 것이다.

3) 가장 단순한 방법으로 CD를 마운트(/mnt/cdrom에 했다고 가정)한 후 다음과 같이 한다.
--------------------------------------------------------------
# rpm -ivh --nodeps --force --justdb /mnt/cdrom/Redhat/RPMS/*
--------------------------------------------------------------

물론 설치한 것이든 안한 것이든 모두 설치한 것으로 간주될 것이다.
보정(?) 작업은 다음 글을 읽어보기 바란다.

3. 복구 후 필요한 작업

실제 서버에는 설치되어 있지 않는데 rpm DB에 포함되어 설치된 것 처럼 나올 수 있다.
이를 위해서 rpm -Va 작업을 통해서 missing이 연속 여러번 나오면 그 패키지는 서버에
설치되지 않는 것이 거의 확실하다.

다음은 mutt 패키지가 없다고 판단하여 삭제하는 것이다.

--------------------------------------------------------------
# rpm -Va
... 중략 ...
missing /usr/bin/flea
missing /usr/bin/mutt
missing /usr/bin/pgpewrap
missing /usr/bin/pgpring
... 중략 ...
# rpm -qf /usr/bin/flea
mutt-1.4-10
# rpm -e mutt
--------------------------------------------------------------

4. 참고글

* rpm database 복구 (recover_rpm_db.sh에 대한 소개 있음)
http://www.redhat.com/archives/redhat-list/2003-January/msg00055.html
* RE: /var/lib/rpm 을 날렸을때 (답변자 : 서마이)
http://linux-sarang.net/board/?p=read&table=qa&no=201291
* RE: Problems with my redhat DB
http://www.geocrawler.com/archives/3/87/2001/12/50/7376453/
*
http://www.leog.net/fujp_forum/topic.asp?TOPIC_ID=3294&whichpage=2