커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 시스템 관리 / 서버운영 도움말
검색 : 사이트 WHOIS 웹서버 종류

최적화 / 튜닝 / 성능개선 (6, 글 1, 자료 3)
디스크 쿼터(quota) (3, 글 1, 자료 3)
디스크 관리 / 파일시스템 / mount (34, 글 13, 자료 12)
백업(backup) / 시스템 복구 (14, 글 6, 자료 11)
서버운영 (8, 글 2, 자료 9)
프린터 관리 / 프린팅 (7)
패키지 관리 / 패치 / rpm (10, 글 5, 자료 1)
부팅, boot / LILO / GRUB (10, 글 5, 자료 9)
서버 모니터링 (10, 글 5, 자료 2)
로그인 / 로그아웃 (1)
로그(log) / syslog (5, 글 3, 자료 3)
메모리, 스왑(swap), 램디스크(ramdisk) (3, 글 2)
사용자 관리(계정 관리) (1, 자료 1)

  삭제한 rpm DB(/var/lib/rpm) 복구하기 작성일 : 2003/12/24 01:12
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 10557
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2003.12.23(화)

    /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
      커피닉스 카페 최근 글
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
    [05/16] (주)후이즈 시스템엔지니어 (경력자) 모집
    [02/15] [AWS] Cloudfront edge 확인하기
    [01/20] Mobile Service/eCommerce 기업에서 Server / Java / PHP 개발자 구인
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~