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