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

--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l

Odpovedet emailem