Rumah >Tutorial sistem >LINUX >Kajian awal tentang rangka kerja pemangkasan kernel Linux
Disebabkan ketidakstabilan kernel sistem pengendalian, ketepatan masa yang lemah, isu integriti, dan keperluan untuk campur tangan manual, teknologi pemangkasan kernel Linux tidak digunakan secara meluas. Selepas memahami batasan teknologi sedia ada, kami cuba mencadangkan rangka kerja jahitan kernel Linux, yang mungkin dapat menyelesaikan masalah ini.
Sekitar tahun 2000, pengekod lama itu masih sangat muda Pada masa itu, dia berharap untuk menggunakan Linux sebagai sistem pengendalian telefon bimbit, jadi dia mendapat idea untuk menjahit kernel dan membantu dalam latihan kesannya agak baik, dan dia sudah boleh melaksanakan telefon bimbit pada PDA. Lebih daripada 20 tahun telah berlalu, dan Linux telah banyak berubah, dan teknologi dan kaedah pemangkasan kernel juga sangat berbeza.
Pemangkasan kernel Linux adalah untuk mengurangkan kod kernel yang tidak diperlukan dalam aplikasi sasaran, yang mempunyai faedah yang ketara dari segi keselamatan dan prestasi (masa but cepat dan jejak memori yang berkurangan). Walau bagaimanapun, teknologi pemangkasan isirong sedia ada mempunyai hadnya Adakah terdapat kaedah rangka kerja untuk pemangkasan isirong?
1. Mengenai pemangkasan isirong
Dalam beberapa tahun kebelakangan ini, sistem pengendalian Linux telah berkembang dalam kerumitan dan skala. Walau bagaimanapun, aplikasi biasanya hanya memerlukan sebahagian daripada fungsi OS, dan banyak keperluan aplikasi membawa kepada kernel Linux yang kembung. Kembung kernel sistem pengendalian juga membawa kepada risiko keselamatan, masa but yang lebih lama dan peningkatan penggunaan memori.
Dengan populariti penservitan dan perkhidmatan mikro, keperluan untuk jahitan kernel telah dibangkitkan lagi. Dalam senario ini, mesin maya menjalankan aplikasi kecil Setiap aplikasi selalunya "mikro" dan mempunyai jejak kernel yang kecil Beberapa teknologi virtualisasi menyediakan kernel Linux yang paling mudah untuk aplikasi sasaran.
Memandangkan kerumitan sistem pengendalian, menyesuaikan kernel dengan ciri kernel memilih tangan agak tidak praktikal. Contohnya, Linux mempunyai lebih 14,000+ pilihan konfigurasi (sehingga v4.14), dengan beratus-ratus pilihan baharu diperkenalkan setiap tahun. Konfigurator kernel (seperti KConfig) hanya menyediakan antara muka pengguna untuk memilih pilihan konfigurasi. Memandangkan kebolehgunaan yang lemah dan dokumentasi yang tidak lengkap, adalah sukar bagi pengguna untuk memilih konfigurasi kernel yang minimum dan praktikal.
Teknik pemangkasan isirong sedia ada biasanya mengikut tiga langkah:
Pacuan konfigurasi ialah pendekatan umum untuk pemangkasan isirong Kebanyakan alat sedia ada menggunakan teknik dipacu konfigurasi kerana ia adalah salah satu daripada beberapa teknologi yang boleh menghasilkan biji yang stabil. Muat semula kernel yang didorong oleh konfigurasi mengurangkan kod kernel berdasarkan ciri-ciri fungsian Pilihan konfigurasi sepadan dengan kefungsian kernel yang dipangkas hanya mengandungi fungsi yang diperlukan untuk menyokong beban kerja aplikasi sasaran.
Walau bagaimanapun, walaupun teknik pemangkasan isirong sangat menarik dari segi keselamatan dan prestasi, ia tidak digunakan secara meluas dalam amalan. Ini bukan disebabkan oleh kekurangan permintaan, malah banyak penyedia awan mengekodkan kernel Linux untuk mengurangkan kod, tetapi secara amnya tidak berkesan seperti teknik pemangkasan kernel.
2. Had teknologi pemangkasan isirong sedia ada
Teknologi pemangkasan isirong sedia ada mempunyai lima batasan utama.
Tidak kelihatan semasa fasa but. Teknik sedia ada hanya boleh bermula selepas but kernel dan bergantung pada ftrace, jadi tiada cara untuk melihat kod kernel yang dimuatkan semasa fasa but. Jika modul kritikal tiada daripada kernel, kernel selalunya gagal untuk but, dan sejumlah besar ciri fungsi kernel hanya boleh ditangkap dengan memerhatikan fasa but. Selain itu, isu prestasi dan keselamatan juga hanya dimuatkan pada masa but (contohnya, CONFIGSCHEDMC dan CONFIGSECURITYNETWORK untuk sokongan berbilang teras), mengakibatkan prestasi dan keselamatan berkurangan.
Kekurangan sokongan pantas untuk penggunaan aplikasi. Menggunakan alatan sedia ada, menggunakan aplikasi baharu yang disesuaikan untuk kernel memerlukan melengkapkan tiga langkah mengesan, menganalisis dan memasang. Proses ini memakan masa dan boleh mengambil masa berjam-jam atau bahkan berhari-hari, menghalang ketangkasan penggunaan aplikasi.
Saiz zarah lebih kasar. Menggunakan ftrace hanya boleh mengesan kod kernel pada tahap fungsi, dan butirannya terlalu kasar untuk mengesan pilihan konfigurasi yang mempengaruhi kod dalam fungsi.
Liputan tidak lengkap. Oleh kerana pengesanan dinamik digunakan, beban kerja aplikasi diperlukan untuk memacu pelaksanaan kod kernel untuk memaksimumkan liputan. Walau bagaimanapun, liputan penanda aras adalah mencabar, dan jika aplikasi mempunyai kod kernel yang tidak diperhatikan semasa jejak, kernel yang dipangkas mungkin ranap pada masa jalan.
Tiada perbezaan antara kebergantungan pelaksanaan dan mungkin terdapat lebihan. Malah kod yang mungkin sebenarnya tidak perlu dilaksanakan mungkin disertakan dalam fungsi kernel, contohnya, ia mungkin memulakan sistem fail kedua.
Tiga had pertama boleh diatasi dan boleh ditangani melalui reka bentuk dan perkakas yang dipertingkatkan, manakala dua had terakhir tidak dapat dielakkan dan memerlukan usaha melangkaui teknologi khusus.
3. Konfigurasi kernel Linux
3.1 Pilihan Konfigurasi
Konfigurasi kernel terdiri daripada satu set pilihan konfigurasi. Modul kernel boleh mempunyai berbilang pilihan, setiap satu mengawal kod yang akan dimasukkan dalam binari kernel akhir.
Pilihan konfigurasi mengawal butiran berbeza kod kernel, seperti penyataan dan fungsi yang dilaksanakan oleh prapemproses C, dan fail objek yang dilaksanakan berdasarkan Makefiles. Prapemproses C memilih blok kod berdasarkan #ifdef/#ifndef, dan pilihan konfigurasi digunakan sebagai takrifan makro untuk menentukan sama ada blok kod bersyarat tersebut disertakan dalam kernel yang disusun, sama ada pada butiran penyata atau kebutiran fungsi. Makefile digunakan untuk menentukan sama ada fail objek tertentu disertakan dalam kernel yang disusun Contohnya, CONFIG_CACHEFILES ialah pilihan konfigurasi dalam Makefile.
Pilihan konfigurasi peringkat penyata tidak boleh dikenal pasti melalui pengesanan peringkat fungsi yang digunakan oleh alat penyesuaian kernel sedia ada. Malah, kira-kira 30% daripada prapemproses C dalam Linux 4.14 adalah pilihan peringkat penyata.
Dengan pertumbuhan pesat kod kernel dan ciri fungsi, bilangan pilihan konfigurasi dalam kernel juga meningkat dengan pesat, dengan kernel Linux 3.0 dan ke atas mempunyai lebih daripada 10,000 pilihan konfigurasi.
3.2. Bahasa konfigurasi
Inti Linux menggunakan bahasa konfigurasi KConfig untuk mengarahkan pengkompil kod yang perlu disertakan dalam kernel yang dihimpun, membenarkan takrifan pilihan konfigurasi dan kebergantungan antara mereka.
Nilai pilihan konfigurasi dalam KConfig mungkin bool, tristate atau malar. bool bermaksud bahawa kod itu sama ada disusun secara statik ke dalam binari kernel atau dikecualikan, manakala tristate membenarkan kod untuk disusun ke dalam modul teras boleh dimuatkan, iaitu objek kendiri yang boleh dimuatkan pada masa jalan. pemalar boleh memberikan rentetan atau nilai angka untuk pembolehubah kod kernel. Satu pilihan boleh bergantung pada pilihan lain, dan KConfig menggunakan proses rekursif dengan memilih dan membatalkan kebergantungan secara rekursif. Konfigurasi kernel terakhir mempunyai kebergantungan yang sah, tetapi mungkin berbeza daripada input pengguna.
3.3. Templat konfigurasi
Inti Linux disertakan dengan banyak templat konfigurasi buatan tangan. Walau bagaimanapun, disebabkan sifat templat konfigurasi berkod keras dan keperluan untuk campur tangan manual, ia tidak boleh disesuaikan dengan platform perkakasan yang berbeza dan tidak memahami keperluan aplikasi. Sebagai contoh, kernel yang dibina dengan tinyconfig tidak boleh boot pada perkakasan standard, apatah lagi menyokong aplikasi lain. Sesetengah alat menganggap localmodconfig sebagai konfigurasi minimum, walau bagaimanapun, localmodconfig mempunyai had yang sama seperti templat konfigurasi statik, ia tidak mendayakan pilihan konfigurasi prapemproses peringkat penyataan atau tahap fungsi C, dan ia tidak mengendalikan modul yang boleh dimuatkan.
Templat kvmconfig dan xenconfig disesuaikan untuk kernel yang berjalan pada KVM dan Xen. Mereka menyediakan pengetahuan domain seperti persekitaran virtualisasi dan perkakasan asas.
3.4 Konfigurasi kernel Linux dalam awan
Linux ialah kernel sistem pengendalian yang dominan dalam perkhidmatan awan, dan pembekal awan telah meninggalkan kernel Linux biasa sedikit sebanyak. Penyesuaian oleh vendor awan selalunya dicapai dengan mengalih keluar modul kernel boleh dimuatkan secara langsung Masalah dengan pemangkasan binari modul kernel secara manual ialah kebergantungan mungkin dilanggar. Yang penting, teras boleh disesuaikan lagi berdasarkan keperluan aplikasi. Sebagai contoh, kernel Amazon FireCracker ialah mesin maya kecil yang direka bentuk untuk berfungsi sebagai perkhidmatan, menggunakan HTTPD sebagai aplikasi sasaran, membolehkan pengecilan jahitan kernel yang lebih besar sambil memastikan peningkatan fungsi dan prestasi.
4. Pemikiran tentang pemangkasan isirong
Untuk had 1, adakah mungkin untuk menggunakan pengesanan peringkat arahan daripada QEMU untuk mencapai keterlihatan fasa but? Dengan cara ini, kod kernel boleh dikesan dan dipetakan kepada pilihan konfigurasi kernel. Memandangkan fasa but adalah penting untuk menghasilkan kernel boleh boot, gunakan ciri pengesanan yang disediakan oleh hypervisor untuk mendapatkan kebolehmerhatian hujung ke hujung dan menghasilkan kernel yang stabil.
Untuk had dua, berdasarkan pengalaman dalam pembelajaran mendalam NLP, gabungan kaedah luar talian dan dalam talian boleh digunakan Memandangkan satu set aplikasi sasaran, konfigurasi Apl boleh dijana secara langsung di luar talian, dan kemudian digabungkan dengan konfigurasi garis dasar untuk membentuk satu. konfigurasi kernel lengkap Ini menghasilkan kernel terpotong. Kebolehkomposan ini membolehkan kernel baharu dibina secara berperingkat dengan menggunakan semula konfigurasi aplikasi dan fail yang dibina sebelum ini (seperti modul kernel). Jika konfigurasi aplikasi sasaran diketahui, pemangkasan kernel boleh dicapai dalam berpuluh-puluh saat.
Untuk had ketiga, menggunakan pengesanan peringkat arahan boleh menyelesaikan pilihan konfigurasi kernel yang mengawal ciri fungsi dalaman fungsi. Overhed pengesanan peringkat arahan boleh diterima untuk menjalankan suite ujian dan penanda aras prestasi.
Berkenaan had empat, had asas menggunakan pengesanan dinamik ialah ketidaksempurnaan suite ujian dan penanda aras Banyak suite ujian aplikasi sumber terbuka mempunyai liputan kod yang rendah. Menggabungkan beban kerja yang berbeza untuk memacu aplikasi boleh mengurangkan had ini sedikit sebanyak.
Untuk had lima, maklumat khusus domain boleh digunakan untuk memuatkan lagi kernel dengan mengalih keluar modul kernel yang dilaksanakan dalam kernel garis dasar tetapi tidak diperlukan semasa menjalankan penggunaan sebenar. Mengambil Xen dan KVM sebagai contoh, saiz kernel boleh dikurangkan lagi berdasarkan templat konfigurasi xenconfig dan kvmconfig. Pemangkasan kernel berorientasikan aplikasi boleh mengurangkan lagi saiz kernel dan juga menyesuaikan kod kernel secara meluas.
5 Kajian Awal tentang Rangka Kerja Keratan Kernel
Prinsip rangka kerja jahitan kernel tidak berubah, ia masih menjejaki penggunaan kernel beban kerja aplikasi sasaran untuk menentukan pilihan kernel yang diperlukan.
5.1 Ciri teras rangka kerja keratan kernel
Rangka kerja keratan kernel mungkin mempunyai ciri-ciri berikut:
Keterlihatan hujung ke hujung. Manfaatkan keterlihatan hypervisor untuk mencapai pemerhatian hujung ke hujung, anda boleh menjejaki fasa but kernel dan beban kerja aplikasi, anda boleh cuba membina rangka kerja jahitan untuk kernel Linux berdasarkan QEMU.
Kebolehkomposan. Idea teras adalah untuk membolehkan konfigurasi kernel digabungkan dengan membahagikannya kepada beberapa set konfigurasi, kedua-duanya untuk but kernel pada persekitaran penggunaan tertentu dan untuk pilihan konfigurasi yang diperlukan oleh aplikasi sasaran. Set konfigurasi terbahagi kepada dua jenis: konfigurasi garis dasar dan konfigurasi aplikasi. Konfigurasi garis dasar tidak semestinya set konfigurasi minimum yang diperlukan untuk but pada perkakasan tertentu, sebaliknya satu set pilihan konfigurasi yang dijejaki semasa fasa but. Konfigurasi garis dasar boleh digabungkan dengan satu atau lebih konfigurasi aplikasi untuk menghasilkan konfigurasi kernel terakhir.
Kebolehgunaan semula. Kedua-dua garis dasar dan konfigurasi aplikasi boleh disimpan dalam pangkalan data dan digunakan semula selagi persekitaran penggunaan dan binari aplikasi kekal tidak berubah. Kebolehgunaan semula ini mengelakkan larian berulang bagi beban kerja pengesanan dan menjadikan penciptaan set konfigurasi sebagai kerja sekali sahaja.
Menyokong penggunaan aplikasi pantas. Memandangkan persekitaran penggunaan dan aplikasi sasaran, rangka kerja jahitan kernel boleh mendapatkan semula konfigurasi garis dasar dan konfigurasi aplikasi dengan cekap, menggabungkannya ke dalam konfigurasi kernel yang diperlukan, dan kemudian menggunakan konfigurasi yang terhasil untuk membina kernel usang.
Pengesanan konfigurasi berbutir halus, pengesanan berasaskan balas program untuk mengenal pasti pilihan konfigurasi berdasarkan corak kod peringkat rendah.
5.2 Seni Bina Rangka Kerja Keratan Inti
Rangka kerja jahitan kernel harus mempunyai kedua-dua sistem luar talian/dalam talian Seni bina adalah seperti rajah di bawah:
Melalui sistem luar talian, penjejak konfigurasi digunakan untuk menjejak dan merekodkan pilihan konfigurasi yang diperlukan oleh persekitaran penggunaan dan aplikasi. Penjana konfigurasi memproses pilihan ini ke dalam konfigurasi garis dasar dan pilihan konfigurasi aplikasi dan menyimpannya dalam pangkalan data konfigurasi.
Melalui sistem dalam talian, penggabung konfigurasi menggunakan konfigurasi garis dasar dan konfigurasi aplikasi untuk menjana konfigurasi kernel sasaran, dan kemudian pembina kernel menjana kernel Linux yang disesuaikan
5.3 Kebolehlaksanaan Rangka Kerja Keratan Kernel
Penjejakan Konfigurasi
Penjejak konfigurasi rangka kerja jahitan kernel menjejaki pilihan konfigurasi semasa pelaksanaan kernel didorong oleh aplikasi sasaran, menggunakan daftar PC untuk menangkap alamat arahan pelaksana. Untuk memastikan bahawa PC yang dijejaki adalah milik aplikasi sasaran dan bukan proses lain (contohnya, perkhidmatan latar belakang), skrip init tersuai boleh digunakan, yang tidak memulakan sebarang aplikasi lain dan hanya memasang sistem fail /tmp, / proc dan /sys, dayakan antara muka rangkaian (lo dan eth0), dan akhirnya mulakan aplikasi terus selepas but kernel.
Pada masa yang sama, mungkin perlu untuk melumpuhkan pemuatan rawak konfigurasi ruang alamat kernel supaya alamat boleh dipetakan dengan betul kepada kod sumber tetapi masih tersedia dalam kernel yang dipangkas. Kemudian, petakan PC kepada pernyataan kod sumber. Modul kernel yang boleh dimuatkan memerlukan pemprosesan tambahan Anda boleh menggunakan /proc/module untuk mendapatkan alamat permulaan setiap modul kernel yang dimuatkan dan memetakan PC ini kepada pernyataan dalam binari modul kernel. Alternatifnya ialah menggunakan localmodconfig, bagaimanapun, localmodconfig hanya menyediakan maklumat pada tahap butiran modul.
Akhir sekali, atribut pernyataan itu kepada konfigurasi. Untuk mod berasaskan prapemproses C, fail sumber C dihuraikan untuk mengekstrak arahan prapemproses, dan kemudian menyemak sama ada pernyataan dalam arahan ini dilaksanakan. Untuk mod berasaskan Makefile, tentukan sama ada pilihan konfigurasi harus dipilih pada butiran fail objek. Contohnya, jika mana-mana fail yang sepadan (bind.o, achefiles.o, atau daemon.o) digunakan, CONFIG_CACHEFILES perlu dipilih.
Penjanaan konfigurasi
Konfigurasi garis dasar dan konfigurasi aplikasi dijana dalam sistem luar talian. Bagaimana untuk menilai akhir fasa permulaan? Fungsi stub kosong boleh dipetakan ke segmen alamat yang dipratentukan menggunakan mmap Skrip init yang diterangkan di atas memanggil fungsi stub sebelum menjalankan aplikasi sasaran, jadi adalah mungkin untuk mengenal pasti akhir fasa but berdasarkan alamat yang dipratentukan dalam PC. jejak.
Rangka kerja jahitan kernel memperoleh pilihan konfigurasi daripada aplikasi dan menapis pilihan berkaitan perkakasan yang diperhatikan semasa fasa but. Ciri perkakasan ini ditakrifkan berdasarkan lokasinya dalam kod sumber kernel. Kemungkinan tidak boleh diketepikan bahawa pilihan berkaitan perkakasan hanya boleh diperhatikan semasa pelaksanaan aplikasi, cth. ia memuatkan pemacu peranti baharu seperti yang diperlukan.
Tatarajah dan pemasangan
Menggabungkan konfigurasi garis dasar dengan satu atau lebih konfigurasi aplikasi menghasilkan konfigurasi akhir yang digunakan untuk membina kernel. Pertama, semua pilihan konfigurasi digabungkan ke dalam konfigurasi awal, dan kemudian kebergantungan di antara mereka diselesaikan menggunakan penyelesai SAT. Cuba modelkan kebergantungan konfigurasi sebagai masalah kepuasan Boolean, dengan konfigurasi yang sah ialah konfigurasi yang memenuhi semua kebergantungan yang ditentukan antara pilihan konfigurasi. Memodelkan konfigurasi kernel adalah berdasarkan penyelesai SAT kerana KConfig tidak memastikan bahawa semua pilihan yang dipilih disertakan, sebaliknya menyahpilih kebergantungan yang tidak dipenuhi.
Pembinaan Inti Sarung
KBuild untuk Linux membina kernel yang disesuaikan berdasarkan pilihan konfigurasi yang dipasang menggunakan make moden boleh mengoptimumkan masa binaan dan juga boleh menyimpan hasil binaan sebelumnya (cth., fail objek dan modul kernel) untuk mengelakkan kompilasi dan pautan yang berlebihan. Apabila perubahan konfigurasi berlaku, hanya modul yang membuat perubahan pada pilihan konfigurasi dibina semula, manakala fail lain boleh digunakan semula.
6 Disebabkan ketidakstabilan kernel sistem pengendalian, ketepatan masa yang lemah, isu integriti, dan keperluan untuk campur tangan manual, teknologi pemangkasan kernel Linux tidak digunakan secara meluas. Selepas memahami batasan teknologi sedia ada, kami cuba mencadangkan rangka kerja jahitan kernel Linux, yang mungkin dapat menyelesaikan masalah ini.
Atas ialah kandungan terperinci Kajian awal tentang rangka kerja pemangkasan kernel Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!