@QingQ77: 用 Rust + ratatui 写的终端安装器,带乌克兰语/英语双语界面,专门给用 dinit 的 Artix Linux 做系统安装,也能进系统恢复模式。 https://github.com/YellowHearth1/artix-…
摘要
用 Rust + ratatui 写的终端安装器,带乌克兰语/英语双语界面,专用于 dinit 的 Artix Linux 系统安装,支持 LUKS 加密、Btrfs 快照、EFISTUB 引导等功能。
查看缓存全文
缓存时间: 2026/07/11 21:29
用 Rust + ratatui 写的终端安装器,带乌克兰语/英语双语界面,专门给用 dinit 的 Artix Linux 做系统安装,也能进系统恢复模式。 https://github.com/YellowHearth1/artix-tui-installer…
YellowHearth1/artix-tui-installer
Source: https://github.com/YellowHearth1/artix-tui-installer
🐧 Artix TUI Інсталятор
Двомовний (українська / англійська) термінальний інсталятор для власної збірки Artix Linux на системі ініціалізації dinit.
Написаний на Rust із ratatui й оформлений як сучасний графічний інсталятор: ліва панель кроків, заокруглені панелі, акцент Artix-блакитного, сегментовані перемикачі та живий прокручуваний журнал встановлення.
🤖 Авторство коду
Увесь код цього проєкту написано Claude — моделлю ШІ від Anthropic. Архітектура, ітеративне налагодження та реалізація — повністю згенеровані Claude у діалозі. Дизайн-візія, тестування на реальному залізі та віртуальних машинах, а також рішення, специфічні для Artix/dinit, належать авторові проєкту.
✨ Можливості
- 🌐 Двомовний інтерфейс — українська та англійська, вибір на першому екрані.
- ⚙️ Рідний dinit — налаштовує користувацький екземпляр dinit саме під цю
систему ініціалізації, без жодних припущень про systemd:
- turnstile для
seatd(власний PAM-модуль, не потребує elogind); - userspawn для
elogind(штатний Artix-варіант); - менеджер сеансів
seatd/elogindта користувацькі сервіси PipeWire.
- turnstile для
- 📦 Інтерактивне встановлення пакунків — пакунки ставляться через
pacmanпід псевдотерміналом, тож ви обираєте провайдерів (драйвери GPU/Vulkan, мультимедіа-бекенди тощо), а не береться мовчки перший. Однойменні пакунки з різних репозиторіїв автоматично беруться з Artix; запити[Y/n]підтверджуються. - 🔒 Шифрування диска LUKS — лише
root, повне шифрування із зашифрованим/bootна UEFI, або USB-ключ (keyfile дозволяє вводити пароль лише раз). - 🥾 Вибір завантажувача — GRUB, rEFInd, Limine або EFISTUB; для GRUB —
os-proberдля виявлення інших ОС. Налаштовується перед розміткою додаткових дисків. - 📦 EFISTUB (завантаження без завантажувача) — прошивка UEFI вантажить ядро
напряму, без проміжного завантажувача (ядра Artix уже зібрані як EFI-стаби,
CONFIG_EFI_STUB=y). initramfs і параметри передаються через записefibootmgr. Не потребує додаткових пакунків чи systemd — на відміну від UKI, якому потрібенsystemd-stub. Лише UEFI; несумісний із зашифрованим/boot. Сумісний із відкатом — ядро, initramfs і параметри лишаються окремими файлами, тож інсталятор реєструє додаткові UEFI-записи для відкату та порятунку (вибираються з меню завантаження прошивки). Це основа для майбутнього Secure Boot. - 🗄️ Додаткові диски — змонтуйте інші диски чи розділи (у домівку,
/mntабо власний шлях), за бажанням відформатуйте чи зашифруйте кожен. Зашифровані додаткові диски розблоковуються автоматично під час завантаження (ключ на зашифрованому корені, служба dinit), незалежно від способу розблокування кореня. - 💾 Вибір файлової системи — ext4, btrfs, xfs, f2fs, jfs, ext3, ext2.
- 🌳 Btrfs зі знімками та відкатом — підтоми @/@home/@snapshots/@log/@cache, авто-знімки навколо кожної дії pacman (snapper + snap-pac) і відкат artix-rollback на будь-якому завантажувачі (у GRUB/rEFInd/Limine — окремим пунктом графічного меню, у EFISTUB — окремим записом у меню завантаження прошивки).
- 🖥️ Вибір оточення — KDE Plasma, LXQt, Pinnacle (Wayland-композитор у стилі AwesomeWM), XFCE, Cinnamon, MATE, LXDE або без оточення.
- 🎮 Драйвери GPU — NVIDIA (open-dkms), NVIDIA 580xx (застарілі), nouveau, AMD, Intel; nouveau автоматично блокується при виборі пропрієтарного драйвера.
- 🛟 Режим відновлення системи — монтує наявну інсталяцію (з розшифруванням LUKS за потреби), визначає завантажувач і відкриває chroot-оболонку для ремонту.
- 🔁 Підтримка AUR —
paruзбирається з джерел (щоб завжди відповідати системнійlibalpm), а потім встановлює обрані вами пакунки. - 🧩 Автоматичне ввімкнення сервісів dinit — будь-який встановлений пакунок
*-dinitотримує ввімкнений сервіс автоматично, чи то з репозиторіїв, чи з AUR. - 📜 Системне логування з коробки —
syslog-ngзбирає всі логи в/var/log, аlogrotate(черезcronie) тримає їх тиждень, видаляє старіше й ротує негайно, якщо файл перевищує 5 ГБ. Користувацькі сервіси логуються в буфер, тожdinitctl catlogпрацює для них одразу. - 🔥 Готовий фаєрвол — вбудований конфіг nftables відкриває порти для KDE Connect, LocalSend, Sunshine, RustDesk, Steam Remote Play, Syncthing та SSH.
- 🎨 Вбудовані конфіги — kitty (Catppuccin Mocha), запит starship, fastfetch, а для Pinnacle ще й waybar та wofi; зовнішні файли не потрібні.
- 🕹️ Готовність до ігор — піднімає ліміт відкритих файлів (
nofile) для Wine/Proton fsync, а за бажанням автоматично налаштовуєauto-cpufreq. - 🧳 Самодостатній — потрібні host-інструменти (artools, gptfdisk, cryptsetup тощо) встановлюються автоматично, тож інсталятор працює навіть із офіційного ISO Artix, а не лише з власного образу.
- 🏷️ Налаштовувані імʼя компʼютера та назва запису UEFI.
- 🚦 Обережний старт — розмітка диска починається лише після явного підтвердження на екрані «Перевірка та встановлення», а потрібні host-інструменти (git, gptfdisk, dosfstools, parted тощо) довантажуються у фоні одразу після зʼєднання з мережею.
- ⚠️ Застереження перед розміткою — на екрані вибору диска інсталятор
ненав’язливо попереджає (не блокуючи вибір), якщо: обраний диск є
завантажувальним носієм, з якого запущено сам інсталятор (виявляється за
файловою системою iso9660 live-образу); диск менший за 20 ГіБ (базова
система вміститься, але для повного оточення може забракнути місця); або обраний
режим UEFI/BIOS не збігається з тим, у якому реально завантажено комп’ютер
(що дало б систему, яка не вантажиться). Кожне застереження — це повне,
зрозуміле речення в окремому вікні з прокруткою (клавіша
wна списку дисків); ви завжди можете продовжити, якщо свідомо цього хочете. - 🧨 Підтвердження стирання диска — останній крок перед форматуванням: окреме вікно прямо показує, який диск (шлях, модель, обсяг) і які наявні розділи буде безповоротно знищено, і вимагає явного Enter. Форматування ніколи не починається без цього другого підтвердження — випадково стерти не той диск важче.
- 🪞 Швидкі та стійкі дзеркала — 5 найближчих країн (за вашим часовим поясом) ранжуються за реальною швидкістю й ставляться зверху; усі інші дзеркала світу лишаються активними нижче, від ближчих до дальших — жодне не закоментоване й не відкинуте. Тож якщо швидке дзеркало «помре» під час завантаження, pacman просто переходить до наступного (аж до головного сервера Artix), а не перериває встановлення. Російські дзеркала виключаються повністю. Плюс опційний Chaotic-AUR із готовими бінарними пакунками AUR.
- 📊 Живий перебіг — журнал встановлення наживо з прокруткою (PgUp/PgDn, Home/End); після помилки — повторний запуск без втрати зробленого вибору.
- 🏁 Три варіанти фіналу — перезавантажитись, вимкнути компʼютер або одразу зайти chroot-ом у нову систему; розділи в усіх випадках відмонтовуються безпечно.
- 📀 Збирається як живий образ ISO через artools (
buildiso).
👁️ Вигляд

Знімок — із графічного термінала; у чистому TTY кольори простіші (див. примітку в розділі «Знімки екрана»).
А схематично кожен екран влаштовано так:
┌───────────┬──────────────────────────────────────────────┐
│ ◆ 01 │ 09 · Диск та розділи │
│ ● 02 │ ┌────────────────────────────────────────┐ │
│ ● … │ │ Режим ● UEFI ○ BIOS │ │
│ ◆ 09 │ │ Диск: /dev/sda 256G │ │
│ ○ 10 │ │ Додати SWAP? [так] [ 4 ГіБ ] │ │
│ ○ … │ │ Файлова система ‹ ext4 › btrfs xfs │ │
│ │ │ ◂ Назад Далі ▸ │ │
│ │ └────────────────────────────────────────┘ │
│ ├──────────────────────────────────────────────┤
│ │ ↑/↓ рух · ←/→ зміна · Enter далі │
└───────────┴──────────────────────────────────────────────┘
Ліва панель показує лише номери кроків (на активному крутиться маленький ромб); повна назва кроку — у заголовку панелі.
⌨️ Керування
| Клавіші | Дія |
|---|---|
| ↑ / ↓ | рух списками та полями |
| Enter | обрати / далі |
| Esc або Shift+Tab | назад; Esc також закриває модальні вікна |
| ↑ на верхньому пункті | вихід на попередній екран |
| Пробіл | позначити пункт / перемкнути перемикач |
| ← / → | змінити значення: файлова система, розмір SWAP, режим акаунтів, сесія |
| Набір тексту | фільтр списків, пошук пакунків, редагування полів |
| Tab | наступне поле на екрані «Облікові записи» |
| o | опції файлової системи (екран «Диск та розділи») |
| w / s | гортання опису в модальному вікні опцій ФС |
| PgUp / PgDn · Home / End | швидке гортання довгих списків та журналу встановлення |
| q | вихід з інсталятора (заблоковано під час встановлення) |
| Ctrl+C | аварійний вихід |
Контекстні підказки для активного екрана завжди показані в нижньому рядку інтерфейсу.
🔨 Збірка
cd installer
cargo build --release
# → target/release/artix-installer
Кроки лише для читання (часовий пояс, клавіатура, Wi-Fi, пошук пакунків, перелік дисків) коректно деградують, коли їхні інструменти недоступні поза цільовою системою. Саме встановлення (розмітка, basestrap, chroot) потребує root і справжньої цілі, тож тестуйте у віртуальній машині.
🚀 Запуск на офіційному Artix
Інсталятор не обовʼязково запускати з власного образу — його можна запустити просто з будь-якого офіційного Artix: і з консольного «base» образу, і з образу спільноти, де є робочий стіл та графічний інсталятор (Calamares) — там достатньо відкрити термінал і запустити цей TUI замість Calamares. Усі host-інструменти, яких він потребує (artools, gptfdisk, cryptsetup тощо), він доставляє сам під час роботи.
Готовий бінарник (найпростіше)
Завантажте зібраний інсталятор зі сторінки релізів і запустіть від root:
curl -LO https://github.com/YellowHearth1/artix-tui-installer/releases/download/artix-tui-installer/artix-installer
chmod +x artix-installer
sudo ./artix-installer
Збірка з джерел
base-devel дає компілятор і компонувальник, потрібні cargo:
sudo pacman -S --needed git rust base-devel
git clone https://github.com/YellowHearth1/artix-tui-installer
cd artix-tui-installer/installer
cargo build --release
sudo ./target/release/artix-installer
Кілька зауваг:
- Інсталятор має працювати від root — він розмічає диски, виконує
basestrapіchroot. - Це повноекранний TUI: запускайте у справжній консолі (
Ctrl+Alt+F2) або в терміналі живого робочого столу, розміром щонайменше 80×24. - На live-образі збірка з джерел іде в оперативну памʼять; якщо її обмаль — візьміть готовий бінарник вище або зберіть його на іншій машині з Artix і скопіюйте єдиний файл на цільову.
- ⚠️ Інсталятор форматує диски — спершу перевіряйте у віртуальній машині.
🧭 Кроки майстра
Інсталятор починається з вибору режиму: Встановлення або Відновлення системи. Встановлення проходить 15 кроків:
- Мова — українська / англійська; задає мову інтерфейсу та локаль системи.
- Часовий пояс — повний список IANA з фільтром-пошуком.
- Wi-Fi — пропустити (дротове), сканувати або підключитися через
nmcli. - Клавіатура — консольні розкладки через
localectl; перша обрана — основна. - Ядро — linux / lts / zen / hardened.
- Оточення — вибір графічного оточення (або без нього) та менеджера сеансів.
- Пакунки — драйвер GPU + пошук і множинний вибір з репозиторіїв.
- AUR — підібраний рекомендований список та живий пошук AUR.
- Диск — режим завантаження, цільовий диск, SWAP і файлова система кореня.
- Завантажувач і шифрування — вибір завантажувача (GRUB / rEFInd / Limine),
виявлення інших ОС (
os-prober, для GRUB), назва запису UEFI та шифрування диска: лишеroot, повне (із зашифрованим/boot) чи USB-ключ, обсяг і пароль-фраза. Робиться перед додатковими дисками, щоб ключ на додатковому диску мав сенс. - Додаткові диски — для кожного знайденого диска/розділу: формат (або
«зберегти дані»), куди монтувати (домівка /
/mnt/ власний шлях із назвою теки) та окрема галочка шифрування. Нічого не змінюється, доки ви не оберете. - Користувач — імʼя компʼютера, режим запису, імʼя користувача та паролі (тримаються лише в памʼяті, на диск інсталятором не пишуться).
- Параметри — sudo без пароля, репозиторій Chaotic-AUR та оптимізація дзеркал.
- Встановлення — огляд, а потім живий журнал виконує план крок за кроком; зупиняється при помилці й дозволяє повернутися Назад.
- Завершення — підсумок і перезавантаження.
Навігація всюди однакова: ↑/↓ рухає фокус (а стрілка вгору на найвищому
пункті повертає на попередній крок), ←/→ змінює значення, Enter — далі,
Esc — закрити віконце або повернутися назад.
🧱 Як організовано встановлення
src/system/install.rs будує один упорядкований список дій; екран встановлення
виконує кожну, транслюючи вивід наживо. Орієнтовно:
встановлення host-інструментів → розмітка → форматування (за потреби LUKS) →
монтування → фаза 1 basestrap мінімальної завантажуваної бази (ядро,
firmware, dinit + сервіси, звук, логування) → налаштування репозиторіїв + ключів
→ фаза 2 інтерактивний pacman для оточення, драйверів і ваших пакунків →
облікові записи → локаль / часовий пояс / розкладка / hostname + hosts →
налаштування user-dinit (turnstile або userspawn) → initramfs (з хуком encrypt
при шифруванні) → завантажувач → вбудований nftables → логротація →
ввімкнення всіх сервісів dinit → фаза 3 AUR через paru.
🌳 Btrfs: підтоми, авто-знімки й відкат системи
Якщо на кроці «Диск та розділи» обрати btrfs, під вибором файлової системи зʼявляються додаткові опції (кожна — з поясненням «виграш/втрата» просто в інтерфейсі):
- Підтоми — схема
@(корінь),@home,@snapshots→/.snapshots,@log→/var/log,@cache→/var/cache. Знімки системи не чіпають/homeі не роздуваються логами та кешем. - Авто-знімки (snapper + snap-pac) — знімок до та після кожної транзакції pacman/paru; вмикає підтоми автоматично (потрібен
@snapshots). - Стиснення (zstd) — прозоре
compress=zstdпри записі. - TRIM для SSD —
discard=asyncу фоні. - Для будь-якої файлової системи окремо є noatime.
Корінь завжди монтується з rootflags=subvol=@ — за іменем, а не через default-підтом.
Що інсталятор налаштовує для знімків:
- snapper конфігурується прямим записом
/etc/snapper/configs/root(боcreate-configу chroot не працює):TIMELINE_CREATE=no— знімки привʼязані до подій pacman, а не до годинника;NUMBER_LIMIT=10— тримаються останні ~10. - Очищення за розкладом —
/etc/cron.d/snapper(щодня о 5:30) через cronie, бо на dinit немає systemd-таймерів. - Базовий знімок першого завантаження — одноразовий фоновий сервіс чекає, поки піднімуться D-Bus і snapper, робить знімок «clean system (post-install baseline)» і прибирає сам себе.
Відкат працює на будь-якому завантажувачі (GRUB, rEFInd, Limine):
sudo artix-rollback [N]— показує список знімків; обраний стає новим@, старий корінь зберігається як@.rollback-<час>, default-підтом перенацілюється, а застарілий pacman-лок зі знімка прибирається (snap-pac робить PRE-знімок ще підdb.lck). Є також ярлик у меню програм.- Відкат до старту системи — параметр ядра
artix.rollbackвідкриває вибір знімка прямо з initramfs; хук mkinitcpio виконується післяencrypt, тож працює і з LUKS. На GRUB для цього є окремий пункт меню System Rollback. - Класичний
snapper rollbackтеж працює.
Відкат не залежить від живого ядра: у /boot лежить заморожена пара vmlinuz-artix-rescue + initramfs-artix-rescue.img, яку pacman не чіпає. Саме її вантажать пункти System Rollback у GRUB, rEFInd і Limine — тож навіть коли оновлення зламало ядро чи initramfs, добірник знімків однаково запускається (а поруч є звичайний пункт rescue kernel — завантажитись на запасному ядрі без жодного відкату). Пара оновлюється лише після вдалого звичайного завантаження: сервіс artix-rescue-sync спрацьовує через 30 с аптайму і спершу звіряє, що зараз працює саме живе ядро (побайтове порівняння з /usr/lib/modules/$(uname -r)/vmlinuz), тому зламане ядро ніколи не отруїть копію. А одразу після відкату одноразовий artix-rollback-fixup сам узгоджує /boot із відновленою системою: повертає ядро зі знімкових /usr/lib/modules, перезбирає initramfs, оновлює меню GRUB і заморожує свіжу запасну пару.
Чому не grub-btrfs: його підменю вантажить знімки read-only через overlayfs-хук, зламаний на ядрах ≥ 6.8 (Antynea/grub-btrfs #328) — пункти просто не вантажаться. Натомість
artix-rollbackпідмінює@і вантажить відновлений корінь read-write, без overlay, на будь-якому ядрі й завантажувачі.
📀 Профіль ISO (iso-profile/, для artools buildiso)
Packages-Root/Packages-Live— пакунки для живого образу (лише dinit).profile.conf— автологін/дисплей-менеджер для живого сеансу.live-overlay/usr/bin/installer-launch— дає TUI справжній керівний термінал на tty1 (setsid -c), із запасним шеллом у разі збою.live-overlay/etc/dinit.d/installer.conf— сервіс автозапуску інсталятора замість getty на tty1.grub-overrides/loopback.cfg— завантажується одразу в інсталятор.
Покладіть скомпільований бінарник у live-overlay/usr/bin/artix-installer, тоді
виконайте sudo buildiso -p <профіль>.
🗂️ Структура проєкту
installer/ Сирці Rust (TUI на ratatui + логіка встановлення)
src/app.rs модель стану + конфіг
src/event.rs глобальна обробка клавіш / навігація
src/main.rs точка входу + «графічна» оболонка інсталятора
src/screens/ по модулю на кожен крок майстра
src/system/ диск, runner (PTY), план встановлення, пакунки, відновлення
src/assets/ вбудовані конфіги (kitty, fastfetch, waybar, wofi, pinnacle)
i18n/ рядки інтерфейсу en.toml / uk.toml
iso-profile/ профіль artools buildiso + накладка живого образу
screenshots/ знімки екрана для README (15 кроків майстра)
📸 Знімки екрана
Примітка. Усі знімки зроблено в графічному емуляторі термінала на машині зі встановленим графічним оточенням. У чистому TTY (наприклад, одразу після завантаження базового образа Artix) інтерфейс виглядає значно скромніше: консоль ядра дає лише 16 кольорів і власний шрифт, тож частина ефектів ratatui — плавні відтінки, приглушені тони, заокруглені рамки — там недоступна або спрощена. Функційно все працює однаково.
Повний прохід майстра — усі 15 кроків. Інтерфейс двомовний (українська / англійська); знімки нижче зроблено українською.
Крок 1/15 — Мова. Мова інтерфейсу та майбутньої системи.

Крок 2/15 — Часовий пояс. Пошук і вибір часового поясу.

Крок 3/15 — Мережа. Пропустити (дротове зʼєднання) або просканувати Wi-Fi: вибір адаптера, мережі та введення паролю.

Крок 4/15 — Розкладка клавіатури. Мультивибір розкладок із фільтром; перша позначена стає основною.

Крок 5/15 — Ядро. Linux, Linux Zen, Linux Hardened або Linux LTS.

Крок 6/15 — Графічне оточення. Мультивибір оточень, перемикання сесії (Wayland/X11) та вибір екрана входу.

Крок 7/15 — Додаткові пакунки. Драйвери відеокарти + пошук і вибір популярних пакунків.

Крок 8/15 — Пакунки AUR. Пошук в AUR і рекомендовані пакунки (збірка через paru).

Крок 9/15 — Диск і розділи. UEFI/BIOS, вибір диска, розділ SWAP, файлова система кореня.

Крок 10/15 — Завантажувач і шифрування. GRUB / rEFInd / Limine / EFISTUB, os-prober, назва UEFI-запису, шифрування LUKS.

Крок 11/15 — Додаткові диски. Монтування інших дисків і наявних розділів (напр. Windows NTFS — зі збереженням даних).

Крок 12/15 — Облікові записи. Імʼя компʼютера, користувач і паролі; режим облікових записів.

Крок 13/15 — Параметри встановлення. Пароль sudo, репозиторій Chaotic-AUR, оптимізація дзеркал.

Крок 14/15 — Перевірка та встановлення. Підсумок усіх виборів перед стартом.

Крок 15/15 — Завершення. QR-код для донату на оборону України та вибір: перезавантажити, вимкнути чи зайти у встановлену систему для ручних кроків.

📄 Ліцензія
Проєкт розповсюджується за ліцензією Apache 2.0 — повний текст у файлі
LICENSE.
相似文章
@vintcessun: 午间看到一个解决下载目录乱象的工具,有点离谱——用Rust+Tauri写了个系统托盘文件整理器,内存占用才5MB,还刚补上Linux支持。核心是文件监控加规则引擎,按扩展名或正则自动分类,SQLite记操作历史可一键撤销。隐私方面零上报,…
介绍了一个开源的桌面文件整理工具Mouzi,基于Rust和Tauri构建,内存占用仅5MB,支持文件监控和规则引擎自动分类,强调隐私零上报。
zinnia: 一个用Rust编写的模块化64位类Unix内核
Zinnia 是一个用Rust编写的模块化64位类Unix内核,旨在在UEFI系统上启动并运行带有Wayland或X11的现代桌面。它实现了POSIX API和常见的Linux/BSD扩展。
@QingQ77: 用 Rust 写的高性能 IM 后端,走 QUIC 协议实时传消息,支持 P2P 打洞和群聊广播。 https://github.com/nicolastinger/only-talk-rs… 用 Actix-web 做 RESTful …
一个基于 Rust + Actix-web + QUIC 的高性能即时通讯后端,支持 P2P 打洞、群聊广播、多种存储后端,可单进程或分离部署。
@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…
Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。
@QingQ77: 一个用 Rust 和 C 编写的开源项目,通过 JIT 编译技术在 macOS 上直接运行 Linux 容器。 https://github.com/ricccrd/dd 它不需要虚拟机、hypervisor 或 Linux 内核,而是将…
dd is an open-source tool written in Rust and C that runs Linux containers on macOS without a VM by using JIT compilation to translate container instructions and handle syscalls in userspace. It implements the Docker Engine API, supports arm64 and x86-64 Linux images, and offers performance comparable to or better than VM-based solutions.