Linux'ta giriş yapmayı anlayın


62

Anladığım kadarıyla, Linux çekirdeği /proc/kmsgdosyaya (çoğunlukla donanıma bağlı mesajlar) ve /dev/logsokete giriş yapıyor mu? Başka herhangi bir yer? Diğer uygulamalar da mesaj göndermek yapabiliyor musunuz /proc/kmsgyoksa /dev/log? Son olarak, ben Syslog'un olduğunu düzeltmek duyuyorum ( rsyslog , syslog-ng ) daha sonra bu iki yerde gelen mesajları denetler ve benzeri çeşitli dosyalara olanlar dağıtır /var/log/messagesveya /var/log/kern.loghatta merkezi syslog sunucusuna?

Yanıtlar:


81

Basitleştirilmiş, aşağı yukarı böyle gider:

Çekirdek mesajları ( printk()işlevi kullanarak ) çekirdek uzayındaki bir halka arabelleğine kaydeder . Bu mesajlar, kullanıcı alanı uygulamalarına iki şekilde sunulur: /proc/kmsgdosya aracılığıyla ( /procmonte edilmiş olması şartıyla ) ve sys_syslogsistem çağrısı yoluyla .

Çekirdek halka arabelleğini okuyan (ve bir dereceye kadar kontrol edebilen) iki ana uygulama vardır: dmesg(1)ve klogd(8). Birincisi, halka arabelleğinin içeriğini yazdırmak için kullanıcılar tarafından talep üzerine çalıştırılması amaçlanmıştır. İkincisi gelen mesajları okur bir servistir /proc/kmsg(veya çağrıları sys_syslogise, /procmonte edilmemiş) ve gönderir syslogd(8)veya konsola. Bu çekirdek tarafını kapsar.

Kullanıcı alanında, var syslogd(8). Bu, bir dizi UNIX etki alanı soketini dinleyen bir servistir (çoğunlukla /dev/logbaşkaları da yapılandırılabilir) ve isteğe bağlı olarak iletiler için UDP bağlantı noktası 514'ü içerir. Ayrıca klogd(8)( gelen syslogd(8)umursamıyor /proc/kmsg) mesajları alır . Daha sonra bu mesajları, bazı dosyalara /logveya adlandırılmış yöneltmelere yazar veya syslogyapılandırıldığı gibi bazı uzak ana bilgisayarlara ( protokol üzerinden, 5DP UDP bağlantı noktası üzerinden) gönderir /etc/syslog.conf.

Kullanıcı alanı uygulamaları normalde mesajları kaydetmek için bu libcişlevi syslog(3)kullanır. libcbu mesajları UNIX alan soketine /dev/log(okudukları yer syslogd(8)) gönderir , ancak eğer bir başvuru yapılırsa chroot(2), mesajlar diğer soketlere yazılabilir, fi /var/named/dev/log. Elbette, bu günlükleri gönderen uygulamalar için ve syslogd(8)bu soketlerin konumu üzerinde anlaşmaya varmak zorunludur. Bu nedenle syslogd(8), standart dışında ek soketleri dinleyecek şekilde yapılandırılabilir /dev/log.

Son olarak, syslogprotokol sadece bir datagram protokolüdür. Hiçbir uygulamanın, syslog(3)işlevi libctamamen atlayarak herhangi bir UNIX etki alanı soketine (kimlik bilgilerinin soketi açmasına izin vermesi şartıyla) syslog datagram göndermesini engelleyemez . Eğer datagramlar doğru formatlanmışsa syslogd(8), mesajlar gönderilmiş gibi kullanabilirsiniz syslog(3).

Tabii ki, yukarıdaki sadece "klasik" kayıt teorisini kapsar. Diğer cinleri (örneğin rsyslogve syslog-ngbahsettiğiniz gibi) sade yerini alabilecek syslogd(8)benzeri, şifreli TCP bağlantıları üzerinden uzaktan ana mesaj göndermek yüksek çözünürlüklü damgaları sağlamak ve benzeri, ve şık her türlü şeyi yapmak. Ve ayrıca systemd, bu Linux'un UNIX bölümünü yavaşça fagositozlaştırıyor. systemdkendi kayıt mekanizmalarına sahiptir, ancak bu hikaye başkası tarafından anlatılmalıdır. :)

* BSD dünyası ile farklılıklar:

* BSD'de yoktur klogd(8)ve /procya yoktur (OpenBSD'de) ya da çoğunlukla kullanılmaz (FreeBSD ve NetBSD'de). syslogd(8)karakter cihazdan çekirdek mesajları okur /dev/klogve dmesg(1)kullanır /dev/kmemçekirdek isimlerini deşifre etmek. Sadece OpenBSD’de bir /dev/log. FreeBSD iki UNIX etki alanı soketi kullanır /var/run/logve var/rub/logprivbunun yerine NetBSD'de bir tane vardır /var/run/log.


3
nit: rsyslog şimdi daha popüler (Fedora, Debian için varsayılan) ve ayrı bir klogd kullanmıyor. Görünüşe göre syslog-ng de değil (tercihe göre).
kaynakjedi

@sourcejedi Birkaç yıldan fazla bir süredir Linux'u bu kadar yakından takip etmedim, ancak IIRC rsyslogkullanmıyor klogd(8)çünkü kökleri geriye doğru gidiyor, kısa bir süre önce bununla açık bir karar verdiğinden değil. Hafızam olsa başarısız olabilir. Her neyse, dediğim gibi, sadece "klasik" günlüğe kaydetmeyi deniyordum.
lcd047

1
@ lcd047, @sourcejedi, Cevaplar için teşekkürler! rsyslogdÇalışan bir Debian 7 sistemim ve çalışan bir Ubuntu 12.04 sistemim syslog-ngvardı ve ikisi de /proc/kmsgaçık dosyaya sahipti lsof, yani klogdkullanılmıyordu. Dikkatimi çeken bir diğer ilginç şey /proc/kmsgise, herhangi bir syslog arka plan programı çalışmadığında günlük mesajlarının dosyada depolanması ve bunlardan birinin örneğin catmetin editörüyle görüntülenmesi. Ancak, bu mesajları yalnızca bir kez görüntülemek mümkündür, çünkü görüntüledikten sonra kaybolurlar. Son fakat en az değil, yürütme dmesg, /proc/kmsgdosyanın içeriğini temizlemez .
Martin

1
@Martin /proc/kmsgnormal bir dosya değil, orada "depolanmış" bir şey yok, sadece çekirdeğin halka arabelleğinin bir görüntüsü. catKesin olarak okuyabilirsiniz çünkü klogd(8)koşuya sahip değilsiniz (koşmalısınız klogd(8), cat /proc/kmsgengelleyiniz). dmesg(1)mesajları /dev/kmsgyerine okur /proc/kmsg; ve eğer söylerseniz, tamponu da temizleyebilir.
lcd047

1
systemd has its own logging mechanisms, but that story would have to be told by somebody else. :)- Lütfen söyle, yeteneğin var :-)
Flavius

51

Diğer cevap, yazarının dediği gibi, Linux'ta "klasik kayıt" ı açıklar. Bugünlerde pek çok sistemde işler böyle yürüyor.

Çekirdek

Çekirdek mekanizmaları değişmiştir.

Çekirdek, bellek içi ara belleğe çıktı üretir. Uygulama yazılımları buna iki şekilde erişebilir. Günlük alt sistemi genellikle adlandırılmış sahte FIFO olarak erişir /proc/kmsg. Bu günlük bilgisi kaynağı yararlı bir şekilde günlük okuyucular arasında paylaşılamaz, çünkü bir kez okundu. Birden fazla işlem paylaşıyorsa, her biri çekirdek günlük veri akışının yalnızca bir bölümünü alır. Aynı zamanda salt okunur.

Buna erişmenin diğer yolu daha yeni /dev/kmsgkarakter cihazıdır. Bu, çoklu müşteri süreçleri arasında paylaşılabilen bir okuma-yazma arayüzüdür. Birden fazla işlem paylaşıyorsa, hepsi birbirinden etkilenmeyen aynı veri akışını okur. Yazma erişimi için açarlarsa, çekirdek tarafından oluşturuluyormuş gibi, çekirdeğin günlük akışına mesaj da ekleyebilirler.

/proc/kmsgve /dev/kmsglog verilerini RFC-5424 olmayan bir formda sağlar.

Uygulamalar

Uygulamalar değişti.

GNU C kütüphanesinin syslog()ana işlevi, AF_LOCALadlı bir datagram soketine bağlanmaya /dev/logve log girişlerini yazmaya çalışır. (BSD C kütüphanesinin syslog()işlevi günümüzde /var/run/logsoket adı olarak kullanır ve /var/run/logprivönce çalışır .) Uygulamaların bunu doğrudan yapmak için kendi kodları olabilir. Kütüphane işlevi, uygulamanın kendi işlem içeriğinde çalıştırılan koddur (sonuçta, bir soketi açmak, bağlamak, yazmak ve kapatmak).

Uygulamalar, biri makinedeki bir AF_INET/ AF_INET6datagram soketinde dinliyorsa, UDP yoluyla RFC 5424 mesajlarını yerel bir RFC 5426 sunucusuna gönderebilir .

Daemontools dünyasının son yirmi yılda yarattığı baskı sayesinde, GNU syslog()C kütüphane işlevini ya da UDP soketlerini kullanmadıkları bir modda çalışan birçok dæmons desteği , ancak günlük verilerini standart hataya çeviriyor . sıradan Unix modası.

nosh ve genel olarak daemontools ailesi ile günlük yönetimi

Daemontools araç gereç ailesi ile kayıt tutmada çok fazla esneklik var. Ancak genel olarak tüm aile genelinde fikir, her "ana" démon'un ilişkili bir "kayıt" dæmonuna sahip olmasıdır. "ana" dæmons, dæmon olmayan işlemler gibi çalışır ve günlük mesajlarını, servis yönetimi alt sisteminin bir boru ile bağlanması için düzenlediği (günlük tutan verilerin kaybedilmemesi için açık tuttuğu) standart hataya (veya standart çıktıya) yazar. Bir servis yeniden başlatılması) "logging" dæmon'un standart girişine.

"Günlük" dæmons'ın tümü bir yere giriş yapan bir program çalıştırır . Genel olarak bu program, standart girişinden okuyan multilogveya buna benzer bir şeydir cyclogve (nanosaniye zaman damgalı) günlük dosyalarını kesinlikle boyutlandırılmış, otomatik olarak döndürülmüş, özel bir yazma dizinine yazar. Genel olarak, bu dæmonsların tümü, bireysel özel imtiyazsız kullanıcı hesaplarının himayesinde çalışır.

Böylece, her bir hizmetin günlük verileri ayrı olarak işlenirken, büyük ölçüde dağıtılmış bir kayıt sistemi bulunur.

Bir edebilir gibi bir şey çalıştırmak klogdveya syslogdveya rsyslogdbir daemontools-aile hizmet yönetimi altında. Ancak daemontools dünyası, yıllar önce "kütükleme" dæmons'lı hizmet yönetimi yapısının işleri daha basit bir şekilde yapmaya özen gösterdiğini fark etti. Tüm günlük akışlarını tek bir dev püre haline getirmeye gerek yok, günlük verilerini ayrıştırır ve ardından günlük dosyalarını ayırmak için akışları havalandırır; ve sonra (bazı durumlarda), taraftaki güvenilir olmayan bir harici kütük dönme mekanizmasını cıvatalar. Standart log yönetiminin bir parçası olan daemontools-family yapısı zaten log rotasyonu, logfile yazma ve dere ayrımı yapıyor.

Ayrıca: Tüm hizmetlerde ortak olan araçlarla zincirleme ayrıcalıkların düşürülmesi modeli, günlükleme programlarının süper kullanıcı ayrıcalıklarına ihtiyaç duymadığı anlamına gelir; ve UCSPI modeli, yalnızca veri akışına karşı datagram taşınma gibi farklara dikkat etmeleri gerektiği anlamına gelir.

Uç araç takımı bunu örneklendirir. Biri iken edebilir çalıştırmak rsyslogdkutunun dışında, bunun altında ve sadece çekirdek yönetmek, /run/logve UDP eski şekilde girdi log; o da bunları günlüğe daha "daemontools yerli" yol sunar:

  • Bir klogdhizmeti /proc/kmsggünlük akışından standart hataya okuyan ve basitçe yazan bir servis . Bu adlı basit bir program tarafından yapılır klog-read. İlişkili günlük kaydı, standart girişindeki günlük akışını bir /var/log/sv/klogdgünlük dizinine besler .
  • Bir local-syslog-readverikatarlarının okur servis /dev/log( /run/logsadece BSD türevi üzerinde) ve onun standart hataya o günlük akışı yazar. Bu adlı bir program tarafından yapılır syslog-read. İlişkili günlük kaydı, standart girişindeki günlük akışını bir /var/log/sv/local-syslog-readgünlük dizinine besler .
  • Bir udp-syslog-readbasitçe, UDP syslog bağlantı noktasını dinleyen bunun nelerin gönderileceğini okur ve hizmet standart hata o günlük akışı yazar. Yine program syslog-read. İlişkili günlük kaydı, standart girişindeki günlük akışını bir /var/log/sv/udp-syslog-readgünlük dizinine besler .
  • (BSD'lerde) local-priv-syslog-readdatagramları okuyan /run/logprivve basitçe bu günlük akışını standart hatasına yazan bir servis . Yine program syslog-read. İlişkili günlük kaydı, standart girişindeki günlük akışını bir /var/log/sv/local-priv-syslog-readgünlük dizinine besler .

Araç seti aynı zamanda export-to-rsyslogbir veya birkaç günlük dizinini izleyebilen bir araçla birlikte gelir (müdahaleci olmayan günlük imleç sistemi kullanarak ) ve ağ üzerinden RFC 5424 formundaki yeni girişleri belirlenmiş bir RFC 5426 sunucusuna gönderir.

systemd ile log yönetimi

sistem bir tek yekpare log yönetim programına sahiptir systemd-journald. Bu sistem tarafından yönetilen bir servis olarak çalışır.

  • /dev/kmsgÇekirdek günlük verileri için okur .
  • GNU C kütüphanesinin fonksiyonundan uygulama günlük verileri için okur /dev/log(sembolik bir bağlantı /run/systemd/journal/dev-log) syslog().
  • Sistem tarafından yönetilen servislerden gelen günlük verileri için AF_LOCALakış soketinde dinler /run/systemd/journal/stdout.
  • Sisteme özgü günlük protokolünü konuşan programlardan gelen log verilerini (örneğin ve ark.) AF_LOCALDatagram soketinde dinler ./run/systemd/journal/socketsd_journal_sendv()
  • Bunları bir araya getirir.
  • /run/log/journal/Veya içindeki bir sistem çapında ve kullanıcı başına günlük dosyalarına yazar /var/log/journal/.
  • AF_LOCALSyslog'a /run/systemd/journal/syslogiletme yapılandırılmışsa, (bir istemci olarak) oradaki bir datagram soketine bağlanabiliyorsa dergi verilerini oraya yazar.
  • Konfigüre edilirse, yazılabilir /dev/kmsgmekanizmayı kullanarak dergi verilerini çekirdek tamponuna yazar .
  • Yapılandırılırsa, günlük verilerini terminallere ve konsol cihazına da yazar.

Bu program çökerse veya servis durdurulursa sistem genelinde kötü şeyler olur.

systemd, /run/systemd/journal/stdoutsokete eklenecek (bazı) hizmetlerin standart çıktılarını ve hatalarını kendisi düzenler . Bu nedenle, normal şekilde standart hataya giriş yapan kişilerin çıktılarını dergiye göndermeleri gerekir.

Bu tamamen klogd, syslogd, sysloging ve rsyslogd'u destekler.

Bunların şimdi sisteme özgü olması gerekiyor. Bir systemd sisteminde onlar sunucu sonu olamaz /dev/log. Bunun yerine iki yaklaşımdan birini alırlar:

  • Onlar dergi verilerini bağlamaya ve yazmaya çalışan /run/systemd/journal/syslog(eğer hatırlıyorsanız) sunucu sonu olurlar systemd-journald. Birkaç yıl önce, biri bunu imuxsockyapmak için rsyslogd'ın giriş yöntemini yapılandırmış olacaktı .
  • İkili günlük biçimini anlayan ve eklenmiş yeni girişler için günlük dosyalarını ve dizini izleyebilen sisteme özgü bir kitaplık kullanarak doğrudan sistem günlüğünden okurlar. Günümüzde, imjournalbunu yapmak için rsyslogd'ın giriş yöntemi yapılandırılmaktadı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.