Neden çalışan bir Linux sistemini güncellemek sorunlu değil?


25

Yıllar boyunca Linux sistemlerini kullanıyorum ve çalıştığı zaman bir sistemi güncelleyerek hiçbir zaman büyük sorun yaşamadım, ama bunun neden mümkün olduğunu hala merak ediyorum.

Bir örnek vereyim.

Bir sistemde belirli bir paketin "A" programının çalıştığını varsayalım. Bu program, belirli bir noktada, aynı paketten başka bir dosyayı ("B") açmalıdır. Ondan sonra, "A" programı "B" yi kapatır çünkü artık ihtiyacı kalmaz. Şimdi "A" ve "B" paketlerini ait olduğumu varsayalım. "A", bu işlemlerden doğrudan etkilenmez, en azından şimdilik RAM'de çalıştığından ve güncelleme sabit diskteki "A" yerine geçtiğinden. Dosya sisteminde de "B" nin değiştirildiğini varsayalım. Şimdi bir nedenden dolayı "A" nın tekrar "B" yi okuması gerekiyor. Soru şudur: "A" nın "B" nin uyumsuz bir versiyonunu bulabilmesi ve kaza veya arıza başka bir şekilde olabilir mi?

Neden hiç kimse canlı bir CD veya benzeri bir prosedürle yeniden başlatarak sistemlerini güncellemiyor?


Güncelleme mekaniğinden (bu iyi yapılabilir) değil, ilk önce uygulamalarımı ve yapılandırmamı değişikliklere karşı test etme tercihim olduğu için bu tür güncellemelerden kaçınmayı tercih ederim. O zaman sadece geçmek için şimdi güncellenen ayrı bir sistem olurdu. Ancak, bunun dışında, kullanıcının güncellenmesi genellikle bir sorun değildir ve küçük veya güvenlik düzeltmeleri için, sadece yaparım.
Skaperen

Yanıtlar:


23

Userland Güncelleme Nadiren Bir Sorun

Paketleri canlı bir sistemde sık sık güncelleyebilirsiniz, çünkü:

  1. Paylaşılan kütüphaneler hafızada saklanır, her çağrıda diskten okunmaz, bu nedenle uygulama yeniden başlatılıncaya kadar eski sürümler kullanımda kalır.
  2. Açık dosyalar , dosya adlarından değil, dosya tanımlayıcılarından okunur , bu nedenle dosya içerikleri, sektörlerin üzerine yazılana veya dosya tanımlayıcıları kapatılana kadar taşınmış / yeniden adlandırılmış / silinmiş olsa bile çalışan uygulamalar için kullanılabilir durumda kalır.
  3. Yeniden tasarlanması veya yeniden başlatılması gereken paketler, paket iyi tasarlanmışsa, paket yöneticisi tarafından düzgün bir şekilde işlenir. Örneğin, Debian, libc6 yükseltildiğinde belirli hizmetleri yeniden başlatır.

Genel olarak, çekirdeğinizi güncellemiyorsanız ve ksplice kullanmıyorsanız, güncellemeden yararlanmak için programların veya hizmetlerin yeniden başlatılması gerekebilir. Ancak, masaüstlerinde bireysel hizmetleri yeniden başlatmaktan zaman zaman daha kolay olmasına rağmen, nadiren nadiren bir kullanıcıyı yeniden kurmak için bir ihtiyaç vardır.

Ayrıca bakınız

http://en.wikipedia.org/wiki/Ring_%28computer_security%29#Supervisor_mode


Ama tüm önbellek belleğine ihtiyacın olursa ne olacak? Bu durumda, paylaşım kütüphanelerinin tekrar diskten yüklenmesi gerekecektir ...
Nils

3
Aslında # 1'in açıklaması o kadar açık değildi. Eski kütüphane dosyası içerikleri, bazı işlemler dosya açıldığı veya içerikleri eşlendiği sürece, veriler ayrı tutulur (ve dosya sistemi olamaz) Dosyanın bağlantısı tamamlanıncaya kadar r / o yeniden kurulmalıdır). Orijinal dosyayı eşleyen işlem, orijinal içeriğe hala bellek eşleştirmelerine sahiptir.
Skaperen

@Nils Uzman değilim, ancak önbelleğiniz biterse, değiş tokuş etmek ve oradan yeniden okumak için yazılmaz mı? Eğer bu dolu olsaydı, bazı işlemler muhtemelen onu zaten kullanan başka bir işlemden hafızayı alabilmesi için muhtemelen engellenirdi.
Joe

@Joe no - takas da koç. Skaperen ne olacağını açıklıyor: dosya tanıtıcısı bozulmadan tutuluyor. Bu yüzden, temelde program eski (çıkmış) kütüphaneye bir zorluk yaşatıyor, ki bu tutamaç tekrar serbest kalana kadar silinmeyecek - hepsi dosya sistemi düzeyinde - RAM seviyesinde değil.
Nils,

4

Evet, açıkladığınız şey mümkündür, ancak dosya pakete eklenmişse çoğu zaman, bir kitaplık veya bir kez ve yalnızca bir kez okunan başka bir dosya olacak (değişmemesi nedeniyle, bunun nedeni yoktur) birden çok kez oku). Ayrıca dosyanın uzun süreli olması gerekiyorsa, uygulama büyük olasılıkla asıl dosya sisteminde yerini alsa bile, açık dosya tanıtıcısı eski sürümü açık tutacak şekilde dosya tanıtıcısını açık bırakacaktır.

Çoğu durumda, işlemin ömrü boyunca birçok kez okunan veriler kullanıcı / değişken verileridir ve bu paket yükseltme sırasında değişmez. Ayrıca, veriler değişken olduğundan, aklı başında olan herhangi bir programcı, programın bir okumadan diğerine geçişi gerçekleştirebilmesini sağlar.


Eşleştirmesi bellekte değişiklik yapmazsa (eğer varsa yedek deposunu değiş tokuş edecek şekilde değiştirirse) dosya yine de "yedek depo" olarak okunabilir ve bellekteki kopya diğer kullanım baskısı nedeniyle silinir bellek. Ancak, orijinal dosya hala açık veya eşlenmiş olduğundan sorun değil. Yeni kitaplık, eski işlemin açılmadığı yeni ve farklı bir dosyadır.
Skaperen

1
@Skaperen Bellek eşlemeli dosyalar hakkında konuştuğunuzu farz ediyorum. Bunlar paketleri güncellerken sorun değil. Tüm paket yöneticileri, eskilerinin yerine yazmak yerine eski dosyaları değiştirmek için yeni dosyalar oluşturur. Aslında bu çalıştırılabilir bir çalıştırılabilir dosya olarak değiştirmenin tek yolu değiştirilemez, sadece bağlantısız olabilir.
Patrick

4

Dosya sisteminde de "B" nin değiştirildiğini varsayalım. Şimdi bir nedenden dolayı "A" nın tekrar "B" yi okuması gerekiyor. Soru şudur: "A" nın "B" nin uyumsuz bir versiyonunu bulabilmesi ve kaza veya arıza başka bir şekilde olabilir mi?

Bu mümkündür, ancak çoğu durumda olası değildir. "B" bir kod kütüphanesiyse, orijinal versiyon genellikle kapalı olmaz. “A”, “B” nin orijinal versiyonunu kullanmaya devam eder. Güncellemeden sonra "A" çalıştırırsanız, "B" nin yeni sürümü kullanılacaktır. Güncelleme sırasında, uyumsuz sürümlerin yüklenme riski vardır. Bununla birlikte, kod kütüphanelerinin yüklenme şekli nedeniyle, bu yalnızca "A" yüklü olduğu "B" sürümlerinde mevcut değilse, işlevselliğe ihtiyaç duyuyorsa, bir sorun olmalıdır.

İyi kodlama uygulaması, arayüzün aynı şekilde çalışmasını sağlar. Sonuç olarak, hangi sürümün yüklü olduğu önemli değil, yeni sürümde sabitlenmiş hatalar varsa.

Yapılandırma dosyaları biraz farklı bir konudur, ancak genellikle başlangıç ​​sırasında okunur. Bu durumda, "A", yapılandırmanın yeniden yüklenmesi değişmediği sürece "B" okumaz. Yine, yapılandırma dosyasının biçimini veya anlamını değiştirmek kötü kodlama uygulaması olacaktır. Yapılandırma dosyasının uyumsuz bir sürümü farklı bir ada sahip olmalıdır, bu nedenle bir soruna neden olmaz.

Neden hiç kimse canlı bir CD veya benzeri bir prosedürle yeniden başlatarak sistemlerini güncellemiyor?

Kapatılması ve farklı bir sürümden yeniden başlatılması servis kesintisine neden olur. Sunucular için bu genellikle istenmez. Her durumda, çalışan sistemdeki paket yöneticisi, yüklediği yazılım ve sürümlerin farkındadır. Canlı CD'lerde, muhtemelen farklı sürümleri olan yüklü bir yazılım listesi vardır. Bu, çalışan sistemi canlı CD'den güvenilir bir şekilde yükseltmeyi zorlaştırır.

Canlı CD'ler bazen yeni bir O / S sürümü kurulurken kullanılır. Bu durumda, O / S'nin temiz kurulumu genellikle yapılır. Bu, kullanılmayan dosya miktarını tutulan önceki sürümden sınırlayabilir. Canlı sistemi yükseltmekten daha fazla çaba olabilir. Bununla birlikte, farklı kök bölümleri kullanılıyorsa, kısmen oluşturulamayan kısmen güncellenen bir sisteme takılma riskini sınırlayabilir.


0

Bunun bir sorun olduğu bazı durumlar var:

  • Bir java-VM çalışırken JDK yükseltmesi: ben de kendi sorularınızı kendime sordum - java kullanan çalışan bir erkek kedi vardı. Şimdi JDK'nin yama güncellemesinden sonra hala sorunsuz çalıştı - öyleydi.

Şimdi açıklama önbellek hafızası. Tamam - kullanılabilir tüm RAM'leri kullanmak için bir hafıza-domuz programı başlattım - ve tomcat çöktü (orada çalışan uygulamaya eriştikten sonra).

  • SuSE sistemlerinde Çekirdek Yükseltme: SuSE'de eski çekirdek ve modülleri çekirdeğin yama yükseltmesinden hemen sonra silinir. Daha sonra yeni bir şey kullanmak istiyorsanız, o zamana kadar yüklenmemiş olan bir çekirdek modülü gerektiren hizmet başarısız olur.

2
Tomcat'ın bazı parçaları yeniden başlatıldı ya da Java seviyesinin altında (örneğin dlopen () ve benzeri) canlı API'lerin karışımıyla sonuçlanabilecek dinamik kitaplıklar kullanıldı.
Skaperen

@Skaperen paylaşılan kütüphaneleri kullanırken bile - kullandıktan sonra kapanırlarsa, önbellek azalıyorsa, herhangi bir program sıkıntılı olmalı ...
Nils

1
Açık dosya tanıtıcısı, diskteki verileri bir dizindeki dosya adı olarak saklamak için aynı güce sahiptir. Orijinal inode , diskte bir sabit bağlantı veya açık bir dosya tanıtıcısı olduğu sürece silinmeyecektir . Önbellek onunla ilgisi yok. Şimdi, bazı programlar kullanmadıklarında dosya verilerini kapatır ve bu verilerin kaybolmasına izin verebilir.
dmckee

@dmckee Doğru. Çekirdeğe yaklaşıyoruz. Öyleyse "normal" bir program için normal olan: kütüphaneyi açın ve açık tutun mu, yoksa kütüphaneyi yükleyin ve daha sonra kapatın?
Nils
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.