From 7209d58ea06996e83475384afeb5b3927a2a755b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkan=20I=C5=9EIK?= Date: Sun, 23 Aug 2026 14:35:01 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20parted=20birim=20tuza=C4=9F=C4=B1=20?= =?UTF-8?q?=E2=80=94=20mkpart=20arg=C3=BCmanlar=C4=B1=20MiB=20sonekine=20g?= =?UTF-8?q?e=C3=A7ti?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - parted "MB" sonekini onalık (10^6) okur, hesaplarımız binary (2^20): 3944MB → sektör 7703125 (hizasız) → "en yakın konum" hatası. Tüm mkpart konumları artık "{}MiB" (tamsayı MiB = 2048 sektör katı). - Bölümleme Planı şeridi yalnızca seçili disk için gösteriliyor (state.selected_disk), tüm diskler aynı anda değil. - AGENTS.md: parted birim tuzağı notu eklendi. --- AGENTS.md | 12 +++++++++--- src/jobs/partition.rs | 20 ++++++++++++-------- src/steps/partition.rs | 15 ++++++--------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 58caa0e..d40538e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS.md — Yali-rs Geliştirme Notları -> Ajan oturumları arasında süreklilik için. Son güncelleme: commit `5c14847` +> Ajan oturumları arasında süreklilik için. Son güncelleme: parted MiB düzeltmesi (23 Ağu) ## Proje - PisiLinux kurulum aracı (eski Python Yali'nin Rust/egui yeniden yazımı). @@ -43,6 +43,12 @@ Eski wipe&rebuild (mktable + hepsini baştan yarat) KALDIRILDI. Yeni fazlar: - İşlemi olmayan disklere ve `delete=true` satırlara mount/fstab/summary dokunmaz. ### Diğer Düzeltmeler +- **parted birim tuzağı (KRİTİK):** parted `"MB"` sonekini **ondalık** (10^6 byte) okur, + bizim hesaplar binary (2^20). `mkpart 3944MB` → sektör 7703125 (hizasız, boş alana + uymaz) → "Becerebildiğimiz buna en yakın konum..." hatası. ÇÖZÜM: parted'a daima + `"{}MiB"` sonekiyle geç (`jobs/partition.rs`, hem otomatik hem CustomPartitionJob). + Tamsayı MiB = 2048 sektörün katı → hizalama hatası çıkmaz. UI'da kullanıcıya MB + gösterilir ama parted argümanı asla "MB" olmasın. - MB dönüşümleri tek bölme: `x / 1_048_576` (çift `x/1024/1024` hassasiyet kaybı yapardı). - Disk seçiminde `size_gb * 1024` yerine `size_bytes / 1_048_576`. - Mountpoint değişince boyut alanı SADECE boş/"0"/"remaining" ise varsayılanlanır @@ -51,8 +57,8 @@ Eski wipe&rebuild (mktable + hepsini baştan yarat) KALDIRILDI. Yeni fazlar: Kutucuk görürsen karakter fontta yok demektir — fontTools ile cmap kontrol et: kullanılanlar: EB7B check, EA6B arrow, EC28 trash, EA13 add, EFE0 pencil, EECD lock, ECA1 error, EDFB hard-drive-line, ECB5/B7 eye, F4C6 close. -- Alt bar: her disk için "Mevcut Durum / Kurulum Sonrası" çift şerit - (`manual_dual_bars`, gri segment = boş). +- Alt bar: "Mevcut Durum / Kurulum Sonrası" çift şerit (`manual_dual_bars`, + gri segment = boş) — SADECE seçili disk için gösterilir (`state.selected_disk`). ## Bilinen Açıklar / Yapılacaklar - [ ] VM testinde rapor edilen hatalar düzeltilecek (kullanıcı listeleyecek) diff --git a/src/jobs/partition.rs b/src/jobs/partition.rs index e15b7e9..e0e519f 100644 --- a/src/jobs/partition.rs +++ b/src/jobs/partition.rs @@ -204,15 +204,15 @@ impl Job for PartitionJob { ui.log(format!("parted {} mktable {}", disk, table_label)); run_parted(&["-s", disk, "mktable", table_label]).await?; - let mut next_mb: u64 = 1; // İlk MB'ı boot kayıtları için bırak + let mut next_mb: u64 = 1; // İlk MiB'ı boot kayıtları için bırak // 2. EFI bölümü (yalnızca GPT/UEFI) if self.plan.efi_mb > 0 { let end_mb = next_mb + self.plan.efi_mb; - ui.log(format!("EFI bölümü oluşturuluyor: {}–{} MB", next_mb, end_mb)); + ui.log(format!("EFI bölümü oluşturuluyor: {}–{} MiB", next_mb, end_mb)); run_parted(&[ "-s", disk, "mkpart", "fat32", - &format!("{}MB", next_mb), &format!("{}MB", end_mb), + &format!("{}MiB", next_mb), &format!("{}MiB", end_mb), ]).await?; run_parted(&["-s", disk, "set", "1", "esp", "on"]).await?; next_mb = end_mb; @@ -221,16 +221,16 @@ impl Job for PartitionJob { // 3. Swap bölümü let swap_end = next_mb + self.plan.swap_mb; let swap_num: u32 = if self.plan.efi_mb > 0 { 2 } else { 1 }; - ui.log(format!("Swap bölümü oluşturuluyor: {}–{} MB", next_mb, swap_end)); + ui.log(format!("Swap bölümü oluşturuluyor: {}–{} MiB", next_mb, swap_end)); run_parted(&[ "-s", disk, "mkpart", "linux-swap", - &format!("{}MB", next_mb), &format!("{}MB", swap_end), + &format!("{}MiB", next_mb), &format!("{}MiB", swap_end), ]).await?; next_mb = swap_end; // 4. Kök bölümü (kalan alan) let root_num: u32 = if self.plan.efi_mb > 0 { 3 } else { 2 }; - ui.log(format!("Kök bölümü oluşturuluyor: {}MB – disk sonu", next_mb)); + ui.log(format!("Kök bölümü oluşturuluyor: {}MiB – disk sonu", next_mb)); run_parted(&[ "-s", disk, "mkpart", "ext4", &format!("{}MB", next_mb), "100%", @@ -634,8 +634,12 @@ impl Job for CustomPartitionJob { let (start_mb, end_mb) = placement.ok_or_else(|| format!( "{} üzerinde {} MB için yeterli boş alan yok", disk, need))?; - let start_str = format!("{}MB", start_mb); - let end_str = format!("{}MB", end_mb); + // DİKKAT: parted "MB" sonekini onalık (10^6) okur; + // hesaplarımız binary (2^20) olduğu için "MiB" zorunlu. + // Tamsayı MiB = 2048 sektörün katı → parted hizalama + // hatası vermez. + let start_str = format!("{}MiB", start_mb); + let end_str = format!("{}MiB", end_mb); let slot = crate::installer::part_number(&part.device).unwrap_or(0); ui.log(format!( diff --git a/src/steps/partition.rs b/src/steps/partition.rs index b2b1775..78e4bc4 100644 --- a/src/steps/partition.rs +++ b/src/steps/partition.rs @@ -1077,15 +1077,12 @@ impl PartitionStep { ui.label(egui::RichText::new(t!("partition_plan_title")).strong().color(crate::ui::theme::c_text())); ui.add_space(6.0); - let mut seen_disks: Vec<&str> = Vec::new(); - for part in &state.custom_partitions { - if !seen_disks.contains(&part.disk.as_str()) { - seen_disks.push(&part.disk); - } - } - for d in seen_disks { - manual_dual_bars(ui, state, d); - ui.add_space(8.0); + // Yalnızca seçili diskin ESKİ/YENİ şeridi gösterilir + let active_disk = state.selected_disk.clone().unwrap_or_default(); + if !active_disk.is_empty() + && state.custom_partitions.iter().any(|p| p.disk == active_disk) + { + manual_dual_bars(ui, state, &active_disk); } }