Özel bir Linux çekirdeğini yapılandırma, derleme ve yükleme


38

Dağıtımım tarafından sağlanandan başka bir çekirdeği kullanmayı deneyin - başka bir yerden veya benim tarafımdan özelleştirilmiş olarak. Bu zor mu tehlikeli mi?

Nereden başlayacağım?

Yanıtlar:


51

Modern bilgisayarların birkaç dakika içinde yapı yapabilir, çünkü çoğunlukla konfigürasyonda - - özel bir çekirdek Bina zaman alıcı olabilir ama özellikle tehlikeli değildir eğer sen çekirdeği çalışma yapın güncel tutmak ve bu bırakmak emin olun bootloader'ınız aracılığıyla bir seçenek olarak (aşağıdaki 6 numaralı adıma bakın). Bu şekilde, eğer yeniniz çalışmıyorsa, eskisini yeniden başlatabilirsiniz.

Aşağıdaki talimatlarda, kaynak ağacının içindeki yollar, kaynağı kurduğunuz dizinin [src]/whatevernerede [src]olduğu, örn /usr/src/linux-3.13.3. Muhtemelen bu işleri su rootkaynak ağacın yazma izinleri bakımından güvenli kalması gerektiği için yapmak istersiniz (root tarafından sahiplenilmelidir).

Adımların bazıları isteğe bağlı olsa da, sürecin geri kalanını anlamak için gerekli bilgileri içerdiklerinden yine de bunları okumalısınız.

  1. Kaynak tarball'ı indirin ve açın.

    Bunlar kernel.org adresinden temin edilebilir . En sonuncular ön sayfada listelenmiştir, ancak /pub/dizinin içine bakarsanız , sürüm 1.0'a kadar uzanan bir arşiv bulacaksınız . Aksi halde özel bir nedeniniz yoksa, sadece “En Son Kararlı” yı seçmeniz yeterlidir. Bu yazının yazıldığı tarihte bu 74 MB'lık bir tar.xzdosyadır.

    Tarball indirildikten sonra, bir yere açmanız gerekir. Normal yer içeri /usr/src. Dosyayı oraya yerleştirin ve:

    tar -xJf linux-X.X.X.tar.xz
    

    Bireysel dağıtımların genellikle vanilya ağacı yerine kaynak paketlerinden birini kullanmanızı önermektedir. Bu, sizin için önemli olan veya olmayan önemli dağıtım yamaları içerir. Aynı zamanda çekirdeği de eşleştirecek, bazı kullanıcı alanları araçlarını derlemek için kullanılan başlıkları da içeriyor, yine de muhtemelen aynı.

    15 yıldan uzun bir süredir özel çekirdekler (çoğunlukla Fedora / Debian / Ubuntu'da) yapımında, vanilya 1 kaynağını kullanırken hiçbir zaman sorun yaşamadım . Bunu yapmak, gerçekten çok fazla fark yaratmaz, ancak, mutlak son çekirdeği istiyorsanız, dağıtımınız muhtemelen henüz toplanmadı. Bu yüzden, en güvenli rota hala içine yerleştirilmesi gereken dağıtım paketini kullanmaktır /usr/src. En son ahırı tercih ederim, bu yüzden dağıtıma girmeden önce bir kobay gibi davranabilirim :)

  2. Temel bir yapılandırma ile başlayın [isteğe bağlı].

    Bunu yapmak zorunda değilsiniz - hemen dalın ve sıfırdan bir konfigürasyon oluşturabilirsiniz. Ancak, bunu daha önce hiç yapmadıysanız, çok fazla deneme yanılma bekleyin. Bu aynı zamanda seçeneklerin çoğunu okumak zorunda kalmak demektir (yüzlerce). Daha iyi bir bahis, eğer varsa mevcut konfigürasyonunuzu kullanmaktır. Bir dağıtım paketi kullandıysanız, muhtemelen zaten bir [src]/.configdosya içeriyordur , böylece onu kullanabilirsiniz. Aksi takdirde, bir kontrol edin /proc/config.gz. Bu, 2.6 çekirdeğine eklenen isteğe bağlı bir özelliktir. Varsa, kaynak ağacın en üst seviyesine kopyalayın ve gunzip -c config.gz > .config.

Eğer yoksa, belki de bu seçenek bir modül olarak yapılandırılmış olabilir. Dene sudo modprobe configs, sonra /procdizini config.gztekrar kontrol et .

Distro config, neredeyse tüm donanım sürücülerini içerdiği için ideal değildir. Bu, çekirdeğin işlevselliği için çok önemli değildir, çünkü bunlar modüllerdir ve çoğu zaman asla kullanılmayacak, ancak inşa etmek için gereken süreyi önemli ölçüde arttırır. Ayrıca bazı çekirdek modülleri içermesi için bir initramfs gerektirmesi de sakıncalıdır (bkz. Aşağıdaki 4. adım). Ancak, muhtemelen varsayılandan daha iyi bir başlangıç ​​noktasıdır.

Yapılandırma seçeneklerinin bir çekirdek sürümden diğerine geçip değiştiğini ve make configaşağıdaki programlardan birini çalıştırdığınızda .configilk önce yeni sürümle eşleşecek ve güncelleştirileceğini unutmayın. Yapılandırma çok eski bir sürümden yapılmışsa, bu garip sonuçlara yol açabilir, bu nedenle yapılandırmayı yaparken dikkat edin. AFAIK, başka bir yolla (yeni bir sürümden bir config kullanarak) çalışmaz.

  1. Bir .configrasyon oluşturun .

    [src]/.configçekirdeği yapılandırmak için kullanılan bir metin dosyasıdır. Bu dosyayı doğrudan düzenlemeyin . Seçeneklerini değiştirme genellikle değiştirmenin basit bir mesele değildir Y, bir ile N, vs; genellikle bir dizi bağımlılık ve dallanma olasılığı vardır. Bunun yerine, çekirdek makefile dosyasındaki config hedeflerinden birini kullanmak istiyorsunuz (yani, make _____üst düzey kaynak dizininden komut satırına girin ):

    • make configen basit olanıdır ama muhtemelen çoğu insanın zevkine göre değil. Bir dizi soru - birçok soru - ve fikrinizi değiştirirseniz tekrar başlamak zorundasınız.

    • make oldconfiggibidir make configdışında zaten bir varsa, .configbir önceki sürümden, yeni seçenekler ait olanlar hariç soruları atlayacak. Bunlardan birçoğu hala olabilir ve birçoğu sizin için önemsiz olacaktır, tekrar önermiyorum.

    • make menuconfigbenim (ve sanırım çoğunun tercih ettiği yöntem). Bir TUI arayüzü oluşturur ve yürütür (bir terminal üzerinde çalışacak renkli menüler). Bu -devncurses paketinin kurulu olmasını gerektirir . Üzerinden erişilebilen deniz manzarası dışında, oldukça açıklayıcıdır /; F1 "yardım" mevcut seçenek için bir açıklama sunar. make nconfigF2 "syminfo" 'nun menuconfig's F1'ine eşdeğer olduğu, birkaç ekstra özelliğe sahip alternatif bir versiyonu vardır .

    • make xconfigtam bir GUI arayüzü. Bu gerektirir qmakeve -devQt paketi tekrar kurulur, derlenir ve oluşturulur. Bunları daha önce kullanmıyorsanız, bu önemli bir indirme olabilir. menuconfigGUI sürümüne tercih etmemin sebebi , seçenek hiyerarşilerinin önceki bölümdeki ardışık ekranlar kullanılarak sunulması ve ikincisindeki açık akordeon benzeri olmasıdır.

    Yapmanız gereken (ancak yapmanız gerekmeyen) ilk şeylerden biri bir "Yerel sürüm" dizesi eklemektir ( Genel Kurulum altında ). Bunun nedeni aşağıda 5 numarada belirtilmiştir.

    "Labyrinthine", seçenek hiyerarşisini tanımlamanın iyi bir yoludur ve onunla detaylara kapılmak, bunun gibi bir Soru-Cevap alanının kapsamı dışındadır. Oturup her şeyden geçmek istiyorsanız, saatlerinizi ayırın . Greg Kroah-Hartman (linux çekirdeği için uzun süredir lider olan), 2006'da yazılmış olmasına rağmen, yapılandırma hakkında bir bölüm içeren, çekirdeği (aşağıdaki Referanslara bakınız) içeren ücretsiz bir çevrimiçi kitabı vardır. şu anki dağıtım çekirdeğinizden (# 2'ye göre) ve ardından gözden geçirin ve ihtiyacınız olmayan tüm şeyleri kaldırın. Ayrıca muhtemelen "modül" seçeneklerinden bazılarını "yerleşik" olarak değiştirmek isteyeceksiniz, bu da bizi bir sonraki noktaya getiriyor ...

  2. Hakkında initramfs[isteğe bağlı]

    Bir "initramfs", çekirdeğe yerleşik ve / veya önyükleme sırasında yüklenen sıkıştırılmış bir dosya sistemidir. Birincil amacı, çekirdeğin /lib/moduleskök dosya sistemindekilere erişmeden önce ihtiyaç duyacağı modülleri (örneğin, bu dosya sistemini içeren aygıtın sürücülerini) eklemektir . Distros bunları daima kısmen kullanır, çünkü sürücüler karşılıklı olarak birbiriyle uyumlu değildir ve bu nedenle hepsi çekirdeğe yapılamaz. Bunun yerine, mevcut sisteme uygun olanlar içinden seçilir initramfs.

    Bu iyi çalışır ve herhangi bir dezavantajı temsil etmez, ancak kendi çekirdeğinizi oluştururken muhtemelen gereksiz bir komplikasyondur. 2 Yakala, bir initramfs kullanmıyorsanız , kök dosya sisteminizin (ve üzerinde bulunduğu cihazın) sürücülerinin çekirdeğe yerleştirildiğinden emin olmanız gerekir. Bu menuconfig, bir M(= modül) seçeneği ile bir *(= dahili ) seçeneği arasındaki farktır . Bu hakkı alamazsanız, sistem önyükleme işleminde erken başarısız olur. Bu nedenle, örneğin, bir SATA sabit diskiniz ve bir ext4 kök dosya sisteminiz varsa, yerleşik olanlar için sürücülere ihtiyacınız vardır. [Birisi olması gereken başka bir şey düşünebiliyorsa, bir yorum bırakın ve bunu buraya dahil edeyim].

    Bir kullanmak istiyorsanız initramfs, Genel Kurulum'da uygun seçenekleri seçmeniz gerekir . Bir tane oluşturmak için bir iskelet rehber var çekirdek yerleşik içinde [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt, ama dağıtımlar bunu yapmayın O notu; harici bir gzip cpio dosyası kullanıyorlar. Ancak, bu doktor neyin içinde olması gerektiği hakkında bir tartışma içeriyor initramfs(bkz. "İnitramfs'ın İçeriği").

  3. Çekirdeği oluşturun ve yükleyin.

    Bir sonraki adım kolaydır. Çekirdek yapmak için, sadece koşmak makeiçinde [src]dizine. Bir çok çekirdekli sistem üzerinde iseniz, ekleyebilir -j N, nerede hız şeyleri Nhiç yoktur sen + 1. ayırmak istediğinizi çekirdek sayısıdır testya check. Bu bittiğinde, yapabilirsin make modules. Hızlı bir kutuda, tüm bunlar <10 dakika sürmelidir.

    Her şey yolunda giderse make INSTALL_MOD_STRIP=1 modules_install. Bu /lib/modules, çekirdeğin sürüm numarası ile varsa 3. adımda belirtilen "Yerel sürüm" dizesiyle eşleşen bir dizin oluşturur . "Yerel sürüm" dizesini kullanmadıysanız, güvendiğiniz aynı sürümden bir çekirdeğiniz varsa , çünkü bu modüller bunları değiştirecektir. 3 INSTALL_MOD_STRIP=1 isteğe bağlıdır, buradaki önemi görmek için .

    Daha sonra make installçekirdeği varsayılan konuma yüklemek için kullanabilirsiniz. Benim tavsiyem, mevcut dosyaların üzerine yazılmaması için kendin yapman. Bak [src]/arch/[ARCH]/bootadında bir dosya için bzImage4 , [ARCH]olduğu x86bir x86 ya x86-64 makinenin (ve başka bir şey Başka bir şey üzerinde iseniz) üzerinde ise. Bunu kopyalayın /bootve daha spesifik ve bilgilendirici bir şeye yeniden adlandırın (ne olduğu önemli değildir). Aynı şeyi yapın [src]/System.map, ancak aşağıdaki şemaya göre yeniden adlandırın:

    System.map-[VERSION]
    

    Burada, "Yerel sürüm" dizesini içerecek şekilde yarattığı dizinin adı[VERSION] ile tam olarak aynıdır , örn ./lib/modulesmake modules_installSystem.map-3.13.3-mykernel

  4. GRUB 2 önyükleyicisini yapılandırın.

    Eğer kullanmıyorsanız grub(linux masaüstü kullanıcıların çoğunun edilir), bu belli ki senin için geçerli değildir. İçinde /etc/grub.d/40_customçok fazla olmayan bir dosya olmalı . Değilse, root tarafından sahiplenilen oluşturun ve chmod 755(çalıştırılabilir olmalıdır). Bu eklemek için:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Bir initramfs kullanıyorsanız, ayrıca son bir satırın olması gerekir initrd /path/to/initramfs. Çizgiye dikkat et set root=. Örnek, grubun ilk sabit sürücünün ilk bölümüne (hd0,1) yüklendiğini varsayar. Birden fazla sürücünüz varsa, bunun yerine UUID bölümünü kullanmak ve bu satırı aşağıdakiyle değiştirmek isteyebilirsiniz:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    Grub, kök dosya sisteminizde değilse, bu, aynı zamanda kök dosya sisteminizi (biri olan ve ile gösterir) gösteren root=direktifle aynı olmalıdır . Bunun UUID sürümü . linux/sbin/init/lib/modulesroot=UUID=[the UUID]

    /boot/grub2/grub.cfgCihazın adıyla ilgili bir ipucu için varlığınıza bakabilirsiniz . İşte kısa bir rehber çalıştırmak, sindiğinde grub 2. altında böyle için grub2-mkconfig -o /boot/grub2/grub.cfg(ancak mevcut yedeklemek grub.cfgönce). Daha sonra bu dosyayı düzenlemek ve girişinizi en üste taşımak isteyebilirsiniz. Hala eski (çalışan) çekirdek için bir giriş içermelidir ve bu tespit edildiği için sizin dağıtıma (otomatik olarak yeni çekirdek için bir girdi çoğaltılamaz bir mekanizmaya sahip olabilir /boot; Fedora dolayısıyla bunu yapar, ayrı bir başlık kullanarak menuentrybir olduğunu İyi bir fikir). Her şey yolunda giderse bunu daha sonra kaldırabilirsiniz.

    Ayrıca doğrudan menuentryiçine grub.cfgdoğrudan ekleyebilirsiniz , ancak bazı dağıtımlar çekirdeği güncellendiğinde bunun üzerine yazacaktır (oysa /etc/grub.d/kullanımı onu dahil tutacak).

    Bu kadar. Şimdi tek yapmanız gereken yeniden başlatmak. Eğer işe yaramazsa, sorunu ekran çıktısından deneyin ve deneyin, eski bir çekirdeği seçerek yeniden başlatın ve 3. adıma geri dönün ( .configzaten sahip olduğunuz kullanımı dışında ve bunu değiştirin). Girişimler arasında make clean(veya make mrproper) çalışmak iyi bir fikir olabilir, ancak [src]/.configönce bazı yedeklere kopyaladığınızdan emin olun , çünkü silinir. Bu, derleme işleminde kullanılan nesnelerin eski olmamasını sağlamaya yardımcı olur.

  5. Çekirdek başlıkları ve diğ. ark.

    Büyük olasılıkla Yapmanız gereken tek şey sembolik link (olan ln -s -i) /lib/modules/X.X.X/sourceve /lib/modules/X.X.X/buildkarşı /usr/srckaynak ağacı (tutmak) 'dir dizine. Bu, bazı kullanıcı alanı araçlarının (ve üçüncü taraf sürücü kurucularının) çalışan çekirdeğin kaynağına erişebilmesi için gereklidir.

    Bununla ilgili bir sorun .hdosyalardaki /usr/includevb. Bunlar yavaş yavaş değişir ve geriye dönük olarak uyumludur . İki seçeneğin var:

    • Dağıtımın kullandıklarını bırak. Tüm sistemi düzenli olarak güncellerseniz, dağıtım yine de periyodik olarak yenilerini kuracaktır, bu yüzden bu "en az güçlük" seçeneğidir.

    • Kullanın make headers_install.

    Geriye uyumlu olduklarından ("eski çekirdek başlıkları kullanan bir C kitaplığına karşı oluşturulan bir programın daha yeni bir çekirdek üzerinde çalışması gerekir" anlamına gelir), bu konuda çok fazla telaşlanmanıza gerek kalmaz. Özel bir çekirdek oluşturmak ve dağıtıma a "kernel-headers" paketi günceller ve bu süre içinde bir süre için tutarsan sadece potansiyel sorun olacağını daha yeni çekirdeği oluşturmak için kullanılan daha sürümü ve bazı olacaksa çıkıyor uyumsuzluk (sadece kaynak koddan derlenen yazılımlar için geçerli olacaktır).

Referanslar

İşte bazı kaynaklar:

  • [src]/README bina ve kurulum için kısa bir rehber içerir.

  • [src]/DocumentationDizin yapılandırmasında yardımcı olabilecek birçok bilgi içeriyor.

  • Greg KH'nin Linux Kernel adlı kitabının cevizini (bir dizi PDF olarak ücretsiz olarak bulabilirsiniz) çekirdeği oluşturmak etrafında döner.

  • Grub 2 çevrimiçi bir el kitabı var .


1. "Vanilya", kernel.org'da bulunan asıl, asılsız resmi kaynağı ifade eder. Dağıtımların çoğu bu vanilya kaynağını alır ve bazı küçük özelleştirmeler ekler.

2. Kök dosya sistemini monte etmek için bir kullanıcı alanına ihtiyaç duyulduğundan, örneğin şifrelenmişse veya karmaşık bir RAID dizisine yayılmışsa, initramfs gerektiren koşullar olduğunu unutmayın.

3. Onları yapmadıysanız, zaten var olan modülleri çıkarmaz, ancak yapılandırmanızı değiştirip make modules_installyeniden çalıştırarak daha sonra bir modül ekleyebileceğiniz anlamına gelir . Bazı modüller inşa etmenin çekirdeğin kendisinde değişiklikler gerektirebileceğini unutmayın; bu durumda çekirdeği de değiştirmeniz gerekir. modprobeModülü yerleştirmek için ne zaman kullanmaya çalıştığınızı söyleyebilirsiniz .

4. Standart olmayan bir sıkıştırma seçeneği kullandıysanız, bu dosyaya farklı bir ad verilebilir. Tüm olasılıkların ne olduğundan emin değilim.


3
Upvoted. Senaryo localmodconfigve streamline_config.plscript gibi araçlar eklemek isteyebilirsiniz ; Mevcut kurulumunuzla çalışmak için yararlı bir yaklaşım ...
jasonwryan

1
Bu, muhtemelen @ terdon'un girişimi için kanonik tipte bir soru olacak kadar ayrıntılı. Meta konusundaki sorusuna cevap vermeyi düşünün. Ya da istersen yapabilirim. Soruyu zaten sorduğun için niyetin bu olduğu anlaşılıyor gibi görünüyor. İkili paketler oluşturmak için dağıtıma özgü yöntemler dahil etmek de faydalı olabilir.
Faheem Mitha

1
Bilginize: initramfshemen hemen her zaman kullanılması gerekiyordu. Örneğin, LVF + RAID üzerine rootf ayarlamak genellikle bir tane gerektirir. Şifrelenmiş kök kesinlikle yok. Oldukça karmaşık RAID kurulumları bile yapıyor. Hatta önemsiz dizilerin çekirdek içi otomatik montajı aslında kullanımdan kaldırılmıştır ...
derobert

2
@ robert: Bu, "neredeyse her zaman" linux'un bir kurumsal sunucuyu çalıştırmak için kullanılmakta olduğu sorusuna işaret ediyor. Hakkında Benim demek initramfseğer ki yok birini kullanmak gerekir, bunu yapmak zorunda değilsiniz ve bu süreci kolaylaştırır. Neyse, şifreli kök fs, vb. Hakkında bir dipnot ekledim.
goldilocks

Lütfen EFI ve linux'un efi saplama işlevselliği hakkında ayrıntılı bilgi ekleyin.
IW16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.