Команда cp –reflink на btrfs исправила поврежденный видеофайл. Что происходит?

Вопрос или проблема

Это одна из самых странных вещей, которые я когда-либо испытывал на Linux. Я загрузил серию видеофайлов с помощью Transmission BT. Когда я попытался открыть первый файл с помощью Celluloid, у меня появилась ошибка “нераспознанный тип файла”. После проверки локальных данных в Transmission выяснилось, что некоторые данные повреждены и их нужно загрузить заново. Пока все хорошо. Но семян не было, и я был нетерпелив, так что решил попробовать, сможет ли VLC решить проблему за меня. Я не хотел работать с оригинальным файлом, поэтому создал его копию.

Вот тут начинается действительно странное. Я создал копию файла с помощью команды “cp –reflink original.mkv test.mkv”, но потом случайно открыл её с помощью Celluloid, а не VLC. Однако, к моему удивлению, файл просто заработал. Я подумал, может, Transmission случайно скачал недостающие данные, но этого не произошло. Я попытался открыть оригинальный файл, и он не работал.

Затем я создал копию с помощью “cp original.mkv test2.mkv”, и этот файл не сработал! md5sum дает мне одинаковый хэш для оригинального файла и файла с reflink, но другой для полной копии, что также странно для меня. Кстати, это устройство NVMe.

У кого-нибудь есть теория, что здесь происходит? Я имею в виду, я знаю, что Btrfs потрясающий, но если бы вы спросили меня, может ли он исправлять видеофайлы, я бы сказал, что это было бы слишком оптимистично.

Проблем нет. Мне просто чрезвычайно любопытно, что происходит. Я имею в виду, копия с reflink указывает на те же самые данные на устройстве хранения, верно? Почему же копия с reflink работает, когда оригинальный файл нет?

Спасибо.

Ответ или решение

Ситуация, с которой вы столкнулись, действительно интересная и может вызвать множество вопросов. Попробуем разобраться в том, что произошло, и объяснить механизмы, которые могут быть вовлечены в этот процесс.

Команда cp --reflink создает "клон" файла в файловой системе Btrfs, не дублируя фактические данные. Вместо этого она создает ссылку на оригинальный блок данных на диске. Это значит, что в начале обеих файлов (оригинального и референсного) содержится один и тот же набор данных, и в процессе копирования не происходит фактической передачи данных, что экономит пространство на диске. Однако, когда файл модифицируется, система создает "разделяемые" данные, которые будут писать изменения именно в этот файл.

То, что reflink-копия test.mkv открывается успешно в Celluloid, в то время как оригинал нет, может быть связано с тем, как Btrfs обрабатывает данные и ошибки. Возможно, что оригинальный файл поврежден на уровне структур данных или метаданных, но некоторые блоки данных, на которые ссылается оригинал, могут быть не повреждены. Когда вы создали reflink, вы фактически скопировали ссылки на те блоки, которые остались целыми, и, следовательно, этот новый файл успешно открывается.

3. Результаты вычисления хешей

Как вы заметили, md5sum выдает одинаковые значения для оригинального файла и reflink-копии. Это ожидаемо, так как оба файла указывают на один и тот же набор данных до тех пор, пока не произойдет изменение в любом из файлов. С другой стороны, обычная копия cp original.mkv test2.mkv создает отдельный экземпляр файла, который, по всей вероятности, копирует также и поврежденные данные, в результате чего результат будет отличаться.

4. Природа ошибок в файловых системах

Файловые системы, такие как Btrfs, предлагают различные уровни защиты от ошибок. Они могут включать такие механизмы, как контрольные суммы для метаданных и данных, которые помогают в обнаружении и исправлении ошибок. Если данные стали поврежденными по каким-то причинам (например, сбоев оборудования), то такие механизмы могут работать не так, как вы ожидаете, и из-за этого оригинал может оказаться недоступным, тогда как reflink-ссылка может обойти эти повреждения благодаря сохранению целостных блоков данных.

5. Заключение

Ваша ситуация подчеркивает важность понимания механизмов работы и функций файловых систем. Хотя Btrfs вряд ли может "исправить" видеофайл в традиционном смысле, однако использование reflink может помочь восстановить доступ к данным, которые были повреждены на более низком уровне. В будущем рекомендуется поддерживать актуальные резервные копии и внимательно следить за состоянием системы, особенно если вы работаете с критически важными файлами.

Надеюсь, это подробное объяснение проясняет ситуацию и дает вам более глубокое понимание работы файловых систем на Linux.

Оцените материал
Добавить комментарий

Капча загружается...