fix: parted birim tuzağı — mkpart argümanları MiB sonekine geçti

- 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.
This commit is contained in:
Erkan IŞIK
2026-08-23 14:35:01 +03:00
parent 0a02f576d4
commit 7209d58ea0
3 changed files with 27 additions and 20 deletions
+9 -3
View File
@@ -1,6 +1,6 @@
# AGENTS.md — Yali-rs Geliştirme Notları # 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 ## Proje
- PisiLinux kurulum aracı (eski Python Yali'nin Rust/egui yeniden yazımı). - 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. - İşlemi olmayan disklere ve `delete=true` satırlara mount/fstab/summary dokunmaz.
### Diğer Düzeltmeler ### 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ı). - 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`. - 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 - 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: 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, 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. ECA1 error, EDFB hard-drive-line, ECB5/B7 eye, F4C6 close.
- Alt bar: her disk için "Mevcut Durum / Kurulum Sonrası" çift şerit - Alt bar: "Mevcut Durum / Kurulum Sonrası" çift şerit (`manual_dual_bars`,
(`manual_dual_bars`, gri segment = boş). gri segment = boş) — SADECE seçili disk için gösterilir (`state.selected_disk`).
## Bilinen Açıklar / Yapılacaklar ## Bilinen Açıklar / Yapılacaklar
- [ ] VM testinde rapor edilen hatalar düzeltilecek (kullanıcı listeleyecek) - [ ] VM testinde rapor edilen hatalar düzeltilecek (kullanıcı listeleyecek)
+12 -8
View File
@@ -204,15 +204,15 @@ impl Job for PartitionJob {
ui.log(format!("parted {} mktable {}", disk, table_label)); ui.log(format!("parted {} mktable {}", disk, table_label));
run_parted(&["-s", disk, "mktable", table_label]).await?; 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) // 2. EFI bölümü (yalnızca GPT/UEFI)
if self.plan.efi_mb > 0 { if self.plan.efi_mb > 0 {
let end_mb = next_mb + self.plan.efi_mb; 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(&[ run_parted(&[
"-s", disk, "mkpart", "fat32", "-s", disk, "mkpart", "fat32",
&format!("{}MB", next_mb), &format!("{}MB", end_mb), &format!("{}MiB", next_mb), &format!("{}MiB", end_mb),
]).await?; ]).await?;
run_parted(&["-s", disk, "set", "1", "esp", "on"]).await?; run_parted(&["-s", disk, "set", "1", "esp", "on"]).await?;
next_mb = end_mb; next_mb = end_mb;
@@ -221,16 +221,16 @@ impl Job for PartitionJob {
// 3. Swap bölümü // 3. Swap bölümü
let swap_end = next_mb + self.plan.swap_mb; let swap_end = next_mb + self.plan.swap_mb;
let swap_num: u32 = if self.plan.efi_mb > 0 { 2 } else { 1 }; 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(&[ run_parted(&[
"-s", disk, "mkpart", "linux-swap", "-s", disk, "mkpart", "linux-swap",
&format!("{}MB", next_mb), &format!("{}MB", swap_end), &format!("{}MiB", next_mb), &format!("{}MiB", swap_end),
]).await?; ]).await?;
next_mb = swap_end; next_mb = swap_end;
// 4. Kök bölümü (kalan alan) // 4. Kök bölümü (kalan alan)
let root_num: u32 = if self.plan.efi_mb > 0 { 3 } else { 2 }; 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(&[ run_parted(&[
"-s", disk, "mkpart", "ext4", "-s", disk, "mkpart", "ext4",
&format!("{}MB", next_mb), "100%", &format!("{}MB", next_mb), "100%",
@@ -634,8 +634,12 @@ impl Job for CustomPartitionJob {
let (start_mb, end_mb) = placement.ok_or_else(|| format!( let (start_mb, end_mb) = placement.ok_or_else(|| format!(
"{} üzerinde {} MB için yeterli boş alan yok", disk, need))?; "{} üzerinde {} MB için yeterli boş alan yok", disk, need))?;
let start_str = format!("{}MB", start_mb); // DİKKAT: parted "MB" sonekini onalık (10^6) okur;
let end_str = format!("{}MB", end_mb); // 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); let slot = crate::installer::part_number(&part.device).unwrap_or(0);
ui.log(format!( ui.log(format!(
+6 -9
View File
@@ -1077,15 +1077,12 @@ impl PartitionStep {
ui.label(egui::RichText::new(t!("partition_plan_title")).strong().color(crate::ui::theme::c_text())); ui.label(egui::RichText::new(t!("partition_plan_title")).strong().color(crate::ui::theme::c_text()));
ui.add_space(6.0); ui.add_space(6.0);
let mut seen_disks: Vec<&str> = Vec::new(); // Yalnızca seçili diskin ESKİ/YENİ şeridi gösterilir
for part in &state.custom_partitions { let active_disk = state.selected_disk.clone().unwrap_or_default();
if !seen_disks.contains(&part.disk.as_str()) { if !active_disk.is_empty()
seen_disks.push(&part.disk); && state.custom_partitions.iter().any(|p| p.disk == active_disk)
} {
} manual_dual_bars(ui, state, &active_disk);
for d in seen_disks {
manual_dual_bars(ui, state, d);
ui.add_space(8.0);
} }
} }