Linux çekirdeğinin çalışması için bir dosya sistemine ihtiyacı var mı?


19

Bence evet, çünkü dış dünyaya (imtiyazsız işlemci modu) tüm faydalı maruziyetler için öncelikle dış dünyada çalışan bir süreç gerekir. Bunun için bir dosya sistemi, hatta geçici bir RAM içi dosya sistemi gerekir.

Başka bir mühendis benimle aynı fikirde değil, ama bunu (benim için bilinmeyen) tüm vakaların ötesinde kanıtlayamıyorum.

Bu sorunun cevabı 'koşu' tanımına bağlı mı?


4
çalışan bir çekirdek "gerektirmez" olduğunu düşünüyorumuseful exposure to the outside world
jsotola

19
Eski durdurulmuş Linux güvenlik duvarını (2002 dolaylarında) akla getiriyor
Jeff Schaller

1
Çekirdeğe yeni kod eklerseniz, her şeyi yapabilirsiniz. Eğer yapamazsanız, çalıştırmaya çalıştığı noktaya kadar para cezası başlatacaktır init(ilk kullanıcı alanı işlemi) ve bu başarısız olacaktır.
user253751

1
"Koşmak" tanımlayın ...
Thorbjørn Ravn Andersen

Yanıtlar:


27

Bu oldukça garip bir soru çünkü çekirdeği bir program çalıştırdığınız gibi çalıştırmıyorsunuz. Çekirdek, programları çalıştırmak için bir platformdur. Tabii ki kurulum ve kapatma kodu var, ancak çekirdeği kendi başına çalıştırmak mümkün değil. Her zaman ana bir "init" süreci olmalıdır. Ve eğer orada değilse, çekirdek panikleyecektir. Eğer init çekirdekten çıkmaya çalışırsa panik olur.

Bugünlerde init süreci systemd gibi bir şey. Aksi belirtilmedikçe çekirdek, ile başlayan konumlar listesinden bir program çalıştırmayı dener /sbin/init. Linux ile önyükleme yapabileceğiniz acil bir durumda http://man7.org/linux/man-pages/man7/bootparam.7.html init Param'ı buradan görebilirsiniz init=/bin/bash. Ancak çalıştırılacak dosya sisteminde her zaman bir dosyayı nasıl belirlediğinize dikkat edin.

Böylece, çekirdek başlatılırsa panik yapacaktır.

Çekirdeğin dosya sistemine erişmek için sürücüleri yüklemesi gereken tavuk ve yumurta durumu nedeniyle bazı karışıklıklar ortaya çıkabilir. Bunu tamamlamak için, disk üzerindeki hayati sürücüler ve kurulum komut dosyaları içeren bir görüntüden ilk ramdisk yüklenir. Bunlar dosya sistemi yüklenmeden önce yürütülür. Ancak ilk ramdisk'in kendisi bir dosya sistemidir. İlk ramdisk /initile çağrılır (ilk ramdiskte saklanır). Birçok dağıtımda nihayetinde buna çağrıda bulunur /sbin/init. Yine bir dosya sistemi olmadan, bu imkansızdır.


Çekirdeğin donanımı başlatmaya ve bilinen bir dosya sistemini (initrd init params aracılığıyla çekirdeğe aktarılmamış) yüklemeye çalışmasından vazgeçtiği, ardından çok sınırlı bir kabuğa (init = / bin / bash olmadan) düştüğü bir durum yok mu? Ayrıca, / bin / bash öğesini getirdiğiniz için, çekirdeği bu sorunu ortadan kaldırabilecek diğer .config seçenekleriyle oluşturulmuş olsa bile, her zaman en az dosya sistemine sahip olur mu?
Peter L.

1
@PeterL. bu sınır kabuğu, initrd / initramfs / 'den gelen herhangi bir çekirdek IIRC'den gelen bir kabuktur.
muru

3
Eğer initramfs (a ramfs veya tmpfs dosya sistemi içine ayıklanır bir CPIO arşivi) inşa edebilirsiniz Not içine kernel. Çekirdeğin "bir dosya sistemine ihtiyaç duyduğu" olarak kabul edilip edilmeyeceği size bağlıdır, çünkü çekirdeği ve çekirdekten başka bir şeyi önyükleyebileceğiniz ve işlevsel (biraz sınırlı ise) bir sisteme sahip olabileceğiniz anlamına gelir. Ayrıca, çekirdeği artık bir init gerektirmeyecek şekilde yamalasanız bile, yine de hiç açığa çıkmayan dahili sanal dosya sistemleri oluşturacağını unutmayın .
orman

@forest Sistem "sınırlı" olmak zorunda değildir - sistemd ve gnome'u initrd'inize koyabilirsiniz (gerçekten yararlı olan şeylerle birlikte ;-)). Initramfs bir kısıtlaması (hala?) İdi uzatılmış özelliklerini destekleyen olmadığını - Ben yaptım o andan itibaren bir döngü cihazı olarak monte edilmiş initrd'yi cpio arşivde bir ext4 görüntüsünü ekleyerek android üzerinde Bunun çevresinin init.$DEV.rckomut.
Billy

1
@IsmaelMiguel, hayır, böyle bir initramfs bir cpio arşivi. Squashfs, gömülü dosya sistemleri için iyi bir seçimdir ve onu kullanan bir initrd (initramfs'ye karşı) yapılabilir (terimler genellikle birbirinin yerine kullanılır , ancak tamamen aynı şey değildir), ancak Linux'un açtığı format değildir. initramfs. (Gerçekten de, bir squashfs görüntüsünün kullanılmadan önce ambalajından çıkarılması gerekmez; düzgün bir şekilde dizine eklenir).
Charles Duffy

16

Bu sorunun cevabı, kelimenin tam anlamıyla bir dosya sistemi olmadan kastettiğinize veya sorunun gerçekte belirtilenden biraz farklı yorumlanıp tasarlanmadığına bağlı olacaktır. Sorunun nasıl yorumlandığına ilişkin küçük değişikliklerin cevapları şunlardır:

  • Linux'u herhangi bir blok cihaz olmadan çalıştırmak , bazı özel kullanım durumları için tamamen uygulanabilir ve kullanışlıdır.
  • Linux'u herhangi bir dosya sistemi olmadan çalıştırmak , çekirdek kodunun bazı bölümlerinin yeniden yazılmasını gerektirecektir ve yararlı bir çaba olması pek olası değildir.
  • Linux'u herhangi bir dosya tanımlayıcı kullanmadan çalıştırmak çok çaba gerektirecektir. Bunun çabaya değmeyeceğinden eminim.

Dosya sistemi olmayan bir çalışma sistemi oluşturmak için çekirdek kodunun bölümlerini yeniden yazmanızın nedenleri şunlardır:

  • Her iş parçacığının bir kök dizini ve bazı dosya sistemlerini göstermesi gereken geçerli bir çalışma dizini vardır.
  • Programlar, execvebir dosya sisteminden yürütülebilir dosya gerektiren sistem çağrısı tarafından başlatılır .
  • Çekirdek, önyükleme işlemi sırasında bellek tabanlı bir dosya sistemi oluşturur.

Bir programı kullanmaya başladıktan sonra, başlatıldığı execveyürütülebilir dosyayı eşlemesini kaldırmak mümkündür, ancak hemen çökmeden bunu yapmak için önce bir dosya tarafından desteklenmeyen yürütülebilir bir bellek eşlemesi oluşturmanız gerekir, ve ona atlayıp yürütülebilir dosyayı açmadan önce bazı yararlı kodlarla başlatması gerekir.

Böylece, çalışan bir kullanıcı modu programı, dosyalar tarafından desteklenen bellek eşlemelerinin olmadığı bir durumda bulunabilir ve dosyalar tarafından desteklenen tüm dosya tanımlayıcılarını kapatabilir. Bir kök dizine ve geçerli çalışma dizinine sahip olmayı durduramaz, ancak bunlardan kaçınabilir.

Bu durumda, dosya sistemini programın altından koparmak ve çalışmaya devam etmesini sağlamak için çekirdek kodunu uygulayabiliyor olsanız da, kullanışlı gibi görünmüyor. Ve bir dosya sistemi kullanmak için ara bir durumdan geçmeden bu son duruma geçmek, yararlı bir fayda için daha fazla iş olacaktır.

Bazı özel kullanım durumları için kullanışlı bir kurulum

Blok cihazların kullanımından kaçınmak faydalı olabilir. Önyükleme sırasında çekirdek bir bellek dosya sistemi oluşturur ve cpioyürütmeden önce bu dosya sistemini bir arşivdeki içeriklerle doldurabilir init. Bu şekilde, sistemi herhangi bir blok cihazı olmadan tamamen bellek tabanlı bir dosya sisteminden çalıştırabilirsiniz.

Bu, herhangi bir durumu korumak istemediğiniz ve sistemin yeniden başlatıldıktan sonra temiz bir sayfadan başlamasını istediğiniz sistemler için yararlı olabilir.

Tabii ki çekirdek ve cpio arşivi, çekirdeğe kontrol verilmeden önce bir şekilde hafızada var olmak zorundadır. Onlar nasıl var çizme yükleyici için bir iş var. Son çalışan sistem blok cihazları kullanmasa bile, önyükleme yükleyicisi bir blok cihazdan yükleyebilirdi. Ancak önyükleme yükleyicisinin, örneğin ağ üzerinden önyükleme yaparak bir blok aygıtı kullanmadan çekirdek ve cpio arşivini edinmesi de mümkündür.


1
Soru, herhangi bir yerleşik yapılandırmadaki (hiçbir şeyi yeniden yazmadan) bir Linux çekirdeğinin herhangi bir dosya sistemi olmadan 'çalışabilmesi'. Yararlı bir şey yapmak veya bir devleti korumak zorunda değildir. Tüm cevaplardan, bir tür dosya sisteminin en azından kapatılana kadar çekirdeğin içinde sağlandığını ve varsayıldığını anlıyorum . '/' Bile bir dosya sistemidir. Yani, cevabı basitleştirmeyi düşünüyorum 'evet'.
Peter L.

2
@PeterL. Evet, hiçbir şeyi yeniden yazmazsanız Linux bir dosya sistemi gerektirir. İnsanlar bir dosya sistemi olmadan Linux'un pratik kullanımları hakkında konuştuğunda, genellikle bir blok cihaz tarafından desteklenenlere atıfta bulunurlar ve bir blok cihaz tarafından desteklenen bir dosya sistemi olmadan Linux'u çalıştırabilirsiniz. Hala bir tür dosya sisteminiz var.
kasperd

3

Linux'ta neredeyse her cihaz bir dosyadır , bu yüzden onu çalıştırmak için bir dosya sistemine sahip olmanız gerekir.


8
Ancak elbette aygıt sürücüleri, bir aygıt dosyasının bunları gösterip göstermediğine bakılmaksızın çekirdek içinde bulunur.
Philip Couling

6
Her cihaz bir dosya değildir. Örneğin eth0, ağ arayüzleri ( wlan0vb.) Değildir.
Ruslan

1
Bu yaygın bir yanlış anlamadır. Teoride, her şey UNIX ve UNIX benzeri sistemlerde bir dosya olsa da, yalnızca Plan 9 gibi son derece uzmanlaşmış sistemler için tamamen doğrudur (ancak Windows'dan çok daha doğrudur). Linux için, birkaç şey dosya değildir. Birçok sürücü kullanım Netlink ziyade karakter cihazlarda ıoctl'ler (başladık gibi bu daha doğrudur elde ettiğini olan dosyalar).
orman

@forest Plan 9 "son derece uzmanlaşmış" bir sistem değildir - Unix veya pencereler gibi genel amaçlı bir sistem olması gerekiyordu (neden Unix'in yerine geçemedi ve bir araştırma sistemi olarak kaldı, tamamen farklı bir hikaye). Her neyse, tıpkı Linux gibi, plan9 da sanallaştırılmış arayüzleri donanımına maruz bırakıyor (ve herhangi bir ioctl'e sahip değil - daha tutarlı olmaya çalışsa bile, netnet vs ioctls faktörünün nasıl kullanıldığını göremiyorum (ör. ağ arabirimlerine dosya sistemi üzerinden erişilebilir). Ad alanlarının tanıtılmasıyla, Linux zaten klasik unix'ten ziyade plan9'a benziyor.
Billy

1
Çok güzel bir argüman: ya tanım başına bir dosya sistemi olan devfs var ya da devfs yok, bu durumda cihaz düğümlerini barındırmak için bir dosya sistemine ihtiyacınız var ...
pmf

-1

Bir çekirdek tıpkı diğer tüm programlar gibi. Varsayılan olarak Linux çekirdeği dosya sistemine erişmeye çalışır, ancak bu davranış çekirdek değişikliği (aslında sadece "arch_call_rest_init ()" işlevinin eklenmesi) ile önemsiz bir şekilde ortadan kaldırılabilir. "Yararlı iş" gerçekleştirmek için geliştiricinin, istenen başlatma ve uygulama türü iş yükünü gerçekleştirmek için özel bir sürücüdeki çekirdek iş parçacıklarını (kthreads) içerebileceğini umuyoruz. Linux çekirdeği zaten birçok kthreads içerir, ancak öncelikle çekirdeğe veya sürücülere yardımcı işler yapmak için. Çekirdek bağlamında bulunan API'lar Linux kullanıcı alanında bulunan API'lerden oldukça farklıdır. Sistem çağrısı işlevselliğinin büyük bir kısmı dosya sistemi olmayan bir senaryoda işe yaramaz hale gelir.

Evet, Linux varsayılan olarak dosya sistemlerine erişim bekler. Hayır, herhangi bir dosya sistemi olmadan yararlı işler yapmak için kesinlikle değiştirilmiş bir çekirdek yapılabilir. Linux dosya sistemi olmadan pratik kullanımı IMO oldukça sınırlıdır, ancak sıfır değildir. FWIW, geçmişte birçok gerçek zamanlı çekirdek RT uygulamaları ile aynı isim-uzay ve ikili dosyalara inşa edildi.

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.