Это потребовало некоторого копания, чтобы понять. В файле источник/compare.c
в Git репозиторий для tar, мы находим функцию с именем Verify_volume
(в строке 527 на момент написания), который содержит следующий комментарий
Проверка архива предназначена для проверки того, правильно ли он получен на физическом носителе, поэтому постарайтесь обойти умную буферизацию в памяти, относящуюся к этому конкретному носителю. В Linux, например, дисковод даже не будет доступен для всей проверки.
Это объясняет, что он пытается сделать, но что касается как она это делает, нам нужно посмотреть на код функции. Он начинается со сравнения заголовков, чтобы убедиться, что они совпадают, и если они совпадают, он запускает функцию diff_archive
(строка 461 на момент написания), который идет поэлементно внутри архива, и когда он встречает файл*, он запускает функцию diff_file
(строка 187). Он начинается с проверки нескольких простых вещей, таких как тип и размер файла (и другие). Если все они верны, он (для обычного файла) идет и проверяет каждый блок файла (в read_and_process
функция, строка 120). За разреженные файлы, он вызывает sparse_diff_file
(строка 698) в источник/sparse.c
, который проверяет каждую область файла** с помощью check_sparse_region
функция (строка 607), также в источник/sparse.c
.
* Он делает другие вещи для других типов архивных данных, таких как каталоги
** Он проверяет каждую область так же, как проверяет весь обычный (не разреженный) файл.