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ı
> 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)
+12 -8
View File
@@ -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!(
+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.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);
}
}