btrfs-progs: docs: enhance the scrub chapter

- Explain that scrub is device based

- Add extra warning on NOCOW files
  Which implies NODATASUM, and can cause unexpected stale data to be
  returned.

- Explain the limitation of scrub
  As it can only do very basic checksum verification and very basic
  mirror based repair.

Signed-off-by: Colin Snover <csnover@users.noreply.github.com>
[ Add an SoB line and commit message, remove the mention of btrfs-check errors,
  as there is no evidence/example where btrfs-check failed to choose a good mirror. ]
Signed-off-by: Qu Wenruo <wqu@suse.com>
This commit is contained in:
Colin Snover 2024-08-05 18:54:27 -05:00 committed by Qu Wenruo
parent 18dcd2d6d0
commit 66f08f9528
1 changed files with 44 additions and 9 deletions

View File

@ -1,14 +1,49 @@
Scrub is a pass over all filesystem data and metadata and verifying the
checksums. If a valid copy is available (replicated block group profiles) then
the damaged one is repaired. All copies of the replicated profiles are validated.
Scrub is a validation pass over all filesystem data and metadata that detects
data checksum errors, basic super block errors, basic metadata block header errors,
and disk read errors.
Scrub is done on a per-device base, if a device is specified to `btrfs scrub`, then
only that device will be scrubbed. Although btrfs will also try to read other device
to find a good copy, if the mirror on that specified device failed to be read or pass
verification.
If a path of btrfs is specified to `btrfs scrub`, btrfs will scrub all devices
in parallel.
On filesystems that use replicated block group profiles (e.g. raid1), read-write
scrub will also automatically repair any damage by copying verified good data
from one of the other replicas.
Such automatic repair is also carried out when reading metadata or data from a
read-write mounted btrfs.
.. warning::
Setting the ``No_COW`` (``chattr +C``) attribute on a file implicitly enables
``nodatasum``. This means that while metadata for these files continues to
be validated and corrected by scrub, the actual file data is not.
Furthermore, btrfs does not currently mark missing or failed disks as
unreliable, so will continue to load-balance reads to potentially damaged
replicas. This is not a problem normally because damage is detected by
checksum validation, but because ``No_COW`` files are
not protected by checksum, btrfs has no idea which mirror is good thus it can
return the bad contents to the user space tool.
Detecting and recovering from such failure requires manual intervention.
Notably, `systemd sets +C on journals by default <https://github.com/systemd/systemd/commit/11689d2a021d95a8447d938180e0962cd9439763>`_,
and `libvirt ≥ 6.6 sets +C on storage pool directories by default <https://www.libvirt.org/news.html#v6-6-0-2020-08-02>`_.
Other applications or distributions may also set +C to try to improve
performance.
.. note::
Scrub is not a filesystem checker (fsck) and does not verify nor repair
structural damage in the filesystem. It really only checks checksums of data
and tree blocks, it doesn't ensure the content of tree blocks is valid and
consistent. There's some validation performed when metadata blocks are read
from disk (:doc:`Tree-checker`) but it's not extensive and cannot substitute
full :doc:`btrfs-check` run.
Scrub is not a filesystem checker (fsck). It can only detect filesystem damage
using the checksum validation, and it can only repair
filesystem damage by copying from other known good replicas.
:doc:`btrfs-check` performs more exhaustive checking and can sometimes be
used, with expert guidance, to rebuild certain corrupted filesystem structures
in the absence of any good replica.
The user is supposed to run it manually or via a periodic system service. The
recommended period is a month but it could be less. The estimated device bandwidth