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-пакетов.
Безопасность
Удаление пакетов операционной системы всегда связано с риском.
Перед использованием рекомендуется:
- сделать snapshot виртуальной машины или резервную копию;
- иметь доступ к консоли машины, а не только SSH;
- внимательно проверить DNF transaction preview;
- сначала протестировать скрипт на отдельной машине.
Особенно осторожно используйте скрипт на системах, которые уже выполняют серверные роли.
Например, если машина использует:
- 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.