mirror-switch — зеркала Яндекса для Fedora / RPM Fusion / EPEL

Переключение репозиториев Fedora, RPM Fusion и EPEL на российские зеркала Яндекса (mirror.yandex.ru) и HyperDedic (mirror.hyperdedic.ru) — одним командой, с автоматическим бэкапом и полным откатом прежнего состояния.

Зеркало Яндекса полностью зеркалирует Fedora, RPM Fusion (free/nonfree) и EPEL — это самый надёжный вариант для машин, находящихся в РФ. HyperDedic — резервный вариант для Fedora и EPEL.

Возможности

Требования

Установка

git clone <URL-репозитория> && cd mirror-switch
sudo install -m 0755 mirror-switch.sh /usr/local/sbin/mirror-switch.sh

Быстрый старт

# 1. что прописано сейчас
mirror-switch.sh status

# 2. сухой прогон: показать будущие изменения (root не нужен)
mirror-switch.sh yandex --dry-run

# 3. переключиться на зеркало Яндекса (бэкап создастся автоматически)
sudo mirror-switch.sh yandex

# 4. проверить
sudo dnf repolist
cat /etc/yum.repos.d/fedora.repo

# 5. если что-то не так — полный откат
sudo mirror-switch.sh restore

Команды

Команда Что делает root
yandex Снимок → baseurl на mirror.yandex.ru для Fedora, Updates, RPM Fusion, EPEL; Cisco OpenH264 выключает да
hyperdedic То же на mirror.hyperdedic.ru; RPM Fusion не трогает (HyperDedic его не зеркалирует) да
restore Возврат файлов из снимка (полный откат), затем dnf clean all && dnf makecache да
list Список снимков в /etc/yum.repos.d.bak/ (хранятся последние 10) нет
status Таблица: repo id, enabled, источник (yandex/hyperdedic/metalink), URL нет

Опции

Опция Назначение
-n, --dry-run показать diff и выйти, ничего не меняя; root не нужен
--cisco=disable \| codecs \| keep поведение для fedora-cisco-openh264 / epel-cisco-openh264 (по умолчанию disable)
--no-refresh не запускать dnf clean all / dnf makecache
--snapshot ID (для restore) конкретный снимок вместо последнего
--purge (для restore) удалить .repo-файлы, появившиеся после снимка
-h, --help краткая справка

Как это работает

  1. Классификатор определяет тип каждой секции (fedora, updates, rf-nonfree-updates, epel, …) по её ID и имени файла. Неизвестные секции не изменяются.
  2. Перед правкой весь /etc/yum.repos.d копируется в /etc/yum.repos.d.bak/<метка-времени>-before-<зеркало> (хранится 10 последних снимков).
  3. В правимых секциях строки metalink/mirrorlist/baseurl удаляются, сразу под заголовком секции прописывается новый baseurl; gpgcheck/gpgkey не изменяются.
  4. Запускаются dnf clean all и dnf makecache (отключается опцией --no-refresh).

Все URL используют литеральные $releasever и $basearch — их подставляет сам DNF.

Соответствие секций и baseurl (зеркало Яндекса)

Repo ID baseurl
fedora https://mirror.yandex.ru/fedora/linux/releases/$releasever/Everything/$basearch/os/
fedora-modular https://mirror.yandex.ru/fedora/linux/releases/$releasever/Modular/$basearch/os/
updates https://mirror.yandex.ru/fedora/linux/updates/$releasever/Everything/$basearch/
updates-modular https://mirror.yandex.ru/fedora/linux/updates/$releasever/Modular/$basearch/
updates-testing https://mirror.yandex.ru/fedora/linux/updates/testing/$releasever/Everything/$basearch/
updates-testing-modular https://mirror.yandex.ru/fedora/linux/updates/testing/$releasever/Modular/$basearch/
rpmfusion-free https://mirror.yandex.ru/fedora/rpmfusion/free/fedora/releases/$releasever/Everything/$basearch/os/
updates-rpmfusion-free https://mirror.yandex.ru/fedora/rpmfusion/free/fedora/updates/$releasever/$basearch/
updates-testing-rpmfusion-free https://mirror.yandex.ru/fedora/rpmfusion/free/fedora/updates/testing/$releasever/$basearch/
rpmfusion-nonfree и его updates то же, но с /nonfree/ вместо /free/
epel (EL) https://mirror.yandex.ru/fedora/epel/$releasever/Everything/$basearch/
epel-testing (EL) https://mirror.yandex.ru/fedora/epel/testing/$releasever/Everything/$basearch/
epel-modular (EL) https://mirror.yandex.ru/fedora/epel/$releasever/Modular/$basearch/
fedora-cisco-openh264, epel-cisco-openh264 по умолчанию enabled=0; при --cisco=codecs → https://codecs.fedoraproject.org/openh264/$releasever/$basearch/

Секции SRPM/debuginfo, а также сторонние репозитории (Google Chrome, VS Code, NVIDIA, COPR-репозитории copr.fedorainfracloud.org…) скрипт намеренно не изменяет.

Примеры

# переключение с отключением Cisco OpenH264 (значение по умолчанию)
sudo mirror-switch.sh yandex

# оставить OpenH264, но перевести на официальное зеркало кодеков
sudo mirror-switch.sh yandex --cisco=codecs

# не трогать cisco-репозитории вообще и не обновлять кэш
sudo mirror-switch.sh yandex --cisco=keep --no-refresh

# посмотреть снимки и откатиться к конкретному
mirror-switch.sh list
sudo mirror-switch.sh restore --snapshot 20260924T101530Z-before-yandex

# откат + удалить .repo, добавленные после снимка
sudo mirror-switch.sh restore --purge

Снимки и восстановление

Снимки хранятся в /etc/yum.repos.d.bak/ (имя каталога — UTC-метка и целевое зеркало), автоматически чистятся до 10 последних. Поведение настраивается переменными окружения:

Переменная По умолчанию Назначение
REPO_DIR /etc/yum.repos.d каталог .repo-файлов
SNAPSHOT_ROOT /etc/yum.repos.d.bak каталог снимков
KEEP_SNAPSHOTS 10 сколько снимков хранить

restore копирует файлы из снимка с сохранением прав (cp -a). Файлы, появившиеся после снимка, по умолчанию сохраняются с предупреждением — удалить их можно опцией --purge.

Cisco OpenH264

Репозиторий fedora-cisco-openh264 недоступен из России (HTTP 403) и для большинства задач не нужен — кодеки удобнее ставить из RPM Fusion (openh264, ffmpeg). Поэтому по умолчанию он отключается (enabled=0). Альтернативы:

sudo mirror-switch.sh yandex --cisco=codecs   # перевести на codecs.fedoraproject.org
sudo mirror-switch.sh yandex --cisco=keep     # не трогать
Резервное зеркало HyperDedic — когда и как Если `mirror.yandex.ru` временно недоступен: ```bash sudo mirror-switch.sh restore # вернуть исходники, чтобы не смешивать конфиги sudo mirror-switch.sh hyperdedic # переключить на mirror.hyperdedic.ru ``` Доступны каталоги `https://mirror.hyperdedic.ru/fedora/linux/` и `https://mirror.hyperdedic.ru/fedora/epel/`. RPM Fusion там не зеркалируется — скрипт предупредит и оставит RPM Fusion на прежних адресах.
Эквивалент вручную через dnf config-manager Для одной секции, например `updates`: ```bash sudo dnf config-manager setopt \ 'updates.baseurl=https://mirror.yandex.ru/fedora/linux/updates/$releasever/Everything/$basearch/' \ 'updates.metalink=' \ 'updates.mirrorlist=' ``` Минус: `dnf config-manager` пишет изменения в те же `.repo`-файлы, поэтому бэкап всё равно нужен — именно поэтому скрипт создаёт снимок всегда.

Безопасность

Troubleshooting

Симптом Что делать
Failed to download metadata для одной секции sudo dnf repoinfo <repo-id> — проверить URL; возможно, у зеркала нет каталога для $releasever (например, релиз EOL)
404 на новом релизе Fedora зеркало ещё синхронизировалось — подождать или временно sudo mirror-switch.sh restore
Нужно вернуть всё как было sudo mirror-switch.sh restore (список снимков — mirror-switch.sh list)
Хочу посмотреть изменения без риска mirror-switch.sh yandex --dry-run
Скрипт пишет ВНИМАНИЕ: RPM Fusion ... не зеркалируется ожидаемо для hyperdedic — секции RPM Fusion остаются на своих адресах
FAQ **Нужно ли вручную подставлять номер версии Fedora?** Нет. В URL используются `$releasever` и `$basearch`, их подставляет DNF. **Затронет ли скрипт мои сторонние репозитории?** Нет. Изменяются только известные секции Fedora/RPM Fusion/EPEL; всё остальное остаётся нетронутым. **Можно ли запустить повторно?** Да, скрипт идемпотентен: второй запуск не меняет файлы и создаёт лишь новый снимок. **Где посмотреть, что именно изменено?** `grep -R "baseurl" /etc/yum.repos.d/` или `mirror-switch.sh status` (колонка «ИСТОЧНИК»).

Разработка

Правила внесения изменений, инварианты и тестовые сценарии — в AGENTS.md. Проверка перед коммитом:

shellcheck mirror-switch.sh
shfmt -i 2 -ci -sr -d mirror-switch.sh
bash tests/run-tests.sh

Лицензия

MIT — см. LICENSE.