tar archives και corruption

George Notaras gnot at g-loaded.eu
Thu Nov 29 23:06:52 EET 2007


On Thu, 2007-11-29 at 17:41 +0200, Giorgos Keramidas wrote:
> On 2007-11-29 17:10, George Notaras <gnot at g-loaded.eu> wrote:
> > Εάν ένα uncompressed tar αρχείο "χαλάσει" σε κάποιο σημείο, είναι δυνατό
> > το extraction αρχείων που δεν επηρεάζονται από την corrupted περιοχή?
> 
> Μπορείς πάντα να χρησιμοποιήσεις το cpio(1), το οποίο υποστηρίζει
> per-file checksums.
> 
> Για παράδειγμα, έφτιαξα ένα ~/crew directory με το source από το
> ``mercurial-crew'' branch, και το συμπίεσα με το cpio(1) σε BSD και
> Solaris:
> 
>     cd ~/crew
>     find . | cpio -o -H crc > /var/tmp/mercurial.cpio
> 
> Ύστερα με το hexl-mode του Emacs (ή ένα οποιοδήποτε άλλο hex editor)
> άλλαξα ένα byte στο αρχείο, και το έκανα extract:
> 
>     $ cpio -i -H crc < /var/tmp/mercurial-broken.cpio
>     cpio: "contrib/churn.py" - checksum error
>     4768 blocks
>     1 error(s)
>     $ echo $?
>     1
>     $
> 
> Η διαφορά είναι όντως το ένα byte που άλλαξα...
> 
>     $ gdiff -ruN crew crew-test
>     diff -ruN crew/contrib/churn.py crew-test/contrib/churn.py
>     --- crew/contrib/churn.py       2007-11-29 17:40:27.207508000 +0200
>     +++ crew-test/contrib/churn.py  2007-11-29 17:40:36.591104000 +0200
>     @@ -174,7 +174,7 @@
>          revs.sort()
>          stats = gather_stats(ui, repo, amap, revs, opts.get('progress'))
> 
>     -    # make a list of tuples (name, lines) and sort it in descending order
>     +    # make a list of tuples (name, lines) and sort it in descending or er
>          ordered = stats.items()
>          ordered.sort(lambda x, y: cmp(y[1], x[1]))
> 
>     $
> 

Τα παρακάτω δεν είναι για τα δικά μου δεδομένα (έλιωσα στο ψάξιμο), αλλά
τα έκανα για χάρη του testing.


Τεστ με TAR

Καταστροφή ενός byte (τυχαίου) του tar archive
=============================================

$ md5sum bak/*
11875e4e35a40686d81a37aa448aac2e  bak/1.pdf
30c63be455dbada1ffc985c5465d0723  bak/2.pdf
096dc1c77a2a0f4d9f953abd7264843f  bak/3.pdf

$ tar -cvf bak.tar bak/
bak/
bak/2.pdf
bak/3.pdf
bak/1.pdf

$ tar -dvf bak.tar bak/
bak/
bak/2.pdf
bak/3.pdf
bak/1.pdf

--
Εδώ άλλαξα ένα byte στο bak.tar
--

$ tar -dvf bak.tar bak/
bak/
bak/2.pdf
bak/3.pdf
bak/3.pdf: Contents differ
bak/1.pdf

$ mkdir out

$ tar -xvf bak.tar -C out/
bak/
bak/2.pdf
bak/3.pdf
bak/1.pdf

$ md5sum out/bak/*
11875e4e35a40686d81a37aa448aac2e  out/bak/1.pdf
30c63be455dbada1ffc985c5465d0723  out/bak/2.pdf
2d0b2aa54047d6e97b45fbb43f8f1bdc  out/bak/3.pdf

-----------
ΣΥΜΠΕΡΑΣΜΑ:
-----------
Διαφέρουν τα checksums των bak/3.pdf out/bak/3.pdf
Τα υπόλοιπα έγιναν κανονικά extract.


======================
ΤΕΣΤ με CPIO

Καταστροφή ενός byte (τυχαίου) του cpio archive
======================

$ md5sum bak/*
11875e4e35a40686d81a37aa448aac2e  bak/1.pdf
30c63be455dbada1ffc985c5465d0723  bak/2.pdf
096dc1c77a2a0f4d9f953abd7264843f  bak/3.pdf

$ find bak/ | cpio -v -o -H crc > bak.cpio
bak/
bak/2.pdf
bak/3.pdf
bak/1.pdf
25919 blocks

$ cpio -vi --only-verify-crc < bak.cpio 
bak/
bak/2.pdf
bak/3.pdf
bak/1.pdf
25919 blocks

--
Εδώ άλλαξα ένα byte στο bak.cpio
--

$ cpio -v -i --only-verify-crc < bak.cpio 
bak/
bak/2.pdf
cpio: bak/3.pdf: checksum error (0x2b7dbd48, should be 0x2b7dbda8)
bak/3.pdf
bak/1.pdf
25919 blocks

$ mkdir out2

$ cd out2/

$ cpio -vid < ../bak.cpio 
bak
bak/2.pdf
cpio: bak/3.pdf: checksum error (0x2b7dbd48, should be 0x2b7dbda8)
bak/3.pdf
bak/1.pdf
25919 blocks

$ cd ..

$ md5sum out2/bak/*
11875e4e35a40686d81a37aa448aac2e  out2/bak/1.pdf
30c63be455dbada1ffc985c5465d0723  out2/bak/2.pdf
cd9ea8e6298a42f44b59322b31e55958  out2/bak/3.pdf

-----------
ΣΥΜΠΕΡΑΣΜΑ:
-----------
Διαφέρουν τα checksums των bak/3.pdf out/bak/3.pdf
Τα υπόλοιπα έγιναν κανονικά extract.


==========================

Πληροφορίες σχετικά με το format του SRV4 (new portable ASCII format
with CRC checksum added), που χρειάστηκαν για τα παρακάτω, βρέθηκαν εδώ:

http://leaf.dragonflybsd.org/cgi/web-man?command=cpio&section=5

===========================

ΤΕΣΤ CPIO ΜΕ ΧΑΛΑΣΜΕΝΟ ΤΟ CRC

Καταστροφή του CRC του  2ου αρχείου μέσα στο archive (το 1ο είναι ο
κατάλογος bak/). Στο πεδίο CRC γράφονται 8 μηδενικά

==========================

$ md5sum bak/*
11875e4e35a40686d81a37aa448aac2e  bak/1.pdf
30c63be455dbada1ffc985c5465d0723  bak/2.pdf
096dc1c77a2a0f4d9f953abd7264843f  bak/3.pdf

$ find bak/ | cpio -v -o -H crc > bak.cpio
bak/
bak/2.pdf
bak/3.pdf
bak/1.pdf
25919 blocks

$ python
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> magic = "070702"
>>> f = open("bak.cpio", "r+")
>>> magic2_pos = f.read().find(magic, 1)
>>> crc_pos = magic2_pos + 6 + 12*8
>>> f.seek(crc_pos)
>>> f.write("0"*8)
>>> f.close()
>>> 

$ cpio -v -i --only-verify-crc < bak.cpio 
bak/
cpio: bak/2.pdf: checksum error (0xbf8ffd3, should be 0x0)
bak/2.pdf
bak/3.pdf
bak/1.pdf
25919 blocks

$ mkdir out2

$ cd out2/

$ cpio -vid < ../bak.cpio
bak
cpio: bak/2.pdf: checksum error (0xbf8ffd3, should be 0x0)
bak/2.pdf
bak/3.pdf
bak/1.pdf
25919 blocks

$ cd ..

$ md5sum out2/bak/*
11875e4e35a40686d81a37aa448aac2e  out2/bak/1.pdf
30c63be455dbada1ffc985c5465d0723  out2/bak/2.pdf
096dc1c77a2a0f4d9f953abd7264843f  out2/bak/3.pdf

-----------
ΣΥΜΠΕΡΑΣΜΑ:
-----------
Τα md5sums ειναι τα ίδια παρόλο που το CRC ήταν χαλασμένο, ;ara to
extraction έγινε κανονικά. Απέτυχε μόνο το verification.


==========================================
ΣΥΝΕΧΕΙΑ του προηγούμενου: "χάλασμα" *όλων* των metadata του 2ου
archived αρχείου

===================

$ python
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> magic = "070702"
>>> f = open("bak.cpio", "r+")
>>> magic2_pos = f.read().find(magic, 1)
>>> f.seek(magic2_pos)
>>> metadata_length = magic2_pos + 6 + 13*8 + 4  # 4: μέρος του pathname
>>> f.write("0"*metadata_length)
>>> f.close()
>>> 

$ cpio -v -i --only-verify-crc < bak.cpio 
bak/
cpio: premature end of file

$ mkdir out3

$ cd out3

$ cpio -vid < ../bak.cpio
bak
cpio: premature end of file

$ ls -l
total 4
drwxrwxr-x 2 gnot gnot 4096 2007-11-29 22:44 bak

-----------
ΣΥΜΠΕΡΑΣΜΑ:
-----------
Ούτε verification ούτε extraction.
Θέλει recovery με το χέρι, αν γίνεται.






More information about the Linux-greek-users mailing list