Skip to content

About

Automated maintenance and recovery CLI tool for ALT Linux: APT/RPM repairs, dynamic kernel updates, mirror failover, and system diagnostics.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

altctl — обслуживание ALT Linux одной командой

altctl чинит и обновляет ALT Linux без привязки к конкретной версии. При каждом запуске он определяет по самой системе:

  • ветку (Sisyphus, p10, p11, c10f2…), архитектуру и тип ядра;
  • гипервизор (VirtualBox, VMware, KVM, Hyper-V или физическая машина);
  • рабочее зеркало и имена служб в пакетах.

Поэтому одна и та же команда работает на Simply Linux 10/11/11.2, Альт Рабочая станция, Альт Сервер и Sisyphus, на железе и в виртуальной машине.

Совместимость

Дистрибутив Ветка репозитория
Simply Linux 10 p10
Simply Linux 11, 11.2 p11
Альт Рабочая станция 10 / 11 p10 / p11
Альт Сервер 10 / 11 p10 / p11
Sisyphus (ALT Regular и другие сборки на нём) Sisyphus

Номера версий в коде не прописаны. Ветка определяется по ALT_BRANCH_ID в /etc/os-release, по /etc/altlinux-release или по VERSION_ID. Архитектура берётся из rpm --eval %_arch (x86_64, aarch64, i586…). Будущая ветка (например, p12) подхватится автоматически, если её ключ подписи есть в пакете alt-gpgkeys.

Установка

sudo ./install.sh            # установить и включить ежедневное обслуживание в 04:00
sudo altctl doctor           # проверить систему

Если install.sh обнаружит виртуальную машину, он сразу применит профиль vm: отключит сон и гашение экрана, настроит chrony и синхронизирует часы с хостом.

Ключи: --no-timer — без ежедневного таймера, --no-profile — не применять профиль, --uninstall — удалить. Можно запускать и без установки, прямо из папки: sudo ./altctl doctor.

Команды

Команда Что делает
altctl doctor диагностика: ветка, источники, ядро, гипервизор, время, сон, графика, службы. Ничего не меняет
altctl fix самовосстановление (список ниже)
altctl update полное обновление: пакеты → ядро и модули → flatpak → очистка
altctl kernel только ядро и модули к нему
altctl maintain fix + update; именно это запускает таймер
altctl profile status|apply показать или применить профиль среды (vm / server / desktop)
altctl time sync установить chrony, сразу выставить точное время, записать его в RTC
altctl time status|check|watch on|off состояние часов / быстрая проверка / периодическая проверка
altctl power status|nosleep|allow-sleep спящие режимы systemd и гашение консоли
altctl display wake разбудить чёрный экран без потери сеанса
altctl display restart после проверок перезапустить LightDM/SDDM/GDM
altctl display status|noblank состояние графики / отключить гашение экрана X и XFCE
altctl guest status гостевые дополнения: модули, службы, группа vboxsf, буфер обмена, общие папки
altctl guest install установить дополнения гипервизора и настроить их
altctl guest fix доустановить недостающее, добавить пользователей в vboxsf, перезапустить VBoxClient
altctl repo auto подобрать живое зеркало под ветку системы (HTTPS в приоритете) и переписать источники
altctl repo https перевести текущие источники с http:// на https://, проверить apt-get update, при сбое — откатить
altctl repo tune записать сетевые настройки APT (99altctl-network.conf)
altctl repo set p11 перейти на другую ветку (затем altctl update)
altctl repo restore вернуть источники, какими они были до последнего изменения
altctl install mc 'apache2-base|apache2' установить пакеты; a|b — альтернативные имена
altctl services установить и запустить службы из SERVICES
altctl firewall apply|status|off межсетевой экран из настроек FW_*
altctl timer on|off|status расписание автоматического обслуживания

Опции: -n — показать, что будет сделано, ничего не меняя (в том числе каждую команду и содержимое файлов); -y — без вопросов.

Профили

Профиль выбирается автоматически (PROFILE=auto). Его можно закрепить в /etc/altctl.conf.

Профиль Когда Что настраивается
vm найден гипервизор сон и гашение консоли и экрана выключены; гостевые дополнения (буфер обмена, общие папки, подстройка экрана); chrony шагает часы в любой момент; часы гостя синхронизируются с хостом; часы проверяются каждые 2 мин
server физическая машина без display manager сон и гашение консоли выключены
desktop физическая машина с графикой энергосбережение не трогается; chrony только поддерживается в рабочем состоянии

fix и maintain доприменяют профиль, если что-то «слетело» после обновления или ручных правок.

Чёрный экран в виртуальной машине

Причина. Гость пытается уйти в сон или погасить монитор (DPMS). Виртуальная видеокарта после этого часто не просыпается, а LightDM, Xorg или xfdesktop зависают или падают. Что делает профиль vm:

  1. Маскирует sleep, suspend, hibernate, hybrid-sleep и suspend-then-hibernate (.target). После этого systemd физически не сможет усыпить систему, кто бы этого ни попросил.
  2. Отключает гашение консоли: BLANK_TIME=0 и POWERDOWN_TIME=0 в /etc/sysconfig/console; в работающей системе это применяется сразу через setterm.
  3. Отключает гашение на уровне X-сервера: пишет /etc/X11/xorg.conf.d/90-altctl-noblank.conf с BlankTime, StandbyTime, SuspendTime, OffTime = 0. Это действует и на экран входа LightDM.
  4. Отключает гашение в открытых сеансах XFCE. От имени владельца сеанса выставляет через xfconf-query blank-on-ac, dpms-on-ac-sleep, dpms-on-ac-off = 0 (и то же для батареи), выключает хранитель экрана XFCE и сразу выполняет xset -dpms.

Если экран уже чёрный. Сначала sudo altctl display wake: включает DPMS и переключает виртуальные консоли, сеанс не теряется. Если не помогло — sudo altctl display restart. Перед перезапуском altctl проверит:

  • конфигурацию LightDM (lightdm --show-config);
  • свободное место в /tmp и /var;
  • права /tmp/.X11-unix;
  • что сейчас не идёт установка пакетов.

Перезапуск ставится в очередь systemd (--no-block), поэтому он сработает, даже если команда запущена из того самого графического терминала.

Часы и RTC в виртуальной машине

Причина. Когда хост встаёт на паузу или засыпает, часы гостя отстают. Chrony в настройках по умолчанию резко поправляет время только при старте (makestep 1.0 3), а дальше подводит его медленно, часами. Пока время неверное, ломаются TLS, подписи репозиториев и таймеры.

В ALT службой времени является chrony (chronyd.service); systemd-timesyncd в базовой поставке нет. Что делает altctl time sync:

  1. Ставит chrony, если его нет. Если часы сбиты сильнее чем на 5 минут, сначала грубо выставляет время, иначе apt может отвергнуть подписи.
  2. Отключает конкурирующие службы (systemd-timesyncd, ntpd): два демона, подводящие одни часы, дают скачки времени.
  3. В профиле vm добавляет блок в /etc/chrony.conf между метками # >>> altctl и # <<< altctl:
    • makestep 1 -1 — шагать часы при расхождении больше 1 с в любой момент;
    • rtcsync — держать RTC синхронными;
    • для KVM и Hyper-V — refclock PHC: часы гостя идут прямо от часов хоста через PTP-устройство гипервизора. Для KVM модуль ptp_kvm загружается и закрепляется в автозагрузке.
  4. Сразу синхронизирует время: chronyc burst → chronyc makestep → hwclock --systohc.
  5. Если NTP недоступен (закрыт UDP 123), выставляет время по заголовку Date ответа зеркала с точностью около 1 с.
  6. Включает altctl-clock.timer: каждые 2 минуты altctl time check сверяет смещение и при необходимости поправляет часы. В журнал попадают только коррекции, а не каждый запуск.

Если после правки конфигурации chronyd не запустится, altctl вернёт прежний chrony.conf из резервной копии.

Гостевые инструменты гипервизора (VBoxService, open-vm-tools, qemu-guest-agent), которые тоже подводят часы от хоста, ставит altctl guest install — он входит в profile apply.

Гостевые дополнения VirtualBox

altctl guest install (входит в профиль vm) и altctl guest fix настраивают три вещи, которые в ALT чаще всего не работают «из коробки».

Откуда берутся модули ядра

altctl сам определяет источник модулей vboxguest/vboxsf и действует по-разному:

Источник Как определяется Что нужно при новом ядре
встроены в ядро vboxguest.ko есть в /lib/modules/<ядро> из kernel-image ничего — они уже в новом ядре
пакет ALT установлен kernel-modules-virtualbox-addition-<тип> update-kernel сам ставит его версию для нового ядра
ISO (VBoxLinuxAdditions.run) есть rcvboxadd, службы vboxadd* заголовки kernel-headers-modules-<тип>, gcc, make → rcvboxadd quicksetup <ядро>
DKMS dkms status знает модуль vbox те же заголовки → dkms autoinstall -k <ядро>

Заголовки в ALT называются по типу ядра: kernel-headers-modules-6.12, kernel-headers-modules-std-def. Пакета с полной версией в имени (kernel-headers-modules-$(uname -r)) нет; тип altctl берёт из версии ядра, например 6.12.20-6.12-alt1 → 6.12.

Обновление ядра. altctl update до update-kernel ставит заголовки и компилятор, если модули собираются из исходников. После update-kernel проверяет, что в ядре, которое загрузится следующим, есть vboxguest. Если модуля нет, altctl собирает его или ставит пакет. Если это не удалось:

  • выводится ошибка;
  • AUTO_REBOOT не перезагрузит систему;
  • doctor показывает проблему до перезагрузки, а не после.

Видеодрайвер и сеть от гостевых дополнений не зависят:

  • при видеоконтроллере VMSVGA (по умолчанию для Linux-гостей) экран обслуживает vmwgfx из ядра, vboxvideo не нужен;
  • сетевые карты VirtualBox (e1000, virtio-net) тоже работают на драйверах ядра.

При «отвалившихся» дополнениях пропадают буфер обмена, общие папки и автоподстройка экрана.

Общие папки: группа vboxsf

Папки хоста монтируются с группой vboxsf. Пользователь вне этой группы получает Permission denied. altctl создаёт группу, если её нет, и добавляет в неё всех обычных пользователей.

Список пользователей определяется так:

  • кто считается обычным пользователем — диапазон UID берётся из /etc/login.defs (UID_MIN/UID_MAX), а не жёстко «от 1000». В ALT обычные пользователи начинаются с UID 500, и фильтр «UID ≥ 1000» пропустил бы их всех;
  • кто ещё добавляется — пользователи, вошедшие в систему (loginctl), например доменные;
  • кто исключается — служебные учётные записи с оболочкой nologin/false;
  • как задать вручную — GUEST_USERS="user student".

Права появляются после повторного входа в сеанс.

Буфер обмена и подстройка экрана: VBoxClient

  • Режимы. Набор берётся из VBoxClient --help установленной версии: --clipboard, --draganddrop, --seamless, а для экрана — --vmsvga (контроллер VMSVGA, загружен vmwgfx) или --display (старые контроллеры).
  • Автозапуск. Если в /etc/xdg/autostart нет записи с VBoxClient, создаётся altctl-vboxclient.desktop. Запись пакета или ISO не трогается.
  • Открытые сеансы. Недостающие режимы запускаются от имени владельца сеанса. guest fix перезапускает VBoxClient принудительно: при «зависшем» буфере процесс жив, но не работает.

fix и maintain проверяют всё это сами: утилиты, vboxguest, службы, группу, автозапуск, буфер в каждом сеансе. Если что-то не так — доустанавливают недостающее, а если всё в порядке, выводят одну строку.

Что чинит fix

  • Блокировки APT. Ждёт Synaptic или Центр приложений и снимает «мёртвые» lock-файлы. Чужие процессы не убивает.
  • Базу RPM. Если rpm не читает базу, удаляет __db.* и выполняет rpm --rebuilddb.
  • Время. chrony не установлен, не запущен, часы не синхронизированы или смещение больше TIME_MAX_OFFSET → time sync.
  • Источники пакетов. Если ветки смешаны (например, Sisyphus поверх p10), источники не совпадают с веткой системы или их нет, — переписывает их.
  • Зеркало. Если зеркало не отвечает, update очищает списки пакетов и переключается на следующее из MIRRORS (по HTTPS, при сбое TLS — по HTTP).
  • Сеть APT. Восстанавливает 99altctl-network.conf; переводит источники с HTTP на HTTPS, если зеркала это поддерживают (с проверкой и откатом).
  • Зависимости. Нарушенные зависимости исправляет через apt-get -f install.
  • Место. При нехватке места на / очищает кэш, при нехватке в /boot удаляет старые ядра.
  • Модули ядра. Восстанавливает modules.dep и сообщает, если модули не загрузились.
  • Службы. Поднимает упавшие службы из WATCH_UNITS и SERVICES.
  • Профиль. Заново маскирует сон и отключает гашение консоли и экрана, если это «слетело».
  • Гостевые дополнения VirtualBox. Утилиты, модуль vboxguest, службы, группа vboxsf, автозапуск и работа VBoxClient.
  • Межсетевой экран. Если FW_ENABLE=yes, а правила пропали, загружает их заново.

Сеть APT: HTTPS и защита от зависаний

Симптом. apt-get update качает pkglist (30+ МБ на ветку) со скоростью около 50 КБ/с или зависает намертво, особенно в ВМ за NAT или сетевым мостом.

Причины.

  • DPI-шейпинг режет открытый HTTP-трафик;
  • конвейер HTTP-запросов APT (pipelining) ломается на прокси, middlebox-ах и виртуальных мостах.

Сетевые настройки APT

/etc/apt/apt.conf.d/99altctl-network.conf создаётся при установке (install.sh). fix, maintain и update проверяют его и восстанавливают, если файла нет или его изменили:

Acquire::http::Pipeline-Depth "0";     // без конвейера запросов
Acquire::https::Pipeline-Depth "0";
Acquire::http::Timeout "30";           // «повисшее» соединение рвётся и повторяется
Acquire::https::Timeout "30";
Acquire::Retries "3";                  // повтор неудачной загрузки

Значения задаются в /etc/altctl.conf (APT_PIPELINE_DEPTH, APT_TIMEOUT, APT_RETRIES); altctl repo tune переписывает файл. После записи altctl проверяет, что apt-config читает конфигурацию. Если нет — файл удаляется, чтобы apt-get не сломался.

APT в ALT — собственная ветка apt-rpm. Неизвестные ей параметры она молча игнорирует. Поддержку Acquire::Retries в конкретной версии я не проверял. Независимо от неё altctl сам повторяет apt-get update: очищает списки, затем переключается на другое зеркало.

HTTPS в приоритете

Зашифрованный трафик DPI не может избирательно резать по содержимому, поэтому HTTPS — основной протокол (REPO_HTTPS=auto).

  • altctl repo auto. Для каждого зеркала из MIRRORS сначала пробует https://, причём схема в списке — только подсказка: старые конфиги с http:// тоже получают HTTPS. Из ответивших по HTTPS выбирается самое быстрое. На http:// altctl переходит, только если TLS не работает ни на одном зеркале, и пишет причину для каждого: ошибка рукопожатия, недействительный сертификат, тайм-аут, нет ветки.
  • altctl repo https. Проверяет каждый http://-источник по HTTPS и переводит те, что отвечают. Затем выполняет apt-get update; если он не прошёл, источники возвращаются как были. Остальные зеркала остаются на HTTP, и altctl называет их.
  • fix и maintain делают то же автоматически. Если HTTPS не работает, источники остаются на HTTP с предупреждением, а не с ошибкой.

Метод https для APT в ALT — отдельный пакет apt-https (+ ca-certificates). Без него строка https:// ломает apt-get update (метод /usr/lib64/apt/methods/https не найден). altctl ставит его по HTTP до перевода источников. doctor предупреждает, если источники уже на HTTPS, а метода нет.

Почему время важно. Для HTTPS нужны правильные часы: со сбитыми часами сертификат выглядит недействительным. Поэтому fix сначала синхронизирует время, а запасная установка времени по заголовку Date всегда идёт по http://.

doctor в разделе «Источники пакетов» показывает протокол ([WARN] Репозитории используют незашифрованный HTTP) и наличие 99altctl-network.conf.

Баг VirtualBox на Wi-Fi: Bridged Adapter против NAT

Симптом. Условия стенда:

  • хост — Windows 11, подключённый к сети по Wi-Fi;
  • VirtualBox 7.x;
  • сетевой адаптер ВМ в режиме «Сетевой мост» (Bridged Adapter).

Входящий трафик гостя зажимается на уровне 30–50 КБ/с. Не помогают ни HTTPS, ни отключённый конвейер APT (Pipeline-Depth 0), ни смена зеркала: узкое место не в APT и не в зеркале, а в сетевом режиме ВМ.

Причина. Стандарт 802.11 разрешает Wi-Fi-клиенту отправлять кадры только от своего MAC-адреса. Поэтому «мост» через беспроводной адаптер VirtualBox делает не настоящим мостом, а подменой MAC-адресов в своём NDIS-фильтре на хосте. На этом пути, в связке с драйвером Wi-Fi, входящий трафик гостя деградирует.

Как убедиться. Скорость скачивания большого файла из гостя:

curl -o /dev/null --max-time 20 -w 'скорость: %{speed_download} байт/с\n' \
     https://mirror.yandex.ru/altlinux/p11/branch/x86_64/base/pkglist.classic.xz

Если на хосте скорость нормальная, а в госте десятки КБ/с при любом зеркале и протоколе — дело в сетевом мосте.

Решение. Переключите сетевой адаптер ВМ с «Сетевого моста» на «NAT»: Настройки ВМ → Сеть → Адаптер 1 → Тип подключения: NAT.

  • В режиме NAT трафик гостя идёт через сетевой стек хоста как обычное соединение программы, без подмены MAC-адресов.
  • Ограничение полностью исчезает, и скорость раскрывается до максимума интернет-канала.
  • Гость получает адрес от встроенного DHCP VirtualBox (обычно 10.0.2.15); APT и altctl работают без изменений.

Доступ по SSH через NAT. В режиме NAT гость не виден из сети хоста напрямую, поэтому для SSH нужен проброс порта (Port Forwarding): Настройки ВМ → Сеть → Адаптер 1 (NAT) → Дополнительно → Проброс портов → «+»:

Имя Протокол Адрес хоста Порт хоста Адрес гостя Порт гостя
SSH TCP (пусто) 2222 (пусто) 22

То же из командной строки хоста:

VBoxManage modifyvm "Имя ВМ" --natpf1 "SSH,tcp,,2222,,22"    # ВМ выключена
VBoxManage controlvm "Имя ВМ" natpf1 "SSH,tcp,,2222,,22"     # ВМ работает

Подключение с хоста:

ssh -p 2222 user@127.0.0.1
scp -P 2222 файл user@127.0.0.1:~/     # копирование файлов — тот же порт

Что ещё учесть:

  • В госте должен работать sshd: sudo altctl services (по умолчанию SERVICES="openssh-server:sshd").
  • Пустой «Адрес хоста» означает все сетевые интерфейсы хоста. К порту 2222 смогут подключиться и другие устройства в той же сети Wi-Fi, если их не остановит брандмауэр Windows. Чтобы SSH был доступен только с самого хоста, укажите адрес хоста 127.0.0.1.
  • Межсетевой экран altctl этому не мешает: внутри гостя соединение по-прежнему приходит на порт 22 (FW_TCP_PORTS="22").

Почему отдельно обновляется ядро

В ALT apt-get dist-upgrade не ставит новое ядро: версия входит в имя пакета ядра (kernel-image-6.12-…). Новое ядро и согласованные с ним модули (kernel-modules-*-<тип>) ставит update-kernel — altctl update вызывает его сам. Старые ядра удаляются только после того, как система загрузилась в новое, чтобы рабочее ядро никогда не пропало. Если нужна перезагрузка, altctl сообщит об этом. Перезагружаться автоматически он будет только при AUTO_REBOOT=yes.

Настройки — /etc/altctl.conf

Все параметры собраны в одном файле с комментариями. Чаще всего меняют:

PROFILE=auto                               # или vm / server / desktop
BRANCH=auto                                # или p11 / Sisyphus — закрепить ветку
REPO_HTTPS=auto                            # yes — только HTTPS, no — только HTTP
APT_TIMEOUT=30; APT_RETRIES=3              # затем: sudo altctl repo tune
NTP_SERVERS="ntp1.vniiftri.ru"             # свои NTP-серверы в дополнение к chrony.conf
SERVICES="openssh-server:sshd apache2-base|apache2:httpd2 samba:smb,nmb"
FW_ENABLE=yes; FW_TCP_PORTS="22 80"        # затем: sudo altctl firewall apply
TIMER_SCHEDULE="Sun 03:00"                 # затем: sudo altctl timer on
AUTO_REBOOT=no

Любой параметр можно задать разово: sudo PROFILE=vm altctl profile apply.

Где что лежит

Путь Назначение
/opt/altctl/, /usr/local/sbin/altctl программа
/etc/apt/sources.list.d/altctl.list источники, которые пишет altctl (остальные закомментированы с пометкой #altctl#)
/etc/apt/apt.conf.d/99altctl-network.conf сетевые настройки APT: без конвейера, тайм-аут, повторы
/etc/chrony.conf блок между # >>> altctl и # <<< altctl (только он меняется)
/etc/X11/xorg.conf.d/90-altctl-noblank.conf отключение гашения экрана X (профиль vm)
/etc/sysconfig/console BLANK_TIME=0, POWERDOWN_TIME=0
/etc/modules-load.d/altctl-ptp.conf автозагрузка ptp_kvm (KVM)
/etc/xdg/autostart/altctl-vboxclient.desktop автозапуск VBoxClient (если пакет не поставил свой)
/var/backups/altctl/ резервные копии источников, chrony.conf, console и правил экрана
/etc/sysconfig/iptables, ip6tables сохранённые правила; поднимает altctl-firewall.service
journalctl -u altctl-maintain журнал ежедневного обслуживания
journalctl -u altctl-clock журнал коррекций часов (профиль vm)

Как вернуть всё назад

Что Команда
сон sudo altctl power allow-sleep и PROFILE=desktop в настройках (иначе fix снова его отключит)
гашение экрана X sudo rm /etc/X11/xorg.conf.d/90-altctl-noblank.conf
HTTPS в источниках REPO_HTTPS=no в настройках, затем sudo altctl repo auto (или altctl repo restore)
сетевые настройки APT APT_NET_TUNING=no в настройках и sudo rm /etc/apt/apt.conf.d/99altctl-network.conf
настройки chrony удалить блок # >>> altctl … # <<< altctl из /etc/chrony.conf
проверка часов sudo altctl time watch off
автозапуск VBoxClient sudo rm /etc/xdg/autostart/altctl-vboxclient.desktop

Структура проекта

altctl            точка входа и разбор команд
install.sh        установка в систему (+ профиль vm в виртуальной машине)
etc/altctl.conf   настройки по умолчанию
lib/common.sh     вывод, dry-run, итоговая сводка, конфигурация
lib/detect.sh     ветка, архитектура, ядро, гипервизор, текущие источники
lib/profile.sh    профили vm / server / desktop
lib/time.sh       chrony, шаг часов, RTC, гостевые инструменты, проверка часов
lib/power.sh      спящие режимы и гашение консоли
lib/display.sh    гашение экрана X/XFCE, пробуждение и перезапуск display manager
lib/guest.sh      гостевые дополнения: модули, vboxsf, VBoxClient, проверка нового ядра
lib/repo.sh       выбор зеркала (HTTPS в приоритете), перевод на HTTPS, сетевые настройки APT, откат
lib/heal.sh       самовосстановление
lib/update.sh     обновление пакетов, ядра, модулей
lib/services.sh   установка пакетов и служб
lib/firewall.sh   межсетевой экран IPv4/IPv6
lib/timer.sh      таймер ежедневного обслуживания
lib/doctor.sh     диагностика

Если файлы правились в Windows и bash ругается на $'\r', выполните sed -i 's/\r$//' altctl install.sh lib/*.sh. install.sh делает это сам.

About

Automated maintenance and recovery CLI tool for ALT Linux: APT/RPM repairs, dynamic kernel updates, mirror failover, and system diagnostics.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages