Compressibility of a disk image depends a lot on what kind of data is stored in there, how much of it is used or has ever been used (without being explicitely erased during the whole life of that drive).
In short, it's impossible to tell. 77% is completely plausible as are 0% (a disk full of videos/oggs) and 99% (an empty, recently erased with zeros disk).
Now, a few comments on your command:
ssh -c blowfish user@ip-or-hostname "dd if=/dev/sda1 | gzip -1 -" |
dd of=sda1.gz conv=sync,noerror
conv=sync,noerror are meant for reading from the disk.
dd is a dumb applications, it just does fixed size reads from a source file and fixed-size write to a destination.
If the disk is failing, and a sector is failing, a fixed-size read of 512 bytes may fail and return nothing. If
dd were to write 0 bytes on output for that sectory, that would mean a corrupted destination as the data would be shifted. What you want instead is to output 512 bytes worth of zeros to the destination to replace that failing sector. That's the
Also, you don't want it to stop at the first error =>
Now, that's only useful for the
dd that's reading the block device, your left side
dd is reading from a pipe fed by the ssh process. Again,
dd reads 512 bytes at a time from that pipe. What if
ssh doesn't write its output in chunks of size that is not multiple of 512? Then,
dd could end up reading incomplete 512 blocks from that pipe and because of
conv=sync, pad them with
zeros, corrupting the compressed file.
What you want here is:
ssh -c blowfish user@ip-or-hostname "dd if=/dev/sda1 conv=sync,noerror |
gzip -1" > sda1.gz
lzop instead of
gzip which is a lot faster even if the compression is not as good and at least is able to record in its footer uncompressed sizes greater than 4GB.