forked from pisilinux-rs/yali-rs
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:
@@ -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
@@ -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!(
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user