Sürücü modülleri otomatik olarak yüklenmiş ve boşaltılmış mı?


15

Ubuntu 14.04'te, harici kablosuz adaptörümü takmadığımda modülünün rt2800usbhala gösterildiğini gördüm lsmod.

  1. otomatik olarak bir sürücü modülünün yüklenmesi ne zaman gerçekleşir? Aygıt bilgisayara bağlandığında veya işletim sistemi önyükleme yaptığında mı?

  2. bir sürücü modülünün otomatik olarak boşaltılması ne zaman gerçekleşir? Aygıtın bilgisayarla bağlantısı kesildiğinde mi yoksa işletim sistemi kapandığında mı?

Yanıtlar:


13

Çekirdek yeni bir aygıt algıladığında, programı çalıştırır modprobeve aygıtı tanımlayan bir ad verir. Çoğu aygıt, satıcı veya model için kayıtlı numaralarla tanımlanır, örneğin PCI veya USB tanımlayıcıları. modprobeProgram modülü takma tablosunu danışır söz konusu aygıtın sürücüsünü içeren dosyanın adını bulmak için. Benzer bir ilke, dosya sistemleri ve şifreleme algoritmaları gibi donanım aygıtı olmayan şeyler için sürücüler için de geçerlidir. Daha fazla ayrıntı için bkz. Debian yeniden başlatıldıktan sonra seri PCI kartı algılamıyor/lib/modules/VERSION/modules.alias

Modprobe, hangi modül dosyasının ( .ko) istenen sürücüyü içerdiğini belirledikten sonra, modül dosyasını çekirdeğe yükler: modül kodu dinamik olarak çekirdeğe yüklenir . Modül başarıyla yüklendiyse, bu listeden listesinden görünecektir lsmod.

Modüllerin otomatik yüklenmesi, çekirdek yeni çalışırken takılabilir bir donanım algıladığında, örneğin bir USB çevre birimi bağladığınızda gerçekleşir. İşletim sistemi ayrıca, başlatma sırasında mevcut olan çevre birimlerinin sürücülerini yüklemek için başlangıçta sistemde bulunan tüm donanımları numaralandırır.

modprobeVeya insmodkomutuyla bir modülün manuel olarak yüklenmesini istemek de mümkündür . Çoğu dağıtım, içinde listelenen modülleri yükleyen bir başlangıç ​​komut dosyası içerir /etc/modules. Yüklenecek modüllerin başka bir yolu, bir modülün bağımlılığı ise: A modülü B modülüne bağlıysa, modprobe AA'yı yüklemeden önce B'yi yükler.

Bir modül yüklendikten sonra, o sürücüyü kullanan tüm aygıtların bağlantısı kesilmiş olsa bile, açıkça kaldırılana kadar yüklü kalır. Uzun zaman önce, kullanılmayan modülleri otomatik olarak boşaltmak için bir mekanizma vardı, ancak doğru bir şekilde hatırlarsam, udev olay yerine geldiğinde kaldırıldı. Otomatik modül boşaltma işleminin yaygın bir özellik olmadığından şüpheleniyorum, çünkü buna ihtiyaç duyacak sistemler çoğunlukla zaten çok fazla belleğe sahip (sürücü kodu ölçeğinde) masaüstü bilgisayarlar.


Teşekkürler. Değiştirmedim /etc/modules. rt2800usbçıktısıdır lsmodve bu, önyüklemeden bu yana cihazını bilgisayarıma bağladığım anlamına mı geliyor?
Tim

1
@Tim Modül yüklüyse ve açıkça yüklemediyseniz ve listede yoksa /etc/modules, evet, muhtemelen modülün yüklenmesinin nedeni cihazın bir noktada bulunmasıdır.
Gilles 'SO- kötü olmayı kes'

5

Modüller, sistem İlk RAM Diski (diğer bir deyişle initrd) üzerinden önyükleme yaptığında yüklenir . Gerekçe Bölümü şunları belirtir:

Birçok Linux dağıtımı, dağıtımın geliştiricilerinin çok çeşitli donanımlarda önyükleme yapmak için özel olarak oluşturdukları tek bir genel Linux çekirdek görüntüsü gönderir. Bu genel çekirdek görüntüsünün aygıt sürücüleri, yüklenebilir çekirdek modülleri olarak dahil edilmiştir, çünkü birçok sürücüyü statik olarak bir çekirdeğe derlemek, çekirdek görüntüsünün çok daha büyük olmasına, belki de sınırlı belleğe sahip bilgisayarlarda önyükleme yapmak için çok büyük olmasına neden olur. Bu, daha sonra kök dosya sistemini önyükleme zamanında monte etmek için gerekli modülleri algılama ve yükleme sorununu veya bu nedenle kök dosya sisteminin nerede veya ne olduğunu belirleme sorununu doğurur.

Ubuntu, diğer birçok dağıtım gibi, sürücünün gerekli olup olmadığına bakılmaksızın ve ayrıca aygıtın sistemde mevcut olup olmadığına bakılmaksızın her aygıt sürücüsünü bu initrd'e yüklemeyi seçer. Giles'in işaret ettiği gibi, her şey RAM'e yüklenir ve daha sonra kullanılan modüller başlangıçta algılanır ve kullanılmayanlar RAM'den çıkarılır. Bu yaklaşımı kullanmak, Ubuntu'nun kurulumdan bağımsız olarak her zaman herhangi bir sistemde başlamasını sağlar. Ubuntu, mikro çekirdek yapıları kullanarak monolitik bir çekirdeği taklit ediyor. Bu Çalışmanın Sebebine Bakın


  1. rt2800usbModül, Gilles'in bahsettiği initramflere dahil edildiğinden, modül her zaman önyüklemede yüklenir . İnitramfs initrd'in ardılıdır, bu nedenle her zaman tarafından gösterilecektir lsmod. Yeni derlenmiş bir modülü, modprobeardından modül adını kullanarak çekirdeğe ekleyebileceğinizi unutmayın .

Bir test olarak kablosuz adaptörünüz takılı değilken sisteminizi yeniden başlatın. Her şey yolunda giderse modül lsmodbaşlatma sırasında listelenmeyecektir, çünkü önyükleme sırasında initramfs tarafından başlatılan algılama işlemi ve başlangıç ​​sistemi problama sırasında cihazı bulamadı ve modül RAM'den çıkarıldı.

  1. Bir sistem çalışırken modülü kaldırmak için , modül adı gibi rmmodveya modprobe -rardından gelen komutları kullanabilirsiniz . Bir sonraki önyüklemede modül yeniden yüklenir. Yukarıyı görmek. Çoğu durumda bir modül dinamik olarak çıkarılmaz, çünkü bu hotplugging'i devre dışı bırakacaktır, yani bir modül çıkarıldıktan sonra yeniden takıldığında aygıtı kullanan cihaz yeniden algılanamaz.

Bir modülü lsmodkaldırmak için, seçilen modül olmadan çekirdeği yeniden derleyip daha sonra görüntüyü yeniden oluşturarak oluşturulan initramfs görüntüsünden kaldırmanız gerekir. Bunu yapmak söz konusu modülün tüm algılanmasını devre dışı bırakır.


3
Bir RAM diskinin bir parçası olarak RAM'e bir dosya yüklemeyi ve çalışan çekirdeğe bir modülü yüklemeyi (yani dinamik olarak bağlamayı) karıştırıyorsunuz. Modüller geçici olarak initrd'den (günümüzde teknik olarak bir initramfs) çekirdeğe değil, belleğe yüklenir, ancak gerçek kök takıldıktan sonra bellekten kaldırılır. Modüller çekirdeğe yalnızca bunları kullanan bir aygıt algılandığında yüklenir (birkaç istisna dışında).
Gilles 'SO- kötü olmayı bırak'

Burada kabul ederken, Ubuntu RAM Diskini yeniden yapılandırmayı seçmedikçe yapılamayacak bir modülün boşaltılması ve yüklenmesi hakkında konuşuyordu, çünkü Ubuntu tüm modülleri her çekirdek güncellemesinde RAM'e yüklemeyi seçiyor. Tüm modüller her seferinde yüklenir, hepsi kullanılmaz.
eyoung100

2
Hayır, soru çekirdeğe bir modül yüklemek ve boşaltmakla ilgilidir. Ne orijinal cevabınız ne de gözden geçirilmiş cevabınız buna değinmez. İnitramfs bu soru ile ilgisizdir (veya en fazla çevresel olarak anlamlıdır).
Gilles 'SO- kötü olmayı bırak'

@Gilles Bu daha iyi mi ??
eyoung100

1
@ eyoung100, Gilles ile aynı fikirdeyim. Initramfs'ın bir tartışması soru ile ilgili değildir. Modüller genellikle /syssistemdeki aygıtların numaralandırılması ve sistemde bulunan aygıtların sürücülerinin yüklenmesi ile yüklenir. Bu, aygıt önyüklemede mevcutsa veya daha sonra çalışırken takılı olsun. udevonunla ilgisi initramfs / initrd'den çok daha fazladır ve initramfs içine (veya bir yapılandırma seçeneği /etc/initramfs-tools/initramfs.conf) tüm modüllerin çoğunun veya sadece bazı modüllerin kopyalanıp kopyalanmadığı özellikle ilgili değildir.
Celada
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.