metalink
Собственно, metalink4.
открытый формат файлов на основе XML, предназначенный для описания ссылок на файлы для загрузки по протоколам HTTP, FTP, bittorrent и т. п.
Несколько адресов (FTP, HTTP, P2P), по которым расположен один и тот же файл для закачки, размещаются в одном метафайле с расширением .metalink. Использование файла подобного формата позволяет, с одной стороны, увеличить надёжность в случаях, когда файл по части адресов будет недоступен, с другой — для компьютеров с высокоскоростным подключением к сети — увеличить интенсивность процесса скачивания посредством закачки сегментов файла одновременно из разных источников (сегментированная закачка).
Помимо этого, формат помогает реализовать автоматическую проверку загруженных файлов по контрольным суммам, автоматическое восстановление поврежденных файлов, одновременное добавление в очередь закачки нескольких файлов (путем их перечисления в метафайле), автоматический выбор наиболее подходящих для конкретной операционной системы и языка файлов.
Формат Metalink расширяем, и позволяет включать несколько частичных и полных хешей, контрольных сумм и PGP-ключей. Однако, большинство клиентов поддерживают проверку только по контрольным суммам MD5, SHA-1 и SHA-256. Помимо хранения адресов FTP-, HTTP-зеркал и rsync, поддерживается включение P2P-ссылок — bittorrent, ed2k и magnet.
Из того, что у меня есть, это понимает aria2 и wget. У aria2 прям много.
Wget, как минимум:
–input-metalink=file
Downloads files covered in local Metalink file. Metalink version 3 and 4 are supported.–metalink-over-http
Issues HTTP HEAD request instead of GET and extracts Metalink metadata from response headers. Then it switches to Metalink download. If no valid Metalink metadata is found, it falls back to ordinary HTTP download. Enables Content-Type: application/metalink4+xml files download/processing.
https://curl.se/docs/manpage.html – к сожалению, curl отключил поддержку:
–metalink
This option was previously used to specify a Metalink resource. Metalink support is disabled in curl for security reasons (added in 7.78.0).
If –metalink is provided several times, the last set value is used.
Example:
curl --metalink file https://example.com
Очень интересный комментарий от Сергея Матвеева
Тоже когда-то узнал про этот формат из документации к aria2.
Вообще софта немало его поддерживает:
https://www.metalinker.org/implementation.html
GNU Wget2 заимел поддержку например.На самом деле он может использоваться и прозрачно без нашего явного ведома. Когда мы просто запрашиваем файл по HTTP, то среди заголовков ответа могут подсовываться ссылки на .meta4 файлы, из которых download клиент может узнавать про зеркала или BitTorrent и распараллелить скачивание. Ну и целостность проверить. Aria2, Wget2 это точно всё прозрачно умели делать.
https://datatracker.ietf.org/doc/html/rfc6249
Не раз видел как CDN-ы раздающие пакеты для GNU/Linux дистрибутивов TODO
Мне формат понравился и например при создании релизов софта. В почтовую рассылку же обычно кидаем письмо с ссылками и контрольными суммами. А так достаточно прикрепить .meta4 файл, где всё это будет, плюс возможно прикреплённые *PGP/OpenSSH подписи, плюс зеркала. А web-сервер, в свою очередь, может и рядом лежащий .meta4 для файла найти, распарсить и в HTTP заголовки подсунуть массу информации из него. Например если просто сделать HEAD запрос на скачивание tarball одного из моего проектов.
% curl -I http://www.vors.stargrave.org/download/vors-3.1.0.tar.zst HTTP/1.1 200 OK Accept-Ranges: bytes Content-Length: 7373425 Content-Type: application/zstd Digest: BLAKE3-256=ss4IaLgfk9n4c7woxhvgm8ud7gTlWnFpOONfLbRix+M= Digest: BLAKE2b-512=J9aeohxwqVTJryusQBKoOrkE38dvc9jtOpsMWxUzgt14qoUTqPyIAkMw4dZ1lTcp80uzawyl+KKGx2p01awd2w== Digest: BLAKE2b-256=UtaN7ng78SEOj/9WZDgT9sn+qkcodYkB8F5xpso8wis= Digest: Skein-512=1v0InHb1TieM/SkVUhxypzh/RjJMS8QVbUQ/FHefiwG7bqDTd8DJNF/R7BXDd3dlYcOdZWiXCmb40S9+o7XkLQ== Digest: SHAKE256=3Ag8ya/88SbO+wfZtNHA9QIy9lev4zEMNv6C13pbRNz1obGtYqyV8LLhiZVZoNQgn02QANUxPk/xEEmbvPqN4A== Digest: SHA-512=AG7T8U7xQEfPh7H8iWa+f9Zt6hvGI9j37MnIV27DzHMHn77IWsUSOk9/qAddsCPHS/l1LLrltpxAIH+VGD2log== Digest: SHA-256=ZRQI96j0n00eh1qxO8NgJeOQPU9bfzHoHa45xQNuzv8= Digest: Streebog-256=j8WFZ70EwTpRXWYKd35NMGPGNgtESEbCCQivGCuWZuY= Digest: SHAKE128=onxzKeFkBXkrGZMiDQxcef4ApD8qy+8ROAnbqlmmaQY= Digest: Streebog-512=hn4tjq22oPFGwATCDG9n1qMuM92XdA/VxTP0IaYYVeNWgjpxIZCe9elJBXgpQvWW5ZbyBikSQX8FQNefmBEdBA== Digest: XXH3-128=bSelLzD9g7e3R4vqpNZhYA== Etag: "AAAAAABwgnEAAAAAZkR9_gAAAAAAAAAA" Last-Modified: Wed, 15 May 2024 09:18:54 GMT Link: <vors-3.1.0.tar.zst.meta4>; rel=describedby; type="application/metalink4+xml" Link: <http://www.vors.stargrave.org/download/vors-3.1.0.tar.zst>; rel=duplicate Link: <http://y.www.vors.stargrave.org/download/vors-3.1.0.tar.zst>; rel=duplicate Server: godlighty/0.9.0 Date: Wed, 28 May 2025 08:12:42 GMTПричём всякие SHA-* хэши из заголовков wget2/aria2 (вроде оба умели, точно не вспомню) умели проверять после скачивания файла. А благодаря Link: … type="application/metalink4+xml", он они могут (и делают!) скачать .meta4 и из него взять информацию, в том числе про BitTorrent. OpenStreetMap базы данных у них тоже через BitTorrent+Metalink4 распространяются.
Не нужно иметь .sha512.txt-like файлы, файлы с подписями и всякое такое: достаточно в одну XML-ку .meta4 сгруппировать. Даже не имея Metalink-aware софта под рукой, XML человек может прочитать и хотя бы URL-ы выцепить.
У меня есть собственная система сборки пакетов. И вот в ней надо бы как-то предоставлять ссылки для скачивания исходного кода программ, плюс проверять целостность, плюс указывать разные зеркала. Идеально .meta4 подходит для этого, плюс удобен за счёт одного XML файла.
Реально хорошая идея этот .meta4, хоть и не распространён настолько хорошо как хотелось бы.