obnova smazaneho (stale otevreneho) souboru

Dan Lukes dan at obluda.cz
Thu Apr 15 12:12:49 CEST 2010


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


More information about the Users-l mailing list