Linux çekirdeğinin sistem kapatması dahili olarak nasıl çalışır?


28

Nasıl olduysa, kullanıcı alanı ve init sistemi (klasik init sysV / upstart / systemd) sistemin kapatılmasında nasıl çalıştığı hakkında kabaca bir fikrim var. (Temelde "Dur!", "Lütfen şimdi dur lütfen", "Sizi Durdurmak için İhtiyacım Olan Süreç" ve devam eden ... bir şeyler sırası var.

Her neyse, sistemin kapatılmasının çekirdekte nasıl çalıştığından habersizim (nerede mutlaka yapılacak çok şey var)?

Çekirdek belgelerine https://www.kernel.org/doc/htmldocs/ göz atmaya çalıştım ve hatta nasıl çalıştığını öğrenmeye başlamam için NSA'nın arama aracını bile kullandım .

Ayrıca SE U + L'yi aradım ve hiçbir şey bulamadım (gözden kaçırdım mı?)

Her halükarda soru, biraz zor olsa da, daha fazla kişinin kapanırken linux çekirdeğinde neler olduğuna dair bir taslak almakla ilgilendiklerini düşündüğümden, bu Soru ve Cevap ağında bir cevabı hak eder.

Potansiyel olarak daha ayrıntılı açıklamalara bağlantıda değişiklik de vardır.

Bir cevap belki hangi sistem çağrılarını ve hangi çekirdek sinyallerinin kullanıldığını içerebilir?

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c , yeniden başlatma ile ilgili kullanılan x86 dosyası gibi görünüyor (zaten kapanmaya, eh?)

belki burada bulunan snippet http://lxr.free-electrons.com/source/kernel/reboot.c#L176 bir açıklama yapmak için kullanılabilir

176 boşluk kernel_power_off (boşluk)
177 {
178 kernel_shutdown_prepare (SYSTEM_POWER_OFF);
179 eğer (pm_power_off_prepare)
180 pm_power_off_prepare ();
181 migrate_to_reboot_cpu ();
182 syscore_shutdown ();
183 pr_emerg ("Kapatma \ n");
184 kmsg_dump (KMSG_DUMP_POWEROFF);
185 makina_power_off ();
186}
187 EXPORT_SYMBOL_GPL (kernel_power_off);

8
tek boynuzlu at seninle olsun
Kiwy

1
@Kiwy öneriniz için teşekkürler. Bir süre sonra potansiyel olarak daha iyi cevapların alınabilmesi için kabul edeceğim. Ama en azından bir cevap şimdi orada.
humanityANDpeace

Bana teşekkür etme, Unicorn'a teşekkür et!
Kiwy

A / orada olduğunu unutmayın pencere dışarı atlama seçeneği shutdown(8)yani kaldırılan -n Birini düşünmek okumak için kullanılan eski unix belgelerinde " kapatma sistemini kendimizi -! Çekirdek birimi AÇIK YANGIN olan " etkin biçimde dağınık bir sistem öldürmek anahtarı hangi bitleri zemine dağılmış olarak bırakabilir (veya en azından bozuk bir durumdaki dosya sistemlerini). Biri bunun, bir kişinin elini sadece bir soğutma fanına yakaladığı ana çerçeve tipi bir sistem için kullanılabileceğini düşünür. 🕱
SlySven

Yanıtlar:


26

Linux çekirdeğinin nasıl çalıştığını anlamak için ana kaynaklar:

  1. Belgeler .
  2. Linux Haftalık Haber makaleleri .
  3. Kaynak. Bu, Linux çapraz referansı olan LXR ile anlaşılması biraz daha kolay olan karmaşık bir canavardır . Lxr.linux.no'da çalışan LXR değişkeni diğerlerinden daha hoş, ancak çoğu zaman sorun değil.

Bu durumda, dokümantasyonda veya LWN'de merkezi olarak ilgili bir şey bulamıyorum, bu yüzden LXR öyle.

Kullanıcı kodunun yaptığı son şey rebootsistem çağrısını çağırmaktır . 4 argüman alır, bu yüzden SYSCALL_DEFINE4(rebootLXR'de arama yapar , bu da yol açar kernel/reboot.c. : Arayanın ayrıcalıkları ve argümanları kontrol ettikten sonra syscall giriş noktası bazı işlevlerin biri çağıran kernel_restartyeniden başlatma için, kernel_haltsıkı bir döngü durma noktasına kernel_poweroffsisteme kapalı iktidara kernel_kexeckarşı yenisi ile çekirdek yerine (derlenmiş) ya da hibernateKapatmadan önce hafızayı diske kaydetmek için

kernel_restart, kernel_haltVe kernel_power_offoldukça benzerdir:

  1. Üzerinden gidin reboot_notifier_listçekirdek bileşenleri olabilir kanca listesi olan kayıt PowerDown kod yürütmesine. Bu aşamada yalnızca birkaç sürücünün kod çalıştırması gerekir, çoğunlukla bekçi köpekleri.
  2. system_stateDeğişkeni ayarlayın .
  3. Artık kullanıcı kodunun başlatılmamasını sağlamak için usermode-helper işlevini devre dışı bırakın . (Bu aşamada hala mevcut işlemler olabilir.)
  4. device_shutdownSistemdeki tüm cihazları serbest bırakmak veya kapatmak için arayın . Bu aşamada pek çok sürücü var.
    Hala bu noktada monte edilmiş olan herhangi bir dosya sisteminin etkili bir şekilde zorla kaldırıldığını unutmayın. Sistem çağrısının arayanı, herhangi bir temiz sökme işleminin sorumluluğunu üstlenir.
  5. Gücü kapatmak için, eğer ACPI yapılandırılmışsa, muhtemelen ACPI S5 durumuna girmeye hazırlanmak için kod yürütün (yumuşak kapatma).
  6. Çok işlemcili bir makinede kod, hangi sistem çağrısını çağıran herhangi bir CPU'da çalışıyor olabilir. migrate_to_reboot_cpubelirli bir CPU'ya geçmeye ve zamanlayıcının diğer CPU'lara kod göndermesini önler. Bu noktadan sonra, sadece tek bir CPU çalışıyor.
  7. syscore_shutdownkayıtlı syscore işlemlerininshutdown yöntemini çağırır . Bunun çoğunlukla kesintileri engellemekle ilgili olduğunu düşünüyorum; birkaç kanca bir yöntem var.shutdown
  8. Bir bilgi mesajı günlüğü - kuğu şarkısı.
  9. Nihayet arayarak bazı makine bağımlı bir şekilde dinlenmeye gitmek machine_restart, machine_haltya da machine_power_off.

Kış uykusu kodu aşağıdaki adımlardan geçer:

  1. Güç yönetimi kancalarını tekrarlayın .
  2. Dosya sistemlerini senkronize edin.
  3. Tüm kullanıcı kodunu dondur .
  4. Cihazın çalışırken takılmasını önleyin .
  5. Sistem durumunu takas alanına boşaltın.
  6. Her şey başarılı olursa , donanımı hazırda bekletme moduna geçirin . Bu, arama kernel_restart, kernel_haltveya kernel_power_offveya bazı platforma özel hazırda bekleme yöntemini içerebilir .

Sistemi kapatmanın farklı bir yolu machine_emergency_restart. Bu, sihirli SysRq anahtarıB tarafından çağrılır . OAnahtar farklı çalışır: o çağırırkernel_power_off .

Sistem ayrıca bir paniğe , yani kurtarılamayan bir hataya da kapatılabilir . Panikleme bir mesajı günlüğe kaydetmeye çalışır, ardından sistemi yeniden başlatır (donanım izleme cihazı veya acil durum yeniden başlatması yoluyla).


+1 teşekkürler! @ Gilles, makinenin RAM'ını bir son adım olarak silen / yapılandıracak bazı kodlar uygulamak isteseniz, bunun için bir syscore işlemini kaydederdiniz syscore_shutdown(yani, diğer soruma unix.stackexchange.com/q/122540/24394 ) . Adım (1) ve adım (7) her ikisi de kapanırken çalıştırılacak olanları kaydetmeye izin verir, ne olduğunu söylemezler. + (1) ve (7) 'deki bu geri aramaların yürütme sırasının etkilenemediği izlenimini edindim! Bahsettiğiniz dokümanları ben veririm, ama eğer biliyorsanız! Teşekkürler!
humanityANDpeace

Bu soruya şaşırdım ve cevabın daha fazla oyu yok.

2

Bu sadece kısmi bir cevap ve kesinlikle daha ayrıntılı ve net olabilecek başka cevapları davet ediyorum.

Bu cevabın içeriği 3.13 linux çekirdeğin alınır kernel/reboot.c(isim shutdown.c ama reboot.c olmadığından ilk tahmin değil olabilir) dosyası

Her neyse, içeride sistemi kapatma sürecini belirleyen üç temel fonksiyon var.

  • void kernel_halt(void) // durma durumunda olan bir sistemle biter
  • void kernel_power_off(void) // kapalı bir sistemle biter
  • void kernel_restart(char *cmd) // sistemi henüz yeniden başlatması için biter

Bu işlevler çok kısa ve bu nedenle buraya tamamen yapıştırılabilir. Kodları, çekirdeğin kapatılması yolunda hangi adımların atıldığını en iyi şekilde gösterir. (yorumlar benim tarafımdan ve% 100 ideal ve doğru olmayabilir, emin olduğunuzdan emin olun. Denemek kolaydır.

void kernel_halt(void)

void kernel_halt (void)
{
    // 1. adım:
    // a) yeniden başlatma / kapatma konumunda çalışmak için kayıtlı çağrı işlevleri / geri arama
    // b) system_sate öğesini SYSTEM_HALT olarak ayarlayın
    // c) userspacetool etkileşimini durdur
    // d) device_shutdown () işlevini çağırın
    kernel_shutdown_prepare (SYSTEM_HALT);

    // 2. adım: Bunun çoğunlukla çoklu işlemci sistemleri için bir gereklilik olduğunu düşünüyorum.
    migrate_to_reboot_cpu ();

    // 3. adım:
    // syscore_shutdown - Tüm kayıtlı sistem çekirdeği kapatma geri çağrılarını çalıştır 
    syscore_shutdown ();

    // 4. mesajlar
    pr_emerg ("Sistem durduruldu \ n");
    kmsg_dump (KMSG_DUMP_HALT);

    // 5. çağrı kemerine özgü cpu-durt kodu
    machine_halt ();
}

her şey, sys_rebootsadece yeniden başlatılması değil, aynı zamanda kapatma işlemi de dahil olmak üzere, kapatma işlemiyle bağlantı kurmak için doğrudan bir şey olmadığı için sistem çağrısı ile başlatılır .

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.