README.md

RED OS 8 Minimal Server Cleanup

Скрипт для очистки установленной RED OS 8 Minimal Server от пакетов и сервисов, которые не нужны для базовой headless-серверной системы.

Цель проекта — получить минимальную, но полноценно работоспособную RED OS:

  • загрузка системы;
  • сеть через NetworkManager;
  • SSH-доступ;
  • DNF/RPM;
  • SELinux;
  • базовые системные утилиты;
  • поддержка BIOS и UEFI;
  • поддержка обычных дисков, LVM и XFS;
  • возможность установить любые дополнительные серверные роли через DNF.

При этом удаляются компоненты рабочего стола, мультимедиа, установщика, VirtualBox Guest Additions, Cockpit, PackageKit, Ansible и другие пакеты, которые не являются необходимыми для минимального сервера.

[!WARNING] Скрипт удаляет большое количество пакетов.

Перед использованием на production-системах обязательно изучите clean.sh и проверьте предлагаемые DNF-транзакции.


Зачем это нужно?

Установка RED OS 8 с профилем Minimal Server может содержать значительно больше программного обеспечения, чем требуется минимальной серверной системе.

Например, после установки могут присутствовать:

  • Anaconda и компоненты установщика;
  • GNOME/GTK-компоненты;
  • X11;
  • GStreamer;
  • PipeWire;
  • PackageKit и AppStream;
  • Cockpit;
  • VirtualBox Guest Additions;
  • Bluetooth;
  • Wi-Fi/WWAN;
  • smart-card компоненты;
  • Ansible;
  • мультимедийные библиотеки;
  • различные desktop-службы;
  • дополнительные инструменты администрирования.

Для универсального дистрибутива наличие части этих компонентов вполне объяснимо, однако для минимального headless-сервера они обычно не требуются.

Этот проект приводит систему примерно к следующей модели:

RED OS 8
│
├── kernel
├── systemd
├── GRUB / UEFI boot support
├── NetworkManager
├── OpenSSH
├── DNF / RPM
├── SELinux
├── audit
├── firewalld
├── chrony
├── basic CLI utilities
│   ├── bash
│   ├── coreutils
│   ├── util-linux
│   ├── procps-ng
│   ├── iproute
│   ├── iputils
│   └── vim-minimal
│
└── storage support
    ├── device-mapper
    ├── LVM
    └── XFS

Всё остальное пользователь при необходимости устанавливает самостоятельно.


Что делает скрипт

1. Защищает критически важные пакеты

Перед очисткой основные компоненты системы помечаются как явно установленные через:

dnf mark install

Это защищает их от последующего dnf autoremove.

Среди защищаемых компонентов:

  • kernel;
  • systemd;
  • GRUB;
  • UEFI boot components, если они установлены;
  • dracut;
  • NetworkManager;
  • OpenSSH;
  • DNF/RPM;
  • PAM/authselect;
  • SELinux;
  • audit;
  • firewalld;
  • chrony;
  • базовые CLI-утилиты;
  • LVM;
  • XFS.

Скрипт не устанавливает отсутствующие boot/storage-компоненты, а только защищает те, которые уже присутствуют в системе.

Это позволяет использовать его как на BIOS, так и на UEFI-системах.


2. Удаляет компоненты установщика

После завершения установки системе больше не нужны компоненты Anaconda:

anaconda-core
anaconda-tui
anaconda-gui
anaconda-widgets
anaconda-user-help
initial-setup
initial-setup-gui
blivet-gui-runtime
python3-meh-gui

3. Удаляет desktop-компоненты

В частности:

GNOME
Mutter
X11
VNC
GTK desktop infrastructure
xdg-desktop-portal
desktop-file-utils

Также удаляются ставшие ненужными зависимости этих компонентов.


4. Удаляет мультимедийный стек

Для headless-сервера обычно не требуются:

GStreamer
PipeWire audio compatibility
Qt Multimedia
WebKitGTK

Большая часть этого дерева удаляется автоматически после удаления верхнеуровневых desktop-пакетов и выполнения dnf autoremove.


5. Удаляет PackageKit/AppStream

Удаляются:

PackageKit
appstream
appstream-data

Для минимального сервера управление пакетами выполняется непосредственно через:

dnf
rpm

6. Удаляет Cockpit

Cockpit не считается частью минимальной системы.

Если он потребуется:

sudo dnf install cockpit

7. Удаляет Ansible

Ansible также не является частью базовой серверной ОС.

Сервер может быть:

  • Ansible target;
  • Ansible controller;
  • вообще не использовать Ansible.

Поэтому Ansible устанавливается пользователем отдельно, если он действительно необходим.


8. Удаляет необязательные сетевые компоненты

Удаляются компоненты для:

  • Wi-Fi;
  • WWAN;
  • Bluetooth;
  • ModemManager;
  • wpa_supplicant;
  • USB-модемов.

Базовый Ethernet networking через NetworkManager сохраняется.


9. Удаляет VirtualBox Guest Additions

Скрипт удаляет:

virtualbox-guest-additions
VirtualBox-kmod

а также динамически обнаруживает kernel-specific пакеты вида:

VirtualBox-kmod_<kernel-version>

Поэтому скрипт не привязан к конкретной версии ядра RED OS.

Дополнительно блокируется загрузка vboxguest.

[!NOTE] vmwgfx намеренно не блокируется.

VirtualBox при использовании графического контроллера VMSVGA может использовать стандартный kernel-драйвер vmwgfx. Его наличие само по себе не означает, что VirtualBox Guest Additions установлены.


10. Удаляет дополнительные server/workstation-компоненты

В число кандидатов на удаление входят, например:

smartmontools
mdadm
udisks2
lm_sensors
mcelog
NFS utilities
CIFS utilities
iSCSI utilities
multipath
ipmitool

При необходимости любой из этих компонентов можно установить обратно через DNF.


Что намеренно сохраняется

Проект придерживается принципа:

Минимальная система должна быть небольшой, но не должна становиться хрупкой или привязанной к конкретной виртуальной машине.

Поэтому некоторые компоненты сохраняются намеренно.

LVM

Даже если текущая система установлена на обычный раздел, поддержка LVM оставляется.

Это позволяет использовать один и тот же скрипт для физических серверов и виртуальных машин с различной схемой хранения данных.

XFS

xfsprogs также сохраняется как часть универсальной серверной storage-базы.

systemd-boot

Если в системе присутствует:

systemd-boot-unsigned

скрипт его не удаляет.

Это важно для универсальности между BIOS- и UEFI-системами.

irqbalance

irqbalance сохраняется, поскольку он может быть полезен на реальном многопроцессорном/многоядерном серверном оборудовании.

SELinux

SELinux не отключается.

Ожидаемое состояние после очистки:

Enforcing

firewalld

Firewall также остаётся частью базовой серверной установки.

audit

Linux Audit сохраняется.


Особенность fprintd

На первый взгляд пакеты:

fprintd
fprintd-pam

кажутся очевидными кандидатами на удаление с headless-сервера.

Однако в RED OS 8 существует зависимость:

pam
  └── authselect
        └── fprintd-pam
              └── fprintd

Попытка удалить fprintd может привести к удалению критически важного authentication stack.

Поэтому эти пакеты намеренно не удаляются.

Это хороший пример того, почему скрипт не пытается удалить абсолютно всё, что выглядит «не серверным».


Требования

Скрипт предназначен для:

RED OS 8

и предполагает наличие:

  • DNF;
  • RPM;
  • systemd;
  • NetworkManager;
  • bash.

Основной сценарий использования — свежая установка:

RED OS 8 Minimal Server

Использование

Склонируйте репозиторий:

git clone <repository-url>
cd redos-minimal-cleanup

Проверьте скрипт:

less clean.sh

Сделайте его исполняемым:

chmod +x clean.sh

Запустите:

sudo ./clean.sh

Скрипт сначала показывает предполагаемые DNF-транзакции и запрашивает подтверждение.

После завершения рекомендуется перезагрузить систему:

sudo reboot

Проверка после перезагрузки

Состояние systemd

systemctl --failed

Ожидаемый результат:

0 loaded units listed.

Проверьте target:

systemctl get-default

Ожидается:

multi-user.target

Сеть

ip -br addr
ip route
systemctl status NetworkManager

SSH

systemctl is-enabled sshd
systemctl is-active sshd
ss -lnt | grep ':22 '

RPM/DNF

Проверьте целостность dependency graph:

sudo dnf check

При нормальной работе команда не должна сообщать об ошибках зависимостей.


SELinux

getenforce

Ожидается:

Enforcing

Остатки desktop stack

rpm -qa | grep -Ei \
'^(plasma|kf5|kf6|kde|gnome|mutter|gdm|sddm|lightdm|xorg-x11-server|qt5|qt6|gtk[234]|gstreamer|pipewire|pulseaudio|webkit2gtk|xdg-desktop-portal)'

В идеальном случае вывод будет пустым.


VirtualBox Guest Additions

rpm -qa | grep -Ei \
'virtualbox|vbox|open-vm-tools|spice-vdagent|qemu-guest'

И:

lsmod | grep -Ei \
'vbox|vmwgfx|vmw_balloon|vmw_vmci|virtio_gpu'

Наличие vmwgfx само по себе не является ошибкой.


Unneeded packages

sudo dnf repoquery --unneeded

Эта команда особенно полезна для поиска оставшихся dependency trees.


Результат

На тестовой установке RED OS 8 после очистки система:

  • успешно загружается;
  • работает в multi-user.target;
  • имеет работающий NetworkManager;
  • доступна по SSH;
  • сохраняет DNF/RPM;
  • работает с SELinux Enforcing;
  • не имеет failed systemd units;
  • не содержит KDE/GNOME/X11/Qt/GStreamer desktop stack;
  • не содержит VirtualBox Guest Additions.

Пример базовых работающих сервисов:

auditd.service
chronyd.service
crond.service
dbus-broker.service
getty@tty1.service
irqbalance.service
NetworkManager.service
rsyslog.service
sshd.service
systemd-journald.service
systemd-logind.service
systemd-resolved.service
systemd-udevd.service

Конкретный список может отличаться в зависимости от оборудования и версии RED OS.


Что этот проект НЕ делает

Скрипт не пытается превратить RED OS в embedded/minimal-container систему.

В частности, он не удаляет базовые механизмы:

  • SELinux;
  • PAM;
  • systemd;
  • NetworkManager;
  • firewalld;
  • audit;
  • поддержку LVM/XFS;
  • универсальный boot stack.

Цель проекта — практичный minimal server, а не минимально возможное количество RPM-пакетов.


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

Удаление пакетов операционной системы всегда связано с риском.

Перед использованием рекомендуется:

  1. сделать snapshot виртуальной машины или резервную копию;
  2. иметь доступ к консоли машины, а не только SSH;
  3. внимательно проверить DNF transaction preview;
  4. сначала протестировать скрипт на отдельной машине.

Особенно осторожно используйте скрипт на системах, которые уже выполняют серверные роли.

Например, если машина использует:

  • NFS;
  • Samba/CIFS;
  • iSCSI;
  • multipath;
  • software RAID;
  • smartmontools;
  • Bluetooth/Wi-Fi/WWAN;
  • Cockpit;
  • Ansible controller;

соответствующие пакеты не следует удалять.


Рекомендуемый сценарий

Лучший вариант использования:

Fresh RED OS 8 Minimal Server installation
                    │
                    ▼
                clean.sh
                    │
                    ▼
                  reboot
                    │
                    ▼
              minimal baseline
                    │
          ┌─────────┴─────────┐
          ▼                   ▼
      Web server          DB server
          │                   │
    nginx/httpd          PostgreSQL
          │                   │
          └─────────┬─────────┘
                    ▼
             required roles only

То есть сначала создаётся чистая базовая ОС, а затем устанавливаются только необходимые для конкретного сервера роли.


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

На данный момент скрипт разрабатывается и тестируется для:

Система Статус
RED OS 8 Minimal Server ✅ Tested
BIOS boot ✅ Tested
UEFI boot ⚠️ Logic supported, testing welcome
VirtualBox ✅ Tested
Physical server ⚠️ Expected to work, testing welcome
Other RED OS installation profiles ⚠️ Not recommended
RED OS 7 ❌ Not tested
Fedora / RHEL / AlmaLinux / Rocky Linux ❌ Not supported

Несмотря на использование DNF/RPM, скрипт учитывает особенности dependency graph RED OS и не должен рассматриваться как универсальный RHEL/Fedora cleanup script.


Contributing

Issues и pull requests приветствуются.

Особенно интересны результаты тестирования на:

  • UEFI;
  • физическом оборудовании;
  • LVM root;
  • XFS root;
  • различных версиях ядра RED OS 8;
  • различных вариантах установки RED OS 8 Minimal Server.

При обнаружении пакета, который можно безопасно удалить, желательно приложить:

rpm -qi <package>
dnf repoquery --installed --whatrequires=<package>
sudo dnf remove --assumeno <package>

Это позволяет проверить dependency graph до внесения изменения в cleanup list.


Philosophy

Основной принцип проекта:

Minimal does not mean broken.

Пакет удаляется не потому, что его название выглядит ненужным, а только если его удаление не разрушает базовые функции операционной системы.

После очистки машина должна оставаться нормальной универсальной серверной RED OS, на которую можно установить необходимую роль обычной командой:

sudo dnf install ...

без восстановления случайно удалённых частей базовой ОС.


License

См. файл LICENSE.

Описание
Скрипт для очистки Minimal Install
Конвейеры
0 успешных
0 с ошибкой
Разработчики