On 04/15/10 10:17, Dan Lukes:
Sel jsem na to nasledovne:
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

Dole to mas trochu sofistikovanejsi (samo si to zjisti ty konstanty) a vyporada se to i se situaci, kdy je poslednim blokem fragment.

Ale nepisu abych se chlubil ze umim psat scripty - prisel jsem pri tom na jedno varovani -

1. fsdb pracuje s tim co je ulozeno na disku
2. ne vsechno se uklada hned

Pri psani toho scriptiku jsem si jim totiz vypisoval jeho sameho - a relativne casto se mi stavalo, ze fsdb nevypsal ZADNY blok. To proto, ze od posledni editace souboru jeste nebyly cache systemu zapsane na disk - a z pohledu dat uloznych na disku tomu souboru jeste zadny blok nenalezi. Takze - pred vypisem se rozhodne vyplati "syncnout" a ani to nemusi pomoci.

Toz pozor ...

                                Dan

 -----------------------------------------------------------------

#!/bin/sh

# $1: device (/dev/ad0s1a)
# $2: inode
# output - file content on stdout

DISK=$1
INODE=$2

get_fs() {
# $1: device (/dev/ad0s1a)
# output - $FSIZE = fragment size (in bytes),
#          $BSIZE = block size (in bytes),
#          $FRAG - fragments ber block
        local x

        x=$( ffsinfo -l1 "$1" \
                | sed -n '/^bsize/,/^frag/{s/^[^ ]*  *[^ ]*  *//p;}'
        )

        set -- $x

        BSIZE=$(( $1 ))
        FSIZE=$(( $2 ))
        FRAG=$(( $3 ))
}

get_blocklist() {
# $1: device (/dev/ad0s1a)
# $2: inode number
# output - list of blocks on stdout

( echo "inode $2" ; echo "blocks" ) \
        | fsdb -r "$1" \
| sed '/^Indirect blocks/d;1,/^Direct blocks/d;s/,//g;s/ *([^)]*) */ /g;s/ $//' \
        | tr ' ' '\n'
}

# ---------------------------------------------------

sync ; sleep 3 ; sync
get_fs "$DISK"

get_blocklist "$DISK" "$INODE" | while read BLOCK x ; do
        dd if="$DISK" iseek="$BLOCK" bs="$FSIZE" count="$FRAG"
done
--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l

Odpovedet emailem