Die Antwort lautet: Versuchen Sie einfach , die gesamte Datei zu lesen . Wenn es anders abläuft als bei der Prüfsumme, liegt ein Eingabe- / Ausgabefehler vor . Also ja, Btrfs prüft tatsächlich Prüfsummen beim Lesen!
Um diese Antwort herauszufinden, habe ich den folgenden Test zusammengestellt:
- Weisen Sie eine 1-GB-Datei zu, die als Blockgerät zum Testen der Btrfs-Partition verwendet werden soll, hängen Sie sie als Schleifengerät an und formatieren Sie Btrfs darauf.
- Erstellen Sie eine Dummy-Datei mit 800 MB, die eine bekannte eindeutige Folge von Bytes in der Mitte (
token1
) enthält. - Schreiben Sie die Datei in die Btrfs und notieren Sie ihre sha256 für spätere Referenz.
- Hängen Sie die Blockgerätedatei auf und patchen Sie sie so, dass ein Byte geändert wird. Dafür
sed
ersetzen wirtoken1
mittoken2
; - Stellen Sie erneut ein und versuchen Sie, sha256 der 800-MB-Datei auf den Btrfs abzurufen. Siehe Eingabe- / Ausgabefehler.
- Hängen Sie die Bereitstellung ab, patchen Sie zurück, mounten Sie und stellen Sie sicher, dass die 800-MB-Datei wieder lesbar ist und sha256 wie in Schritt 3 ist.
- Profitieren!
Hier ist das Skript:
#!/bin/bash f="btrfstestblockdevicefile" ft="btrfstestfile" loop="/dev/loop0" mount_dir="btrfstestdir" size="1g" token1="36bbf48aa6645646fbaa7f25b64224fb3399ad40bc706c79bb8276096e3c9e8f" token2="36bbf48aa6645646fbaa7f25b64224fb4399ad40bc706c79bb8276096e3c9e8f" f_mount() { echo "Mounting..." && \ sudo losetup $loop $f && \ if ! [[ -z $1 ]] ; then sudo mkfs.btrfs -q $loop fi mkdir $mount_dir && \ sudo mount $loop $mount_dir } f_umount() { echo "Unmounting..." && \ sudo umount $loop && \ sudo rmdir $mount_dir && \ sudo losetup -d $loop } echo "Allocating file for test block device..." && \ fallocate -l $size $f && \ f_mount 1 && \ echo "Generating test file..." && \ dd if=/dev/urandom of="$1" bs=1M count=400 status=none && \ echo $token1 > "$2" && \ dd if=/dev/urandom of="$3" bs=1M count=400 status=none && \ sudo sh -c "cat $1 $2 $3 > $/$" && \ rm "$1" "$2" "$3" && \ echo "Calculating original hash of the file..." && \ sha256sum "$/$" && \ f_umount && \ echo "Patching the file in the block device file..." && \ sed -i "s/$/$/g" $f && sync && \ f_mount && \ echo "Trying to read the file..." && \ sha256sum "$/$" echo "OK, unmount, patch back and try again..." && \ f_umount && \ sed -i "s/$/$/g" $f && sync && \ f_mount && \ sha256sum "$/$" && \ echo "Yay, Btrfs rules! Cleaning up..." && \ f_umount && \ rm $f && \ echo "All clear!"
Wie zu erwarten, ermöglicht das Ersetzen mkfs.btrfs
durch ein Nicht-Prüfsummen-Dateisystem (z. B. mkfs.ext4
) das Lesen der beschädigten Datei. Natürlich unterscheidet sich sein sha256 vom nicht beschädigten.