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§ion=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