Вопрос или проблема
Я не смог найти конкретное решение этой проблемы. У меня есть файл источников с одной строкой:
deb file:/var/local/my.repository-name /var/local/my.repository-name/
В репозитории имеются (помимо пакетов) файлы Release, InRelease, Release.gpg.
Когда я запускаю apt update, я получаю:
The repository 'file:/var/local/my.repository-name /var/local/my.repository-name/ Release' does not have a Release file
После этого возникает ошибка.
Очень похоже, что Парсер вставляет пробел после завершающей косой черты элемента ‘suite’, из-за чего команда не выполняется.
Как исправить эту проблему?
Примечание: Я также попробовал создать поддиректорию под названием ‘fudgeit’ и переместил туда все файлы, так что теперь в файле my.repository-name.list имеется одна строка:
“deb file:/var/local/my.repository-name fudgeit/”
Я получаю ту же ошибку и также замечаю, что при попытке найти файлы InRelease и Release он, похоже, добавляет лишний пробел в оба файла, из-за чего они не находятся, хотя ошибка сообщается только для Release.
Ответ или решение
Для решения проблемы, которую вы описали в использовании sources.list.d
с локальным репозиторием Apt, давайте разберемся, как устроен процесс работы и какие потенциальные ошибки могут быть допущены.
Теория
Apt
— это инструмент управления пакетами в операционных системах на базе Debian, таких как Ubuntu. Он работает с репозиториями, откуда получают пакеты и метаданные для установки или обновления программного обеспечения. В этом процессе важную роль играют файлы конфигурации, такие как /etc/apt/sources.list
и файлы в директории /etc/apt/sources.list.d/
. Эти файлы содержат записи (deb
или deb-src
), каждая из которых указывает, каким образом и откуда apt
должен получать пакеты.
Каждая строка в этих файлах должна соответствовать определенному формату. В случае репозиториев, хранящихся локально (например, file:
протокол), источнику данных также необходимо наличие файлов Release
, InRelease
и Release.gpg
для обеспечения целостности и подлинности пакетов. Файл Release
содержит метаданные о репозитории, в том числе информацию о всех пакетах, которые можно установить.
Пример
В вашем случае наблюдается ошибка, при которой apt сообщает, что не удается найти файл Release
, даже если он физически существует в нужной директории. Строка конфигурации, которую вы предоставили, выглядит так:
deb file:/var/local/my.repository-name /var/local/my.repository-name/
Сообщение об ошибке:
The repository 'file:/var/local/my.repository-name /var/local/my.repository-name/ Release' does not have a Release file
Эта ошибка часто возникает из-за того, что apt
интерпретирует данную строку конфигурации с лишними пробелами, что приводит к неправильному парсингу URL. Убедитесь, что в вашей строке отсутствуют лишние пробелы, особенно после последнего символа /
.
Вы также отметили, что создали поддиректорию fudgeit
и переместили все необходимые файлы туда, обновив строку следующим образом:
deb file:/var/local/my.repository-name fudgeit/
Тем не менее, вы получаете ту же ошибку, а это указывает на систематическую ошибку в процессе парсинга.
Применение
Решения проблемы:
-
Удаление лишних пробелов:
Убедитесь, что в строках конфигурации нет лишних пробелов. Например:
deb file:/var/local/my.repository-name /fudgeit/
или если файлы находятся непосредственно в
my.repository-name
, то:deb file:/var/local/my.repository-name ./
Заметьте использование
./
, что указываетapt
, искать файлы в верхнем уровне указанной директории. -
Проверка файлов целостности:
Убедитесь, что файлы
Release
,InRelease
иRelease.gpg
существуют в указанной директории и доступны для чтения. -
Использование правильных метаданных:
Если у вас только локальное хранилище, и вы сами создаете метаданные, убедитесь, что они соответствуют стандартам Debian. Вы можете использовать утилиту
dpkg-scanpackages
для генерации индексного файла.dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
После этого можно создать файл
Release
:echo "Archive: stable" > Release echo "Component: main" >> Release echo "Origin: Your-Company" >> Release echo "Label: Your-Company" >> Release echo "Architecture: amd64" >> Release echo "MD5Sum:" >> Release md5sum Packages.gz | awk '{ print $1" "$2" "$2 }' >> Release
Если нужно подписать репозиторий, убедитесь, что у вас настроен GPG-ключ и он используется при генерации.
-
Проверка прав доступа:
Убедитесь, что пользователь, под которым запускается
apt
, имеет разрешения на чтение указанных файлов и директории. Широко распространенной проблемой являются неверные права доступа, которые предотвращают необходимые чтения. -
Проверка конфигурации:
Иногда ошибка конфигурации на уровне системы может неявно влиять на работу. Проверьте настройки apt, например, в
/etc/apt/apt.conf
и другие файлы, которые могут перегружаться при работе apt через файлы конфигурации во время инициализации.
Заключение
Проблемы, подобные вашей, часто приводят к недопониманиям из-за незначительных ошибок в конфигурации. Вероятно, в вашем случае все сводится к некорректной интерпретации строки конфигурации apt вследствие лишних пробелов или неверных настроек маршрутизации файла. Важно последовательно проверять каждую из предполагаемых причин и тестировать конфигурацию до тех пор, пока оптимальное решение не будет найдено.