Linux çekirdeğini anlamak
Linux çekirdeği, Linux işletim sisteminin çekirdeğidir. Donanıma hitap eden ana bileşenleri içerir ve kullanıcı ile donanım arasında hem iletişimi hem de etkileşimi sağlar. Linux çekirdeği monolitik bir sistem değil, oldukça esnektir ve çekirdek, çekirdek modülleri olarak adlandırılanlarla genişletilir.
çekirdek modülü nedir?
Genel olarak, bir çekirdek modülü, “istek üzerine çekirdeğe yüklenebilen ve boşaltılabilen bir kod parçasıdır. Sistemi yeniden başlatmaya gerek kalmadan çekirdeğin işlevselliğini genişletiyorlar” [1]. Bu, çalışma sırasında çok büyük esnekliğe yol açar.
Ayrıca, “bir çekirdek modülü yerleşik veya yüklenebilir olarak yapılandırılabilir. Bir modülü dinamik olarak yüklemek veya kaldırmak için, çekirdek yapılandırmasında yüklenebilir bir modül olarak yapılandırılmalıdır” [1]. Bu, /usr/src/linux/ çekirdek kaynak dosyasında yapılır.yapılandırma [2]. Yerleşik modüller “y” ile ve yüklenebilir modüller “m” ile işaretlenmiştir. Örnek olarak, liste 1, SCSI modülü için bunu göstermektedir:
Liste 1: SCSI modülü kullanım beyanı
CONFIG_SCSI=y # yerleşik modülCONFIG_SCSI=m # yüklenebilir modül
# CONFIG_SCSI # değişken ayarlanmadı
Konfigürasyon dosyasını doğrudan düzenlemenizi önermiyoruz, ancak Linux çekirdeğinde ilgili modülün kullanımını tanımlamak için “make config”, “make menuconfig” veya “make xconfig” komutunu kullanmanızı öneririz.
Modül komutları
Linux sistemi, çekirdek modüllerini işlemek için bir dizi farklı komutla birlikte gelir. Bu, şu anda Linux çekirdeğine yüklenen modüllerin listelenmesini, modül bilgilerinin görüntülenmesini ve ayrıca çekirdek modüllerinin yüklenmesi ve boşaltılmasını içerir. Aşağıda bu komutları daha ayrıntılı olarak açıklayacağız.
Mevcut Linux çekirdekleri için aşağıdaki komutlar kmod paketi [3] tarafından sağlanmaktadır. Tüm komutlar kmod'a sembolik bağlantılardır.
Şu anda lsmod ile yüklü modüllerin listesi
lsmod komutuyla başlıyoruz. lsmod, "list modülleri" kısaltır ve /proc/modules dosyasının içeriğini güzel bir şekilde biçimlendirerek Linux çekirdeğine yüklenmiş olan tüm modülleri görüntüler. Liste 2, üç sütundan oluşan çıktısını gösterir: modül adı, bellekte kullanılan boyut ve bu belirli olanı kullanan diğer çekirdek modülleri.
Liste 2: lsmod Kullanımı
$ lsmodKullanılan Modül Boyutu
hedef 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
…
$
Mevcut çekirdeğiniz için mevcut modülleri bulun
Henüz farkında olmadığınız kullanılabilir çekirdek modülleri olabilir. /lib/modules dizininde saklanırlar. uname komutuyla birlikte find yardımı ile bu modüllerin bir listesini yazdırabilirsiniz. "uname -r" sadece şu anda çalışan Linux çekirdeğinin sürümünü yazdırır. Liste 3, bunu daha eski bir 3 için göstermektedir.16.0-7 Linux
çekirdek ve IPv6 ve IRDA için modülleri gösterir.
Liste 3: Kullanılabilir modülleri görüntüleme (seçim)
$ find /lib/modules/$(uname -r) -name '*.ko'/lib/modüller/3.16.0-7-amd64/kernel/net/ipv6/ip6_vti.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/ipv6/xfrm6_tunnel.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/ipv6/ip6_tunnel.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/ipv6/ip6_gre.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/irda/irnet/irnet.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/irda/irlan/irlan.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/irda/irda.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/irda/ircomm/ircomm.ko
/lib/modüller/3.16.0-7-amd64/kernel/net/irda/ircomm/ircomm-tty.ko
…
$
Modinfo kullanarak modül bilgilerini görüntüleyin
modinfo komutu, istenen çekirdek modülü hakkında size daha fazla bilgi verir (“modül bilgisi”). Bir parametre olarak modinfo, ya tam modül yolunu ya da sadece modül adını gerektirir. Liste 4, Kızılötesi Doğrudan Erişim protokol yığınıyla ilgilenen IrDA çekirdek modülü için bunu göstermektedir.
Liste 4: Modül bilgilerini görüntüleyin
$ /sbin/modinfo irdadosya adı: /lib/modules/3.16.0-7-amd64/kernel/net/irda/irda.ko
takma ad: net-pf-23
lisans: GPL
tanım: Linux IrDA Protokol Yığını
yazar: Dag Brattli
bağlıdır: crc-ccitt
vermagic: 3.16.0-7-amd64 SMP mod_unload mod sürümleri
$
Çıktı, çekirdek modülünün tam yolu, takma adı, yazılım lisansı, modül açıklaması, yazarlar ve ayrıca çekirdeğin dahili bilgileri gibi farklı bilgi alanlarını içerir. "Bağlıdır" alanı, hangi diğer çekirdek modüllerine bağlı olduğunu gösterir.
Bilgi alanları modülden modüle farklılık gösterir. Çıktıyı belirli bir bilgi alanıyla sınırlamak için modinfo, “-F” parametresini (“-field” kısaltması) ve ardından alan adını kabul eder. Liste 5'te çıktı, lisans alanı kullanılarak kullanıma sunulan lisans bilgileriyle sınırlıdır.
Liste 5: Yalnızca belirli bir alanı görüntüleyin.
$ /sbin/modinfo -F lisansı irdaGPL
$
Daha yeni Linux çekirdeklerinde kullanışlı bir güvenlik özelliği mevcuttur. Bu, kriptografik olarak imzalanmış çekirdek modüllerini kapsar. Linux çekirdek proje web sitesinde [4] açıklandığı gibi, “bu, imzasız modüllerin veya modüllerin yüklenmesine izin vermeyerek çekirdek güvenliğinin artmasına izin verir
geçersiz bir anahtarla imzalanmış. Modül imzalama, kötü amaçlı bir modülü çekirdeğe yüklemeyi zorlaştırarak güvenliği artırır. Modül imza denetimi, çekirdek tarafından yapılır, böylece "güvenilir kullanıcı alanı bitlerine" gerek kalmaz.Aşağıdaki şekil bunu göstermektedir
parport_pc modülü.
Modprobe kullanarak modül yapılandırmasını göster
Her çekirdek modülü belirli bir yapılandırmayla gelir. Modprobe komutu ve ardından “-c” seçeneği (“-showconfig” kısaltması) modül konfigürasyonunu listeler. grep ile birlikte, bu çıktı belirli bir sembolle sınırlıdır. Liste 6, bunu IPv6 seçenekleri için gösterir.
Liste 6: Modül yapılandırmasını göster
$ /sbin/modprobe -c | grep ipv6takma ad net_pf_10_proto_0_type_6 dccp_ipv6
takma ad net_pf_10_proto_33_type_6 dccp_ipv6
takma ad nf_conntrack_10 nf_conntrack_ipv6
takma ad nf_nat_10 nf_nat_ipv6
takma ad nft_afinfo_10 nf_tables_ipv6
takma ad nft_chain_10_nat nft_chain_nat_ipv6
takma ad nft_chain_10_route nft_chain_route_ipv6
takma ad nft_expr_10_reject nft_reject_ipv6
takma ad sembolü:nf_defrag_ipv6_nf_defrag_ipv6'yı etkinleştir
takma ad sembolü:nf_nat_icmpv6_reply_translation nf_nat_ipv6
takma ad sembolü:nft_af_ipv6 nf_tables_ipv6
takma ad sembolü:nft_reject_ipv6_eval nft_reject_ipv6
$
Modül bağımlılıklarını göster
Linux çekirdeği modüler olacak şekilde tasarlanmıştır ve işlevsellik bir dizi modüle dağıtılmıştır. Bu, modprobe kullanılarak tekrar görüntülenebilen birkaç modül bağımlılığına yol açar. Liste 7, i915 modülünün bağımlılıklarını listelemek için “-show-depends” seçeneğini kullanır.
Liste 7: Modül bağımlılıklarını göster
$ /sbin/modprobe --show-i915'e bağlıdırinsmod /lib/modüller/3.16.0-7-amd64/kernel/drivers/i2c/i2c-core.ko
insmod /lib/modüller/3.16.0-7-amd64/çekirdek/sürücüler/i2c/algos/i2c-algo-bit.ko
insmod /lib/modüller/3.16.0-7-amd64/kernel/drivers/thermal/thermal_sys.ko
insmod /lib/modüller/3.16.0-7-amd64/çekirdek/sürücüler/gpu/drm/drm.ko
insmod /lib/modüller/3.16.0-7-amd64/kernel/drivers/gpu/drm/drm_kms_helper.ko
insmod /lib/modüller/3.16.0-7-amd64/çekirdek/sürücüler/acpi/video.ko
insmod /lib/modüller/3.16.0-7-amd64/çekirdek/sürücüler/acpi/düğme.ko
insmod /lib/modüller/3.16.0-7-amd64/çekirdek/sürücüler/gpu/drm/i915/i915.ko
$
Bağımlılıkları “ağaç” veya “lsblk” komutuna benzer bir ağaç olarak görüntülemek için modtree projesi [5] yardımcı olabilir (i915 modül ağacı için aşağıdaki şekle bakın). GitHub'da ücretsiz olarak mevcut olmasına rağmen, özgür yazılım kurallarına uymak ve paket olarak bir Linux dağıtımının parçası olmak için bazı uyarlamalar gerektirir.
Modüller yükleniyor
Çalışan bir çekirdeğe bir modül yüklemek iki komutla yapılabilir - insmod ("insert module") ve modprobe. Bu ikisi arasında küçük ama önemli bir fark olduğunu unutmayın: insmod modül bağımlılıklarını çözmez, ancak modprobe daha akıllıdır ve bunu yapar.
Liste 8, IrDA çekirdek modülünün nasıl yerleştirileceğini gösterir. Lütfen insmode'un tam modül yolu ile çalıştığını, modprobe'un modülün adından memnun olduğunu ve mevcut Linux çekirdeği için modül ağacında kendisini aradığını unutmayın.
Liste 8: Bir çekirdek modülü ekleme
# insmod /lib/modüller/3.16.0-7-amd64/kernel/net/irda/irda.ko…
# modprobe irda
Boşaltma modülleri
Son adım, çalışan bir çekirdekten modüllerin boşaltılmasıyla ilgilidir. Yine, bu görev için kullanılabilecek iki komut vardır - modprobe ve rmmod (“modu kaldır”). Her iki komut da modül adını parametre olarak bekler. Liste 9 bunu, çalışan Linux çekirdeğinden IrDA modülünü kaldırmak için gösterir.
Liste 9: Bir çekirdek modülünü kaldırma
# rmmod irda…
# modprobe -r irda
…
Sonuç
Linux çekirdek modüllerini kullanmak büyük bir sihir değil. Öğrenilmesi gereken birkaç komutla mutfağın ustası sizsiniz.
teşekkür ederim
Yazar, makaleyi hazırlarken yardımlarından dolayı Axel Beckert'e (ETH Zürich) ve Saif du Plessis'e (Hothead Studio Cape Town) teşekkür eder.
Bağlantılar ve Referanslar
- [1] Çekirdek modülü, Arch Linux wiki, https://wiki.Archlinux.kuruluş/dizin.php/Kernel_module
- [2] Çekirdek Yapılandırması, https://tldp.kuruluş/NASIL/SCSI-2.4-NASIL/kconfig.html
- [3] kmod, https://git.çekirdek.org/pub/scm/utils/kernel/kmod/kmod.git
- [4] Çekirdek modülü imzalama tesisi, https://www.çekirdek.kuruluş/doc/html/v4.15/yönetici kılavuzu/modül imzalama.html
- [5] mod ağacı, https://github.com/falconindy/modtree