obnova smazaneho (stale otevreneho) souboru

Miroslav Lachman 000.fbsd at quip.cz
Thu Apr 15 01:04:21 CEST 2010


Dan Lukes wrote:
> On 04/14/10 14:40, Miroslav Lachman:

[...]

>> Zkousel jsem se podivat do manualu, jestli by to neslo pres fsdb
>
> fsdb je dobry pokus. Na ten jsem zapomel. Ma to ale hacek - s diskem smi
> v RW rezimu pracovat jen jediny proces. Dokud je disk namountovany RW,
> tak fsdb muze spouzit pouze v RO rezimu. Takze nemuzes pouzit 'ln',
> ktere by to snadno resilo.
>
> A odmountovat disk nepujde - tim by se "drzice descriptor" uzavrel.
> Mozna by slo disk remountovat na RO - ale to by se muselo vyzkouset.
>
> Ale melo by jit pouzit 'blocks' - tim dostanes seznam diskovych bloku,
> ktere obsahuji data ze souboru - a ty si uz pak pomoci 'dd' muzes
> postupne vycist.

Diky, tohle bylo postrceni spravnym smerem. Vyzkousel jsem to na souboru 
se znamym obsahem a byl jsem schopen ho takhle pomoci fsdb (prikazy 
inode a blocks) a dd zkopirovat jinam a jeho obsah odpovidal.

S timhle "podezrelym" souborem mam ale trosku potiz, jelikoz to neni 
textovy soubor, tak nevim, jestli mam jeho obsah kompletni, nebo spis 
jestli jsem neprecetl vice bloku, nez bylo potreba.

> Nejvetsi problem tak bude prepocet cisel bloku tak, jak vypadnou z
> 'blocks' na pozici na disku.
>
> Kdysi jsme v teto konferenci reseli opacny problem - jak ke zname pozici
> na disku najit do jakeho souboru sektor patri. Nekde v archivu to musi
> byt - a tam postup prepoctu skoro jiste byl ...

Sel jsem na to nasledovne:

# fsdb /dev/mirror/gm0s1e

fsdb (inum: 2)> inode 1184376
current inode: regular file
I=1184376 MODE=100755 SIZE=480872
         BTIME=Apr 11 04:26:18 2010 [0 nsec]
         MTIME=Apr 11 04:26:19 2010 [0 nsec]
         CTIME=Apr 11 04:26:20 2010 [0 nsec]
         ATIME=Apr 11 04:26:44 2010 [0 nsec]
OWNER=gurth GRP=wheel LINKCNT=1 FLAGS=0 BLKCNT=3e0 GEN=10af9016

fsdb (inum: 1184376)> blocks
Blocks for inode 1184376:
Direct blocks:
4750080, 4750088, 4750096, 4750104, 4750112, 4750120, 4750128, 4750136, 
4759880, 4759888, 4759896, 4759904
Indirect blocks:
4759912, 4759920, 4759928, 4759936, 4759944, 4759952, 4759960, 4759968, 
4759976, 4759984, 4759992, 4760000, 4760008, 4760016, 4760024, 4760032, 
4760040,
4760048,

Nasledne jsem si udelal jednoduchy script, ktery slouzi ke zkopirovani 
tech bloku ze seznamu:

----------------------------------------------------------------------
#!/bin/sh

blocks="4750080 4750088 4750096 4750104 4750112 4750120 4750128 4750136 
4759880 4759888 4759896 4759904 4759912 4759920 4759928 4759936 4759944 
4759952 4759960 4759968 4759976 4759984 4759992 4760000 4760008 4760016 
4760024 4760032 4760040 4760048"

for blk in $blocks
do
	blk=$(expr 4 \* $blk)
	dd if=/dev/mirror/gm0s1e of=/tmp/file-${blk}.blk skip=${blk} bs=512 
count=32
	dd if=/dev/mirror/gm0s1e skip=${blk} bs=512 count=32 >> /tmp/file.dump
done
----------------------------------------------------------------------

Puvodni fs block z fsdb je potreba nasobit 4, to pak odpovida pozici 
diskoveho bloku na disku.

Mam ted tedy jednotlive 16kB soubory (myslim, ze to je velikost FS 
bloku, pokud se pletu, tak me opravte, ale u prvniho pokusu se znamym 
souborem to fungovalo) i file.dump, kde jsou vsechny spojeny za sebe.

Ovsem nejsem si jist, jaky je vyznam "direct blocks" a jaky "indirect 
blocks".

Mam skutecne precist vsechny, nebo jen nektere?

Mirek



More information about the Users-l mailing list