Yükseltme sırasında çalışan uygulama ikili dosyalarını güncelleme nasıl çalışır?


23

Ben sadece ubuntu'yu utangaç olarak yükselttim, yükseltme sırasında çalışan uygulamaların çoğunu daha yeni bir sürümle değiştirdim.

Bu nasıl çalışıyor? (Uygulamalar kilitlenmeyecek mi?) Bir lib dosyası yükseltilmişse ve daha eski bir lib için arayan çalışan bir uygulama onu yüklemeye çalışırsa, uygulamaya ne olacak?


İyi soru, ama muhtemelen burada daha iyi sorulan sorular: unix.stackexchange.com (URL'nin Unix dediğini biliyorum ama Linux soruları da tarıyorlar !)

Linux'un açık iken yerini değiştir işlevini anlamak, hala programlanıyor gibi görünüyor (ancak çok az :)
bdonlan

2
@bdonlan: Süreciniz boyunca kütüphaneleri dinamik olarak yüklüyorsanız, bunun farkında olmanız gerekir, aksi halde sizi ısırır. Alışılmadık bir şey, örneğin kendi kendini değiştiren kod vb. Yapmaya çalışıyorsanız, bu özellikle önemlidir.
Piskvor

1
Kendini değiştiren kodla gerçekten alakalı değil, ama kesinlikle linux için kitaplıklar yazan birisinin bilmesi gereken bir şey, evet. :)
bdonlan

1
@Piskvor, gcc için çok aşamalı derleme işlemine biraz benziyor :) Ama temelde yalnızca derleyiciler böyle bir şey yapar ve genellikle bunu yaparken bunu yükseltemezsiniz (bunu yaparsanız bile, 't düşürme o konularda kendi özel derlenmiş kopyalarını şey) kullanarak olacak çünkü, süreç içinde sen ince iken şey
bdonlan

Yanıtlar:


31

Linux (ve diğer UNIX'ler) , bir dosyanın adı ( bağlantı ), dosyanın kendisi (genellikle inode ile tanımlanır ) ve dosyaya açılan tutamaçlar arasında bir ayrım yapar . Bir dosyayı silmeye başladığınızda unlink()aramayı çağırırsınız - bu dosyaya olan bağlantıyı siler ( rename()farklı bir inode ile üzerine yazmak için de kullanabilirsiniz ). Bununla birlikte, açık dosyaya işlenirse (veya diğer bağlantılar - dosyalarda birden fazla bağlantı olabilir ), inode kalır ve tüm bağlantılar ve tutamaçlar gidene kadar dosya içeriği de kalır.

Bu nedenle, kütüphaneyi kullanarak programları çalıştırmak ya da eski sürüme bir tutamakta tutulan herhangi bir şey (genellikle bir bellek eşlemesi yoluyla dolaylı olarak), bu nedenle diskte kalır. Artık sadece bir dosya adı yok ve onu kullanan tüm programlar kapandığında (veya bir sonraki açılışta, dosya sistemi kontrolü veya günlük tekrarı sırasında) temizleniyor.

Ayrıca, 'eski kütüphaneyi' bekleyen programların, kütüphanenin daha yeni sürümleriyle iyi sonuçlanacağına dikkat edin. Linux kütüphanelerine, kütüphanenin sunduğu ABI'nin (Uygulama İkili Arayüzü) sürümünü yansıtan bir dosya adı ('soname') atanmıştır. Örneğin, sistemimdeki C kütüphanesi libc.so.6. Daha eski bir libc sürümüne karşı derlenmiş, ancak yine de 6 ABI sürümünü uygulayan bir libc sürümü olan herhangi bir program onunla çalışacaktır. Gerçekten eski programlar a arayacaktır libc.so.5veya libc.so.4yerine falan; bu durumda, eski sürümü de burada tutmanız gerekir - ancak dosya adı farklı olduğu için bu bir sorun değildir.


9

Windows'un aksine, olabilir silmek veya açık dosyasını değiştirmek; Bir vermek basitleştirilmiş açıklama, dosyalar için yeni istekler mevcut kolları onlar oluştururken, varolan dosyayı kullanmak, yeni dosyayı açın. Başka bir deyişle, Linux'ta, dizin yapısında artık bir işaretçi olmasa da, hala var olan dosya / dosya sürümlerine sahip olabilirsiniz; var olanlara son verenler, onlara hiçbir şey göstermez (kapalı ve hepsi).

Genellikle çalışan bir uygulama gerekli kitaplıkları önceden yükler, bu nedenle açıkladığınız sorun paket yüklenirken yalnızca belirli zamanlama durumlarında olur: çalışan uygulamalar hala kitaplığın eski sürümünü kullanıyor, yeni başlatılan uygulamalar yeni bir.

Bu yalnızca dağıtım yükseltmelerinde kullanılmaz, aynı zamanda her paket yükseltmesinde de olur (dağıtım yükseltmesi bu işleme birkaç otomatik adım daha ekler).


0

Pek çok Linux süreci, geldikleri paketler geliştirildikten sonra çalışmaya devam ediyor - ancak bazıları çalışmıyor. Deneyimlerime göre, KDE çalışırken yükseltirseniz hiçbir zaman düzgün çalışmaz. Çıkışta çökmeler ve / veya başarısızlıklarla karşılaşmanız muhtemeldir.

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.