dpkg FAT dosya sistemindeki dosyaları değiştirme


22

Bir paketi yükseltirken veya yeniden yüklediğinizde dpkg(ve sonuçta apt-get vb. Gibi kullanan her şeyi kullanırsanız), değiştirmeden önce dosyaya sert bir bağlantı oluşturarak varolan dosyaları yedekler. Bu şekilde, açma işlemi başarısız olursa, mevcut dosyaları kolayca geri koyabilir. İşletim sistemini Bad Things ™ 'den koruduğundan, bu harika bir şey.

Bunun dışında ... yalnızca dosya sisteminiz sabit bağlantıları destekliyorsa çalışır . Tüm dosya sistemleri değil - örneğin FAT dosya sistemleri.

Belirli bir gömülü ARM platformu için Debian dağıtımı üzerinde çalışıyorum ve önyükleme ortamı, belirli dosyaların (çekirdek dahil) bir FAT dosya sistemi üzerinde olmasını gerektirir, bu nedenle önyükleme kodu onları bulabilir ve yükleyebilir.

Çekirdek paketini (veya bu FAT bölümünde dosyaları olan başka bir paketi) yükseltmeye gittiğinizde yükleme işlemi şu şekilde başarısız olur:

dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
 unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted

Ve tüm yükseltme başarısız olur.

Web’i araştırdım ve bulabildiğim tek referans belirli yanıtları olan ve belirli yanıtları olan ve genellikle "Delete /boot/vmlinuz-3.18.11+ ve tekrar dene" olan belirli sorunları olan belirli insanlar. bu sorunu düzeltir.

Ama bu benim için cevap değil. Ben bir işletim sistemi kullanıcısı değilim, bir işletim sistemi kullanıcısı değilim, bu yüzden bunu düzeltmek için, son kullanıcının bir yükseltme yapmadan önce çekirdek dosyalarını manuel olarak silmesini gerektirmeyen bir yola ihtiyacım var. Dpkg'a / boot (veya önyükleme işlemindeki dosyalar için "hard link değil kopyalamak") ya da daha iyi bir şekilde "güncelleme işlemi başarısız olursa, ancak önyükleme işlemini biraz yavaşlatacak olsa da" ya da umursamıyorum tüm dosyalar için söylemem için bir yola ihtiyacım var şikayet etmeyin, sadece kopyalayın ".

--force-unsafe-ioVe hatta --force-allbayrakları gibi şeyler denedim dpkgama hiçbir şeyin bir etkisi olmaz.


Bir dilek listesi hatası için zaman gibi geliyor. :-)
Faheem Mitha

Yanıtlar:


13

Gördüğünüz davranış archives.c, dpkgkaynak 1030 satırında uygulanır (sürüm 1.18.1 için):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
  ohshite(_("unable to make backup link of '%.255s' before installing new version"),
          ti->name);

Bana göre link başarısızlığını 1003 ve sonraki satırlarda kullanılan yeniden adlandırma davranışına geri dönerek halledebilirsiniz; gibi bir şey (bu denenmemiş):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
  debug(dbg_eachfiledetail,"link failed, nonatomic");
  nifd->namenode->flags |= fnnf_no_atomic_overwrite;
  if (rename(fnamevb.buf,fnametmpvb.buf))
    ohshite(_("unable to move aside '%.255s' to install new version"),
            ti->name);
}

Ben bir dpkguzman değilim ama ... (Ve dpkgbu davranışı sağlamak için zaten mevcut seçenek yok .)


Kendi dpkg versiyonumu kesinlikle paketlemek bir ihtimal, ancak versiyonumdaki akış yukarı değişiklikleri takip etmemeyi tercih ediyorum.
Majenko

Tamam, bunun iyi çalıştığını onaylayabilirim, bu yüzden kesinlikle bir seçenek. Başıma gelebilecek bir başka seçenek de, paketin preinstkomut dosyasındaki rahatsız edici dosyaları elle taşımaktır , ancak çekirdek standart çekirdek paketleme komut dosyaları tarafından oluşturulduğundan, bunu nasıl değiştireceğimi bilmiyorum. Ayrıca otomatik bir geri alma tesisi olmazdı.
Majenko

1
Aslında, bu işe yarayacak; ayrıca dpkgkancaları da inceleyebilirsiniz ( dpkg --pre-invoke=).
Stephen Kitt

+1 Bunu bildiğinde nasıl dpkguzman değilsin !
nikhil

1
Raspberrypi çekirdeği de benzer bir hile ile dpkg-divert kullanılarak güncellenir. Alındığı raspberrypi.stackexchange.com/questions/51410/... ,
akarapatis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.