- server/ profile and build-iso.sh [desktop|server]; make iso-server, make qemu-server, run-qemu.sh --serial; login on tty and ttyS0 - das-server: SSH, chrony, NetworkManager/dhcpcd, Docker with Compose, nftables (closed except SSH, own table), fail2ban reading socklog, sshd without root passwords, Docker log rotation, tools - das-server-install: dialog installer in Ukrainian and English, or unattended with --config; GPT + Btrfs subvolumes, GRUB for UEFI and BIOS, serial console, SSH key with optional keys-only logins - das-install-common: mount-source and postinstall shared with Calamares - dsv: runit service manager (list, enable, disable, start, stop, restart, status, logs) with bash completion, also on the desktop - das-update split into a subpackage without GTK; the window and tray icon move to /usr/libexec/das/das-update-gui - das-snapper-setup enables dbus, which snapper needs - TODO: ISO size review with measured numbers and options Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
191 lines
26 KiB
Markdown
191 lines
26 KiB
Markdown
## Das OS
|
||
### _Легкий і дружній десктоп на базі Void Linux з Xfce та українським колоритом, а також консольна серверна версія_
|
||
|
||
[](https://voidlinux.org) [](https://xfce.org) [](https://docs.voidlinux.org/config/services/) [](https://go.dev) [](https://www.docker.com) [](#)
|
||
|
||
🇬🇧 [English version](README.md)
|
||
|
||
### 💡 Призначення
|
||
Void Linux швидкий, простий і незалежний: runit замість systemd і власний менеджер пакетів xbps. Проте з коробки це гола система, і щоб довести її до щоденного використання, треба кілька годин налаштовувати. Das OS збирає live-образ ISO, який одразу завантажується в налаштований десктоп Xfce і встановлюється графічним інсталятором. У ньому власне оформлення, український інтерфейс і розкладка, звичні програми та знімки Btrfs, які дозволяють скасувати невдале оновлення. Усе, що додає Das OS, постачається власними xbps-пакетами, тож налаштування можна відтворити й оновлювати, як будь-який інший пакет. Другий, консольний ISO встановлює сервер із налаштованими SSH, файрволом, fail2ban і Docker на тій самій розмітці Btrfs зі знімками.
|
||
|
||
### 📃 Можливості
|
||
- [Live ISO](#LiveISO), що завантажується з UEFI і BIOS одразу в робочий стіл
|
||
- [Графічний інсталятор](#Installer) Calamares, налаштований під Void і runit
|
||
- [Знімки й відкат](#Snapshots): щогодинні знімки Btrfs, які можна завантажити з меню GRUB
|
||
- [Оновлення системи](#Update) зі знімком перед ним: вікно, значок у треї та консольний режим
|
||
- [Вікно привітання](#Welcome) під час першого входу: мова, теки, оновлення та довідка
|
||
- [Серверний образ](#Server): консольний live ISO з текстовим інсталятором, SSH, файрволом, fail2ban і Docker
|
||
- [Керування службами](#Services) `dsv`: вмикати, запускати й читати журнали служб runit, як systemctl
|
||
- [Оформлення Das OS](#Look): світла й темна теми, згенеровані рамки вікон, шпалери та логотип
|
||
- [Налаштування за замовчуванням](#Defaults) для Xfce, які не перезаписують стандартні файли
|
||
- [Власний репозиторій пакетів](#Repository), який xbps-src збирає з шаблонів у дереві проєкту
|
||
- [Збирання в контейнері](#Build), яке працює на будь-якому Linux із Docker, і скрипти QEMU для тестування
|
||
|
||
### ⭐ Переваги
|
||
- **Void усередині** – швидке завантаження з runit, менеджер пакетів xbps і свіжі програми без ручного налаштування.
|
||
- **Безпечні оновлення** – `das-update` робить знімок перед кожним оновленням, систему можна повернути до будь-якого знімка, а особисті файли в `/home` відкат не зачіпає.
|
||
- **Легкість** – без systemd, а з Xfce, LightDM і PipeWire система добре працює навіть на старих ноутбуках.
|
||
- **Нічого прихованого** – усі зміни постачаються звичайними xbps-пакетами, і `xbps-query -f das-settings` показує, що саме змінено.
|
||
- **Контроль у користувача** – налаштування за замовчуванням лежать у `/etc/xdg/das`, тож власні налаштування користувача завжди мають пріоритет і не скидаються після оновлень.
|
||
- **Одна основа для десктопа й сервера** – обидва образи мають спільні пакети, розмітку диска, знімки й `das-update`, тож сервер оновлюється й відкочується так само, як ноутбук.
|
||
- **Збирається будь-де** – збирання відбувається в контейнері Void, тому хостом може бути Mint, Ubuntu чи Fedora.
|
||
|
||
### 📱 Скріншоти
|
||
<table>
|
||
<tr>
|
||
<td align="center"><img src="images/desktop.png" width="300" alt="Live-робочий стіл" /></td>
|
||
<td align="center"><img src="images/desktop-terminal.png" width="300" alt="Термінал і рамки вікон" /></td>
|
||
<td align="center"><img src="images/boot-menu.png" width="300" alt="Меню завантаження (UEFI)" /></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><i>Live-робочий стіл</i></td>
|
||
<td align="center"><i>Термінал і рамки вікон</i></td>
|
||
<td align="center"><i>Меню завантаження (UEFI)</i></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><img src="images/wallpaper-light.png" width="300" alt="Світлі шпалери" /></td>
|
||
<td align="center"><img src="images/wallpaper-dark.png" width="300" alt="Темні шпалери" /></td>
|
||
<td align="center"><img src="images/window-frames.png" width="300" alt="Рамки вікон" /></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><i>Світлі шпалери</i></td>
|
||
<td align="center"><i>Темні шпалери</i></td>
|
||
<td align="center"><i>Рамки вікон: світлі й темні, активні й неактивні</i></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><img src="images/installer-welcome.png" width="300" alt="Інсталятор" /></td>
|
||
<td align="center"><img src="images/installer-partitions.png" width="300" alt="Розмітка диска з Btrfs" /></td>
|
||
<td align="center"><img src="images/grub-snapshots.png" width="300" alt="Знімки в меню завантаження" /></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><i>Інсталятор</i></td>
|
||
<td align="center"><i>Розмітка диска з Btrfs</i></td>
|
||
<td align="center"><i>Знімки в меню завантаження</i></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><img src="images/welcome.png" width="300" alt="Вікно привітання" /></td>
|
||
<td align="center"><img src="images/update.png" width="300" alt="Оновлення системи" /></td>
|
||
<td align="center"><img src="images/server-installer.png" width="300" alt="Серверний інсталятор" /></td>
|
||
</tr>
|
||
<tr>
|
||
<td align="center"><i>Вікно привітання</i></td>
|
||
<td align="center"><i>Оновлення системи</i></td>
|
||
<td align="center"><i>Серверний інсталятор</i></td>
|
||
</tr>
|
||
</table>
|
||
|
||
### 📌 Використання
|
||
|
||
#### Live ISO<a id='LiveISO' />
|
||
**_Live-система сама входить у робочий стіл, без встановлення._**
|
||
- Завантажується з UEFI (GRUB) і зі старого BIOS (isolinux), в обох випадках із заставкою Das OS.
|
||
- Пункт *graphics disabled* завантажує систему з параметром `nomodeset`, якщо на якомусь комп'ютері екран лишається чорним, а пункт *RAM* копіює всю систему в пам'ять.
|
||
- Користувач `live`, пароль `live`, `sudo` працює без пароля. Користувач створюється під час завантаження й існує лише в live-сесії.
|
||
- Український інтерфейс (`uk_UA.UTF-8`) і часовий пояс Києва за замовчуванням. Розкладки `us,ua`, перемикання Alt+Shift.
|
||
- Є NetworkManager, Bluetooth, звук PipeWire і Firefox з українською мовою. Сервіси працюють під runit: `dbus`, `elogind`, `polkitd`, `NetworkManager`, `bluetoothd`, `lightdm`.
|
||
- Є гостьові інструменти для QEMU/SPICE та VirtualBox.
|
||
- Значок *Встановити Das OS* на робочому столі та в меню запускає інсталятор.
|
||
|
||
#### Графічний інсталятор<a id='Installer' />
|
||
**_Calamares встановлює Das OS за кілька кроків: мова й часовий пояс, клавіатура, диск, користувач._**
|
||
- Інтерфейс за замовчуванням український, часовий пояс Києва, з брендингом і слайдами Das OS.
|
||
- Диск можна очистити автоматично або розмітити вручну. За замовчуванням Btrfs, також доступні ext4 і XFS. На комп'ютерах з UEFI створюється EFI-розділ на 512 МіБ.
|
||
- Копіюється чистий live-образ (`/dev/mapper/live-base`), без live-користувача і його налаштувань завантаження.
|
||
- Після копіювання інсталятор збирає локалі для вибраної мови, лишає гостьові інструменти лише того гіпервізора, у якому працює (на реальному залізі — жодних), налаштовує знімки, збирає initramfs і встановлює GRUB.
|
||
- Наприкінці інсталятор видаляє себе й пакети, потрібні лише йому.
|
||
- Шифрування диска поки не пропонується.
|
||
|
||
#### Знімки й відкат<a id='Snapshots' />
|
||
**_Знімки Btrfs дозволяють відновити систему після невдалого оновлення._**
|
||
- Інсталятор створює підтоми `@` (корінь), `@home`, `@snapshots`, `@var_log` і `@var_cache_xbps`. Знімки кореня не містять особистих файлів, журналів і кешу пакетів.
|
||
- snapper робить знімок *Fresh install* одразу після встановлення і щогодинні знімки (cron). Зберігаються останні 5 щогодинних, 7 щоденних і 2 щотижневих.
|
||
- grub-btrfs додає кожен знімок у підменю *Das OS snapshots* у GRUB і оновлює його, щойно з'являється новий.
|
||
- Знімок доступний лише для читання. Коли він завантажується, dracut-модуль `das-snapshot-overlay` накладає зверху записуваний шар у RAM, тож повноцінно працює весь робочий стіл. Зміни, зроблені в такій сесії, зникають після вимкнення.
|
||
- `sudo snapper-rollback <номер>` робить знімок новим коренем (старий зберігається як `@<дата>`). Зміна набуває чинності після перезавантаження. Команда працює і з робочої системи, і із завантаженого знімка.
|
||
- Учасники групи `wheel` бачать знімки без sudo: `snapper list`.
|
||
|
||
#### Оновлення системи<a id='Update' />
|
||
**_`das-update` встановлює оновлення між парою знімків, тож невдале оновлення можна скасувати з меню завантаження._**
|
||
- Перед оновленням створює знімок snapper *pre*, потім запускає `xbps-install -Su` (спершу оновлює сам xbps, якщо треба), а наприкінці створює парний знімок *post*, навіть якщо оновлення не вдалося.
|
||
- Якщо знімок *pre* не вдалося створити, нічого не встановлюється. Без Btrfs (ext4, XFS) оновлює без знімка й попереджає про це.
|
||
- Після завершення показує номер знімка й те, як до нього повернутися, і просить перезавантажитися, якщо оновилися ядро, glibc, runit чи інші ключові пакети.
|
||
- Вікно *Оновлення системи* показує список пакетів зі встановленою і новою версіями та вивід xbps. Частина, якій потрібні права root, запускається через pkexec (дія polkit `ua.org.das.update`).
|
||
- У фоні перевіряє оновлення через 2 хвилини після входу, а далі кожні 6 годин, без прав root. Значок у треї й сповіщення з'являються лише тоді, коли є оновлення. Клік відкриває вікно, правий клік — меню з пунктом *Перевірити зараз*. У live-сесії перевірка вимкнена.
|
||
- `das-update --cli` робить те саме в терміналі (сервери, ssh). Перед встановленням питає підтвердження (`-y` його пропускає) і сам перезапускається через sudo. Без графічного дисплея працює в терміналі й без `--cli`.
|
||
- Сама команда — пакет `das-update` без GTK, а вікно й значок у треї — `/usr/libexec/das/das-update-gui` з `das-tools`.
|
||
|
||
#### Вікно привітання<a id='Welcome' />
|
||
**_`das-welcome` відкривається під час першого входу і збирає перші кроки в одному місці._**
|
||
- У live-сесії пропонує встановити Das OS.
|
||
- Мову інтерфейсу можна вибрати, якщо в системі зібрано більше однієї локалі. Вона зберігається в AccountsService і `~/.dmrc` і діє з наступного входу.
|
||
- Якщо теки домашнього каталогу лишилися з англійськими назвами (`Documents`, `Downloads`…), пропонує перейменувати їх мовою системи разом із `user-dirs.dirs` і закладками файлового менеджера. Теки, які користувач переніс, і ті, чия нова назва вже зайнята, не чіпає.
|
||
- Містить посилання на оновлення системи, налаштування Xfce і довідку.
|
||
- Сам відкривається лише один раз. Прапорець *Показувати під час входу* залишає його на кожен вхід.
|
||
|
||
#### Серверний образ<a id='Server' />
|
||
**_Консольний live ISO, що встановлює сервер Das OS з готовими до роботи SSH, файрволом і Docker._**
|
||
- `dasos-server-<версія>-x86_64.iso` завантажується з UEFI і BIOS із входом і на екрані, і на послідовній консолі (`ttyS0`, 115200), тож працює й через IPMI, консолі VPS та `qemu -nographic`. Увійдіть як `live` з паролем `live` і запустіть `sudo das-server-install`.
|
||
- Інсталятор питає українською або англійською: диск, ім'я сервера, адміністратора й пароль, SSH-ключ (і чи лишати вхід за паролем), часовий пояс, розкладку консолі, мову та мережу (dhcpcd або NetworkManager). `das-server-install --config ФАЙЛ` встановлює без запитань, приклад — `/usr/share/examples/das-server-installer/install.conf`.
|
||
- Розмітка GPT і Btrfs та сама, що в десктопному інсталяторі, тож знімки, меню *Das OS snapshots* і `snapper-rollback` працюють так само. GRUB встановлюється для UEFI (також за запасним шляхом) або BIOS, а якщо інсталятор запущено з послідовної консолі, то й на неї.
|
||
- Адміністратор отримує sudo через `wheel` і входить у групи `docker` та `socklog`. У root немає пароля.
|
||
- Встановлена система запускає `sshd`, `chronyd`, `nftables`, `fail2ban`, `docker`, `socklog` і вибрану мережеву службу.
|
||
- nftables пропускає лише SSH, ICMP і DHCPv6 (`/etc/nftables.conf`). Правила лежать у власній таблиці `inet das`, тож їх перезавантаження не чіпає правил Docker і fail2ban. Порти, які публікують контейнери, проходять через власні правила Docker.
|
||
- fail2ban блокує адреси, з яких раз у раз не вдається увійти по SSH, читаючи журнал socklog. sshd не приймає вхід root за паролем.
|
||
- Інструменти: Docker з Compose, lazydocker, lazygit, Midnight Commander, tmux, htop, Python 3, curl, `das-update --cli` і `dsv`. Графічних бібліотек немає.
|
||
|
||
#### Керування службами<a id='Services' />
|
||
**_`dsv` керує службами runit так, як systemctl у дистрибутивах із systemd._**
|
||
- `dsv list` показує всі служби з `/etc/sv`: чи ввімкнена, стан, PID і час роботи.
|
||
- `dsv enable НАЗВА` запускає службу під час завантаження (посилання в типовому рівні запуску) і одразу запускає її. `dsv disable НАЗВА` робить навпаки.
|
||
- `dsv start|stop|restart|status НАЗВА` — обгортки над `sv`, які показують новий стан.
|
||
- `dsv logs НАЗВА [-f]` показує власний журнал служби (svlogd) або, для служб, що пишуть у syslog, їхні рядки, зібрані socklog.
|
||
- Сам перезапускається через sudo, коли потрібні права root, і має автодоповнення bash. Є й на десктопі.
|
||
|
||
#### Оформлення Das OS<a id='Look' />
|
||
**_Сучасний мінімалізм із синьо-жовтою восьмипелюстковою зіркою з української вишивки._**
|
||
- GTK-теми `DasOS` і `DasOS-Dark` побудовані на adw-gtk3 і додають акцентні кольори Das OS. Вони також оформлюють панель Xfce, яку adw-gtk3 лишає чорною.
|
||
- Рамки вікон xfwm4 (заокруглені кути, круглі кнопки, червона кнопка закриття при наведенні) генерує у PNG утиліта `xfwm4gen` (Go) з однієї палітри.
|
||
- Світлі й темні шпалери зображують зірку над смугою орнаменту в стилі рушника. Та сама зірка є логотипом Das OS і кнопкою меню.
|
||
- Шрифти: Inter для інтерфейсу і JetBrains Mono в терміналі. Іконки Papirus, тема курсора Adwaita.
|
||
|
||
#### Налаштування за замовчуванням<a id='Defaults' />
|
||
**_Пакет das-settings налаштовує Xfce, не чіпаючи файлів інших пакетів._**
|
||
- `/etc/profile.d/das-xdg.sh` ставить `/etc/xdg/das` перед `/etc/xdg`, і xfconf бере звідти налаштування Das OS.
|
||
- Одна нижня панель містить меню Whisker, кнопки вікон, трей, розкладку клавіатури, гучність, сповіщення, годинник і кнопку «показати стільницю».
|
||
- При першому вході `das-session-init` встановлює шпалери на кожному підключеному моніторі, бо Xfce зберігає шпалери за назвою монітора.
|
||
- LightDM використовує GTK-вітальню з темою і шпалерами Das OS.
|
||
- Теки домашнього каталогу отримують назви мовою сеансу. xdg-user-dirs 0.20 шукає переклади лише в першій теці з `XDG_DATA_DIRS`, де є підкаталог `locale`, — порожній `/usr/local/share/locale`, тому створював теки англійською. `/etc/X11/xinit/xinitrc.d/50-das-user-dirs` створює їх ще до сеансу Xfce зі шляхом пошуку, де переклади знаходяться.
|
||
|
||
#### Власний репозиторій пакетів<a id='Repository' />
|
||
**_Кожен файл Das OS встановлює й оновлює xbps._**
|
||
- `srcpkgs/das-theme` містить теми, рамки xfwm4, шпалери й логотип.
|
||
- `srcpkgs/das-settings` містить налаштування Xfce, LightDM і сесії.
|
||
- `srcpkgs/das-tools` містить `das-welcome`, вікно оновлення і значок у треї (Go, GTK 3 через gotk3) з пунктами меню й автозапуском. Його підпакет `das-update` — сама команда оновлення й дія polkit, без GTK.
|
||
- `srcpkgs/das-snapshots` містить конфігурацію snapper, `das-snapper-setup` і dracut-модуль для завантаження знімків.
|
||
- `srcpkgs/das-installer` містить налаштування й брендинг Calamares, `srcpkgs/das-server-installer` — консольний інсталятор. Спільні для обох кроки (`mount-source`, `postinstall`) лежать у `srcpkgs/das-install-common`. Вони є лише на live-ISO.
|
||
- `srcpkgs/das-server` — серверний метапакет із налаштуваннями nftables, fail2ban, sshd і Docker. `srcpkgs/dsv` містить керування службами.
|
||
- `srcpkgs/calamares`, `srcpkgs/adw-gtk3` і `srcpkgs/font-jetbrains-mono` пакують релізи, яких немає у Void.
|
||
- `make packages` накладає шаблони на неглибокий клон void-packages і збирає їх через `xbps-src` в `out/hostdir/binpkgs`. Збирання ISO встановлює їх звідти.
|
||
|
||
#### Збирання в контейнері<a id='Build' />
|
||
**_Усе збирання відбувається в Docker-контейнері, тож на хості потрібні лише Docker і QEMU._**
|
||
1. `make packages` збирає локальний xbps-репозиторій.
|
||
2. `make iso` збирає пакети, а потім ISO через `void-mklive` за профілем у `live/` (список пакетів, сервіси, оверлей кореневої файлової системи). `make iso-server` робить те саме для серверного профілю в `server/`.
|
||
3. `make qemu` завантажує найновіший ISO з UEFI. `make qemu-bios` використовує старий BIOS, а `make qemu-disk` ще й підключає віртуальний диск на 20 ГБ для встановлення. `make qemu-server` завантажує серверний ISO з диском на послідовній консолі прямо в терміналі (вихід — Ctrl-A X).
|
||
|
||
### 🚀 Збирання застосунку
|
||
Вимоги: Linux із Docker (користувач має бути в групі `docker`), QEMU та OVMF для тестування, Go 1.24+ і файли розробки GTK 3 для `make test`. Приблизно 10 ГБ вільного місця.
|
||
```shell
|
||
make iso # зібрати пакети й live-ISO (перший запуск завантажує ~2 ГБ)
|
||
make qemu # запустити його в QEMU з UEFI
|
||
make iso-server # зібрати пакети й серверний ISO
|
||
make qemu-server # запустити його на послідовній консолі з диском для встановлення
|
||
make test # запустити Go-тести
|
||
make clean # видалити результати збирання, зберегти кеш завантажень
|
||
```
|
||
ISO з'являються в `out/iso/dasos-<версія>-x86_64.iso` і `out/iso/dasos-server-<версія>-x86_64.iso`. Записати їх на флешку можна через `dd` або Ventoy.
|
||
|
||
**Примітка:** Das OS — рання версія (0.4.0). Профіль розробника, менші ISO та підписаний репозиторій на хостингу заплановані на наступні етапи. Поки репозиторій не розміщено на хостингу, встановлена система отримує оновлення лише з Void. Das OS базується на Void Linux, але не пов'язана з ним офіційно.
|
||
|
||
###### _Made by -=:dAs:=-_
|