Erkan IŞIK 4c68c5018e fix(partition): çoklu disk kurulumu — veri kaybı hatası, disk seçici, doğrulama
Kullanıcı Linux bölümlerini ayrı disklere dağıtabilmeli. Veri modeli
(ö. `CustomPartition.disk`) çoklu diski destekliyordu; UI ve job
katmanındaki boşluklar bu işi kullanamaz hale getiriyordu.

## 1. VERİ KAYBI: bölüm numaraları ayrışıyordu (jobs/partition.rs)

Asıl bulgu. Bölüm numarası İKİ AYRI YERDE bağımsız hesaplanıyordu:
  - UI: assign_partition_numbers → "en küçük boş slot"
  - Job: mkpart + part.device okuması

`parted rm` silinen bölümden sonrakileri kaydırır ve mkpart yeni
bölümü başlangıç offset'ine göre yerleştirir. Aradaki boşluk
istenen boyuta SIĞMADIĞINDA mkpart diskin sonuna yazıyor, kernel yeni
bölüme 3 veriyor — UI ise 2 demişti. FAZ C mkfs'i o aygıta
uyguluyordu, yani kullanıcının KORUMAK İSTEDİĞİ bölüm
biçimlendiriliyordu.

  - `plan_disk_layout()`: saf, test edilebilir bir fonksiyon. Diskin
    tamamını (fiziksel + yeni) görüp başlangıç offset'ine göre
    numaralandırıyor; hem yeni bölümlerin hem de silmeden sonra
    KAYAN fiziksel bölümlerin gerçek yollarını döndürüyor.
  - FAZ B artık tahmin yürütmüyor, bu planı kullanıyor.
  - FAZ C `device_map` üzerinden GERÇEK aygıtı kullanıyor; kayma
    olduğunda loglayıp doğru aygıta işliyor.
  - `disk_free_regions_mb` (aynı mantığın eski, ayrı kopyası) silindi.
  - `disk_total_mb` ve `read_physical_extents` eklendi; artık diskin
    gerçek boyutunu sysfs'ten okuyor (önce son bölümün bitişinden
    tahmin yürütülüyordu).

11 test, bunların içinde asıl regresyonu kilitleyen:
  delete_plus_create_renumbers_physical_partitions,
  deleting_on_one_disk_does_not_renumber_another,
  layouts_are_independent_per_disk.

## 2. Ekleme diyaloğunda disk seçici YOKTU (steps/partition.rs)

Yeni bölümün diski `state.selected_disk`'e SABİTLENİYORDU ve diyalogda
hiçbir disk kontrolü bulunmuyordu. /home'u sdb'ye koymak isteyen
kullanıcı, kurulumun GRUB hedefini de değiştirmek zorundaydı
(`selected_disk` aynı zamanda `build_custom_job_queue`'un girdisi).

  - `ManualState::add_disk` + diyaloga disk seçici
  - Düzenlemede de değiştirilebilir: bölümü başka diske taşımanın
    yolu. Taşınırsa `orig_device` temizlenir, yoksa job eski diske
    işlem yapmayı sürdürürdü.
  - Varsayılan öneriler (EFI/root/swap) artık AKTİF diskin durumuna
    göre veriliyor; önce her zaman aktif diskin bölüm sayımı
    kullanılıyordu, yeni diske geçince alakasız öneri çıkıyordu.

## 3. Hiç bölümü olmayan diskler tabloda GİZLİYDİ (steps/partition.rs)

`seen_disks` yalnızca `custom_partitions` içinden kuruluyordu. Yeni
veya bölüm tablosu olmayan bir disk ne başlık ne boş-alan satırı
gösteriyordu — kullanıcı "sdb'de ne var?" diye bakamıyor, dolayısıyla
oraya bölüm koymanın yolunu da göremiyordu. Artık `available_disks`
taranıyor ve tanımsız disklere boş-alan satırı basılıyor.

Bu satır `first_idx: None` taşıyor: tıklanırsa `selected_idx = 0`
olur ve kullanıcı BAŞKA diskin ilk bölümü seçilmiş olurdu.

## 4. Kapasite doğrulaması yanlış listeyi geziyordu (steps/partition.rs)

`manual_capacity_error` `available_disks` üzerinde yürüyordu; o
listede olmayan diske yapılan tanım hiç kontrol edilmeden geçiyordu.
Artık bölüm tanımlarının kendi `disk` alanından yürüyor.

Ayrıca "disk bağlı değil" ile "kapasite aşıldı" ayrıldı:
validate_manual_on(..., &disks) diskin gerçekten var olduğunu
kontrol ediyor, kapasite hesabı yalnızca bilinen disklerde yapılıyor
(0 MB kapasiteyle "aşıyor" demek yanıltıcıydı).

Yeni kontroller: birden fazla kök (/), disksiz tanım, bağlı olmayan
disk.

## 5. LVM PV mount ediliyordu (jobs/partition.rs)

Diyalog her tanım için mountpoint zorunlu kılıyordu; PV'nin
mountpoint'i vardı, MountCustomPartitionsJob onu mount'lamaya
çalışıyordu ("wrong fs type" → kurulumun tamamı düşüyordu) ve
FstabFromCustomPartitionsJob fstab'a ext4 satırı yazıyordu.
Artık PV mount edilmiyor, fstab'a girmiyor, mountpoint'i de
zorunlu değil.

## 6. prepare_disk seyrek düzende bölüm çözmüyordu (jobs/partition.rs)

`1..=32` numaralandırılıp İLK EKSİK bölümde `break` ediliyordu.
sda1 + sda3 olan bir diskte döngü n=2'de duruyor, sda3 hiç çözülmüyor
→ bağlı kalan bölüm yüzünden `parted mkpart` "device busy" veriyordu.
Artık gerçek bölümler lsblk'den alınıyor.

## 7. GRUB yedek yapılandırması kökü tahmin ediyordu (jobs/bootloader.rs)

generate_minimal_grub_cfg kök aygıtını `is_uefi` ile (3|2) ve seçili
disk üzerinden buluyordu. Manuel modda numaralar
assign_partition_numbers'tan gelir, üstelik kök başka bir diskte
olabilir. Artık `mounted_root_device()` ile mount noktasının arkasındaki
gerçek aygıt soruluyor. BIOS'taki sabit `set root=(hd0,msdos2)` de
gerçek kök aygıtının bölüm numarasından geliyor.

## Testler
+22: 11 plan/numaralandırma, 10 çoklu disk doğrulama, 1 LVM PV.
steps/partition.rs'te disk() ve part() yardımcıları iki test modülü
ortak kullandığı için testutil modülüne taşındı.

cargo check --all-targets : 0 hata, 0 uyarı
cargo test              : 76/76 geçti (55 → 76)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-25 23:54:27 +03:00
2026-09-15 22:16:48 +03:00
2026-09-15 22:16:48 +03:00
2026-06-01 00:32:03 +03:00
2026-06-17 10:15:20 +03:00

YALI (Yet Another Linux Installer) — Rust / egui

A rewritten Pisi GNU/Linux installation tool in Rust and egui. YALI installs the system from the live environment, installs packages, and performs basic configuration. It is a modern, fast, and maintainable rewrite of the original Python/Qt version.

Features

  • 10-step installation wizard: Welcome → Location → Keyboard → Network → Disk Partitioning → Users → Bootloader → Summary → Installation → Finish
  • Squashfs-based: the installed system is copied from the ISO's squashfs, packages are not fetched over the network. The display manager, desktop environment and packages come from the ISO, so the wizard does not offer them (offering them would be misleading, since the copy would overwrite the choice)
  • Two modes: Graphical interface (default) and automatic installation with answer file (--auto-install answer.toml)
  • Demo mode: Skips system checks, simulates installation (--demo)
  • Disk partitioning: Automatic (GPT/MBR) or manual, LVM and LUKS encryption support
  • Network configuration: WiFi scanning (nmcli), proxy settings
  • Bootloader: GRUB device/password/timeout settings, kernel parameters
  • Rescue mode: Chroot, GRUB reinstallation, Pisi rollback
  • OEM mode: Predefined settings for manufacturer pre-installation
  • Internationalization: Turkish and English (with rust-i18n via TOML locale files)
  • Branding system: Runtime-loadable branding.toml for logo, slides, color settings
  • Theme: Dark/light theme, atomic color management, custom gradient buttons
  • Async job queue: All installation steps run in separate tokio runtime, UI updated via mpsc channel
  • System checks: 8 pre-checks including RAM, disk space, internet, UEFI, CPU, NVMe
  • Slideshow: Custom branded slides for 9 desktop environments
  • Demo session cleanup: Removes live environment artifacts, adds production repository

Usage

# Normal installation (requires root)
sudo cargo run --release

# Demo mode (no root required)
cargo run --release -- --demo

# Automatic installation (with answer file)
sudo cargo run --release -- --auto-install answer.toml

# Slideshow test (standalone window, no root required)
cargo run --bin slides_test [desktop] [lang]
# E.g.: cargo run --bin slides_test xfce en

Project Structure

├── src/
│   ├── main.rs              # Entry point, eframe App, GUI layout
│   ├── lib.rs               # Library root (reserved for future DLL structure)
│   ├── installer.rs         # InstallerStep trait, GlobalState, WelcomeStep
│   ├── funct.rs             # Shared UI helpers (form fields, language selector)
│   ├── branding.rs          # Branding.toml loader (logo, slides, theme, OEM)
│   ├── bin/
│   │   └── slides_test.rs   # Standalone slideshow test binary
│   ├── ui/
│   │   ├── theme.rs         # Colors, fonts, Visuals, section_heading, error/warning/success boxes
│   │   ├── buttons.rs       # Gradient buttons (primary, secondary, danger, etc.)
│   │   ├── combobox.rs      # ComboBox helpers (show_combo_box, selectable_value)
│   │   ├── combobox_stil.rs # ComboBox visual constants (weak_bg, border, text colors)
│   │   ├── slideshow.rs     # Auto-advancing slideshow
│   │   └── error_screen.rs  # Error screen (log viewer, copy, retry)
│   ├── steps/
│   │   ├── location.rs      # Location/timezone + date/time
│   │   ├── license.rs       # License agreement
│   │   ├── keyboard.rs      # Keyboard layout/variant selection
│   │   ├── network.rs       # Network configuration (WiFi, proxy)
│   │   ├── partition.rs     # Disk partitioning (automatic + manual + LVM)
│   │   ├── users.rs         # User account creation
│   │   ├── bootloader.rs    # GRUB configuration
│   │   ├── summary.rs       # Installation summary
│   │   ├── execution.rs     # Installation execution (progress bar, log)
│   │   ├── finish.rs        # Completion screen
│   │   ├── netinstall.rs    # Extra package group selection
│   │   └── rescue.rs        # Rescue mode (chroot, GRUB, Pisi takeback)
│   ├── jobs/mod.rs           # Async job queue and all installation jobs
│   └── autoinstall/
│       ├── mod.rs           # Answer file loading and state application
│       └── checker.rs       # System pre-checks
├── locales/
│   ├── tr.toml              # Turkish translations
│   └── en.toml              # English translations
├── slides/
│   ├── img/                 # Slide images (PNG)
│   ├── slides_tr.toml       # Turkish slide content
│   └── slides_en.toml       # English slide content
├── assets/
│   ├── icons/               # UI icons (YALI_icon_LIGHT.svg, language-icon.svg, etc.)
│   ├── flags/               # Country flags (~250 SVG)
│   └── pisi-logo-*.png      # Distribution logos (branding `[general]`)
├── branding.toml            # Default branding configuration
├── branding_en.toml         # English branding
├── branding_tr.toml         # Turkish branding
└── answer-example.toml      # Example answer file

Installation Workflow

  1. Welcome — Language selection, system checks, rescue mode
  2. Location / Time — Timezone selection (region/area dual ComboBox), GeoIP, NTP or manual date/time
  3. Keyboard — Layout/variant selection, search, live preview (setxkbmap)
  4. Network — WiFi scanning, connection, proxy
  5. Disk Partitioning — Automatic (guided) or manual, LVM, LUKS
  6. Users — Account creation, password strength indicator, root password, autologin
  7. Bootloader — GRUB device, timeout, password, kernel parameters
  8. Summary — Review all selections
  9. Installation — Slideshow + progress bar + live log
  10. Finish — Successful installation, reboot or return to live desktop

Dependencies

Dependency Version Purpose
eframe 0.27 (wgpu) egui framework, WebGPU backend
egui_extras 0.27 (image, file, svg) Image loading, file dialogs, SVG
image 0.24 PNG decoding
serde / toml 1.0 / 0.8 Branding and answer file serialization
zbus 4.0 D-Bus communication (COMAR)
tokio 1.0 (full) Async job queue
sysinfo 0.30 System information (RAM, disk, OS)
rust-i18n 3.1 Internationalization
chrono 0.4 Date/time operations

License

GNU General Public License v3.0

This project is developed by the Pisi GNU/Linux team.

S
Description
No description provided
Readme GPL-3.0 12 MiB
2026-08-22 15:33:09 +00:00
Languages
Rust 98.8%
Makefile 1.2%