• Linux çekirdeğini yapılandırma ve derleme. Linux çekirdeğinin anatomisi

    Bir telefon için bir Linux çekirdeği imajınız olduğunu hayal edin. Android tabanlı, ancak karşılık gelen kaynak veya çekirdek başlık dosyalarına sahip değilsiniz. Çekirdeğin modül yükleme desteğine sahip olduğunu (neyse ki) ve o çekirdek için bir modül oluşturmak istediğinizi düşünün. Bir kaç tane var Iyi sebepler, neden kaynaklardan yeni bir çekirdek oluşturmuyorsunuz ve onu bitirmiyorsunuz (örneğin, derlenmiş çekirdek bazılarını desteklemiyor) önemli cihaz LCD veya dokunmatik ekran gibi). Sürekli değişen Linux çekirdeği ABI ve kaynak ve başlık eksikliği ile çıkmaza girdiğinizi düşünebilirsiniz.

    Aslında, diğer başlık dosyalarını (sahip olduğunuz çekirdek görüntüsünü oluşturmak için kullanılanlardan - yaklaşık Şerit) kullanarak bir çekirdek modülü oluşturursanız, başlık dosyalarının nasıl olduğuna bağlı olarak modül hatalarla yüklenemez. gerekenlerden farklıdır. Kötü imzalardan, kötü sürümlerden ve diğer şeylerden şikayet edebilir.

    çekirdek yapılandırması

    İlk adım, çekirdek kaynağını çekirdek görüntüsüne mümkün olduğunca yakın bulmaktır. Muhtemelen doğru konfigürasyonu elde etmek, tüm modül oluşturma sürecinin en zor kısmıdır. /proc/version adresinden okunabilen çekirdek sürüm numarasıyla başlayın. Benim gibi bir Android cihaz için bir modül oluşturuyorsanız, cihazınıza en yakın olan Code Aurora, Cyanogen veya Android'den Android çekirdeklerini deneyin. Benim durumumda, msm-3.0 çekirdeğiydi. Çekirdek görüntüsü sürümünüzle tam olarak aynı kaynak sürümü aramanız gerekmediğini unutmayın. Küçük sürüm farklılıkları büyük olasılıkla bir engel olmayacaktır. Kullanılabilir çekirdek görüntüsünün sürümü 3.0.8 iken, çekirdek kaynakları 3.0.21'i kullandım. Ancak, 3.0.x çekirdek görüntünüz varsa, 3.1 çekirdek kaynaklarını kullanmaya çalışmayın.

    Sahip olduğunuz çekirdek görüntüsü bir /proc/config.gz dosyası sağlayacak kadar nazikse, oradan başlayabilirsiniz, aksi takdirde varsayılan yapılandırmayla başlamayı deneyebilirsiniz, ancak bu durumda son derece dikkatli olmanız gerekir (her ne kadar ben varsayılan yapılandırmayı kullanmanın ayrıntılarına girmeyeceğim çünkü buna gerek kalmayacak kadar şanslıyım, aşağıda doğru yapılandırmanın neden bu kadar önemli olduğuna dair bazı ayrıntılar olacak).

    PATH ortam değişkeninizdeki yollardan birinde arm-eabi-gcc'ye sahip olduğunuzu ve terminalin çekirdek kaynak klasöründe açık olduğunu varsayarak, çekirdeği yapılandırmaya ve başlık dosyalarını ve komut dosyalarını kurmaya başlayabilirsiniz:

    $ mkdir build $ gunzip config.gz > build/.config # veya ne hazırlayacaksa .config $ make Silentoldconfig headers_install betikleri hazırla ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=`adb shell uname - r`
    Silentoldconfig derlemesi büyük olasılıkla belirli seçenekleri etkinleştirmek isteyip istemediğinizi soracaktır. Varsayılanları seçebilirsiniz, ancak bu işe yaramayabilir.

    KERNELRELEASE içinde başka herhangi bir şey kullanabilirsiniz, ancak bu, modülü yüklemeyi planladığınız çekirdeğin sürümüyle tam olarak eşleşmelidir.

    Basit bir modül yazmak

    Boş bir modül oluşturmak için iki dosya oluşturmanız gerekir: source ve Makefile . Aşağıdaki kodu hello.c içinde ayrı bir dizine yerleştirin:

    #katmak /* Tüm modüller için gereklidir */ #include /* KERN_INFO için gerekli */ #include /* Makrolar için gerekli */ static int __init hello_start(void) ( printk(KERN_INFO "Merhaba dünya\n"); return 0; ) static void __exit hello_end(void) ( printk(KERN_INFO "Hoşçakal dünya\n"); ) module_init(hello_start); module_exit(merhaba_son);
    Aşağıdaki metni aynı dizindeki bir Makefile dosyasına yerleştirin:

    Obj-m = merhaba.o
    Modülün montajı oldukça basittir, ancak bu aşama ortaya çıkan modül yüklenemez.

    Modül Montajı

    -de normal montaj kernel derleme sistemi, içeriği çeşitli sorunlara yol açabilen bir hello.mod.c dosyası oluşturur:

    MODULE_INFO(vermagic, VERMAGIC_STRING);
    VERMAGIC_STRING değeri, çekirdek oluşturma sistemi tarafından oluşturulan include/generated/utsrelease.h dosyasında bulunan UTS_RELEASE makrosu tarafından belirlenir. Varsayılan olarak bu değer, çekirdek sürümü ve git deposunun durumu tarafından belirlenir. Bu, çekirdeği yapılandırırken KERNELRELEASE'in yüklediği şeydir. VERMAGIC_STRING, çekirdek sürümüyle eşleşmiyorsa, modülün yüklenmesi dmesg'de şuna benzer bir mesajla sonuçlanır:

    Merhaba: sihirli sürüm "3.0.21-perf-ge728813-00399-gd5fa0c9", "3.0.8-perf" olmalıdır
    Ayrıca burada modül yapısının tanımına da sahibiz:

    Yapı modülü __this_module __attribute__((section(".gnu.linkonce.this_module"))) = ( .name = KBUILD_MODNAME, .init = init_module, #ifdef CONFIG_MODULE_UNLOAD .exit = cleanup_module, #endif .arch = MODULE_ARCH_INIT, );
    Bu tanım kendi başına zararsız görünür, ancak include/linux/module.h içinde tanımlanan yapı modülü yapısı hoş olmayan bir sürprizle gelir:

    Yapı modülü ( (...) #ifdef CONFIG_UNUSED_SYMBOLS (...) #endif (...) /* Başlangıç ​​işlevi. */ int (*init)(void); (...) #ifdef CONFIG_GENERIC_BUG (.. .) #endif #ifdef CONFIG_KALLSYMS (...) #endif (...) (... çok daha fazla ifdef ...) #ifdef CONFIG_MODULE_UNLOAD (...) /* Destruction function.*/ void (*çıkış) (geçersiz);(...) #endif(...) )
    Bu, başlangıç ​​işaretçisinin doğru yerde olması için, CONFIG_UNUSED_SYMBOLS'un çekirdek görüntümüzün kullandığıyla eşleşecek şekilde ayarlanması gerektiği anlamına gelir. Çıkış işaretçisine gelince, bunlar CONFIG_GENERIC_BUG , CONFIG_KALLSYMS , CONFIG_SMP , CONFIG_TRACEPOINTS , CONFIG_JUMP_LABEL , CONFIG_TRACING , CONFIG_EVENT_TRACING , CONFIG_FTRACE_MCOUNT_RECORD ve CONFIG_MODULE_UNLOAD .

    Neden genellikle çekirdeğimizin inşa edildiği başlık dosyalarının tamamen aynısını kullanması gerektiğini anlamaya başlıyor musunuz?

    Statik yapı yapısı modversion_info ____versions __used __attribute__((section("__versions"))) = ( ( 0xsomehex, "module_layout" ), ( 0xsomehex, "__aeabi_unwind_cpp_pr0" ), ( 0xsomehex, "printk" ), );
    Bu tanımlar, başlık dosyalarına göre oluşturulan Module.symvers dosyasından alınmıştır.

    Bu tür her giriş, modülün gerektirdiği sembolü ve sembolün sahip olması gereken imzayı temsil eder. İlk karakter olan module_layout struct modülünün neye benzediğine, yani daha önce bahsedilen yapılandırma seçeneklerinin etkinleştirilmesine bağlıdır. İkincisi, __aeabi_unwind_cpp_pr0, ARM ABI'ye özgü bir işlevdir ve sonuncusu, printk işlev çağrılarımız içindir.

    Her sembolün imzası, o işlevin çekirdek koduna ve çekirdeği oluşturmak için kullanılan derleyiciye bağlı olarak farklılık gösterebilir. Bu, çekirdeği ve o çekirdeğin modüllerini kaynaktan oluşturursanız ve ardından örneğin printk işlevini uyumlu bir şekilde bile değiştirdikten sonra çekirdeği yeniden oluşturursanız, orijinal olarak oluşturulmuş modüllerin yeni çekirdekle yüklenmeyeceği anlamına gelir.

    Bu nedenle, sahip olduğumuz çekirdek görüntüsünün oluşturduğumuz kaynaklara ve yapılandırmaya yeterince yakın bir çekirdek oluşturursak, çekirdek görüntümüzdeki imzaların aynısını alamama ihtimalimiz vardır ve bu, yükleme sırasında lanetlenir. modül:

    Merhaba: symbol_name sembolünün sürümü hakkında aynı fikirde değil
    Bu, elimizde olmayan çekirdek görüntüsüyle eşleşen doğru Module.symvers dosyasına ihtiyacımız olduğu anlamına gelir.

    Çekirdeği keşfetmek

    Çekirdek bu kontrolleri modüller yüklendiğinde yaptığı için, dışa aktardığı sembollerin ve karşılık gelen imzaların bir listesini de içerir. Çekirdek bir modülü yüklediğinde, kendi sembol tablosunda (veya modülün kullandığı diğer modül sembol tablolarında) bulması ve karşılık gelen imzaları kontrol etmesi için modülün ihtiyaç duyduğu tüm sembolleri gözden geçirir.

    çekirdek kullanır sonraki işlev sembol tablonuzda arama yapmak için (kernel/module.c'de):

    Bool every_symbol_section(bool (*fn)(const struct symsearch *arr, struct module *owner, void *data), void *data) ( struct module *mod; static const struct symsearch arr = ( ( __start___ksymtab, __stop___ksymtab, __start__kcrctab, NOT_GPL_ONLY) , false ) D_SYMBOLS ( __start___ksymtab_unused, __stop___ksymtab_unused, __start___kcrctab_unused, NOT_GPL_ONLY, true ), ( __start___ksymtab_unused_gpl, __stop___ksymtab_unused_gpl, __start___kcrctab_unused_gpl, GPL_ONLY , true ), #endif ); if (each_symbol_in_section(dizi, ARRAY_SIZE(dizi), NULL, fn, veri)) doğru dönüş; (...)
    Bu işlevde kullanılan yapı include/linux/module.h'de tanımlanmıştır:

    Struct symsearch ( const struct kernel_symbol *start, *stop; const unsigned long *crcs; enum ( NOT_GPL_ONLY, GPL_ONLY, WILL_BE_GPL_ONLY, ) lisans; bool unused; );
    Not: verilen kodçekirdek son dört yılda pek değişmedi.

    Yukarıda every_symbol_section işlevinde sahip olduğumuz üç (veya CONFIG_UNUSED_SYMBOLS yapılandırması etkinleştirildiğinde beş) alandır, her biri simge tablosunun başlangıcını, sonunu ve iki bayrağı içerir.

    Bu veriler statik ve kalıcıdır, bu da çekirdek ikili dosyasında olduğu gibi görüneceği anlamına gelir. Çekirdek adres alanındaki üç işaretçinin ardışık üç dizisi için çekirdeği tarayarak ve ardından every_symbol_section içindeki tanımlardan tamsayı değerleri alarak, sembol ve imza tablolarının konumunu belirleyebilir ve Module.symvers dosyasını çekirdekten yeniden oluşturabiliriz. ikili.

    Ne yazık ki, günümüzde çoğu çekirdek sıkıştırılmıştır (zImage), bu nedenle basit bir arama sıkıştırılmış görüntü imkansız. Sıkıştırılmış çekirdek, aslında sıkıştırılmış bir akış tarafından takip edilen küçük bir ikili dosyadır. Sıkıştırılmış akışı bulmak ve ondan sıkıştırılmış görüntüyü almak için zImage dosyasını tarayabilirsiniz.

    Etiketler: Etiket ekle

    Herhangi bir modern işletim sistemini yüklemek karmaşık, çok aşamalı bir süreçtir. Linux dağıtımına bağlı olarak, önyükleme işlemi biraz değişebilir, ancak genel şema yaklaşık olarak aynıdır ve aşağıdaki aşamalardan oluşur:

      BIOS kodu yürütülüyor. Ekipman başlatma. Seçenek önyüklenebilir medya. Önyükleyici RAM'ini okuma ve kontrolü ona aktarma. Önyükleyici genellikle diskte bir sektör kaplar ve boyut olarak 384 baytla sınırlıdır (512 bayt disk sektörüdür, eksi 128 bayt bölüm tablosudur). türüne bağlı olarak Önyükleme aygıtıÖnyükleme sektörü farklı yerlerden okunabilir:

      • Bir disketten veya sabit sürücüden önyükleme yaparken, önyükleyici fiziksel ortamın ilk sektöründen okunur;
      • CD/DVD'den önyükleme yaparken - CD veri yapısında bulunan önyükleme diski görüntüsünün ilk sektöründen;
      • Ağ önyüklemesi için, sunucudan tftp protokolü aracılığıyla indirilen önyükleme diski görüntüsünün ilk sektöründen.

      Bu aşamadaki ekranda şu bilgiler görüntülenir: BIOS sürümleri, bulunan RAM'i kontrol etme işlemi sabit diskler. Önyükleyici kodu, bilgi yazdırma işlevini içermek için çok küçük, ancak kısa mesajlar hatalar hakkında.

      Ana önyükleyicinin (GRUB, LiLo, NTLDR) belleğini okuma ve kodunu çalıştırma. Önyükleyici çok küçük olduğundan, kural olarak sektörler, ana yükleyicinin kodunun okunması gereken koduna sabit kodlanmıştır. Bir sabit sürücüde bu, MBR ile diskteki ilk bölüm (sıfır izi) arasındaki boşluk olabilir. Bir diskette ve bir CD'den ve bir ağ üzerinden önyükleme yaparken bir disk görüntüsünü kullanırken, ana önyükleyici birincil önyükleyiciden hemen sonra yer alabilir ve görüntünün tüm hacmini kaplayabilir.

      Önyükleme çekirdeği (vmlinuz) ve yardımcı disk görüntüsü (initrd). Ana yükleyici, dosya sistemindeki yapılandırma dosyasını, çekirdek görüntü dosyasını ve yardımcı disk görüntü dosyasını bulabilecek kadar akıllıdır. Gerekirse, çekirdek görüntüsü RAM'e açılır, yardımcı disk görüntüsünün adresi de dahil olmak üzere önyükleyiciden çekirdeğe iletilen parametreleri içeren bir bellek alanı oluşturulur.

      Yardımcı disk, çekirdeğin modüler yapısı nedeniyle modern Linux sistemleri tarafından gereklidir ve ana dosya sistemine erişim sağlamak için gerekli sürücüleri (ATA, NFS, RAID, vb.) içerir.

      Bu aşamada, yardımcı sürücünün kök dizininde bulunan init betiğinin yürütüldüğü pid=1 ile bir işlem oluşturulur. Çekirdeğe iletilen seçenekler aslında init'e komut satırı argümanları olarak aktarılır.

      Komut dosyası indirme içerir gerekli sürücülerçekirdek modülleri olarak, bu modüllere erişmek için /dev dizininde geçici aygıt dosyaları oluşturmak, RAID'leri ve mantıksal birimleri algılamak ve başlatmak için disk bölümlerini taramak. Mantıksal sürücüler başlatıldıktan sonra, root= parametresi tarafından belirtilen kök dosya sistemini bağlama girişiminde bulunulur. Disksiz ağ önyüklemesi durumunda, kök dizini NFS yoluyla bağlama girişiminde bulunulur.

      Ekranda, sürücülerin yüklenmesi ve LVM alt sisteminin sanal birimlerinin aranması hakkında mesajlar görüntülenir. Kök dizini ana dosya sistemine yeniden bağlayarak ve /sbin/init (veya eşdeğeri) ana programını pid=1 ile sürece yükleyerek aşama tamamlanır.

      Klasik UNIX ve Linux'un eski sürümlerinde (yaklaşık 2012'ye kadar), init programı /etc/inittab yapılandırma dosyasını okur, metin konsollarını başlatır ve genellikle /etc/init.d içinde bulunan bir dizi betik kullanarak gerekli hizmetleri başlatır. d dizinleri ve /etc/rc*.d Modern Linux dağıtımlarında, /sbin/init dosyası daha fazlasını içerir modern program hizmetleri başlatın. Bu programların en popüler olanları, bu önyükleme aşamasının süresini önemli ölçüde azaltabilen upstart ve systemd programlarıdır.

      Bu aşamada ekranda servislerin başladığını ve başarı ile ilgili bilgileri gösteren çizgiler görüntülenir. bu süreç( veya ).

    GRUB önyükleyici

    Kurulum diskinden kurtarma moduna önyükleme yapın - Kurtarma modu. Bunu yapmak için, önyükleme sırasında önyükleme isteminde: linux kurtarma girmelisiniz

    Her şey yolunda giderse, ana sistemin kök dizini /mnt/sysimage'a, önyükleme dizini /mnt/sysimage/boot'a bağlanır. Ek olarak, geçerli /proc , /sys ve /dev dizinleri ilgili /mnt/sysimage alt dizinlerine bağlanır. Bu olmazsa, bu işlemleri manuel olarak yapmanız gerekecektir.

    Tüm dizinler bağlandığında, kök dizini değiştirebilirsiniz.

    #bir şeyi mount etmeyi unuttuğunuz ortaya çıkarsa ^D chroot /mnt/sysimage ile çıkabilirsiniz.

    ve initrd'yi yeniden oluştur

    #eski dosyayı kopyala cp -p /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak #yeni bir dracut oluştur -f #eğer çekirdeğin sürümü ana sistemdeki sürüm kurulum diskindeki sürümden farklıysa, açıkça belirtin dracut -f /boot/initramfs-2.6.32-358.el6.x86_64.img 2.6.32-358.el6.x86_64

    #eski dosyayı kopyala cp -p /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.bak #yeni bir tane oluştur mkinitrd -f -v /boot/initrd -$( uname -r).img $(uname -r) #ana sistemdeki kernel sürümü kurulum diskindeki sürümden farklıysa, açıkça belirtin mkinitrd -f -v /boot/initrd-2.6. 18-371.el5.img 2.6.18-371.el5

    cd/sync telinit 6

    Otomatik olarak yüklenmeyen i2o_block sürücüsü (Adaptec 2010S SCSI adaptörü) ile tam örnek. Standart CentOS 6 çekirdeği bu sürücüyü desteklemediği için örnek CentOS 5 üzerinde çalışmaktadır.

    Kurtarma modunda CD'den önyükleme yaptıktan sonra, Linux bölümlerinin bulunamadığını ve bunların manuel olarak monte edilmesi gerektiğini belirten bir mesaj görüntülenir.

    #insmod i2o_block sürücüsünü yükleyin #Her şeyin çalıştığını kontrol edin lsmod .... dmesg ... #dmesg mkdir /dev/i2o mknod /dev/i2o/hda b 80 0 mknod /dev/i2o/ içindeki bilgilere dayalı olarak cihaz dosyaları oluşturun hda1 b 80 1 mknod /dev/i2o/hda2 b 80 2 #Birim Grubunu Etkinleştir lvm vgchange -a y #Birimleri Bağla mkdir /mnt/sysimage mount /dev/mapper/VolGroup00-LogVol00 /mnt/sysimage mount /dev/i2o/hda1 / mnt/sysimage/boot #Mount özel dizinleri mount --bind /proc /mnt/sysimage/proc mount --bind /dev /mnt/sysimage/dev mount --bind /sys /mnt/sysimage/sys

    Ayrıca, talimatlara göre, yalnızca bir disk görüntüsü oluştururken mkinitrd programını belirtmeniz gerekir. ek seçenek--preload=i2o_block ve i2o_block sürücüsünün askıda kalmasına neden oldukları için önceden okuma hizmetlerini devre dışı bırakın:

    chkconfig erken-önceden oku kapalı chkconfig sonra-önceden oku kapalı

    Geçen sefer Linux önyüklendiğinde ne olduğundan bahsetmiştik: ilk olarak, önyükleyici başlar, çekirdeği yükler ve RAM'de geçici bir disk yerleştirir, çekirdek başlatma işlemini başlatır, init gerçek kök diski bulur, bunun yerine çok zor bir çevirme gerçekleştirir - bunun yerine gerçek bir disk üzerindeki geçici bir sanal diskin kök dizinde aynı yere monte edildiğinden, init işlemi bu gerçek diskteki başka bir init'i bu gerçek diskten yükler. Tüm bu işlemlerden sonra UNIX normal çalışma durumuna girer.

    Bu derste, ne olduğunu açıklayacağım klasik program System V stili rc.d betikleriyle birlikte init. System V, ticari UNIX'in üzerine inşa edildiği UNIX'in klasik versiyonudur.

    Adından da anlaşılacağı gibi, rc.d bir dizindir. Böyle bir UNIX geleneği vardır - bir şeyin tüm yapılandırması tek bir dosyaya sığarsa ve config olarak adlandırılırsa, o zaman ana dosyaya bağlı ayrı dosyalara bölündüğünde, aynı ada sahip bir dizin oluştururlar ve buna eklerler. name.d - config.d. d harfi, bunun bir dizin olduğu ve yapılandırma dosyasının yardımcı bölümlerinin burada bulunduğu anlamına gelir. Başlangıç ​​yapılandırma dosyası biçiminin iki geleneği vardır: her yapılandırma ayrıntısını rc.d dizininde ayrı bir dosyada tutan System V değişkeni ve birçok betik ve değişken içeren tek bir /etc/rc dosyasına sahip BSD sistem geleneği. , sistemin davranışından sorumludur.

    Her halükarda sistem başladığında PID=1 ile init adlı programın çalıştığı bir process oluşturuyoruz. Geçen sefer gördüğünüz gibi, eğer init programı öldürülürse, çekirdek paniğe kapılır ve tüm işi durdurur.

    Classic System V init, /etc/inittab dosyasını okur ve bu dosyada yazılan bir dizi yönergeyi yürütür. Inittab, her satırı aslında bir komut veya bir tür davranış kuralı olan bir metin dosyasıdır. init sekmesi şöyle görünür:

    kimlik:3:initdefault:

    si::sysinit:/etc/rc.d/rc.sysinit

    l3:3:bekle:/etc/rc.d/rc3

    ca::ctrlaltdel:/sbin/shutdown -t3 -r şimdi

    Satırın başında bir etiket var. Bu etiketin büyük anlamı nedir, gerçekten anlamıyorum. Bunun basit bir metin olduğunu ve bu kadar olduğunu varsayabiliriz. İkinci öğe, sözde yük seviyesi veya boş bir değerdir. Yük düzeyi, 0 ile 6 arasında tek bir sayı veya virgülle ayrılmış bir sayı listesidir. Sonra biraz aksiyon geliyor. Eylemler şu şekildedir: wait, respawn, sysinit, ctrlaltdel. Başka eylemler de vardır, ancak bunlar en çok kullanılanlardır. Son olarak satırın sonuna yürütülebilir dosyanın adı ve bu komuta iletilmesi gereken argümanlar ile belirli bir komut yazılır.

    Sysinit eylemi, sistem başlangıcında bir kez yürütülür.

    ctrlaltdel eylemi gerçekten bir eylem değildir - bu bir kontrol alt del kısayol işleyicisidir. Basının kendisi sistem çekirdeği tarafından yakalanır ve bununla ilgili bilgiler, belirli bir komutu yürütmesi gereken init işlemine gönderilir. Örneğin, bilgisayarı kapatacak olan kapatma komutu verilebilir. Prensip olarak, buraya başka herhangi bir program yazılabilir, örneğin, alt del kontrolüne bastıktan sonra sistemin tüm terminallerine bir tür mesaj gönderecek olan yankı. şömine konsolu yani

    Bekle eylemi, komutu çalıştırmanız, bitene kadar beklemeniz ve ancak bundan sonra sonraki satırları işlemeye devam etmeniz gerektiği anlamına gelir. Bu tür eylemler paralel olarak çalıştırılabilir mi bilmiyorum. Büyük olasılıkla hayır.

    Yeniden doğma eylemi, programı çalıştırmanız ve tamamlanmasını beklemeden şu adrese gitmeniz gerektiği anlamına gelir: daha fazla eylem. Bu program daha sonra sonlandırılırsa, yeniden başlatılması gerekir.

    Yani, sonuç beklentisiyle tek bir yürütme ve eşzamansız modda çoklu yürütme var - başladılar, bitene kadar beklediler, kelimeleri başlattılar.

    Yük düzeyleri, hangi hizmetlerin yüklendiğini denetlemenizi sağlayan bir kuraldır. Pencerelerdeki en yakın analog, içine yükleniyor güvenli mod, yalnızca sınırlı sayıda sürücü yüklendiğinde ve minimum sayıda hizmet başladığında, hata ayıklama ile önyükleme, her eylem ek olarak günlüğe kaydedildiğinde ve normal tam önyükleme.

    Linux geleneksel olarak 6 önyükleme seçeneğine sahiptir. Bu bölünme oldukça koşulludur.

    0 ve 6 kapalı. 0 - tamamen kapatma ve 6 - yeniden başlatma modu.

    4 genellikle Linux'ta atlanır

    Dört yükleme seviyesi vardır:

    1 - tek kullanıcı modu. Bootloader'a geçerseniz anahtar kelime tek, o zaman tek bir işlemin çalıştığı tek kullanıcı modunda olacağız ve bu sistem yöneticisi kabuğu. Bu mod sistem kurtarma için kullanılır.

    3 - normal çok kullanıcılı metin modu, tüm hizmetler çalışırken, ağ çalışır, tüm sürücüler çalışır.

    2 - ayrıca metin modu, ancak ağ sürücülerini bağlamadan. Gerçek şu ki, geleneksel ağ dosyası nfs sistemi UNIX'te kullanılan , ağ hasarına karşı son derece dayanıklıdır. Dosya sunucusunu kapatırsak veya ağ kablosunu kesersek, nfs ağ dosya sistemi kurtarmak için çok sayıda girişimde bulunur ve bu girişimler o kadar uzun sürer ki, hata mesajının nihayet göründüğü zamanı asla bekleyemezdim. Belki bir saat içinde, belki de 6 saat içinde gerçekleşecek. Tüm bu süre boyunca, nfs sürücüsü hiçbir şey yapmanıza izin vermeden bilgisayarı koruyacaktır. Bu nedenle, ayarlarda ağımız veya dosya sunucumuz çöktüyse, başlangıçta harici sürücülerin takılması gerektiği yazılır, ardından girişim tam mod her şeyin sizin için askıda kalmasına yol açacaktır. Bu durumda, ikinci önyükleme seçeneği sağlanır - her şey üçüncüyle aynıdır, yalnızca ağ sürücüleri bağlı değiller Kendim ağ adaptörüçalışır, IP adresi atanır, İnternet kullanılabilir.

    5 - 3 ile aynı, ancak x penceresinin başlatılmasıyla - bir grafik arayüz.

    mod 2, 1 + çok oyunculu modu içerir. 3, 2 + montaj ağ dosya sistemi içerir. Son olarak 5, grafik alt sistemini çalıştıran 3+ içerir. Bunun tutarlı bir şekilde uygulanıp uygulanmayacağı bir dağıtım sorunudur. Genel olarak, yöneticiler inittab dosyasını bu modların sırayla başlatılması için bağımsız olarak yapılandırabilir veya her şeyi tamamen bağımsız hale getirebilirsiniz - bir sonraki moda geçebilir, önceki adımda yapılan her şeyi kaldırabilir ve her şeyi sıfırdan yapılandırabilirsiniz.

    Gerçek bir dosyanın satırlarını düşünün. Onlar çok basit.

    l3:3:bekle:/etc/rc.d/rc3

    Üçüncü seviyede beklenen tüm gerekli eylemleri gerçekleştirmesi gereken bir program başlatıldı. Muhtemelen, üçüncü seviyede ağ arayüzlerini yapılandırmanız, terminal sürücüsünü başlatmanız ve bazı hizmetleri başlatmanız gerekir. Ancak tüm bunlar tamamlandıktan sonra sistemde çalışabileceğiz. Startup'ın tamamlanmasını beklememiz gerektiğinden wait action'ı seçiyoruz.

    Başlatıcı rc olarak adlandırılır ve seviye numarası parametre olarak çalıştırılır. İnit programının kendisi oldukça basittir. Dosyasını basit bir sözdizimi ile satır satır okuyabilir ve bazı işlemleri başlatarak yeni işlemler başlatabilir. yardımcı programlar. Tüm yük seviyesi mantığı rc'de gizlidir. Parametre 3 ile rc çalıştırarak üçüncü seviyeye, parametre 5 ile beşinci seviyeye gideceğiz.

    rc programı da çok basittir. Bu, yükleme düzeyine karşılık gelen dizinlerdeki tüm dosyaları çalıştıran bir betiktir, örneğin /etc/rc3.d/. Bu dizinler, bir parametre alan yürütülebilir dosyalar içerir - başlat veya durdur. Dosya start parametresi ile başlatılırsa servisi başlatır, stop parametresi ile başlatılırsa durdurur. Örneğin, ağ başlatma, ağ arabirimlerini yapılandırır ve ağ durdurma, arabirimleri çalışmaz duruma getirir. Ağ arayüzlerine ek olarak, ağ dosya sistemlerini bağlamak / bağlantısını kesmek, hizmetleri başlatmak / durdurmak vb. için komut dosyaları vardır.

    Belirli kurallara göre oluşturulmuş dizinlerdeki dosya adları. K veya S ile başlarlar, ardından bir sayı ve hizmetin adı gelir.

    rc betiği, rc3 dizininin içeriğine bakar ve oradan K (kill) harfiyle başlayan tüm dosyaları seçer. Dosyalar artan sayı sırasına göre sıralanır ve stop parametresi ile yürütülür. Daha sonra start parametresi ile başlatılan S (start) harfi ile başlayan dosyalarda da aynı işlemler yapılır. Genel olarak, belirli bir seviyeye geçmek için tüm prosedür budur.

    /etc/rc0.d/ dizininin yalnızca K harfiyle başlayan dosyaları içerdiği varsayılabilir, çünkü kapatma sırasında her şeyin durdurulması gerekir ve /etc/rc1.d/ dizini S kitapçığında bir dosyaya sahip olacaktır. yönetici konsolunu başlatmak için.

    Programlama kolaylığı için, aynı dosyaları yalnızca adın başında rakam harfi olmadan içeren ayrı bir /etc/init.d/ dizini vardır. Aslında, seviye dizinlerindeki dosyalar sadece ana dosyalara sembolik bağlantılardır. Yani /etc/rc3.d/S10apache, /etc/init.d/apache'ye bir bağlantıdır. Bağlantıların adlarındaki harf ve sayılar, rc betiğinin onları doğru sırada ve doğru argümanlarla çağırabilmesi için gereklidir.

    Bu prensibe göre oluşturulmuş sistemlerde, /etc/init.d/ dizinindeki herhangi bir servisi başlatmak veya durdurmak için, ona karşılık gelen dosyayı bulmanız ve start veya stop parametresi ile başlatmanız gerekir. Hizmetleri bu şekilde başlatmanın sevilmeyecek yanı, betikleri açıkça çağırmaktır. Mesele şu ki Komut satırı linux otomatik tamamlama harika çalışıyor. Bununla, başlangıç ​​dosyasının yolunu çok hızlı bir şekilde girebilirsiniz.

    Belirli uygulamayı kullanıcıdan gizlemek için, komut dosyaları ve sembolik bağlantılar sisteminin üstüne iki yardımcı program yazılır.

    Chkconfig programı, uygun betiklere sembolik bağları yönetmenize izin verir. Her seviyede neyin başladığını ve neyin durduğunu görmek için, ls komutunu kullanabilir ve komut dosyalarını uygun dizinde listeleyebilirsiniz, ancak chkconfig --list komutunu kullanmak daha kolaydır. Chkconfig programı tüm rc dizinlerini inceler ve her seviyede neyin başlayıp neyin durduğunu listeler. Sistem başlangıcında belirli bir hizmeti otomatik olarak başlatmak için bir şey istiyorsak, chkconfig yürütürüz.<имя службы>açık ve komut dosyası, doğru dizinde ve ile çalışmak için bir bağlantı oluşturur. doğru isim. chkconfig'i çalıştırın<имя службы>off, başlat bağlantısının kaldırılmasına ve durdurma bağlantısının oluşturulmasına neden olur. Böylece, chkconfig programı, sistem başlangıcında başlayan hizmetlerin listesini yönetmenizi sağlar.

    Başka bir program olan hizmet, hizmetleri manuel olarak başlatmak ve durdurmak için kullanılır. Hizmet, komut dosyasına doğrudan erişmenize değil, hizmetin adını belirtmenize ve onu başlatmak veya durdurmak istediğimizi söylemenize izin veren bir sarmalayıcıdır. Kullandığım bash, service komutu için otomatik tamamlamaya sahip değil, bu yüzden betiklerin yolunu yazmak benim için daha kolay.

    Başlangıç ​​betiklerinde, başlatma ve durdurma bağımsız değişkenleri hatasız olarak işlenmelidir. Ek olarak, faydalı bir şeyler yapacak kendi argümanlarınızdan bazılarını ortaya çıkarabilirsiniz.

    Çoğu komut dosyası, hizmetin çalışıp çalışmadığını gösteren durum seçeneğini uygular. Start'ı çalıştırdığımızda, hizmetin başarılı bir şekilde başlatılmasından sonraki komut dosyası PID'sini alır ve bunu şuraya yazar: belirli dosya. Durdur komutu dosyayı siler. Tipik olarak, bu tür dosyalar /var/run/ dizininde oluşturulur. Status komutu böyle bir dosyanın var olup olmadığını kontrol eder. Orada değil, hizmetin çalışmadığını bildiriyor. Dosya varsa, işlem kimliğini ondan çıkarır ve geçerli işlem listesini kontrol eder. Bu tanımlayıcı varsa, her şey çalışıyor, program herhangi bir nedenle bozulursa, durum bu hizmeti başlatma girişiminde bulunulduğunu gösterir - dosya var, ancak hizmetin kendisi çalışmıyor.

    Yeniden başlatma seçeneği, komut dosyası içinde sırayla iki komutu yürütür - önce durdur ve sonra başlat. Bu tamamen isteğe bağlı bir komuttur - yalnızca kolaylık sağlar. Son olarak, hareket halindeyken bazı yapılandırma dosyalarını yeniden okumanıza izin veren hizmetler vardır. Onlar için, görevi, yapılandırmanın değiştiği hizmete bir sinyal göndermek olan bir yeniden yükleme komutu eklenir. Ayrı bir durum, güvenlik duvarı yapılandırmasını kaydetmek için kaydet ve yükle komutlarıdır.

    Sistem yöneticisi, hizmetleri tek tek durdurmak veya başlatmak yerine, tüm sistemi belirli bir düzeye aktarmak istiyorsa, bu iki yoldan biriyle gerçekleştirilebilir. /sbin/init programını doğrudan çağırabilirsiniz. Parametre olarak belirli bir sayı ile çağrılırsa, inittab dosyasındaki tüm talimatları karşılık gelen seviyenin tanımlandığı şekilde yürütür. Örneğin / sbin / init 1'i çalıştırırsanız, init yapılandırma dosyasında 1. seviyeye sahip tüm satırları bulur ve bunları yürütür. Bazı sistemlerde, kapatma komutu /sbin/init 0 olarak uygulanır, çünkü düzey 0 sistem kapatmadır. Son zamanlarda, seviyeler arası geçiş için, özel program init'e bir bağlantı olan telinit denir. Görevi, yöneticinin belirli bir düzeye gitmek istediği init işlemine bir sinyal göndermektir. telinit q, init'e inittab dosyasını yeniden okumasını söyler. Daha eski sistemlerde bu, PID=1 (kill -HUP 1) ile işleme bir SIGHUP sinyali gönderilerek gerçekleştirilirdi.

    inittab'ta birkaç satır daha, bu uçbirimlerin lansmanı

    1:2345:yeniden doğma:/sbin/mingetty tty1

    Sisteme etkileşimli erişim sağlamak için inittabe'de bu türden bir dizi satırınız olabilir. 2345, komutun çalıştırılması gereken seviyelerdir, respawn, programın sona ermesi durumunda programın yeniden başlatılması gerektiği anlamına gelir. getty programı bir terminal yönetim programıdır. İlk terminaller elektrikli daktilolar olduğundan, geleneksel olarak UNIX'teki bir terminale teletype adı verilir. Buna göre tty, teletype'ın kısaltmasıdır. Mingetty, sanal terminallerle çalışabilen bir programdır. kişisel bilgisayar. Terminal sürücüsünü konfigüre edebilir ve parametre olarak konfigüre edilecek terminal cihazının adını alır. /dev/ dizininde, ilk sanal uçbirime karşılık gelen bir tty1 aygıt dosyası vardır. Eğer bir modemimiz olsaydı ve onu boot sırasında başlatmak isteseydik, getty'yi COM1 portuna karşılık gelen ttyS0 parametresi ile çağırabilirdik. Modemi başlatırken, ek parametreler ayarlamak mümkün olacaktır: bağlantı hızı 19200 baud, bayt başına 7 veya 8 bit, eşlik, durdurma biti sayısı.

    S0:2345:yeniden doğma:/sbin/getty ttyS0 19200 8 n 1

    En son fork çağırarak sürecin kendisinin bir kopyasını oluşturduğu bir zincir çizmiştim, alt kopya exec'i çağırarak hafızasına başka bir program yüklüyor ve tamamlandıktan sonra ana süreci bu konuda bilgilendiriyor.

    Metin kullanıcı oturumları bu tür zincirlerde düzenlenir: önce init, kendisinin bir kopyasını oluşturur ve içinde mingetty programını çalıştırır. Mingetty, terminali ve klavyeyi başlatır ve ardından aynı süreçte oturum açma programını çalıştırır. Oturum açma, bir ad ve parola girme istemlerini görüntüler ve her şey yolunda giderse, kendisine kullanıcı ayrıcalıkları atar ve aynı süreçte, kendisinin üzerine yazarak, örneğin bash gibi bir kullanıcı yorumlayıcısını başlatır. Kullanıcı çıkış komutunu yazdığında, yorumlayıcı bu işlemin yaşam yolunu sonlandırır. Bir süreç sona erdiğinde, init bununla ilgili bir sinyal alır. Init ne yapması gerektiğine bakar, yeniden doğma eylemini görür, terminali yeniden başlatan mingetty programını yeniden çalıştırır ve her şey tekrar eder. Böylece her oturum bir sürecin içindedir. Oturumdan çıkar çıkmaz işlemimiz sona erdi ve hemen bizim için terminali temizleyecek ve tüm varsayılan ayarları geri yükleyecek bir program başladı.

    inittab dosyasında initdefault adlı başka bir özel anahtar kelime daha vardır - varsayılan seviye. Eğer init çekirdeği tek parametreyi çekirdek aracılığıyla aldıysa, o zaman seviye 1'e önyükleme yaparız. Önyükleyiciden hiçbir şey geçmediyse, o zaman varsayılan değer kullanılır. Grafik kabuğu kurduktan sonra, bilgisayarımızın grafikler için zayıf olduğu ortaya çıktıysa, varsayılan seviyeyi 3 olarak ayarlayabiliriz ve bir sonraki yeniden başlatmanın ardından üçüncü seviyeye, yani metin moduna geçebiliriz. Sistemi grafik modu olmadan kurduk, ardından x penceresi için tüm paketleri kurduk, varsayılan seviyeyi 5 olarak değiştirdik ve bir sonraki yeniden başlatmanın ardından hemen grafik moduna geçtik.

    Bu betik sisteminde, bazen kendinize ait bir şey yapmak istersiniz, örneğin başlangıçta /tmp/ dizinindeki tüm dosyaları silmek. Bunun için var ayrı dosya diğerlerinden sonra çalışan /etc/rc.local olarak adlandırılır. Bu, içine istediğiniz her şeyi yazabileceğiniz, parametreleri olmayan bir komut dosyasıdır. Örneğin, yönlendiricilerimden birinde, sistem başlatıldığında, bu dosyaya yönlendirme tabloları yazılır. Dağıtımdaki karşılık gelen standart betiklerin nerede olduğunu aramak için çok tembeldim ve rc.local'da komut yazmanın daha kolay olduğu ortaya çıktı.

    13 milyondan fazla kod satırıyla Linux çekirdeği, dünyanın en büyük açık kaynak projelerinden biridir. Peki Linux çekirdeği nedir ve ne için kullanılır?

    Çekirdek en çok düşük seviye bilgisayar donanımı ile etkileşime giren yazılım. Kullanıcı alanında çalışan tüm uygulamaların fiziksel donanıma kadar etkileşiminden sorumludur. Ayrıca servisler olarak bilinen süreçlerin IPC sistemini kullanarak birbirinden bilgi almasına olanak sağlar.

    Çekirdeğin türleri ve sürümleri

    Zaten bildiğiniz Linux çekirdeği nedir, ancak çekirdek türleri nelerdir? Yemek yemek çeşitli yollar ve çekirdekleri sıfırdan oluştururken mimari hususlar. Çekirdeklerin çoğu üç türden biri olabilir: yekpare çekirdek, mikro çekirdek ve hibrit. Linux çekirdeği yekpare bir çekirdektir, Windows ve OS X çekirdekleri ise hibrittir. Bu üç tür çekirdeği gözden geçirelim.

    mikro çekirdek

    Mikro çekirdekler, yalnızca yapmaları gerekenleri yönettikleri bir yaklaşım benimsiyor: CPU, bellek ve IPC. Bilgisayardaki hemen hemen her şey aksesuar olarak ele alınır ve kullanıcı modunda işlenir. Mikro çekirdekler taşınabilirlik avantajına sahiptir, işletim sistemi donanıma uyumlu bir şekilde erişmeye çalıştığı sürece farklı donanımlarda ve hatta farklı işletim sistemlerinde kullanılabilirler.

    Mikro çekirdekler ayrıca çok küçüktür ve daha güvenlidir çünkü çoğu işlem minimum ayrıcalıkla kullanıcı modunda çalışır.

    profesyoneller

    • taşınabilirlik
    • küçük boy
    • Düşük bellek tüketimi
    • Emniyet

    eksiler

    • Sürücüler aracılığıyla kullanılabilen donanım
    • Sürücüler kullanıcı modunda çalıştığı için donanım daha yavaş
    • İşlemler bilgi almak için sıralarını beklemelidir.
    • İşlemler beklemeden diğer işlemlere erişemez

    yekpare çekirdek

    Yekpare çekirdekler, yalnızca CPU, bellek ve IPC'yi değil, aynı zamanda aygıt sürücüleri, dosya sistemi yönetimi ve G/Ç gibi şeyleri de kapsadıkları için mikro çekirdeklerin tersidir. Monolitik çekirdekler verir daha iyi erişim donanıma bağlayın ve daha iyi çoklu görev gerçekleştirin, çünkü bir programın bellekten veya başka bir işlemden bilgi alması gerekiyorsa, kuyrukta beklemesi gerekmez. Ancak bu, bazı sorunlara neden olabilir çünkü süper kullanıcı modunda birçok şey yapılır. Ve yanlış davranırsa sisteme zarar verebilir.

    Artıları:

    • Donanıma daha doğrudan erişim
    • Süreçler arasında daha kolay iletişim
    • Süreçler daha hızlı yanıt verir

    eksiler:

    • Büyük beden
    • Çok fazla RAM kaplıyor
    • Daha az güvenli

    hibrit çekirdek

    Hibrit çekirdekler, kullanıcı modunda neyin çalışacağını ve neyin çekirdek alanında çalışacağını seçebilir. Genellikle aygıt sürücüleri ve dosya sistemleri kullanıcı alanındayken, IPC ve sistem çağrıları çekirdek alanındadır. Bu çözüm, önceki ikisinden de en iyisini alır, ancak daha fazla iş ekipman üreticilerinden. Sürücünün tüm sorumluluğu artık onlara ait olduğundan.

    profesyoneller

    • Çekirdek ve kullanıcı alanında neyin çalışacağını seçme yeteneği
    • Monolitik bir çekirdekten daha küçük
    • Daha esnek

    eksiler

    • Daha yavaş çalışabilir
    • Aygıt sürücüleri üreticiler tarafından yayınlanır

    Çekirdek dosyaları nerede saklanır?

    Linux çekirdeği nerede bulunur? Ubuntu veya başka bir Linux dağıtımının çekirdek dosyaları /boot klasöründe bulunur ve vmlinuz-versiyonu olarak adlandırılır. Vmlinuz adı Unix döneminden gelmektedir. 60'larda çekirdekler basitçe Unix olarak adlandırılıyordu, 90'larda Linux çekirdekleri de Linux olarak adlandırılıyordu.

    Çoklu görevi kolaylaştırmak için sanal bellek geliştirildiğinde, çekirdeğin bu teknolojiyi desteklediğini belirtmek için dosya adının önünde vm harfleri belirdi. Bir süreliğine çekirdeğe vmlinux adı verildi, ancak daha sonra görüntü artık belleğe sığmadı önyükleme, ve sıkıştırıldı. Bundan sonra, zlib sıkıştırmasının kullanıldığını belirtmek için son x harfi z olarak değiştirildi. Bu sıkıştırma her zaman kullanılmaz, bazen LZMA veya BZIP2'yi bulabilirsiniz, bu nedenle bazı çekirdekler basitçe zImage'ı çağırır.

    Sürüm numaralandırması üç basamaktan, Linux çekirdeğinin sürüm numarasından, sürüm numaranızdan ve yamalardan veya düzeltmelerden oluşur.

    /boot paketinde sadece Linux çekirdeğini değil, initrd.img ve system.map gibi dosyaları da bulabilirsiniz. initrd, gerçek çekirdek dosyasını getiren ve yürüten küçük bir sanal disk olarak kullanılır. System.map dosyası, çekirdek henüz yüklenmemişken belleği yönetmek için kullanılır ve yapılandırma dosyaları, oluşturulduğunda çekirdek görüntüsüne hangi çekirdek modüllerinin dahil edildiğini belirleyebilir.

    Linux çekirdek mimarisi

    Linux çekirdeği yekpare bir yapıya sahip olduğu için diğer çekirdek türlerine göre daha büyük ve çok daha karmaşıktır. Bu tasarım özelliği, Linux'un ilk günlerinde pek çok tartışmaya yol açtı ve hala yekpare çekirdeklerin doğasında bulunan bazı tasarım kusurlarını taşıyor.

    Ancak bu eksikliklerin üstesinden gelmek için, Linux çekirdeğinin geliştiricileri bir şey yaptı - çalışma zamanında yüklenebilen çekirdek modülleri. Bu, çekirdek bileşenlerini anında ekleyebileceğiniz ve çıkarabileceğiniz anlamına gelir. Her şey donanım işlevselliği eklemenin ötesine geçebilir, sunucu işlemlerini çalıştırabilir, sanallaştırmayı etkinleştirebilir ve yeniden başlatmadan çekirdeği tamamen değiştirebilirsiniz.

    Sürekli yeniden başlatmaya ihtiyaç duymadan bir Windows güncelleme paketi yükleyebildiğinizi hayal edin.

    çekirdek modülleri

    Ya Windows zaten varsayılan olarak ihtiyacınız olan tüm sürücülere sahipse ve siz sadece ihtiyacınız olanları etkinleştirebilseydiniz? Bu ilke, Linux çekirdek modülleri tarafından uygulanmaktadır. Yüklenebilir modüller (LKM'ler) olarak da bilinen çekirdek modülleri, çekirdeğin tüm RAM'i tüketmeden tüm donanımlarda çalışmasını sağlamak için gereklidir.

    Modül genişler işlevsellik cihazlar, dosya sistemleri için temel çekirdek, sistem çağrıları. Yüklenebilir modüller .ko uzantısına sahiptir ve genellikle /lib/modules/ dizininde depolanır. Modüler yapısı nedeniyle, modülleri kurarak ve yükleyerek çekirdeği kolayca özelleştirebilirsiniz. otomatik yükleme veya modül boşaltma şu şekilde yapılandırılabilir: yapılandırma dosyaları veya özel komutları kullanarak anında yükleyin ve indirin.

    Üçüncü taraf, kapalı kaynak, tescilli modüller, Ubuntu gibi bazı dağıtımlarda mevcuttur, ancak bunlar varsayılan olarak sağlanmaz ve manuel olarak kurulmaları gerekir. Örneğin, NVIDIA video sürücüsü geliştiricileri, kaynak, ancak bunun yerine kendi modüllerini .ko formatında bir araya getiriyorlar. Bu modüller ücretsiz gibi görünse de ücretsiz değildir. Bu nedenle, varsayılan olarak birçok dağıtıma dahil edilmezler. Geliştiriciler, çekirdeği özgür olmayan yazılımlarla kirletmenin gerekli olmadığına inanıyor.

    Linux çekirdeği nedir sorusunun yanıtına artık daha yakınsınız. Çekirdek sihir değil. Herhangi bir bilgisayarın çalışması için çok gereklidir. Linux çekirdeği OS X ve Windows'tan farklıdır çünkü tüm sürücüleri içerir ve kutudan çıkar çıkmaz desteklenen pek çok şeyi yapar. Artık yazılımınızın nasıl çalıştığı ve hangi dosyaları kullandığı hakkında biraz daha bilgi sahibisiniz.

    Ameliyathanenin en temel bileşeni Linux sistemleri bir çekirdek var. Kullanıcı programları ile bilgisayar donanımı arasında bir ara bağlantı görevi gören çekirdektir. Tüm ikili dağıtımlarda, çekirdeğin oluşturulması ve yapılandırılması ile ilgilenmemize gerek yoktur, her şey dağıtım geliştiricileri tarafından bizim için zaten yapılmıştır. Ancak kendi dağıtımımızı oluşturmak veya en son çekirdeği kurmak istiyorsak, çekirdeği manuel olarak oluşturmamız gerekecek.

    İlk seçenek, almak isteyenler için alakalıydı. maksimum performans donanımlarından, ancak şimdi, bilgisayarların gücündeki hızlı artış göz önüne alındığında, çekirdeği bir araya getirirken performanstaki artış tamamen algılanamaz. Şimdi, bir çekirdek oluşturmak, Gentoo gibi ikili olmayan dağıtımların kullanıcıları, çekirdekte bazı değişiklikler yapmak, en yeni çekirdek sürümünü almak isteyenler ve tabii ki sistemlerinin nasıl çalıştığını tam olarak anlamak isteyenler için gerekli olabilir. İşler.

    Bu öğreticide, Linux çekirdeğinin nasıl oluşturulacağına bakacağız. İlk bölüm, çekirdeği otomatik modda nasıl yapılandıracağınızı anlatacaktır. Tabiri caizse, nasıl çalıştığını anlamak istemeyenler için, yalnızca bitmiş ürünü çıktıda - monte edilmiş çekirdek - alması gerekenler için. İkinci bölümde, ana adımlara bakacağız. manuel ayarçekirdek, bu süreç karmaşıktır ve hızlı değildir, ancak bunu kendiniz çözebilmeniz için bir temel vermeye çalışacağım.

    Yapılacak ilk şey, çekirdek kaynaklarını indirmektir. En iyi kaynaklar, varsa dağıtımınızın sitesinden veya çekirdeğin resmi sitesinden alınır: kernel.org. Kernel.org'dan kaynak indirmeye bakacağız.

    Kaynakları indirmeden önce kuracağımız kernelin versiyonuna karar vermemiz gerekiyor. Sürümlerin iki ana sürümü vardır - kararlı (kararlı) ve sürüm adayları (rc), elbette, uzun bir destek süresine (uzun vadeli) sahip kararlı olanlar da vardır, ancak şimdi ilk ikisiyle ilgilenmek önemlidir. Kararlı, kural olarak, en yeni değil, ancak minimum sayıda hata içeren zaten iyi test edilmiş çekirdeklerdir. Test - aksine, en yeni, ancak çeşitli hatalar içerebilir.

    Yani versiyona karar verdiğimizde kernel.org'a girip gerekli kaynakları tar.xz formatında indiriyoruz:

    Bu makale üzerinde en son güncellemeleri kullanacaktır. şu an kararsız sürüm 4.4.rc7.

    Git yardımcı programını kullanarak da Linux çekirdek kaynaklarını edinebilirsiniz. Öncelikle kaynaklar için bir klasör oluşturalım:

    mkdir kernel_sources

    En son sürümü indirmek için şunu yazın:

    git klonu https://github.com/torvalds/linux

    Çekirdek kaynaklarının paketini açma

    Şimdi kaynakları kurtardık. Kaynak klasöre gidin:

    cd linux_sources

    Veya linux çekirdeğini bir tarayıcı kullanarak indirdiyseniz, önce bu klasörü oluşturun ve arşivi içine kopyalayın:

    mkdir linux_sources

    cp ~/Downloads/linux* ~/linux_sources

    tar yardımcı programını kullanarak arşivi açın:

    Ve paketlenmemiş çekirdeğin bulunduğu klasöre gidin, bende şu var:

    cd linux-4.4-rc7/

    Linux çekirdeği oluşturma otomatik ayarı

    Linux çekirdeğini oluşturmaya başlamadan önce onu yapılandırmalıyız. Dediğim gibi, önce çekirdek yapısını kurmak için otomatik seçeneği ele alacağız. Sisteminizde zaten yerleşik, dağıtım üreticisi tarafından özelleştirilmiş ve tamamen çalışan bir çekirdek var. Çekirdek yapılandırmasının incelikleriyle uğraşmak istemiyorsanız, eski çekirdeğin hazır ayarlarını çıkartabilir ve bunlara göre yeni çekirdek için ayarlar oluşturabilirsiniz. Yalnızca yeni parametreler için değerler sağlamamız gerekecek. En son sürümlerde hiçbir büyük değişikliğin planlanmadığını ve planlanmadığını göz önünde bulundurarak, tüm bu parametrelere yapılandırma betiğinin önerdiği gibi yanıt verebilirsiniz.

    Kullanılan çekirdeğin parametreleri /proc/config.gz adresindeki arşivde saklanır. Yapılandırma paketini açın ve zcat yardımcı programıyla klasörümüze yerleştirin:

    Çalışması sırasında birkaç soruyu yanıtlamanız gerekecek. Bunlar, yeni çekirdeğe eklenen veya değiştirilen yeni seçenekler ve yeni donanım desteğidir, çoğu durumda varsayılan seçeneği seçebilirsiniz. Genellikle üç seçenek vardır y - dahil et, n - dahil etme, m - bir modül olarak dahil et. Önerilen seçenek büyük harfle yazılır, seçmek için Enter tuşuna basmanız yeterlidir.

    Her şey hakkında her şey yaklaşık 10 dakikanızı alacaktır. İşlem tamamlandıktan sonra çekirdek oluşturulmaya hazırdır. Ardından, çekirdeği manuel olarak yapılandırmaya bakacağız ve hemen Linux çekirdeğinin montajına geçebilirsiniz.

    Linux çekirdeğinin manuel olarak ayarlanması

    Manuel yapılandırma, karmaşık ve zaman alan bir işlemdir, ancak sisteminizin nasıl çalıştığını, hangi işlevlerin kullanıldığını anlamanıza ve minimum düzeyde bir çekirdek oluşturmanıza olanak tanır. doğru takım ihtiyaçlarınıza uygun işlevler. Çekirdeği çalışır duruma getirmek için yalnızca atılması gereken ana adımları ele alacağız. Geri kalan her şeyi, çekirdek belgelerine dayanarak kendiniz çözmeniz gerekecek. Neyse ki, her parametre için yapılandırma yardımcı programı, başka hangi ayarları etkinleştirmeniz gerektiğini anlamanıza yardımcı olacak kapsamlı belgelere sahiptir.

    Hadi başlayalım. Linux çekirdeği ayarları menüsünü başlatmak için şunu yazın:

    Bu, yardımcı programı ncurses arabirimiyle açacaktır:

    Gördüğünüz gibi, kurulum sürecini sizin için kolaylaştırmak için bazı gerekli seçenekler zaten dahil edilmiştir. En temel ayarlarla başlayalım. Parametreyi etkinleştirmek için y'ye, modülü etkinleştirmek için - m'ye basın, hareket etmek için ok tuşlarını ve Enter'ı kullanın, Exit düğmesi ile seviye yukarı dönebilirsiniz Öğeyi aç Genel Kurulum.

    Burada aşağıdaki parametreleri ayarlıyoruz:

    yerel sürüm- Çekirdeğin yerel sürümü, her derlemede bir artacaktır, böylece kurulum sırasında yeni çekirdekler eskilerinin yerini almaz, değeri 1 olarak ayarlayın.

    Sürüm bilgisini sürüm dizesine otomatik olarak ekle- çekirdek dosya adına sürüm ekleyin.

    Çekirdek Sıkıştırma Modu- çekirdek görüntü sıkıştırma modu, en verimli lzma.

    varsayılan ana bilgisayar adı- giriş isteminde görüntülenen bilgisayar adı

    POSIX Mesaj Kuyrukları- POSTIX kuyrukları için destek

    Anonim belleğin çağrılması için destek - takas desteğini etkinleştir

    Kontrol Grubu desteği- süreç grupları arasında kaynak tahsisi mekanizması için destek

    Çekirdek .config desteği Ve /proc/config.gz aracılığıyla .config erişimini etkinleştirin- çekirdek yapılandırmasını /proc/config.gz yoluyla çıkarma yeteneğini etkinleştirin

    Hepsi bu kadar, seviye yukarı dönüyoruz ve açıyoruz yüklenebilir modül desteğini etkinleştirin, bu işlev, harici modüllerin yüklenmesine izin verir, ardından menüsünü açar ve açar:

    modülleri devre dışı bırakma desteği

    modüllerin zorla kapatılması

    Tekrar geri dön ve aç İşlemci tipi ve özellikleri:

    İşlemci ailesi (Opteron/Athlon64/Hammer/K8)- işlemcinizin türünü seçin.

    Tekrar dönüyoruz ve bölüme gidiyoruz Dosya sistemleri, ardından gerekli tüm onay kutularını işaretleyin.

    etkinleştirdiğinizden emin olun Genişletilmiş 3 (ext3) dosya sistemi Ve Genişletilmiş 4 (ext4) dosya sistemi- standart ext3 ve ext4 dosya sistemlerini desteklemek için

    dönüyoruz ve gidiyoruz Çekirdek hackleme.

    buraya dahil ediyoruz Sihirli SysRq anahtarı- SysRq'in sihirli işlevleri için destek, gerekli olmayan ama bazen yararlı olan bir şey.

    Bir nokta daha kaldı, en zoru, çünkü onu kendin geçmek zorunda kalacaksın. Aygıt sürücüleri- bölümleri geçmeniz ve ekipmanınız için sürücüleri açmanız gerekir. Ekipman derken standart dışı demek istiyorum sabit diskler, fareler, USB cihazları, web kameraları, Bluetooth, Wi-Fi adaptörleri, yazıcılar vb.

    Sisteminize hangi ekipmanın bağlı olduğunu şu komutla görebilirsiniz:

    Tüm adımları tamamladıktan sonra, çekirdek oluşturulmaya hazırdır, ancak büyük olasılıkla pek çok şeyle uğraşmanız gerekecek.

    Çıkmak için düğmeye birkaç kez basın. çıkış.

    Linux Çekirdeğini Oluşturma

    Tüm hazırlıklar tamamlandıktan sonra linux çekirdeği kurulabilir. Oluşturma sürecini çalıştırmak için:

    make && make modülleri

    Şimdi gidip kahve içebilir veya yürüyüşe çıkabilirsiniz çünkü montaj süreci uzun ve yaklaşık yarım saat sürecek.

    Yeni bir çekirdek yükleme

    Çekirdek ve modüller oluşturulduğunda, yeni çekirdek kurulabilir. Çekirdek dosyasını manuel olarak bootloader klasörüne kopyalayabilirsiniz:

    cp arşivi/x86_64/boot/bzImage /boot/vmlinuz

    Veya aynı anda modülleri hemen yükleyerek kurulum komut dosyasını çalıştırabilirsiniz:

    sudo make install && sudo make module_install

    Kurulumdan sonra, Grub önyükleyici yapılandırmasını güncellemeyi unutmayın:

    grub-mkconfig -o /boot/grub/grub.cfg

    Ve yeni çekirdeği çalışırken görmek için bilgisayarı yeniden başlatın:

    sonuçlar

    Bu kadar. Bu yazıda, Linux çekirdeğini kaynaktan nasıl oluşturacağımıza ayrıntılı bir şekilde baktık. Sistemini daha iyi anlamak isteyenler ve en iyi şekilde yararlanmak isteyenler için faydalı olacaktır. Yeni sürüm sisteminizdeki çekirdekler. Herhangi bir sorunuz varsa, yorum sorun!