I have fixed my problem with the "missing `.' fsck cannot fix". I want
to thank the following people clearing up my confusion.
Ed Arnold
smb@ulysses.att.c
Stephane Tsacas
"Matt Crawford"
William LeFebvre
Harris A. Jaffee
dan@BBN.COM
Mike Raffety
Kevin Sheehan
tim@ben.dciem.dnd
klaus u schallhor
Harris A. Jaffee
To summarize, somehow I no longer had `.' as the first entry in the
directory for the partition. Several people mentioned using od to find
out what is there. Doing od -c /u4 gets
0000000 \0 \0 \0 002 \0 \f \0 001 377 \0 \0 \0 \0 \0 \0 002
0000020 \0 \f \0 002 . . \0 \0 \0 \0 \0 003 \0 024 \0 \n
0000040 l o s t + f o u n d \0 \0 \0 \0 006 \0
0000060 \0 \f \0 003 g n u \0 \0 \0 242 001 001 310 \0 005
0000100 l o c a l \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000120 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0001000
In comparing this to other directories it is clear that the 377 on the first
line should be a `.'
Using od on the raw disk I found out that the location of the inode
for the directory is at 074000:
od -c /dev/rsd2h | less ( and searched for /l o s t/ and
backed up)
0740000 \0 \0 \0 002 \0 \f \0 001 377 \0 \0 \0 \0 \0 \0 002
0740020 \0 \f \0 002 . . \0 \0 \0 \0 \0 003 \0 024 \0 \n
0740040 l o s t + f o u n d \0 \0 \0 \0 006 \0
0740060 \0 \f \0 003 g n u \0 \0 \0 242 001 001 310 \0 005
0740100 l o c a l \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0740120 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
So at location 0740010 (octal) I want to put a `.'
How to fix it?
Well several people mentioned adb. and do something like:
------------------------------------------------------------------------
adb -w - /dev/rsd2h
0o0740010/x
(should produce "3c008: ff00".)
0o0740010/w 0x2e00
(should produce "3c008: 0xff00 = 0x2e00".)
$q
------------------------------------------------------------------------
Unfortunately, I keep getting "data not found" message from my sun
4/330(OS:4.1). However, when I tried the same on a SS2 (4/75) it
works fine. If anyone knows why please tell me.
A couple people mentions emacs. I don't think emacs will let root
edit the raw disk file. Anyway I couldn't get it to work.
A really cute solution is to use a dd; edit; dd trick as follows:
------------------------------------------------------------------------
# dd if=/dev/rsd2h of=1sector bs=512 skip=480
# <edit the file "1sector" with emacs or whatever>
# dd if=1sector of=/dev/rsd2h bs=512 seek=480
------------------------------------------------------------------------
The solution I used was a C program. Many of you pointed out that I
had 074000 where I should have had 0740000. Here is the C program that
I used. Thanks to all of you.
------------------------------------------------------------------------
#include <stdio.h>
#include <fcntl.h>
main()
{
int fd;
int ja;
int oc;
unsigned char buf[2048];
for(ja=0; ja<2048; buf[ja++] = '\0');
fd = open ("/dev/rsd2h",O_RDWR,0);
printf("fd : %d\n",fd);
ja = get(fd,(long) 0740000,&buf[0],2048);
printf("ja : %d\n",ja);
for(ja = 0; ja < 24; ja++)
{
oc = buf[ja];
printf("%d: %o\n",ja,oc);
}
buf[8] = '.';
ja = put(fd,(long) 0740000,&buf[0],2048);
}
int get(int fd,long pos, unsigned char *buf, int n)
{
int ls;
if ((ls=lseek(fd,pos,0)) >= 0)
{
printf("ls from lseek %d\n",ls);
ls = read(fd, buf, n);
if (ls < 0) perror("read error");
return ls;
}
else
{
perror("get error");
return -1;
}
}
int put(int fd,long pos, unsigned char *buf, int n)
{
int ls;
if ((ls=lseek(fd,pos,0)) >= 0)
{
printf("ls from lseek %d\n",ls);
ls = write(fd, buf, n);
if (ls < 0) perror("write error");
return ls;
}
else
{
perror("get error");
return -1;
}
}
--______________________________________________________________________________ Robert McLay | When you have a problem, put NO in front of Manager CFD Lab | it and you have: NO PROBLEM. Dept ASE-EM | University of Texas at Austin | -- Eric Beckman's 2nd Law | mclay@wilbur.ae.utexas.edu |
This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:06:12 CDT