Memperbarui kernel Linux, sambil meninggalkan sisa sistem apa adanya

25

Saya adalah pengguna OpenBSD. Dalam FAQ OpenBSD tertulis:

OpenBSD adalah sistem yang lengkap, dimaksudkan untuk tetap sinkron. Ini bukan utilitas kernel plus yang dapat ditingkatkan secara terpisah satu sama lain.

Ketika Anda meningkatkan sistem, Anda melakukannya dalam sekali jalan; kernel dan sistem basis diganti. Kemudian Anda pergi dan memperbarui paket pihak ke - 3 Anda . Jika dikompilasi dari sumber , Anda mengkompilasi ulang kernel dan mem-bootnya. Kemudian Anda membangun kembali sistem dasar, dan kemudian paket-paket yang telah Anda instal. Jika lebih dari beberapa minggu / bulan telah berlalu sejak terakhir kali Anda membangun kembali semuanya, Anda terlebih dahulu memasang snapshot dan membangun kembali dari sana (jika Anda mengikuti cabang CVS terbaru).

Memiliki kernel yang tidak sinkron, sistem dasar dan / atau paket pihak ke-3 merupakan sumber masalah potensial dan lebih atau kurang mendiskualifikasi Anda dari mendapatkan bantuan serius dari milis resmi.

Saya cukup baik-baik saja dengan ini. Sebenarnya, ini adalah salah satu alasan saya menggunakan OpenBSD. Itu membuat sistem unit yang konsisten dan membuatnya mudah bagi saya untuk membentuk tinjauan mental tentangnya.

Seperti apa di Linux? Sebagian besar Linux yang saya ketahui tidak memiliki "sistem dasar" dalam arti yang sama dengan BSD, melainkan kumpulan paket yang dikumpulkan oleh penyedia distribusi. Perangkat lunak lebih lanjut kemudian ditambahkan ke ini oleh administrator lokal sedemikian rupa sehingga batas antara apa yang ada dari awal dan apa yang ditambahkan kemudian, paling tidak, buram.

Apakah Linux (secara umum) tidak memiliki kopel kernel yang kuat untuk userspace? Kernel diperbarui, sejauh yang saya tahu, seperti paket perangkat lunak lain, dan sedikit membingungkan saya bahwa ini mungkin. Tambahkan ke fakta ini bahwa beberapa bahkan mengkompilasi kernel custom (yang tidak disarankan pada OpenBSD), dan memiliki banyak versi kernel yang terdaftar dalam menu boot mereka.

Siapa atau apa yang menjamin bahwa berbagai subsistem sistem Linux dapat bekerja sama satu sama lain meskipun diperbarui secara terpisah satu sama lain?

Alasan saya bertanya adalah karena pengguna lain di situs ini bertanya kepada saya apakah mengganti kernel di sistem Linux-nya dengan versi yang lebih baru "akan bisa dilakukan". Dari sisi OpenBSD, saya tidak dapat mengatakan bahwa ya, ini dijamin tidak akan merusak sistem.


Saya menggunakan "Linux" di atas sebagai singkatan untuk "distribusi Linux", kernel + utilities.

Kusalananda
sumber
Ini adalah cara lain untuk mengatakan bahwa OpenBSD hanya memiliki distribusi tunggal. Entri menu beberapa grub pada sistem Linux biasa adalah untuk jatuh kembali ke kernel sebelumnya dalam kasus yang (biasanya) terbaru tidak bisa boot karena beberapa alasan.
Thorbjørn Ravn Andersen

Jawaban:

29

Linus Torvalds memiliki pendapat yang sangat kuat terhadap perubahan kernel yang menghasilkan regresi userspace (lihat pertanyaan " Kernel Linux: memecah ruang pengguna " untuk detailnya).

Antarmuka antara userspace dan kernel disediakan oleh panggilan sistem. Kernel yang lebih baru dapat memiliki lebih banyak panggilan sistem, dan perubahan yang keluar ketika perubahan tersebut tidak merusak aplikasi yang ada. Ketika antarmuka panggilan sistem memiliki parameter flag, kernel baru sering mengekspos fungsionalitas baru dengan flag bit baru. Dengan cara ini kernel mempertahankan kompatibilitas ke belakang ke aplikasi lama.

Ketika tidak mungkin untuk mengubah antarmuka yang ada tanpa melanggar ruang pengguna, panggilan sistem tambahan telah ditambahkan yang menyediakan fungsionalitas yang diperluas. Inilah sebabnya mengapa ada tiga versi dupdan dua versi umountpanggilan sistem.

Kebijakan memiliki ruang pengguna yang stabil adalah alasan mengapa pembaruan kernel jarang menyebabkan masalah dalam aplikasi userspace dan Anda biasanya tidak mengharapkan masalah setelah memutakhirkan kernel.

Namun stabilitas API yang sama tidak dijamin untuk antarmuka kernel dan detail implementasi lainnya . Sysfs (on /sys) dan procsfs (on /proc/) memaparkan detail implementasi kernel pada konfigurasi runtime, perangkat keras, jaringan, proses dll. Yang digunakan oleh aplikasi tingkat rendah. Adalah mungkin bagi antarmuka tersebut untuk berubah dengan cara yang tidak kompatibel antara versi kernel jika ada alasan yang baik untuk itu. Perubahan masih mencoba untuk meminimalkan ketidaksesuaian jika memungkinkan dan ada aturan untuk bagaimana aplikasi dapat menggunakan antarmuka dengan cara yang paling tidak menyebabkan masalah. Dampaknya juga terbatas karena aplikasi non-level tidak boleh menggunakan antarmuka ini.

@PeterCordes menunjukkan jika perubahan dalam procfs atau sysfs merusak aplikasi yang digunakan oleh distribusi Anda dalam skrip init, Anda bisa memiliki masalah.

Ini agak tergantung pada bagaimana distribusi Anda memperbarui kernel (dukungan jangka panjang atau arus utama) dan bahkan masalah itu relatif jarang terjadi karena distribusi biasanya mengirimkan alat yang diperbarui pada saat yang sama.

@StephenKitt menambahkan bahwa userspace yang ditingkatkan mungkin memerlukan versi kernel yang lebih baru, dalam hal ini sistem mungkin tidak dapat melakukan booting dengan kernel lama dan catatan rilis distribusi menyebutkan hal ini jika diperlukan.

sebasth
sumber
1
Akan bermanfaat dalam jangka panjang untuk memperluas penjelasan ini dengan ringkasan antarmuka pengguna-kernel (alias pemanggilan sistem) karena menjelaskan mekanisme di mana kernel yang dikonfigurasi secara berbeda tidak merusak aplikasi.
wallyk
3
Bahkan procfs ( /proc) dan sysfs ( /sys) dijaga se-stabil mungkin, mengikuti kebijakan / filosofi "jangan putus ruang-pengguna" yang sama. Juga, ioctl()kode pada file perangkat en.wikipedia.org/wiki/Ioctl . Ini jauh melampaui kompatibilitas sistem-panggilan ABI sederhana, tetapi seperti yang Anda katakan ketika ada alasan bagus, semuanya berubah /procdan /sys. Itu tidak akan merusak sebagian besar program secara langsung, tetapi jika itu merusak program ruang-pengguna tingkat rendah yang digunakan oleh skrip init distro Anda, Anda bisa memiliki masalah. Untungnya ini jarang terjadi.
Peter Cordes
Sebenarnya beberapa file seperti rfkillsaklar IIRC telah mengubah lokasi di beberapa upgrade kernel. Jadi /procdan /sysjauh lebih tidak stabil daripada antarmuka syscall. Untungnya, distribusi biasanya tidak menyertakan peningkatan kernel seperti itu kecuali itu adalah upgrade versi distribusi utama.
Ruslan
3
Ada dua aspek yang perlu dipertimbangkan di sini: memutakhirkan kernel, dan memutakhirkan ruang pengguna. Berkat stabilitas ABI kernel, memutakhirkan kernel cukup aman (bahkan dengan /procdan /sysperubahan biasanya - pemindahan membutuhkan waktu bertahun-tahun). Namun, memutakhirkan userspace dapat membutuhkan kernel baru, dan Anda dapat berakhir dengan sistem yang tidak bisa di-boot jika Anda tidak memiliki kernel yang cukup baru. Catatan rilis distro menyebutkan hal ini bila perlu (jadi jangan upgrade distro secara membabi buta, baca catatan rilis).
Stephen Kitt
1
Ada pedoman untuk / proc dan / sys file dan bagaimana userspace harus membacanya untuk memungkinkan penambahan bidang dalam kernel yang lebih baru. / proc / stat misalnya, atau / proc / meminfo. Ruang pengguna diharapkan mengabaikan bidang yang ditambahkan.
Zan Lynx
11

Kernel Linux dan ruang pengguna distribusi Linux, yang secara historis didominasi oleh alat-alat pengguna yang dikembangkan oleh proyek GNU, secara longgar digabungkan. Sebagian ini karena desain, dan sebagian karena kebutuhan.

Berbeda dengan BSD, di mana kernel serta ruang pengguna basis dirancang dan dikelola bersama-sama, kernel Linux dan ruang penggunanya dikembangkan dan dikelola oleh orang yang berbeda. Jadi menyatukan mereka dengan erat akan menjadi sulit, bahkan jika komunitas menginginkannya, dan saya rasa tidak.

Dan @sebasth juga menunjukkan bahwa kebijakan utama proyek kernel Linux adalah bahwa ia tidak boleh merusak ruang pengguna. Yang tentu saja merupakan faktor lain yang menerapkan kopling longgar.

Namun, masih ada beberapa derajat kopling. Kernel Linux yang cukup lama tidak akan berfungsi dengan distribusi modern.

Faheem Mitha
sumber
2
@Abigail ini adalah nit-picking, tetapi kompatibilitas ke depan dapat disediakan, jika userspace mengimplementasikan fallback yang sesuai (bahkan fallback yang terdegradasi) untuk fitur kernel yang hilang. Memang sering tidak diinginkan atau bahkan tidak sia-sia, tetapi beberapa perangkat lunak melakukan ini ( glibcmisalnya). (Tapi ya, ini bukan janji kernel, ini janji userspace.)
Stephen Kitt
7

Pemahaman saya adalah bahwa Linux adalah kernel, dan yang lainnya adalah tambahan. Anda pasti dapat memutakhirkan kernel secara independen dari (banyak) paket yang diinstal, karena umumnya terkait dengan pustaka daripada kernel itu sendiri. Anda biasanya hanya akan melihat sambungan antara versi kernel dan driver perangkat keras (mis. Driver GPU). Beberapa perangkat lunak hanya kompatibel dengan versi kernel tertentu, tetapi itu harus ditentukan dalam dokumentasi masing-masing program tersebut.

Agak umum untuk memiliki dua paket paket kernel yang diinstal pada suatu sistem - paket yang saat ini digunakan, dan paket yang diinstal sebelumnya. Saat memutakhirkan, setelah memastikan versi baru berfungsi dengan benar, yang terlama dapat dihapus dan Anda masih memiliki cadangan yang diketahui aman. Red Hat (dan sepupunya) misalnya, harus package-cleanup --oldkernels --count 2melakukan ini secara otomatis.

DopeGhoti
sumber
Bahkan sesuatu seperti kmod , yang menurut Anda perlu diikat ke versi kernel, memiliki sedikit kelonggaran di mana versi itu akan bekerja dengan.
Ignacio Vazquez-Abrams
4

Selain semua argumen bagus di sini, saya dapat menambahkan beberapa poin yang akan membantu.

Kami sudah mengetahui kebijakan tim kernel, dan sebagai distribusi Linux, kami berusaha menjaga kode sumber kernel semurni mungkin. Ini berarti, setiap kali kerentanan muncul, atau sesuatu yang membutuhkan tambalan, kami memberi tahu tim kernel dan mencoba membantu dengan tambalan, tetapi pada akhirnya, keputusan akhir berasal dari tim kernel.

Beberapa distribusi menambahkan lebih banyak tambalan daripada yang lain, tetapi idenya adalah untuk mempertahankannya karena berasal dari pengembang hulu. Jelas, ada beberapa program yang membutuhkan konfigurasi kernel khusus, terutama virtualisasi dan driver pihak ketiga dan biasanya, keduanya digunakan untuk bekerja dengan versi kernel tertentu atau setidaknya versi yang tidak terlalu lama ... alasannya adalah mereka mencoba untuk bekerja dengan fitur-fitur kernel terbaru dan karena itu, jika Anda mencoba menjalankannya dengan kernel lama, mereka mungkin tidak berjalan dengan benar.

Satu elemen tambahan yang perlu diingat adalah bahwa semua distribusi Linux memiliki tim pengelola, orang-orang yang memastikan bahwa semua perangkat lunak kompatibel dengan sistem. Itu sebabnya hampir setiap distribusi memiliki versi stabil dan tidak stabil. Pengembang bekerja dengan perangkat lunak "tidak stabil" dan ketika semua diuji mereka menandainya stabil, hanya setelah itu pengguna normal dapat memutakhirkan paket, jadi jika orang yang bertanya kepada Anda adalah pengguna normal adalah 90% aman bahwa perangkat lunak diuji dengan baik .

Jadi siapa itu, komunitas, dan kemudian apa yang seharusnya menjadi pendekatan umum, kita perlu perangkat lunak bekerja bersama, dan tidak merusak sistem, itu sebabnya kami mencoba mengikuti beberapa standar seperti Filesystem Hierarchy Standard .

Christopher Díaz Riveros
sumber