Bir yazılım paketi, yükseltilirken bile neden iyi çalışıyor?


29

Diyelim ki bir yazılım kullanıyorum ve ardından yazılımı yükseltmek için paket yöneticisini çalıştırıyorum, Linux'un paket yükseltme için çalışan işlemi azaltmadığını fark ettim - hala iyi çalışıyor. Linux bunu nasıl yapar?

Yanıtlar:


35

Bunun nedeni, Unix yürütülürken yürütülebilir bir dosyayı kilitlememesi veya Linux gibi olsa bile bu kilit dosya adı için değil inode için geçerlidir. Bu, açık kalmasını sağlayan bir işlem, dosya silindikten sonra bile (eski olarak bağlanmış) aynı (eski) verilere erişmek ve aslında bir paket güncellemesinin yapması gereken aynı adla yeni bir taneyle değiştirilmek anlamına gelir.

Unix ve Windows arasındaki ana farklardan biri budur. İkincisi, genellikle tam bir yeniden başlatma gerektiren bazı paketleri güncellemek veya hatta yüklemek için büyük bir güçlük yaratan dosya adları ve inode'lar arasında bir katman eksik olduğundan, kilitli bir dosyayı güncelleyemez.


10
Netleştirmek için, Linux altında, çalıştırılabilir bir dosyayı değiştiremezsiniz . Ancak dosyanın bağlantısını kaldırabilir ve aynı ada sahip yeni bir dosyayla değiştirebilirsiniz.
cjm

Linux altında, çalışırken yürütülebilir bir dosyayı değiştirebilirsiniz. Ne yaptığınızı gerçekten bilmiyorsanız, sonuç muhtemelen tahmin edilemez. Açıkça belirtilmemiş olan "aynı isim" noktasını ekledi.
jlliagre

4
@jlliagre Yanlış anlamadığım sürece, farkında olduğum kadarıyla yapamazsınız
Chris Down

2
NFTS ile ilgili güzel bir şey - komut satırından veya başka bir programdan yeniden adlandırma yaparsanız, aynı adı taşıyan bir dosyayı oraya geri koyabilirsiniz ve orijinal dosyayı açık olan programları etkilemez. (kaşifte yeniden adlandırma komutu bunun için çalışmıyor)
Steffan Donal

1
@cjm Linux altında "dosya metni meşgul" koruması konusunda haklısınız, cevap güncellendi. Solaris altında daha aşina olduğum bir sınırlama yok. Yine de paylaşılan kütüphaneleri her iki işletim sistemiyle de değiştirebilirsiniz.
jlliagre

18

Yürütülebilir dosyalar, genellikle bir kez açılır, bir dosya tanıtıcısına eklenir ve tek bir çalıştırma süresi boyunca yeniden açılan ikili dosyalarına sahip bir dosya tanıtıcısına sahip değildir. Örneğin, yürütürseniz bash, exec()genellikle yalnızca bir /bin/bashkez işaretlendiğinde inode için bir dosya tanıtıcısı oluşturur - başlatma sırasında.

Bu genellikle, yürütme sırasında kendilerini yeniden okumaya çalışmayan basit ikili dosyalar için (çağrıldıkları yolu kullanarak), önbelleğe alınan içeriğin sarkan bir inode olarak geçerli kalması anlamına gelir. Bu, aslında çalıştırılabilir sürümün önceki sürümünün bir kopyası olduğu anlamına gelir.

Daha karmaşık durumlarda, bu sorunlara neden olabilir. Örneğin, bir yapılandırma dosyası yükseltilebilir ve daha sonra yeniden okunabilir veya program, yürütüldüğü yolla yeniden çalıştırılabilir. Programlar birbirine bağlıysa ve biri yükseltme işleminden önce, diğeri sonra (muhtemelen ilk program tarafından) yürütülürse de sorunlar olabilir. Bu, bazı kütüphaneler için de geçerlidir.

Basit kullanım durumlarında, işlemi yeniden başlatmadan yükseltmek güvenlidir.


1
Diğer durumlarda, basit durumlarda bile, çalışmakta olan uygulama ikili kodun önbelleğe alınmış bir kopyasını kullanması nedeniyle, uygulamayı manuel olarak yeniden başlatana kadar hala kodun eski sürümünü çalıştırıyor olmasıdır. Bu çoğu zaman önemli olmamalı; Yükseltme güvenlik düzeltmeleri içeriyorsa, yamanın kurulmasına rağmen sisteminiz hala eskidir, çünkü eski sürüm hala çalışıyordur.
Dan Neely,

1
Korkarım ilk paragrafınız yanlış. Unix / Linux çekirdekleri çalıştırılabilir programları bir kerede yüklemez, hafıza haritalarını yüklerler. Bu, yalnızca gerçekten kullanılan sayfaların sonunda RAM’de yapılmasını sağlar. Bu, Linux altında "Metin dosyası meşgul" korumasının esas noktasıdır. Bir çalıştırılabilir dosyanın bir bölümünün piyasaya sürüldükten çok sonra okunmayacağının garantisi yoktur. Ayrıca, bazı sayfalar yeterince büyük programlar için hiçbir zaman yüklenmez ve bu dinamik olarak yüklenmiş kütüphaneler için daha da doğrudur. Örneğin, bashikili yaklaşık 4 4 sayfadır, hepsinin ortalama bir oturumda kullanıldığından emin değildir.
jlliagre

@jlliagre ialloc()Sayfaların kendi hafıza haritalamalarından değil, okuma üzerine bir çekirdek yapısına girmekten bahsediyordum . Modern ext * dosya sistemlerinde, inode'un çekirdek içinde (ve VM alt sisteminin içinde) tutarlı olduğunu düşünmedim mi?
Chris Down,

Yürütülebilir içeriğin bazı bölümlerinin çalıştırıldıktan uzun süre sonra okunmayacağının garantisi yoktur ve aynı sayfaların yürütme sırasında bir süre sonra tekrar okunmayacağının garantisi yoktur.
jlliagre

@jlliagre Doğru, ama demek istediğim bu değil. Belki de sözlerimi biraz cevabımla kıydım, ne demek istediğimi netleştirmeye çalışacağım.
Chris Down
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.