Paylaşılan kitaplığı çökmeden nasıl yükseltebilirim?


18

Burada yürütülebilir bir dosyayı yeniden yazabileceğinizi ve işlemin iyi çalışacağını söylüyor - bir işlem yeniden başladığında yeniden okunacaktır.

Ancak, işlem çalışırken (scp, dev den test sunucusuna) bir ikili dosyayı değiştirmeye çalıştığınızda 'dosya meşgul' diyor. Ve paylaşılan bir kütüphane dosyasını (* .so) değiştirirsem, onu bağlayan tüm işlemler çöküyor.

Neden öyle? Bir şey mi kaçırıyorum? Bir işlemi durdurmadan / kilitlemeden ikili dosyaları nasıl değiştirebilirim?


Bağımlılıkları kontrol etmek için .sokullanarak dosyayı kontrol edebilirsinizldd filename.so
Rahul Patil

Bağımlılıkları biliyorum. Çalışan dosyaları etkilemeden bu dosyaları değiştirmek için bir yol istiyorum. Bağlantılı sorunun ima ettiği gibi
Sam

kesinti süresi gereklidir .. ya da bunu yapabilirsiniz stop app && create symlink of .so && start app
Rahul Patil

Yanıtlar:


21

Bahsedildiği üzere Why çalıştırmak bir yazılım paketi sadece iyi o yükseltiliyor bile zaman? , kilit dosya adına değil inode üzerine yerleştirilir. Bir ikili dosyayı yükleyip yürüttüğünüzde, dosya meşgul olarak işaretlenir - bu nedenle yazmaya çalıştığınızda ETXTBSY (dosya meşgul) hatası alırsınız.

Şimdi, paylaşılan kütüphaneler için biraz farklıdır: kütüphaneler, hafızayı işlemin adres alanına eşleştirilir mmap(). MAP_DENYWRITEBelirtilebilir olsa da, Linux'ta en azından Glibc sessizce yok sayar (man sayfasına göre, kaynakları kontrol etmekten çekinmeyin) - bu konuyu kontrol edin . Bu nedenle, aslında dosyayı yazmanıza izin verilir ve bellek eşlemeli olduğu için, herhangi bir değişiklik hemen görülebilir - bu da yeterince denerseniz kitaplığınızın üzerine yazarak makinenizi tuğlalamayı başarabileceğiniz anlamına gelir .

Bu nedenle güncellemenin doğru yolu:

  1. Verileri referanstan kaldıran dosya sisteminden kaldırılır, böylece onu kullanmak isteyebilecek yeni ortaya çıkan uygulamalar için erişilebilir olmazken, verileri zaten açık (veya eşlenmiş) olan herkes için erişilebilir tutar ;

  2. güncellenmiş içeriğe sahip yeni bir dosya oluşturmak.

Yeni oluşturulan süreçler güncellenmiş içeriği kullanacak, çalışan uygulamalar eski sürüme erişecektir. Herhangi bir aklı başında paket yönetim yardımcı programı budur. Yine de tamamen tehlikesiz olmadığını unutmayın - örneğin, kodu dinamik olarak yükleyen uygulamalar ( dlsym()ve arkadaşları kullanarak ), kütüphanenin API'sı sessiz bir şekilde değişirse sorun yaşayacaktır.

Gerçekten, gerçekten güvenli tarafta olmak istiyorsanız , sistemi kapatın, dosya sistemini başka bir işletim sistemi örneğinden bağlayın , güncelleyin ve güncellenen sistemi tekrar açın.


6

Bir rpm yükseltmesi aynı şeyi yapar - hiçbir şey çökmezken çalışan ikili dosyalar ve kütüphaneler.

Peki fark nedir:

  1. dosyanın bağlantısını kaldır
  2. aynı ada sahip yeni dosya yaz

Bu, dosyanın yerinde YERLEŞTİRİLMEYECEKTİR: Kullanımda ikili dosyaya başvuran inode, açık tutan son nesne bitinceye kadar hala "meşgul" olur. Yeni dosya yeni bir inode numarası ile oluşturulacaktır.

Şimdi scpveya cpdosyayı yerinde değiştirmeye çalışacaksınız - bu da inode'un başvurduğu içeriği değiştirecektir. Bu, açıkladığınız gibi çalışmaz.

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.