<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bitrot &#8211; Linux und Ich</title>
	<atom:link href="https://linuxundich.de/tag/bitrot/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxundich.de</link>
	<description>Blog über Ubuntu, Linux, Android und IT</description>
	<lastBuildDate>Thu, 13 Mar 2025 11:05:06 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://linuxundich.de/wp-content/uploads/2025/04/cropped-lui-app-512-32x32.png</url>
	<title>Bitrot &#8211; Linux und Ich</title>
	<link>https://linuxundich.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bitrot bei JPG-Dateien, wirklich so dramatisch?</title>
		<link>https://linuxundich.de/gnu-linux/bitrot-bei-jpg-dateien-wirklich-dramatisch/</link>
					<comments>https://linuxundich.de/gnu-linux/bitrot-bei-jpg-dateien-wirklich-dramatisch/#comments</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Tue, 22 Mar 2016 08:53:05 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Bitrot]]></category>
		<category><![CDATA[Btrfs]]></category>
		<category><![CDATA[Dateisysteme]]></category>
		<category><![CDATA[Datensicherheit]]></category>
		<guid isPermaLink="false">https://linuxundich.de/?p=34903</guid>

					<description><![CDATA[Daten können auf unterschiedliche Art und Weise verloren gehen: Kaputte Massenspeicher (egal ob Festplatte oder SSD), zerschossene Dateisysteme, Verlust des Notebooks oder Smartphones durch Diebstahl oder Schusseligkeit, sowie die eigene Dummheit beim versehentlichen Löschen von Daten. Gegen allzu dramatische Datenverluste infolge dieser unglücklichen Ereignisse helfen in der Regel Backups, die eigentlich jeder Computeranwender regelmäßig erstellen [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Daten können auf unterschiedliche Art und Weise verloren gehen: Kaputte Massenspeicher (egal ob Festplatte oder SSD), zerschossene Dateisysteme, Verlust des Notebooks oder Smartphones durch Diebstahl oder Schusseligkeit, sowie die eigene Dummheit beim versehentlichen Löschen von Daten. Gegen allzu dramatische Datenverluste infolge dieser unglücklichen Ereignisse helfen in der Regel Backups, die eigentlich jeder Computeranwender regelmäßig erstellen sollte &#8212; was bekanntlich aber nur ein Bruchteil aller User macht. Gegen eine weitere Form des Datenverlusts helfen jedoch auch Backups nur bedingt. <a href="https://en.wikipedia.org/wiki/Data_corruption" target="_blank" rel="noopener">Silent Data Corruption</a> oder Bitrot schlägt unmerklich zu, da nur einzelne Bits einer oder mehrere Dateien betroffen sind. Moderne Dateisysteme wie Btrfs oder ZFS schützen in einem RAID-Verbund mit Prüfsummen zu Daten und Metadaten gegen Bitrot. Doch wie dramatisch ist das Problem eigentlich? Ich schaue mir von Bitrot befallene JPG-Dateien einmal genauer an.</p>
<p><span id="more-34903"></span></p>
<h2>Bitrot schummelt Fehler leise ins Dateisystem</h2>
<p>Unter Bitrot bezeichnet man umgangssprachlich das &#8222;Kippen&#8220; einzelner Datenbits. Dies kann etwa bei Zahlen schnell dramatische Folgen hervorrufen: Habt ihr etwa 100 Euro auf dem Konto (Binär: 1100100) und das erste Bit kippt in der Datenbank der Bank zu einer 0, dann schrumpft euer Guthaben auf einen Schlag auf nur noch 36 Euro (Binär: 0100100). Damit dies nicht passiert, speichern moderne Dateisysteme Daten redundant und schreiben Prüfsummen, sodass man zum einen merkt, dass etwas mit den Daten nicht stimmt und zum anderen sie auch automatisch wiederherstellen kann. Auch Dateiformate selber besitzen eine gewisse Redundanz, sodass kleine Datenfehler im Bild eigentlich kaum ersichtlich sein sollten. Daher hat mich <a href="http://arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems/3/" target="_blank" rel="noopener">dieser Beitrag von Ars Technica</a> sehr gewundet. Schon nach drei gekippten Bits ist das dort gezeigte Bild nicht mehr erkennbar. Gut, nach 10 gekippten Bits bin ich auch nicht mehr wiederzuerkennen, aber der Totalausfall nach 3 gedrehten Bits macht einem schon Sorgen &#8212; schließlich gehören Bilder für viele von uns zum wertvollsten Datenschatz.</p>
<p>Um das Thema also einmal selber nachzustellen, braucht es ein Bild und ein kleines Programm, mit dem man gezielt einzelne Bits einer Datei umkippen lassen kann. Im Netz finden sich dazu eine Reihe von kleinen Code-Schnippseln, der folgende in Python geschriebene Code macht als <code>bitflip.ph</code> abgespeichert genau dies. Als Parameter übergebt ihr den Programm einen Offsetwert, also im Endeffekt das wie vielte Bit es drehen soll. Zudem habe ich mit <code>bitflip.sh</code> ein kleines Shell-Skript geschrieben, das automatisiert eine beliebige Anzahl an Bits einer Datei drehen kann. Es nummeriert zudem die einzelnen Bilder und erstellt am Ende aus den Einzelbildern ein Video &#8212; mit dem Ziel am Ende den Verfall des Bildes als animierten Verlauf zu sehen.</p>
<h2>Skripte zum automatisierten Drehen einzelner Bits</h2>
<h3>bitflip.ph</h3>
<pre>#!/usr/bin/python
"""Toggle the bit at the specified offset.
Syntax:  filename bit-offset"""

import sys
fname = sys.argv[1]
# Convert bit offset to bytes + leftover bits
bitpos = int(sys.argv[2])
nbytes, nbits = divmod(bitpos, 8)

# Open in read+write, binary mode; read 1 byte 
fp = open(fname, "r+b")
fp.seek(nbytes, 0)
c = fp.read(1)

# Toggle bit at byte position `nbits`
toggled = bytes( [ ord(c)^(1&lt;&lt;nbits) ] ) 
# print(toggled) # diagnostic output

# Back up one byte, write out the modified byte
fp.seek(-1, 1)  # or absolute: fp.seek(nbytes, 0)
fp.write(toggled)
fp.close()</pre>
<h3>bitflip.sh</h3>
<pre>#!/bin/bash
# Settings
ORIGFILE=$1
FIRSTBIT=$2
LASTBIT=$3
STEPWIDTH=$4

# Folders
FLIPPEDFILES=tmp_flipped
VIDEOTEMP=tmp_video

# Init
FLIPPEDBITS=0

# Watch for Ctrl+C
trap "exit" INT

# Prepare
if [[ ! -e $FLIPPEDFILES ]]; then
	mkdir $FLIPPEDFILES
else
	rm $FLIPPEDFILES/*
fi

if [[ ! -e $VIDEOTEMP ]]; then
	mkdir $VIDEOTEMP
else
	rm $VIDEOTEMP/*
fi

# Function annotate
function annotate () {
	convert $1/$2.jpg -gravity southeast \
		-stroke '#000C' -pointsize 100   -strokewidth 2 -annotate 0 $3 \
		-stroke  none   -pointsize 100   -fill white    -annotate 0 $3 \
		$1/$2.jpg
}

# Flip bits
cp $ORIGFILE $FLIPPEDFILES/$FIRSTBIT.jpg
convert $ORIGFILE $FLIPPEDFILES/$FIRSTBIT.jpg +append $VIDEOTEMP/$FIRSTBIT.jpg

while [  $FIRSTBIT -lt $LASTBIT ]; do

	echo Flipping bit: $FIRSTBIT
	echo Flipped bits: $FLIPPEDBITS

	let PLUSONE=FIRSTBIT+STEPWIDTH
	cp $FLIPPEDFILES/$FIRSTBIT.jpg $FLIPPEDFILES/$PLUSONE.jpg
	./bitflip.py $FLIPPEDFILES/$PLUSONE.jpg $PLUSONE
	convert $FLIPPEDFILES/$FIRSTBIT.jpg $FLIPPEDFILES/$PLUSONE.jpg +append $VIDEOTEMP/$PLUSONE.jpg
	annotate $VIDEOTEMP $PLUSONE $FLIPPEDBITS

	let FIRSTBIT=FIRSTBIT+STEPWIDTH
	let FLIPPEDBITS=FLIPPEDBITS+1
	clear
done

# Build video
cd $VIDEOTEMP
cat *.jpg | ffmpeg -y -f image2pipe -r 15 -vcodec mjpeg -i - -vcodec libx264 ../out.mp4</pre>
<p>Doch bevor ich das Skript auf ein JPG loslasse, muss <code>bitflip.ph</code> beweisen, ob es auch wirklich funktioniert. Dazu nehme ich ein beliebiges PNG-Bild und flippe gezielt ein einzelnes Bit. Ein binärer Verglich mit <code>cmp</code> zeigt dann den Unterschied. Der Aufruf von <code>file</code> erkennt anschließend zwar noch eine PNG-Datei, doch ein Bildbetrachter mag die Datei nicht mehr öffnen, wie auch <code>identify</code> aus der Imagemagick-Suite einen mit <code>IDAT: CRC error</code> einen Fehler in der Bilddatei meldet. Schalte ich das Bit erneut um, dann akzeptiert <code>identify</code> das Bild wieder brav und der Bildbetrachter von Gnome öffnet die PNG-Datei ebenfalls wieder. Sum­ma sum­ma­rum: Schon ein gekipptes Bit kann eine Datei komplett runinieren. JPG bringt jedoch deutlich mehr Redundanzen mit, von daher bin ich gespannt, wie sich das für Fotografien übliche Dateiformat schlägt.</p>
<pre>### Beliebige PNG-Datei kopieren
$ cp picture.png picture-flip.png
### Als Beispiel das 2000. Bit flippen
$ ./bitflip.py picture-flip.png 2000
### Hat es geklappt, ja!
$ cmp -l picture.png picture-flip.png | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'
000000FB 1C 1D</pre>
<pre>### Immer noch eine PNG-Datei?
$ file picture-flip.png
picture-flip.png: PNG image data, 800 x 533, 8-bit/color RGB, non-interlaced
### Bild-Information kaputt
$ identify -verbose picture-flip.png
identify: IDAT: CRC error `picture-flip.png' @ error/png.c/MagickPNGErrorHandler/1630.
identify: corrupt image `picture-flip.png' @ error/png.c/ReadPNGImage/3959.</pre>
<pre>### Gegenprüfung, wieder das 2000. Bit flippen
$ ./bitflip.py picture-flip.png 2000
### Bild-Informationen stimmen wieder
$ identify -verbose picture-flip.png
Image: picture-flip.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 800x533+0+0
  Resolution: 28.35x28.35</pre>
<figure id="attachment_34920" aria-describedby="caption-attachment-34920" style="width: 640px" class="wp-caption aligncenter"><a href="https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file.png" rel="attachment wp-att-34920"><img fetchpriority="high" decoding="async" class="wp-image-34920 size-medium" src="https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-640x509.png" alt="Ein gekipptes Bit reicht aus um eine PNG-Datei zu zerstören." width="640" height="509" srcset="https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-640x509.png 640w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-528x420.png 528w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-681x542.png 681w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-250x199.png 250w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-550x438.png 550w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-800x637.png 800w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-226x180.png 226w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-377x300.png 377w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file-628x500.png 628w, https://linuxundich.de/wp-content/uploads/2016/02/bitrot-png-file.png 907w" sizes="(max-width: 640px) 100vw, 640px"></a><figcaption id="caption-attachment-34920" class="wp-caption-text">Ein gekipptes Bit reicht aus um eine PNG-Datei zu zerstören.</figcaption></figure>
<p>Bei Ars <a href="http://arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems/3/" target="_blank" rel="noopener">schildert Autor Jim Salter</a> nun, dass es schon mit einem geflippten Bit im JPG-Bild Artefakte erscheinen. Nach zwei und erst recht nach drei gekippten Bits ist dann kaum mehr etwas von dem Originalbild zu erkennen. In meinen Tests kann ich das nun aber nicht nachvollziehen: Mein Testbild bleibt ein Bild und für das Auge ergibt sich kein erkennbarer Unterschied, nur <code>cmp</code> meldet (wie gewünscht) die Anzahl der Unterschiede in den jeweiligen Dateien. Ich habe den Vergleich bewusst auf eine &#8222;richtige&#8220; Fotografie beschränkt und nicht auf eine künstlich kleine JPG-Datei, da natürlich die Redundanz mit der Größe des Bildes zunimmt. 1000 gekippte Bits in einer 1 Kb großen Datei dürften sich deutlich dramatischer Auswirken als in einer 5 Mb großen Datei, frisch von der Digitalkamera geladen.</p>
<h2>Mit 10 gekippten Bits</h2>
<pre>$ cmp -l ../katze_orig.jpg 11000.jpg | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' | wc -l
10</pre>
<figure id="attachment_34922" aria-describedby="caption-attachment-34922" style="width: 640px" class="wp-caption aligncenter"><a href="https://linuxundich.de/wp-content/uploads/2016/02/11100.jpg" rel="attachment wp-att-34922"><img decoding="async" class="wp-image-34922 size-medium" src="https://linuxundich.de/wp-content/uploads/2016/02/11100-640x360.jpg" alt="10 gekippte Bits (Links: Original, Rechts: Defekt)" width="640" height="360" srcset="https://linuxundich.de/wp-content/uploads/2016/02/11100-640x360.jpg 640w, https://linuxundich.de/wp-content/uploads/2016/02/11100-1280x720.jpg 1280w, https://linuxundich.de/wp-content/uploads/2016/02/11100-747x420.jpg 747w, https://linuxundich.de/wp-content/uploads/2016/02/11100-681x383.jpg 681w, https://linuxundich.de/wp-content/uploads/2016/02/11100-250x141.jpg 250w, https://linuxundich.de/wp-content/uploads/2016/02/11100-550x309.jpg 550w, https://linuxundich.de/wp-content/uploads/2016/02/11100-800x450.jpg 800w, https://linuxundich.de/wp-content/uploads/2016/02/11100-320x180.jpg 320w, https://linuxundich.de/wp-content/uploads/2016/02/11100-533x300.jpg 533w, https://linuxundich.de/wp-content/uploads/2016/02/11100-889x500.jpg 889w, https://linuxundich.de/wp-content/uploads/2016/02/11100.jpg 1920w" sizes="(max-width: 640px) 100vw, 640px"></a><figcaption id="caption-attachment-34922" class="wp-caption-text">10 gekippte Bits (Links: Original, Rechts: Defekt)</figcaption></figure>
<h2>Mit 100 gekippten Bits</h2>
<pre>$ cmp -l ../katze_orig.jpg 20100.jpg | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' | wc -l
100</pre>
<figure id="attachment_34923" aria-describedby="caption-attachment-34923" style="width: 640px" class="wp-caption aligncenter"><a href="https://linuxundich.de/wp-content/uploads/2016/02/20100.jpg" rel="attachment wp-att-34923"><img decoding="async" class="wp-image-34923 size-medium" src="https://linuxundich.de/wp-content/uploads/2016/02/20100-640x360.jpg" alt="100 gekippte Bits (Links: Original, Rechts: Defekt)" width="640" height="360" srcset="https://linuxundich.de/wp-content/uploads/2016/02/20100-640x360.jpg 640w, https://linuxundich.de/wp-content/uploads/2016/02/20100-1280x720.jpg 1280w, https://linuxundich.de/wp-content/uploads/2016/02/20100-747x420.jpg 747w, https://linuxundich.de/wp-content/uploads/2016/02/20100-681x383.jpg 681w, https://linuxundich.de/wp-content/uploads/2016/02/20100-250x141.jpg 250w, https://linuxundich.de/wp-content/uploads/2016/02/20100-550x309.jpg 550w, https://linuxundich.de/wp-content/uploads/2016/02/20100-800x450.jpg 800w, https://linuxundich.de/wp-content/uploads/2016/02/20100-320x180.jpg 320w, https://linuxundich.de/wp-content/uploads/2016/02/20100-533x300.jpg 533w, https://linuxundich.de/wp-content/uploads/2016/02/20100-889x500.jpg 889w, https://linuxundich.de/wp-content/uploads/2016/02/20100.jpg 1920w" sizes="(max-width: 640px) 100vw, 640px"></a><figcaption id="caption-attachment-34923" class="wp-caption-text">100 gekippte Bits (Links: Original, Rechts: Defekt)</figcaption></figure>
<h2>Mit knapp 1000 gekippten Bits</h2>
<pre>$ cmp -l ../katze_orig.jpg 110000.jpg | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' | wc -l
999</pre>
<figure id="attachment_34924" aria-describedby="caption-attachment-34924" style="width: 640px" class="wp-caption aligncenter"><a href="https://linuxundich.de/wp-content/uploads/2016/02/110000.jpg" rel="attachment wp-att-34924"><img loading="lazy" decoding="async" class="wp-image-34924 size-medium" src="https://linuxundich.de/wp-content/uploads/2016/02/110000-640x360.jpg" alt="999 gekippte Bits (Links: Original, Rechts: Defekt)" width="640" height="360" srcset="https://linuxundich.de/wp-content/uploads/2016/02/110000-640x360.jpg 640w, https://linuxundich.de/wp-content/uploads/2016/02/110000-1280x720.jpg 1280w, https://linuxundich.de/wp-content/uploads/2016/02/110000-747x420.jpg 747w, https://linuxundich.de/wp-content/uploads/2016/02/110000-681x383.jpg 681w, https://linuxundich.de/wp-content/uploads/2016/02/110000-250x141.jpg 250w, https://linuxundich.de/wp-content/uploads/2016/02/110000-550x309.jpg 550w, https://linuxundich.de/wp-content/uploads/2016/02/110000-800x450.jpg 800w, https://linuxundich.de/wp-content/uploads/2016/02/110000-320x180.jpg 320w, https://linuxundich.de/wp-content/uploads/2016/02/110000-533x300.jpg 533w, https://linuxundich.de/wp-content/uploads/2016/02/110000-889x500.jpg 889w, https://linuxundich.de/wp-content/uploads/2016/02/110000.jpg 1920w" sizes="auto, (max-width: 640px) 100vw, 640px"></a><figcaption id="caption-attachment-34924" class="wp-caption-text">999 gekippte Bits (Links: Original, Rechts: Defekt)</figcaption></figure>
<p>Lange Rede, kurzer Sinn: Ganz so schlimm wie der Autor von Ars darstellt, wirkt sich Bitrot bei JPEG-Dateien nicht aus. Dennoch sollte man sich bei seiner Backupstrategie ein wenig Gedanken an die Tatsache verschwenden, dass einzelne Bits auf dem Datenträger kippen können. Sichert man nun einfach nur Stumpf seine Daten auf ein Backup-Medium, dann wandert der Defekt unbemerkt ins Backup und ersetzt auch irgendwann mal die älteste Version in der Sicherung, sodass eine Wiederherstellung zu einem späteren Zeitpunkt unmöglich wird. Dazu gehören moderne Dateisysteme, die Prüfsummen wie Btrfs oder ZFS für alle Daten anlegen (nicht nur wie Ext4 für das Journal) und am besten darunter noch ein RAID1, sodass man Daten leicht wiederherstellen kann.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/gnu-linux/bitrot-bei-jpg-dateien-wirklich-dramatisch/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
	</channel>
</rss>
