nalezeni souboru na disku podle LBA

Miroslav Lachman 000.fbsd at quip.cz
Thu Sep 24 19:15:02 CEST 2009


Dan Lukes wrote:

> Miroslav Lachman napsal/wrote, On 09/24/09 15:43:
>> Pokud je ten mirror gm0 slozen primo z disku ad4 a ad6
[...]

> Jak sam rikas - melo. Nezkoumal jsem presnou vnitrni implementaci 
> gmirror, takze nevim. Over si svoje tvrzeni - precti par sektoru z gm0 a 
> par z ad4 a pokud bude obsah stejny (zkus se netrefit do prazdneho mista 
> a vynulovanych sektoru).
> 
> Kdyz overis, ze prepocet je fakticky identita potvrdia tim i moje 
> tvrzeni, ze ten prepocet bude jednoduchy.

Ze 7 pokusu jsem se 4 krat trefil do prazdneho mista :)
Ale jinak si troufam rict, ze to v pripade gmirroru sedi

dd if=/dev/ad4 of=dd_ad4.333 bs=512 count=1 skip=333
dd if=/dev/ad6 of=dd_ad6.333 bs=512 count=1 skip=333
dd if=/dev/mirror/gm0 of=dd_gm0.333 bs=512 count=1 skip=333

~/# md5 *.333
MD5 (dd_ad4.333) = 084c42cea78aec7f633af1ddfd5a41c3
MD5 (dd_ad6.333) = 084c42cea78aec7f633af1ddfd5a41c3
MD5 (dd_gm0.333) = 084c42cea78aec7f633af1ddfd5a41c3

dd if=/dev/ad4 of=dd_ad4.3456 bs=512 count=5 skip=3456
dd if=/dev/ad6 of=dd_ad6.3456 bs=512 count=5 skip=3456
dd if=/dev/mirror/gm0 of=dd_gm0.3456 bs=512 count=5 skip=3456

~/# md5 *.3456
MD5 (dd_ad4.3456) = a371492f16c0940507435909603efe88
MD5 (dd_ad6.3456) = a371492f16c0940507435909603efe88
MD5 (dd_gm0.3456) = a371492f16c0940507435909603efe88

[...]
>> obecne by se mi asi hodilo, znat postup, *jak zjistit soubor podle 
>> pozice vadneho bloku*.
> 
> 
> Taky by se mi obcas hodilo. Bohuzel, neznam.

Nejaky postup jsem na to vymyslel, ale jelikoz se pro tentokrat jednalo 
o prazdne misto (viz nize), tak to nemam potvrzeno.

Melo by to jit pomoci prikazu *fsdb* (je soucasti base systemu) a jeho 
prikazu *findblk*, ten by mel podle zadaneho cisla bloku vypsat inode a 
pak uz staci pouzit
find /my/path -inum nalezeny_inode

Mam s tim akorat ten problem, ze to nedokazu potvrdit. Nahodne zadane 
cislo findblk 55555 vratilo vysledek 55552: data block of inode 2496590

fsdb (inum: 2)> findblk 22222 33333 44444 55555 66666
55552: data block of inode 2496590

(mam trosku nesrovnalost v tom, proc na dotaz 55555 prijde vysledek pro 
55552 - to neni muj preklep, to je copy&paste)

tomu nasledne odpovida toto:
~/# find /var/db/ -inum 2496590
/var/db/mysql/ibdata3

Ale nejsem schopen rict, ze ten soubor na tom bloku opravdu je, nebo 
spis ze je to ten blok, ktery si myslim, ze to je. Ono totiz to *fsdb* 
ma zvlastni chovani.

fsdb (inum: 2)> blocks
Blocks for inode 2:
Direct blocks:
3008 (1 frag)
fsdb (inum: 2)> findblk 3008
fsdb (inum: 2)>

Vyse uvedeny priklad by mel vlastne vypsat blok(y) pro aktualni inode, 
coz je v uvedenem prikladu 2, vypise blok 3008, ale 'findblk 3008' 
nevypsal zadny vysedek a ja bych ocekaval, ze mi vrati cislo 2

> 
>> Mam v planu zkusit vynutit realokaci prepisem toho sektoru, ale to az 
>> v pripade, ze zjistim, co na tom sektoru lezi, nebo ze tam nic nelezi.
> 
> 
> Nejprve dohledej ktery z tech 256 sektoru ve ctenem bloku to byl. Pak 
> muzes zkusit nahlednout jeho obsah. Asi ne primo, protoze pokud sektor 
> cist nelze, obvykle ti to nevrati ani castecny obsah, ale same nuly.

Zkusil jsem pro zacatek metodu mene namahavou na hlavu. Po tom, co jsem 
precetl celou partition pomoci dd (viz predchozi e-mail), jsem tentokrat 
prepsal veskere volne misto na te partition nulama z /dev/zero a cirou 
nahodou to zabralo (dd if=/dev/zero of=/var/db/big.file bs=1m)

Ted uz je ve SMARTu
   5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail 
Always       -       0
  13 Read_Soft_Error_Rate    0x000e   100   100   000    Old_age 
Always       -       1
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always 
       -       3
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always 
       -       0
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always 
       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age 
Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   100   100   000    Old_age   Always 
       -       0
200 Multi_Zone_Error_Rate   0x000a   100   100   000    Old_age   Always 
       -       0
201 Soft_Read_Error_Rate    0x000a   100   099   000    Old_age   Always 
       -       0

Neni tedy hlasena ani realokace, ale ani pending sector.

Na zaklade toho tedy (snad spravne) usuzuji, ze vadny blok byl na volnem 
miste a navic jeho necitelnost byla nejakou "anomalii", ktera uz se pri 
druhem cteni nevyskytla.

> V kazdem pripade budes muset nejprve prevest pozici na fyzickem disku na 
> pozici v ramci slice (trivialni matematika - zjistis, kde partition na 
> fyzickem disku zacina a odectes) nasledne budes muset zaridit podobny 
> prepocet (podobnym algoritmem) pri prechodu z slice do partition. A zde 
> koncime - pozici v ramci FS na soubor proste prevest neumim. ZKus 
> zmermomocnit ten port o kterem byla rec - treba z nej neco dostanes. Me 
> se ho nejak zdolat nepovedlo.

Jen abych si udelal jasno, ze jsem to pocital spravne:

fdisk

sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
     start 63, size 209712447 (102398 Meg), flag 80 (active)
         beg: cyl 0/ head 1/ sector 1;
         end: cyl 1023/ head 254/ sector 63
The data for partition 2 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
     start 209712510, size 1743807555 (851468 Meg), flag 0
         beg: cyl 1023/ head 255/ sector 63;
         end: cyl 1023/ head 254/ sector 63


bsdlabel mirror/gm0s1
# /dev/mirror/gm0s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
   a:  2097152        0    4.2BSD        0     0     0
   b: 25165824  2097152      swap
   c: 209712447        0    unused        0     0         # "raw" part, 
don't edit
   d: 12582912 27262976    4.2BSD        0     0     0
   e: 146800640 39845888    4.2BSD        0     0     0
   f: 16777216 186646528    4.2BSD        0     0     0
   g:  6288703 203423744    4.2BSD        0     0     0


Filesystem            Size    Used   Avail Capacity  Mounted on
/dev/mirror/gm0s1a    989M    224M    686M    25%    /
devfs                 1.0K    1.0K      0B   100%    /dev
/dev/mirror/gm0s1f    7.7G    1.8G    5.3G    25%    /usr
/dev/mirror/gm0s1d    5.8G    3.0M    5.3G     0%    /var
/dev/mirror/gm0s1e     68G     17G     46G    27%    /var/db
/dev/mirror/gm0s1g    2.9G     16K    2.7G     0%    /tmp

chyba na LBA=79725056     ad4[READ(offset=40819228672, length=131072)

Podle offsetu jednotlivych partitions, LBA 79725056 lezi na /var/db 
(mezi offsety 39845888 a 186646528; a samozrejme jeste tech 63 sektoru o 
ktere zacina s1 dale, nez je zacatek disku, je to tak?)

Kdyz uz vim, ze se pohybuji v ramci prvni slice, tak abych 
neprepocitaval vsechny offsety o tech 63, tak muzu zachovat offsety a 
odecist 63 od LBA chyby:
79725056 - 63 = 79724993  to by mela byt pozice v ramci ad4s1 (doufam)

Od takto ziskaneho cisla pak staci odecist offset partition /var/db a 
tim dostat cislo bloku, ktere vyzaduje *fsdb*.
79724993 - 39845888  = 39879105


  findblk disk_block_number ...
      Find the inode(s) owning the specified disk block(s) number(s).
      Note that these are not absolute disk blocks numbers, but offsets
      from the start of the partition.


Pak uz jen zbyva spustit fsdb nad prislusnym oddilem podle jeho zarizeni 
z /dev a zadat prikaz findblk s patricnym cislem, viz vyse:

  ~/# fsdb -r /dev/mirror/gm0s1e
** /dev/mirror/gm0s1e (NO WRITE)
Examining file system '/dev/mirror/gm0s1e'
Last Mounted on /var/db
current inode: directory
I=2 MODE=40755 SIZE=512
         BTIME=May  1 08:07:23 2009 [0 nsec]
         MTIME=Sep 24 15:52:01 2009 [0 nsec]
         CTIME=Sep 24 15:52:01 2009 [0 nsec]
         ATIME=Sep 24 16:24:34 2009 [0 nsec]
OWNER=root GRP=wheel LINKCNT=11 FLAGS=0 BLKCNT=4 GEN=4ebc65fc
fsdb (inum: 2)>
fsdb (inum: 2)> findblk 39879105

A jelikoz jsi tam zminoval, ze length=131072 je 256 sektoru, tak tohle 
cislo 39879105 postupne (256x) zvysovat o 1 a tim bych prosel vsechny 
sektory...

Je tahle moje uvaha spravna, nebo jsem nekde v tech prepoctech udelal 
chybu?

Jelikoz se v mem pripade jednalo o problem v neobsazenem miste, tak mi 
to samozrejme zadny inode nevratilo. Tak bych byl rad, kdyby nekdo 
tenhle muj domely postup dokazal zrevidovat, jestli je spravne a pokud 
ne, tak mi v tom opravte chyby... at priste uz opravdu vim, jak na to.

Doufam, ze jsem nikoho moc neunavil prilis dlouhym a nudnym e-mailem a 
treba tu nekdo nasel i nejakou uzitecnou informaci (z Danovi strany, odeme.

Mirek

PS: A jeste mi od kamarada prisel odkaz na clanek ohledne stejne 
problematiky na linuxu http://www.gra2.com/article.php/20041015232512624
Ale tam se pocita jeste s "File system block size in bytes"...





More information about the Users-l mailing list