Вопрос или проблема
Используя CentOS 8.
Я хотел бы заставить dnf
использовать только зеркала, находящиеся вблизи определенного местоположения, не поддерживая вручную список желаемых зеркал. Поэтому я решил изменить конфигурационные файлы репозиториев в /etc/yum.repo.d/
.
Возьмем, к примеру, /etc/yum.repo.d/CentOS-Linux-BaseOS.repo
, это его стандартное состояние:
[baseos]
name=CentOS Linux $releasever - BaseOS
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Я хотел бы знать, есть ли параметр при запросе mirrorlist.centos.org
, который я могу указать для фильтрации по местоположению, нечто вроде этого:
mirrorlist=http://mirrorlist.centos.org/?country=us&other-params-ommitted
(country=
я пробовал, не дало никакого эффекта)
Мне не удалось найти какую-либо соответствующую документацию по API сайта.
Итак, я немного покопался, прежде чем задать этот вопрос, и сам нашел ответ, вот он.
Я искал “Centos mirrorlist API” и нашел репозиторий кода для веб-сервиса. Я изучил его исходный код и нашел этот фрагмент кода здесь:
ip=request.remote_route[-1]
cc=request.query.cc
debug=request.query.debug
remote_ip = ipaddr.IPAddress(ip)
mirrorlistpage = "https://www.centos.org/download/mirrors/"
if branch == "altarch":
mirrorlistpage = "https://www.centos.org/download/altarch-mirrors/"
region = None
if len(cc) == 5 and cc[2:3] == "-":
country = cc[:2]
region = cc[3:]
elif len(cc) > 0:
country = cc
else:
try:
country = geodb.city(ip).country.iso_code.lower()
if country == 'us' or country == 'ca':
try:
region = geodb.city(ip).subdivisions.most_specific.iso_code
except:
pass
except:
country = 'fallback'
Похоже, что параметр просто cc
. Я протестировал с помощью следующих URL и действительно получил желаемые зеркала:
- http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=BaseOS&cc=us
- http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=BaseOS&cc=cn
Редактировать
Оказалось, что я на самом деле посмотрел не на тот файл, что довольно неловко 😅
isoredirect.py
на самом деле отвечает за страницу загрузки ISO;ml.py
отвечает за mirrorlist. Сначала я не смотрел его, потому что думал, что это означает машинное обучение… Ну да ладно.
Я имею в виду, что я пришел к правильному ответу, но чуть не так, как ожидал. cc
также используется в ml.py
и делает практически то же самое.
Я обнаружил, что использование запроса country
в URL работает для Fedora metalink
URL.
Например, чтобы запросить зеркала, ближайшие к Австралии (AU), добавьте &country=au
в конец URL metalink
.
[updates]
name=Fedora $releasever - $basearch - Updates
metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch&country=au
...
Ссылки на:
- Infrastructure/MirrorManager – Дополнительные параметры на Fedora Wiki
- Комментарий от u/gordonmessmer в посте “Fedora прекрасна, но выбор зеркал плох” на Reddit r/Fedora
Ответ или решение
Чтобы заставить dnf в CentOS 8 использовать зеркала из определенного региона, следует внести изменения в конфигурационные файлы репозиториев, находящиеся в директории /etc/yum.repos.d/. Это можно сделать без необходимости вручную поддерживать список зеркал.
Шаг 1: Изучение конфигурации репозиториев
Для начала, откройте файл конфигурации, например, /etc/yum.repos.d/CentOS-Linux-BaseOS.repo. В его стандартном виде содержится строка:
[baseos]
name=CentOS Linux $releasever - BaseOS
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Обратим внимание на строку, содержащую mirrorlist
, поскольку именно она указывает на сервер, который предоставляет список зеркал.
Шаг 2: Использование параметра cc
Чтобы ограничить запрос только зеркалами из конкретной страны или региона, необходимо добавить параметр cc
к URL-адресу mirrorlist. Например, чтобы получить зеркала только из США, измените строку на:
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&cc=us
Параметры cc
Параметр cc
должен содержать код страны, который используется для фильтрации зеркал. Например:
- Для США:
cc=us
- Для Канады:
cc=ca
- Для Китая:
cc=cn
Важно отметить, что этот параметр действительно работает, как подтвердили тесты с использованием разные комбинации кода страны и архитектуры.
Выполнение изменений
После того как вы внесли изменения в файл репозитория, не забудьте проверить правильность конфигурации. Для этого выполните следующую команду:
dnf clean all
dnf makecache
Эти команды очистят кэш и обновят его с новым списком зеркал в соответствии с вашими установками.
Заключение
Таким образом, изменение конфигурационных файлов репозиториев и использование параметра cc
позволяют dnf загружать пакеты и обновления исключительно из нужных вам регионов, что может существенно улучшить скорость загрузки и надежность подключения в зависимости от вашего местоположения.
В случае возникновения вопросов или необходимости дальнейшей помощи всегда можно обратиться к документации CentOS или сообществам пользователей.