Korea FreeBSD Users Group News, Internal, Projects, Home
Software, Support, Documentation

디스크레이블 사고와 복구



[ 날짜순 색인 ] [ 댓글순 색인 ] [ 최상위 색인]

[이전 글] [다음 글] [이전 댓글] [다음 댓글]


엊그제 15기가까지 FreeBSD 파티션의 레이블만 홀랑 날아가버리는
기가막히는 사고가 발생해서 홈 디렉토리를 몽땅 날릴뻔 했습니다. :<

다행히도 다른 파티션에 3.5.1을 깔아서 복구했는데, 다시 생각만 해도
아찔하군요. 잊어먹기 전에 간단한 절차에 대해 이야기하겠습니다.

 1. 사고 개요

 파티션은 멀쩡한데 디스크레이블이 온데간데 없음 :<

 2. 복구방법

 다른 파티션에 FreeBSD를 깐다(저의 경우 3.5.1).

 sysutils/gpart와 ffsrecover를 설치한다.

 gpart는 PC파티션 날라갔을 때 디스크 내용을 보고 파티션 구성을 추측해
 주는 프로그램이고(이것도 파티션이 날라갔을 때에는 아주 쓸만합니다만
 저의 경우 PC파티션은 멀쩡했으므로 없어도 OK), ffsrecover는 깨진 ffs
 파티션에서 파일을 살려주는 프로그램인데, 제가 이용한 건 그중 수퍼블럭
 정보 보는 것입니다. 이게 디스크 장치에 동작을 안하고 파일로 된 디스크
 이미지에만 동작하는 바람에 조금 애를 먹었습니다. 수퍼블럭 정보 보려면

  dd if=/dev/wd0s2 of=ffs.img bs=512 count=500

  정도 하고서(대충 앞부분만 뜯는 겁니다)

  ffsrecover -p ffs.img

  로 보시면 해당 블럭의 크기는 알 수 있습니다(수퍼블럭이 날라갔으면
  대체 블럭을 보면 되겠죠. 보통 0, 32, 이런식으로 되니까 32번째 블럭을
  봐도 됩니다)

 그 다음, 레이블 살리기.

 레이블은 하나의 FFS 파티션을 나타내므로 가장 앞 블럭은
 수퍼블럭입니다(물론 백업본이 있습니다). 수퍼블럭의 백업은 0, 32,
 ... 식으로 증가합니다. 원리는 디스크를 죽 훑으면서 수퍼블럭을
 찾은후(FS_MAGIC으로 보니까 사실 여러 섹터들이 걸리겠죠. 그게
 수퍼블럭인지 아닌지는 잘 모르니까...), 인접한 두 수퍼블럭의 섹터
 차이가 32섹터가 되는 곳을 찾아낸 후 이것을 레이블의
 시작점으로(실제로는 A와 B가 32섹터 차이나는 두 블럭이라 할 때, A에서
 16블럭을 뺀 값이 한 레이블의 시작입니다) 인정하는 겁니다. 이런 식으로
 해서 다 찾으면 그 정보를 바탕으로 disklabel명령으로 레이블만 복구하면
 파일시스템은 다시 마운트할 수 있습니다.

 메일링 리스트 아카이브에서 이때 사용되는 프로그램을 찾을 수 있습니다.
 disklabel recovery 식으로 검색어를 주었던 것 같은데 지금은 검색이
 안되는군요. :< 대신 여기 붙입니다. 아래 프로그램으로 디스크레이블의
 시작 위치를 알고, ffsrecover로 수퍼블럭 정보를 봐서 크기를
 알아내고(그 프로그램의 결과는 1k 단위이므로 디스크레이블에 쓰려면 2를
 곱해야 합니다) 시작 위치를 알아내면 어렵지 않게 디스크레이블을 복구할
 수 있습니다. 어떤 레이블이(a,b,d,e,f,g,h) 그 섹터 범위에 해당하는지는

   cat /dev/wd0s2 | strings | more

 하면 디스크 내용이 덤프되는데 대략 앞부분에 /etc/fstab의 내용이
 나오는 경우가 있습니다. 이걸 보면 정확히 살릴 수 있고, / 가 아닌
 파티션이라면 적당히 하면 되겠죠. 어차피 disklabel은 순서를 따지지
 않습니다.

 혹 나중에 저같은 사고 당하신 분을 위해 적어둡니다.

 Navigation Bar  
 Date:      Sun, 25 Dec 1994 20:10:38 -0500 (EST)
 From:      Peter Dufault <dufault@hda.com>
 To:        alan@math.ucsb.edu (Alan D. Trombla)
 Cc:        questions@freebsd.org
 Subject:   Re: HELP!! Boot block/disklabel wiped
 Message-ID:  <199412260110.UAA03355@hda.com>
 In-Reply-To: <19941225173505.AAA6921@emile.math.ucsb.edu> from "Alan
 D. Trombla" at Dec 25, 94 09:35:05 am
-------------------------------------------------------------------------------
Next in thread | Previous in thread | Raw E-Mail | Index | Archive | Help
-------------------------------------------------------------------------------

Alan D. Trombla writes:
> 
(...)
> How can I reconstruct a disklabel? Is the disklabel/partition info 
> stashed in some other well-known location on disk?  Do superblocks
> know about there own partition?  Other partitions?  How can I locate a
> superblock --- do they have some kind of magic cookie that I could
> scan for?

Here is a program that might help you.  I wrote it when I accidentally
trashed my disk label on a two partition drive and couldn't bear the
thought of hours of spinning tapes to get it back.  Two lessons - be
careful when labeling disks and print out your labels (or at least store
them on other drives).

As long as your label is fairly simple you should be able to find the
partitions.  Look for "hits" 16 blocks apart.  Here is the label
on one of my drives:

> 8 partitions:
> #        size   offset    fstype   [fsize bsize   cpg]
>   a:    65536        0    4.2BSD     1024  8192    16   # (Cyl.    0 - 31)
>   b:    65536    65536      swap                        # (Cyl.   32 - 63)
>   c:   586764        0    unused        0     0         # (Cyl.    0 - 286)
>   d:   586764        0    unused        0     0         # (Cyl.    0 - 286)
>   e:   455692   131072    4.2BSD     1024  8192    16   # (Cyl.   64 - 286)

And here is some of the output from findfs.  This is around the two
partitions starting at 0 and 131072.

Each "hit" is a superblock:

> hda.com# ./findfs /dev/rsd0c 0 100
> Checked block 0
> !!! Hit at 16 !!!
> 16
> !!! Hit at 32 !!!
> 32
> hda.com# ./findfs /dev/rsd0c 131000 132000
> Checked block 131072
> !!! Hit at 131088 !!!
> 131088
> !!! Hit at 131104 !!!
> 131104
> hda.com# 

Note that the first superblock "hit" will be 16 blocks beyond the
start of the partition and there will always be an alternate
superblock (another hit) 16 later.  That is a good signature for
the start of a partition.  This only works for 512 byte sectors.

++++Start of findfs.c:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/param.h>
#include <ufs/ffs/fs.h>

#include <errno.h>

char buff[8192];

int check(int fid, int block)
{
        struct fs *fs;

        if (lseek(fid, (off_t)block * 512, SEEK_SET) == -1)
        {
                perror("lseek");
                exit(-1);
        }

        if (read(fid, buff, sizeof(buff)) != sizeof(buff))
        {
                perror("read");
                exit(-1);
        }

        fs = (struct fs *)buff;

        if (fs->fs_magic == FS_MAGIC)
        {
                fprintf(stderr, "!!! Hit at %d !!!\n", block);
                printf("%d\n", block);
                fflush(stdout);
                return 1;
        }

        return 0;
}

main(int argc, char *argv[])
{
        FILE *f;
        int block, start, end;
        int fid;

        if (argc != 4)
        {
                fprintf(stderr, "usage: %s device start_block end_block.\n",
                 argv[0]);
                exit(-1);
        }

        f = fopen(argv[1], "r");
        if (f == 0)
        {
                perror(argv[1]);
                exit(errno);
        }

        sscanf(argv[2], "%d", &start);
        sscanf(argv[3], "%d", &end);

        fid = fileno(f);

        for (block = start; block <= end;block++)
        {
                check(fid, block);
                if ((block % 4096) == 0)
                        fprintf(stderr, "Checked block %d\n", block);
        }
}

----End of findfs.c.

Peter


-- 
Peter Dufault               Real Time Machine Control and Simulation
HD Associates, Inc.         Voice: 508 433 6936
dufault@hda.com             Fax:   508 433 5267
++++ New e-mail address.  E-mail problems? Tell hdslip@iii.net


-------------------------------------------------------------------------------

www@FreeBSD.org



-- 
 +++ Any opinions in this posting are my own and not those of my employers +++
 CHOI Junho                             <cjh@FreeBSD.org> <cjh@kr.FreeBSD.org>
 KFUG <http://www.kr.FreeBSD.org>         Web Data Bank <http://www.wdb.co.kr>
 FreeBSD, GNU/Linux Developer                   http://people.FreeBSD.org/~cjh
--
To Unsubscribe: send mail to majordomo@kr.FreeBSD.org
with "unsubscribe hackers" in the BODY of the message



[ 날짜순 색인 ] [ 댓글순 색인 ] [ 최상위 색인]

Copyright © 1998-2003 Korea FreeBSD Users Group.
All rights reserved. webmaster at kr.FreeBSD.org
$Date: 2002/03/26 13:22:37 $
Powered by FreeBSD