Bagaimana cara memutakhirkan binari aplikasi yang sedang berjalan selama proses upgrade bekerja?

23

Saya baru saja memutakhirkan ubuntu saya dengan rapi, selama pembaruan itu menggantikan sebagian besar aplikasi yang sedang berjalan dengan versi yang lebih baru.

Bagaimana cara kerjanya? (Tidakkah aplikasi akan crash?) Apa yang akan terjadi pada aplikasi jika file lib ditingkatkan dan aplikasi yang sedang berjalan yang mencari lib yang lebih lama mencoba memuatnya?

srinathhs
sumber
Pertanyaan yang bagus, tetapi mungkin lebih baik ditanyakan di sini: unix.stackexchange.com (Saya tahu URL mengatakan Unix tetapi mereka juga menjawab pertanyaan Linux!)
Memahami fungsi ganti-sambil-buka Linux sepertinya masih pemrograman (tapi baru saja :)
bdonlan
2
@bdonlan: Jika Anda secara dinamis memuat perpustakaan selama masa proses Anda, Anda harus sangat sadar akan hal ini, jika tidak maka akan menggigit Anda. Ini sangat penting jika Anda mencoba melakukan sesuatu yang tidak biasa, misalnya kode modifikasi diri, dll. Tapi ya, itu batas.
Piskvor
1
Itu tidak benar-benar relevan dengan kode modifikasi diri, tapi itu pasti sesuatu yang seseorang harus pahami perpustakaan menulis untuk linux, ya. :)
bdonlan
1
@Piskvor, terdengar agak seperti proses kompilasi multi-tahap untuk gcc :) Tapi pada dasarnya hanya kompiler yang melakukan sesuatu seperti itu, dan biasanya Anda tidak akan meningkatkan sistem saat Anda melakukannya (bahkan jika Anda melakukannya, selama Anda tidak dapat menurunkan versi apa pun saat sedang dalam proses, Anda baik-baik saja, karena itu akan menggunakan salinan apa pun yang dikompilasi secara pribadi di mana pun masalahnya)
bdonlan

Jawaban:

31

Linux (dan UNIX lainnya) menggambar perbedaan antara nama file ( tautan ), file itu sendiri (sering diidentifikasi dengan inode ), dan buka pegangan ke file tersebut. Ketika Anda pergi untuk menghapus file, Anda memanggil unlink()panggilan - ini menghapus tautan ke file (Anda juga dapat menggunakannya rename()untuk menimpanya dengan inode yang berbeda). Namun, jika pegangan terbuka ke file (atau tautan lain - file dapat memiliki banyak hardlink ) tetap ada, inode tetap ada, dan demikian juga konten file, sampai semua tautan dan pegangan hilang.

Jadi menjalankan program menggunakan pustaka atau apa pun tetap menggunakan versi lama (sering secara implisit melalui pemetaan memori), sehingga tetap pada disk. Itu hanya tidak memiliki nama file lagi, dan akan dibersihkan ketika semua program menggunakannya mematikan (atau pada reboot berikutnya, selama pemeriksaan filesystem atau replay jurnal).

Lebih lanjut, perhatikan bahwa program yang mengharapkan 'perpustakaan lama' akan baik-baik saja dengan versi perpustakaan yang lebih baru. Perpustakaan Linux diberi nama file ('soname') yang mencerminkan versi ABI (Application Binary Interface) yang ditawarkan oleh perpustakaan. Sebagai contoh, pustaka C pada sistem saya adalah libc.so.6. Program apa pun yang dikompilasi melawan versi libc yang lebih lama, tetapi masih versi libc yang menerapkan versi 6 ABI, akan berfungsi dengan baik dengannya. Program yang benar-benar lama akan mencari libc.so.5atau libc.so.4atau sesuatu sebagai gantinya; dalam hal ini, Anda juga perlu menjaga versi lama - tetapi karena nama filenya berbeda, ini bukan masalah.

bdonlan
sumber
9

Tidak seperti Windows, Anda dapat menghapus atau mengganti file yang terbuka; untuk memberikan penjelasan yang disederhanakan , permintaan baru untuk file membuka file baru, pegangan yang ada menggunakan file yang ada saat dibuat. Dengan kata lain, di Linux Anda dapat memiliki file / versi file yang masih ada, meskipun tidak ada lagi pointer ke mereka dalam struktur direktori; mereka berhenti ada tidak ada pointer sama sekali (tertutup dan semua).

Biasanya aplikasi yang berjalan memuat perpustakaan yang diperlukan di depan, sehingga masalah yang Anda uraikan hanya akan terjadi dalam situasi waktu yang sangat spesifik saat paket sedang diinstal: aplikasi yang berjalan masih menggunakan versi lama perpustakaan, aplikasi yang baru mulai menggunakan yang baru satu.

Ini digunakan tidak hanya di upgrade distro, tetapi terjadi pada setiap upgrade paket (upgrade-dist hanya menambah beberapa langkah automagic untuk proses itu).

Piskvor
sumber
0

Banyak proses Linux terus bekerja setelah paket-paket mereka berasal telah diupgrade - tetapi beberapa tidak. Dalam pengalaman saya, KDE tidak pernah berfungsi dengan baik jika Anda memutakhirkannya saat sedang berjalan. Anda cenderung mengalami gangguan dan / atau kegagalan untuk keluar.

Robin Green
sumber