finding alternate superblocks in ffs
Christoph P. Kukulies
kuku at kukulies.org
Sun Oct 31 03:42:14 PST 2004
Yesterday a major desaster happened: I stumbled across the power cable of my
Dell Inspiron notebook. The notebook fell to the floor. FreeBSD was running
at that time. Nothing seemed to got damaged, just a palm rest popped off.
Ah yes, the HD bay sprung off and in a moment of reflex I pushed it
in again in the running system. After that I tried to mount the
disk (which had not been mounted at that point of time). Anyway,
trying to
# fsck_ffs /dev/ad2s1e
** /dev/ad2s1e
Cannot find file system superblock
LOOK FOR ALTERNATE SUPERBLOCKS? [yn] y
32 is not a file system superblock
89808 is not a file system superblock
179584 is not a file system superblock
269360 is not a file system superblock
359136 is not a file system superblock
448912 is not a file system superblock
538688 is not a file system superblock
628464 is not a file system superblock
718240 is not a file system superblock
808016 is not a file system superblock
....
20813728 is not a file system superblock
20903504 is not a file system superblock
20993280 is not a file system superblock
21083056 is not a file system superblock
21172832 is not a file system superblock
21262608 is not a file system superblock
SEARCH FOR ALTERNATE SUPER-BLOCK FAILED. YOU MUST USE THE
-b OPTION TO FSCK TO SPECIFY THE LOCATION OF AN ALTERNATE
SUPER-BLOCK TO SUPPLY NEEDED INFORMATION; SEE fsck(8).
#
Any idea what I can do now?
I wrote a little program that opens /dev/ad2s1e
#include <stdio.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/mount.h>
#include <sys/resource.h>
#include <sys/sysctl.h>
#include <sys/disklabel.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/ufsmount.h>
#include <ufs/ffs/fs.h>
#include <fcntl.h>
#include <ufs/ffs/fs.h>
main(){
int fd;
int k,i=0;
int buf[512/(sizeof (int))];
if((fd=open("/dev/ad2s1e",O_RDONLY)) < 0)
printf("error opening device\n"),exit(2);
printf("opened device\n");
while(read(fd,buf,512)>0){
for(k=0;k<(512/(sizeof (int)));k++){
/*if(buf[k]==FS_UFS1_MAGIC)
printf("UFS1 * %d\n",i),fflush(stdout); */
if(buf[k]==FS_UFS2_MAGIC)
printf("UFS2 * %d\n",i),fflush(stdout);
i++;
}
}
}
I'm not sure whether my approach is correct.
Anyway, the blocks I find with that method
aren't recognized as superblocks either.
--
Chris Christoph P. U. Kukulies kuku_at_kukulies.org
More information about the freebsd-hackers
mailing list