Subject: Re: Reading bad disk
To: Lars Hecking <lhecking@nmrc.ie>
From: None <kpneal@pobox.com>
List: port-amiga
Date: 05/02/2003 21:11:05
On Thu, May 01, 2003 at 01:21:26AM +0100, Lars Hecking wrote:
> warning unknown dostype: 0x53575000 marking unused
> warning found rdb->secpercyl(756) != rdb->nsectors(85) * rdb->nheads(9)
> sd3(ahsc0:0:3:0):  Check Condition on CDB: 0x08 00 00 00 01 00
>     SENSE KEY:  Media Error
>      ASC/ASCQ:  Address Mark Not Found for ID Field
>      FRU CODE:  0xe8
>          SKSV:  Actual Retry Count: 0
> 
> sd3: rdb scan I/O error
> 
>  Does anybody have ideas what I could do? There is no critical data on the
>  system, in fact, the configuration of the NetBSD disk is almost identical,
>  give or take a few ports/packages. But it would be nice to salvage as much
>  as possible.

Make an image of the disk into a file or onto another disk. Do it soon.

Also, use ffs_find (or similar) to find the beginnings of the filesystems.
I got it from the NetBSD mailing list archives, but I don't think it will
hurt to post it again. I made a couple of minor, ugly changes for
Digital UNIX (I blew away my OSF/1 disklabel once). They should be
easy to back out. Also, you may need to compile and run it on OpenBSD
(I had to run it on OSF/1 because the NetBSD compile wouldn't work on
the OSF/1 superblocks).

Someone should make a package. I'd do it but I just got this shiny
new MicroVAX-III that I want to play with, see, and ..... :)


/*
 * Copyright (c) 1997 David Brownlee (@mono.org). Licence at end of file.
 * Attempt to find ffs filesystems in the event of a lost disklabel.
 *
 * This program itself will not modify any data on a disk, but using
 * disklabel and fsck _can_ cause loss of data - you have been warned!
 *
 * Compile with 'cc -Wall -O -o ffs_find ffs_find.c'.
 *
 * To use, run 'ffs_find /dev/rXXNc' (eg rsd0c, rsd1c, or rwd0c etc), note the
 * possible filesystems, disklabel appropriately and try to fsck.
 * (May want to use /dev/rXXNd on i386).
 *
 * It reports possible filesystems by checking for two 'superblock like'
 * blocks fs.fs_sblkno blocks apart.
 *
 * Caveats:
 *	It can find false positives. (It should check more rigorously).
 *	It assumes 512 byte blocks.
 *	It assumes the first & second superblocks of a filesystem are intact,
 *	and at offsets of fs.fs_sblkno and fs.fs_sblkno*2 respectively.
 *	The 'trick' with sbplus is not particularly palatable, 
 *
 * Comments/suggestions welcome!
 */

#include <stdio.h>
#include <string.h>
#include <sys/param.h>
#if 1
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
#else
#include <ufs/fs.h>
#endif

#define BLOCKSIZE	512
#define	SB_SIZE	(((sizeof(struct fs)+BLOCKSIZE-1)/BLOCKSIZE)*BLOCKSIZE)

typedef struct
    {
    struct fs	data;
    char	pad[BLOCKSIZE-1];
    }fsplus;

int main(int argc,char **argv)
    {
    FILE	*fds;
    fsplus	sblock;
    int		blockno,
		size,
		last;

    if( argc!=2 )
	{
	fputs("Usage: ffs_find special\n",stderr);
	exit(3);
	}
    if( (fds=fopen(argv[1],"r"))==0 )
	{
	perror(argv[1]);
	exit(3);
	}
    if( fread(&sblock.data,SB_SIZE,1,fds)==0 )
	{
	fputs("Unable to read start of partition.\n",stderr);
	exit(3);
	}
    last=0;
    do	{
	if( sblock.data.fs_magic == FS_MAGIC )
	    {
	    printf("%d\r",blockno);
	    fflush(stdout);
	    if( last && last==blockno-sblock.data.fs_sblkno )
		{
		size=sblock.data.fs_size*(sblock.data.fs_fsize/BLOCKSIZE);
		printf("Possible filesystem at offset %u, size %u (%uMB).\n",
					    last-sblock.data.fs_sblkno,size,
					    size/(1024*1024/BLOCKSIZE));
		/*
		 * Do not skip to end of possible filesystem, as may be
		 * false positive
		 */
		}
	    last=blockno;
	    }
	memmove(&sblock.data,(char *)&sblock.data+BLOCKSIZE,
						sizeof(sblock.data)-BLOCKSIZE);
	++blockno;
	}while(fread((char *)&sblock.data+SB_SIZE-BLOCKSIZE,BLOCKSIZE,1,fds));
    return(0);
    }

/*
 * Copyright (c) 1997 David Brownlee (abs&#64;mono.org).  All rights reserved.   
 * 
 * This program is free software.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
 * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */



-- 
Kevin P. Neal                                http://www.pobox.com/~kpn/
      'Concerns about "rights" and "ownership" of domains are inappropriate.  
 It is appropriate to be concerned about "responsibilities" and "service" 
 to the community.' -- RFC 1591, page 4: March 1994