nalezeni souboru na disku podle LBA (fsdb findblk)

Miroslav Lachman 000.fbsd at quip.cz
Sun Oct 4 18:15:26 CEST 2009


Dan Lukes wrote:
> Miroslav Lachman napsal/wrote, On 09/27/09 00:58:
> 
>> Jenze s fsdb mam takovy problem, ze i kdyz najdu nejaky soubor 
>> (inode), necham si k nemu vypsat bloky a pak tyto bloky zadam zpet 
>> fsdb findblk, tak mi zadny inode nevypise. 
> 
> 
> No to je proto, ze fsdb je velmi zmatene. Kdyz pouziva pojem "blok" tak 
> tim nikdy nemysli blok - nejcasteji tim mysli blok ale fragment. A v 
> pripade findblk pak dokonce mysli sektor.
> 
> Takze cislo pro findblk musis vynasobit ctyrmi (v pripade, ze fragment 
> ma velikost 2048=4*512 jinak adekvatne k velikosti fragmentu)
> 
> Cislem sektoru se samozrejme mysli cislo sektoru v ramci dane partition. 
> Aby se z nej dostalo cislo sektoru v ramci dane slice je treb apouzit 
> bsdlabel a pricist "offset". A abychom z nej dostali cislo sektoru v 
> ramci sektoru je treba pouzit jeste fdisk a pricist cislo "start"

Jelikoz mam nejake smolne obdobi, tak jsem mel vcera moznost si to znovu 
vyzkouset na jinem stroji, kde se take vyskytly nejake necitelne 
sektory. Zkusil jsem vzit v potaz tvou teorii o vynasobeni 4, ale 
nezafungovalo to.

Naopak zafungovalo pro findblk pouzit normalne vypoctene cislo LBA ze 
SMART logu (po odecteni offsetu slice a partition). Tim jsem nasel 
inode, k inodu i patricny soubor, ktery jsem tentokrat predem ocekaval a 
na zaver jsem zkusil prikazem blocks zpetne overit tu teorii, kde jsem 
opet "selhal"...
Ve vypisu bloku pro zadany inode se nenechazel ten blok, jehoz cislo 
jsem zadaval prikazu findblk.

Zkusil jsem to tedy jeste jinak - cislo, ktere jsem zadaval predtim pro 
findblk jsem vydelil 4 a to uz jsem pak na seznamu bloku, ktery vraci 
prikaz blocks, nasel. Jestli je to shoda nahod, nebo potvrzeni 
spravnosti, to si netroufam tvrdit. Do zdrojaku jsem nekoukal a i kdyby 
koukal, tak mi to na 99% nic nerekne.

Cely proces byl tedy nasledujici:

ad6: FAILURE - READ_DMA status=51<READY,DSC,ERROR> 
error=40<UNCORRECTABLE> LBA=22832527

fdisk (zkraceny vypis):
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
     start 63, size 125821017 (61436 Meg), flag 80 (active)

bsdlabel (zkraceny vypis):
   d: 12582912 12582928    4.2BSD     2048 16384 28528
   e: 83886080 25165840    4.2BSD     2048 16384 28528

/dev/mirror/gm0s1d    5.8G    499M    4.9G     9%    /var
/dev/mirror/gm0s1e     39G     16G     19G    46%    /var/db

Chyba na LBA 22832527 lezi na partition /var

Od LBA chyby odectu offset prvni slice (63)
22832527 LBA error - 63 = 22832464

A od toho pak jeste offset partition /var
22832464 - 12582928  = 10249536

Tim jsem ziskal pozici chyby uvnitr partition /var

Pokud jsem te pochopil spravne, mel jsem ziskane cislo vynasobit 4, coz 
je 40998144, ale to mi findblk nic nenajde

fsdb -r /dev/mirror/gm0s1d

fsdb (inum: 2)> findblk 40998144
fsdb (inum: 2)>

Pro puvodni cislo najde inode 23704

fsdb (inum: 2)> findblk 10249536
10249536: data block of inode 23704

prikazem find pak slo dohledat o jaky soubor se jedna

~/# find /var/ -inum 23704
/var/log/lighttpd/lighttpd-error.log

To, ze by to mohl byt tenhle soubor jsem predem usuzoval podle toho, ze 
k zalogovani chyby doslo priblizne kolem okamziku, kdy jsem s timhle 
32MB velkym logem pracoval ve Vimu a projizdel ho i grepem.

Kdyz se pak pokusim ve fsdb zpetne k inode dohledat bloky, tak mi to 
nevrati ani ten vynasobeny 4, ani to cislo 10249536, ale pokud to 
vydelim 4, tak uz se chytam.


fsdb (inum: 2)> inode 23704
current inode: regular file
I=23704 MODE=100644 SIZE=33272836
         BTIME=Oct  7 00:24:34 2008 [0 nsec]
         MTIME=Oct  4 17:19:11 2009 [0 nsec]
         CTIME=Oct  4 17:19:11 2009 [0 nsec]
         ATIME=Oct  3 21:15:13 2009 [0 nsec]
OWNER=www GRP=wheel LINKCNT=1 FLAGS=0 BLKCNT=fe00 GEN=624200e1

fsdb (inum: 23704)> blocks
Blocks for inode 23704:
Direct blocks:
138080, 138088, 138096, 138104, 138112, 138120, 138128, 159568, 159576, 
159584, 159592, 159600
Indirect blocks:
159608, 159616, 179552, ..... 2562384 .... , 2803696, 2803704

Misto tecek je samozrejme dlouha rada cisel (nekolik set cisel) a mezi 
nimi i 2562384  coz odpovida 10249536 / 4.


Tak snad tato moje zjisteni dale nekomu pomohou v pochopeni 
"nepochopitelneho prikazu fsdb".

jen mi porad nejde dohlavy, proc se tam pokazde pracuje s jinymi bloky a 
co tim autor fsdb sledoval... zrejme zmateni nepritele.

Mirek



More information about the Users-l mailing list