Cat / proc / cpuinfo komutunu çalıştırdığımda ne olur?


Yanıtlar:


72

Her ne zaman altında bir dosya okursanız /proc, bu, çekirdeğin dosya içeriği olarak okunacak metni hesaplayan bazı kodları çağırır. İçeriğin anında oluşturulduğu gerçeği, hemen hemen tüm dosyaların neden şimdiki zamanları ve boyutlarının 0 olarak bildirildiğini açıklar - burada “bilmiyorum” olarak 0 okumalısınız. Normal dosya sistemlerinden farklı olarak, üzerine procfs/proc adı verilen dosya sistemi, bir diskten veya başka bir depolama ortamından (FAT, ext2, zfs,…) veya ağ üzerinden (NFS, Samba,…) veri yüklemez. ve kullanıcı kodunu çağırmaz ( FUSE’in aksine ).

Procfs, çoğu BSD birliğinde mevcut değildir. AT & T’nin UNIX 8. basımdaki Bell Laboratuarlarında hayatını süreçler hakkında bilgi rapor etmenin bir yolu olarak başlattı (ve psgenellikle okunan bilgiler için güzel bir yazıcıdır /proc). Procfs uygulamalarının çoğunda /proc/123, PID 123 ile yapılan işlemle ilgili bilgileri bildirmek için çağrılan bir dosya veya dizin bulunur. Linux, proc dosya sistemini, örneğin durumunu da içeren sistemin durumunu bildiren daha birçok girişle genişletir /proc/cpuinfo.

Geçmişte, Linux /procsürücüler hakkında bilgi sağlayan çeşitli dosyalar satın aldı, ancak bu kullanım artık kullanımdan kaldırıldı /sysve /procşimdi yavaş yavaş gelişiyor. Geriye dönük uyumluluk için olduğu gibi kalır /proc/busve /proc/fs/ext4kalır, ancak altında daha yeni benzer arayüzler oluşturulur /sys. Bu cevapta, Linux'a odaklanacağım.

/procLinux ile ilgili belgeler için birinci ve ikinci giriş noktalarınız :

  1. proc(5)Adam sayfası ;
  2. /procDosya sistemi içinde çekirdek belgelerinde .

Dokümantasyon onu kapsamadığında üçüncü giriş noktanız kaynağı okuyor . Kaynağı makinenizden indirebilirsiniz, ancak bu çok büyük bir program ve Linux çapraz referansı olan LXR çok yardımcı oluyor. (LXR'nin pek çok çeşidi vardır; çalışan lxr.linux.nobiri en güzel olanıdır , ancak maalesef site çoğu zaman kapalıdır.) C hakkında az bilgi sahibi olmak gerekir, ancak gizemli bir değeri bulmak için bir programcı olmanıza gerek yoktur. .

/procGirişlerin çekirdek işlenmesi fs/procdizinde. Herhangi bir sürücü girişleri kaydedebilir /proc(yukarıda belirtildiği gibi, şu anda lehine itiraz edilmiş olsa da /sys), bu nedenle aradığınızı bulamazsanız fs/procbaşka bir yere bakın. Sürücüler çağrısı işlevleri bildirildi include/linux/proc_fs.h. 3.9'a kadar olan çekirdek sürümleri işlevleri create_proc_entryve bazı paketleyicileri (özellikle create_proc_read_entry) ve 3.10 ve üzeri çekirdek sürümlerini yalnızca proc_createve proc_create_data(ve birkaç tane daha) sağlar.

Alarak /proc/cpuinfobir örnek olarak, bir arama "cpuinfo"çağrısına götürür proc_create("cpuinfo, …")içinde fs/proc/cpuinfo.c. Kodun hemen hemen kaynak kodu olduğunu görebilirsiniz: çoğu dosya /procsadece bazı metin verilerini aştığından, bunun için yardımcı fonksiyonlar vardır. Sadece bir seq_operationsyapı var ve gerçek et cpuinfo_op, genellikle arch/<architecture>/kernel/setup.c(veya bazen farklı bir dosyada) tanımlanmış mimariye bağlı veri yapısında . Örnek olarak x86'yı alarak, yönlendirildik arch/x86/kernel/cpu/proc.c. Orada ana işlevishow_cpuinfo, istenen dosya içeriğini basar; Altyapının geri kalanı, verileri okuma sürecine istediği hızda beslemek için oradadır. CPU frekansı gibi anında hesaplanan birkaç sayı da dahil olmak üzere çekirdekte toplanan verilerin çekirdek içindeki çeşitli değişkenlerdeki verilerden görebilirsiniz .

Bunun en büyük kısmı, /procişlem başına bilgidir /proc/<PID>. Bu girişler kayıtlıdır fs/proc/base.ciçinde, tgid_base_stuffdizideki ; Burada kayıtlı bazı fonksiyonlar diğer dosyalarda tanımlanmıştır. Bu girdilerin nasıl oluşturulduğuna dair birkaç örneğe bakalım:

Bir diğer önemli alan /procis /proc/sysdoğrudan arayüz, sysctl. Bu hiyerarşideki bir girdiden okumak, karşılık gelen sysctl değerinin değerini döndürür ve yazma sysctl değerini ayarlar. Sysctl için giriş noktaları içeride fs/proc/proc_sysctl.c. Sysctls register_sysctlve arkadaşlarının kendi kayıt sistemi vardır .


59

Büyü sıralama en iyi arkadaşınızdır perde arkasında neler olduğu hakkında fikir edinmek için çalışırken strace. Bu aracı kullanmayı öğrenmek, sahnelerin ardında çılgın büyünün ne olduğuna dair daha iyi bir takdir almak için yapabileceğiniz en iyi şeylerden biri.

$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536)                      = 0
close(3)                                = 0
...

Yukarıdaki çıktıdan, /proc/cpuinfobunun sadece normal bir dosya olduğunu veya en azından bir tane olduğunu görebilirsiniz. Öyleyse daha derine inelim.

Derin dalış

# 1 - ls ile ..

Dosyanın kendisine bakıldığında "sadece bir dosya" gibi görünebilir.

$ ls -l /proc/cpuinfo 
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo

Ama yakından bak. Özel olduğuna dair ilk ipucumuzu alıyoruz, dosyanın boyutunun 0 bayt olduğuna dikkat edin.

# 2 - stat ile birlikte ..

Şimdi dosyaya statbakarsak, özel bir şey olduğuna dair bir sonraki ipucumuzu alabiliriz /proc/cpuinfo.

1. koş.
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
 Birth: -
koş # 2
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
 Birth: -

Erişim, Değiştirme ve Değişiklik zamanlarını fark ettin mi? Her erişim için değişmeye devam ediyorlar. Bu, her 3'ün de böyle değişmesi oldukça olağandışı bir durum. Bir dosyanın düzenlenmediği sürece, zaman damgası nitelikleri tipik olarak aynı kalır.

# 3 - dosyayla ..

Yine de bu dosyanın normal bir dosyadan başka bir şey olmadığı kanısındayım:

$ file /proc/cpuinfo 
/proc/cpuinfo: empty

İsmi geçen bir borunun tezahürü olsaydı, bu dosyalardan birine benzer bir şey gösterirdi:

$ ls -l /dev/initctl /dev/zero 
prw-------. 1 root root    0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero

$ file /dev/initctl /dev/zero 
/dev/initctl: fifo (named pipe)
/dev/zero:    character special

A'ya dokunursak emptyfile, /proc/cpuinfobir dosyadan daha sonra bir boruya benziyor:

$ touch emptyfile
$ ls -l emptyfile 
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile 
emptyfile: empty
# 4 - mount ile birlikte ..

Yani bu noktada geri adım atmamız ve biraz uzaklaştırmamız gerekiyor. Belirli bir dosyaya bakıyoruz, ancak belki de bu dosyanın bulunduğu dosya sistemine bakmalıyız. Ve bunun için mountkomutu kullanabiliriz .

$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

Tamam, yani dosya sistemi türü tür proc. Yani /procfarklı bir dosya sistemi türüdür, altındaki dosyaların /procözel olması bizim ipucumuzdur . Onlar sadece değirmen dosyalarını yönetmiyor. O halde procdosya sistemini neyin özel kıldığı hakkında daha fazla bilgi bulalım .

mount'Nin man sayfasına bir göz atın :

Proc dosya sistemi özel bir cihazla ilişkili değildir ve onu monte ederken, bir cihaz spesifikasyonu yerine proc gibi isteğe bağlı bir anahtar sözcük kullanılabilir. (Geleneksel seçim hiçbiri daha az şanslı: umount'dan "none busy" hata mesajı kafa karıştırıcı olabilir.)

Ve eğer onun procerkek sayfasına bakarsak :

Proc dosya sistemi, çekirdek veri yapılarına arayüz olarak kullanılan sahte dosya sistemidir. Genellikle / proc'a monte edilir. Çoğu salt okunurdur, ancak bazı dosyalar çekirdek değişkenlerinin değiştirilmesine izin verir.

Aynı adam sayfasında biraz daha aşağı:

/ Proc / cpuinfo

Bu, desteklenen her mimari için farklı bir liste olan CPU ve sistem mimarisine bağlı öğeler topluluğudur. İki ortak giriş CPU numarası ve bogomips veren işlemcidir; çekirdek başlatma sırasında hesaplanan bir sistem sabiti. SMP makineleri her bir CPU için bilgiye sahiptir. Lscpu (1) komutu, bilgilerini bu dosyadan toplar.

Man sayfasının altında, burada bulabileceğiniz bir çekirdek belgeye referanstır: THE / proc FILESYSTEM . Bu belgeden alıntı:

Proc dosya sistemi, çekirdekteki iç veri yapılarına bir arayüz görevi görür. Sistem hakkında bilgi edinmek ve çalışma zamanında belirli çekirdek parametrelerini değiştirmek için kullanılabilir (sysctl).

Sonuçlar

Peki, burada ne öğrendik? Eh verilen /procbir sözde dosya sistemi ve aynı zamanda bir "iç veri yapılarına arayüzüne" olarak anılır bunun içinde ürün olduğunu varsaymak muhtemelen güvenli değil gerçek dosyalar değil, sadece belirtileri dosyaları gibi görünmek için yapılmış, ama gerçekten değil.

Görünüşe göre man 5 proc2004'ün sonlarından önceki sürümlerinde kullanılan, ancak ne nedenle olursa olsun dahil olmayan bu alıntı ile yakınlaşacağım . Not: Neyin ne /procolduğunu çok iyi tanımladığı için neden kaldırıldığından emin değilim :

GNU / Linux sistemlerindeki / proc dizini, çekirdeğe bir dosya sistemi benzeri arayüz sağlar. Bu, normal dosya sistemi I / O işlemini kullanarak uygulamaların ve kullanıcıların çekirdekten bilgi almalarını ve değerleri belirlemelerini sağlar.

Proc dosya sistemi bazen bir işlem bilgisi sözde dosya sistemi olarak da adlandırılır. `` Gerçek '' dosyalar içermez, bunun yerine çalışma zamanı sistem bilgilerini içerir (örn. Sistem belleği, takılı cihazlar, donanım yapılandırması vb.). Bu nedenle çekirdeğin kontrol ve bilgi merkezi olarak kabul edilebilir. Aslında, epeyce sistem yardımcı programları bu dizindeki dosyaları çağırıyor. Örneğin, çekirdek tarafından yüklenen modülleri listeleyen lsmod komutu, temelde 'cat / proc / module' ile aynı iken, sistemin PCI veri yoluna bağlı aygıtları listeleyen lspci, 'cat / ile aynıdır. proc / pci'. Bu dizinde bulunan dosyaları değiştirerek, sistem çalışırken çekirdek parametrelerini değiştirebilirsiniz.

Kaynak: Proc sözde dosya sistemi

Referanslar


1
Harika, :) soruyu gördüğüm gibi ilk denediğim şey bu:strace -o catcpuproc.txt cat /proc/cpuinfo
mkc

1
Güzel cevap! Linux'ta daha derine inmek istiyorsanız, proc dosya sisteminin kaynağı çekirdek kaynağında fs / proc dizinindedir. Bir fs / proc / cpuinfo.c olduğunu göreceksiniz, ancak ne yazık ki, ağır kaldırma tüm kemerlere / mimariye bağlı olduğu için yaylara yayıldığı için oldukça boştur. Daha basit bir örnek için bkz. Fs / proc / uptime.c. Dosyaya bakarak, uptime_proc_show'un bize istediğimiz verileri getiren şeyin beygir gücü olduğunu tahmin edebilir ve aradığı fonksiyonlara dalarak daha fazlasını keşfedebiliriz. Seq_file arayüzünü ve işlemlerde nasıl kullanıldığını anlamak için bakınız:
Steven D


1
@slm: +1, mükemmel cevap. Ama benim için, ilk ipucu, özel bir dosyadır, büyüklüğü ^^ 0 bayttır, ancak ondan bir çok şeyi kedi yapabilirsiniz (biraz boru dosyası gibi).
Olivier Dulac

@ OliverDulac - iyi nokta. Geri bildiriminize dayanarak ek düzenlemeler yaptım. LMK daha fazla iyileştirme yapabilirsem. Teşekkürler.
slm

14

@Smm tarafından verilen cevap çok kapsamlı, ancak daha basit bir açıklama perspektifindeki bir değişiklikten gelebilir diye düşünüyorum.

Günlük kullanımda, dosyaları fiziksel şeyler olarak düşünebiliriz, yani. Bazı cihazlarda depolanan veri parçaları. Bu, / proc / cpuinfo gibi dosyaları çok gizemli ve kafa karıştırıcı yapar. Ancak, dosyaları bir arayüz olarak düşünürsek, her şey mükemmel bir anlam ifade eder ; Bazı programların içine ve dışına veri göndermenin bir yolu.

Bu şekilde veri gönderen ve alan programlar, dosya sistemleri veya sürücülerdir (bu terimleri nasıl tanımladığınıza bağlı olarak, bir tanım çok geniş veya çok dar olabilir). Önemli olan nokta, bu programlardan bazılarının bu arayüz üzerinden gönderilen verileri saklamak ve almak için bir donanım cihazı kullanmasıdır; fakat hepsi değil.

Dosya sistemleri bazı örnekleri olmayan bir saklama aygıtı (en azından doğrudan) kullanımı vardır:

  • Aranan veya hesaplanan verileri kullanan dosya sistemleri. Proc bir örnek, çünkü çeşitli çekirdek modüllerinden veri alıyor. Aşırı bir örnek πfs'dir (github.com/philipl/pifs)
  • Verileri normal bir kullanıcı alanı programı ile işleyen tüm FUSE dosya sistemleri
  • Hareket halindeyken başka bir dosya sisteminin verilerini dönüştüren dosya sistemleri, örneğin şifreleme, sıkıştırma veya hatta ses kod dönüştürme (khenriks.github.io/mp3fs/)

Plan9 İşletim Sistemi ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ), dosyaları genel bir programlama arayüzü olarak kullanmanın aşırı bir örneğidir.

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.