Mengapa paket perangkat lunak berjalan dengan baik meskipun sedang ditingkatkan?

29

Katakanlah saya menjalankan perangkat lunak, dan kemudian saya menjalankan manajer paket untuk memutakhirkan perangkat lunak, saya perhatikan bahwa Linux tidak menurunkan proses yang berjalan untuk peningkatan paket - itu masih berjalan dengan baik. Bagaimana Linux melakukan ini?

Howard
sumber

Jawaban:

35

Alasannya adalah Unix tidak mengunci file yang dapat dieksekusi saat dieksekusi atau bahkan jika itu seperti Linux, kunci ini berlaku untuk inode, bukan nama file. Itu berarti suatu proses menjaganya tetap terbuka mengakses data (lama) yang sama bahkan setelah file telah dihapus (sebenarnya tidak terhubung) dan diganti dengan yang baru dengan nama yang sama yang pada dasarnya adalah apa yang dilakukan pembaruan paket.

Itulah salah satu perbedaan utama antara Unix dan Windows. Yang terakhir tidak dapat memperbarui file yang sedang dikunci karena tidak ada lapisan antara nama file dan inode yang membuat kesulitan besar untuk memperbarui atau bahkan menginstal beberapa paket karena biasanya memerlukan reboot penuh.

Jlliagre
sumber
10
Untuk memperjelas, di Linux Anda tidak dapat memodifikasi file yang dapat dieksekusi saat sedang berjalan. Tetapi Anda dapat memutuskan tautan file dan menggantinya dengan file baru dengan nama yang sama.
cjm
Di Linux, Anda dapat memodifikasi file yang dapat dieksekusi saat sedang berjalan. Hasilnya mungkin tidak dapat diprediksi, kecuali jika Anda benar-benar tahu apa yang Anda lakukan. Menambahkan titik "nama yang sama" yang tidak secara eksplisit dinyatakan.
jlliagre
4
@ jlliagre Kecuali saya salah paham, Anda tidak bisa sejauh yang saya ketahui: sprunge.us/egiR
Chris Down
2
Satu hal yang rapi tentang NFTS - jika Anda melakukan penggantian nama dari baris perintah atau program lain, maka Anda dapat menempatkan file dengan nama yang sama di sana, dan itu tidak akan memengaruhi program yang membuka file asli. (perintah rename dalam explorer tidak berfungsi untuk ini)
Steffan Donal
1
@ cjm Anda benar tentang perlindungan "file text busy" di Linux, jawab update. Tidak ada batasan seperti di bawah Solaris yang dengan saya lebih akrab dengannya. Anda masih dapat memodifikasi pustaka bersama dengan kedua OS.
jlliagre
18

File executable biasanya dibuka satu kali, dilampirkan ke file descriptor, dan tidak memiliki file deskriptor ke biner mereka yang dibuka kembali selama satu periode eksekusi. Sebagai contoh, jika Anda mengeksekusi bash, exec()umumnya hanya membuat deskriptor file untuk inode yang ditunjuk oleh /bin/bashdoa satu kali.

Ini sering berarti bahwa untuk biner sederhana yang tidak mencoba membaca ulang sendiri selama eksekusi (dengan menggunakan jalur yang digunakan), konten yang di-cache tetap valid sebagai inode yang menggantung. Ini berarti bahwa pada dasarnya ada replika dari versi eksekusi sebelumnya.

Dalam kasus yang lebih kompleks, ini dapat menyebabkan masalah. Sebagai contoh, file config dapat ditingkatkan dan kemudian dibaca kembali, atau program dapat melakukan re-exec sendiri melalui jalur dari mana ia dieksekusi. Mungkin juga ada masalah jika program saling berhubungan, dan satu dijalankan sebelum pemutakhiran, dan satu setelah (mungkin oleh program pertama). Ini juga berlaku untuk beberapa perpustakaan.

Namun, untuk kasus penggunaan yang sederhana, aman untuk ditingkatkan tanpa memulai kembali prosesnya.

Chris Down
sumber
1
Bahaya lain, bahkan dalam kasus-kasus sederhana, adalah karena aplikasi yang berjalan menggunakan salinan biner yang di-cache, hingga Anda secara manual memulai ulang aplikasi itu masih menjalankan kode versi lama. Meskipun ini seharusnya tidak menjadi masalah sebagian besar waktu; jika pemutakhiran menyertakan perbaikan keamanan, meskipun tambalan sedang diinstal, sistem Anda masih rentan karena versi yang lama masih berjalan.
Dan Neely
1
Saya khawatir paragraf pertama Anda tidak akurat. Kernel Unix / Linux tidak memuat program yang dapat dieksekusi sekaligus tetapi memetakannya. Itu berarti hanya halaman yang benar-benar digunakan yang akhirnya berhasil mencapai RAM. Ini adalah inti dari perlindungan "File teks sibuk" di Linux. Tidak ada jaminan beberapa bagian dari executable tidak akan dibaca lama setelah diluncurkan. Selain itu beberapa halaman tidak akan pernah dimuat untuk program yang cukup besar dan ini bahkan lebih benar untuk perpustakaan yang dimuat secara dinamis. Misalnya bashbiner adalah sekitar 200 halaman 4K, tidak yakin mereka semua digunakan dalam sesi rata-rata.
jlliagre
@ jlliagre saya sedang berbicara tentang ialloc()ing ke struct kernel saat membaca, bukan pemetaan memori halaman itu sendiri. Apakah saya tidak benar dalam berpikir bahwa pada filesystem ext * modern, inode pada akhirnya konsisten di dalam kernel (dan di dalam subsistem VM)?
Chris Down
Tidak ada jaminan bagian dari konten yang dapat dieksekusi tidak akan dibaca lama setelah dijalankan, dan tidak ada jaminan bahwa halaman yang sama tidak akan dibaca lagi setelah beberapa saat selama waktu eksekusi.
jlliagre
@ jlliagre Benar, tapi bukan itu yang saya maksud. Mungkin saya sedikit mencincang kata-kata saya dalam jawaban saya, saya akan mencoba untuk membuat apa yang saya maksudkan menjadi lebih jelas.
Chris Down