Hitta super-block backups i NetBSD 2.0 ffsv2

Urban Boquist urban at boquist.net
Mon Jan 2 10:34:26 CET 2006


Johan> Jag har en (tidigare) NetBSD 2.x maskin vars disk har rasat
Johan> verkar det som, jag kommer åt alla slices förutom 'a' där jag
Johan> [...]

Johan> Vet inte om det här är rätt sätt att använda det men särskilt
Johan> bra går det ju inte:
Johan> # dumpfs -a /dev/wd1
Johan> dumpfs: /dev/wd1d: could not find superblock, skipped

Hmmm, du borde nog köra det på /dev/rwd1a om det är filsystemet på
a-partitionen du har problem med (och det heter inte "slice" i NetBSD). ;-)

Johan> Om någon kan hjälpa mig är jag tacksam, om ingen kan är det
Johan> inte hela världen, /home överlevde iaf ;)

Förtvivla inte!

Jag råkade stava fel i ett dd-kommando häromveckan och blåste helt
början av en disk. Programmet nedan fick mig på fötter igen snabbt,
det letar superblock med det magiska numret. Ger en del falska träffar
tyvärr, ta något som ser bra ut och läs ut sektorn med dd och titta
sedan på den med hexdump.

Lycka till! :-)

Mvh,
	-- Urban

#include <fcntl.h>
#include <unistd.h>
#include <sys/param.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>

main(int argc, char **argv)
{
	static char buf[2048];
	struct fs *fs;
	int fd;
	u_int64_t i;
	int j;

	fd = open(argv[1], O_RDONLY, 0);
	if (fd < 0) {
		perror("open");
		exit(1);
	}
	for (i = 0;;i++) {
		if (lseek(fd, i * 512, SEEK_SET) < 0) {
			perror("seek");
			exit(1);
		}
		if (read(fd, buf, sizeof(buf)) != sizeof(buf)) {
			perror("read");
			exit(1);
		}
		if (i % (2048*1024) == 0) {
			printf("i=%qd, ",i);
			printf("%qd GB\n", i / (2048*1024));
		}

		for (j = 0; j < sizeof(buf) - sizeof(struct fs); j+=4) {
			fs = (struct fs*)&buf[j];
			if (fs->fs_magic == FS_UFS1_MAGIC &&
			    (fs->fs_fsmnt[0] == '/' || fs->fs_fsmnt[0] == '\0'))
				printf("superblock in sector %qd:\n", i);
		}
	}
	exit(0);
}


More information about the BUS mailing list