/ Proc / * nasıl çalışır?


62

Birçok dosya var /procgibi /proc/cpuinfo, /proc/meminfo, /proc/devicesve benzeri, hangi açıldı, geri dönüş sistemi bilgi.

Bu dosyalar gerçekte herhangi bir varlığa sahip görünmüyor, çünkü fileüzerlerinde çalışanlar sadece boş olduklarını söylüyor.

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

Bu dosyalar tam olarak nasıl çalışır?

Yanıtlar:


72

En azından uygulama detaylarına ihtiyacınız yoksa, oldukça basit.

Öncelikle, Linux'ta tüm dosya sistemleri (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) çekirdeğe uygulanır. Bazıları FUSE üzerinden kullanıcı koduna boşaltılabilir ve bazıları yalnızca bir çekirdek modülü biçiminde gelir ( yerel ZFS , lisans kısıtlamaları nedeniyle ikincisinin kayda değer bir örneğidir), ancak her iki durumda da bir çekirdek bileşeni kalır. Bu önemli bir temeldir.

Bir program, bir dosyadan okumak istediğinde, sonuçta bir şeklinde çekirdekte sona çeşitli sistem kitaplığı çağrıları yayınlayacak open(), read(), close()dizi (muhtemelen ile seek()iyi ölçmek için atılmış). Çekirdek sağlanan yolu ve dosya adını alır ve dosya sistemi ve aygıt G / Ç katmanı aracılığıyla bunları fiziksel okuma isteklerine (ve çoğu durumda da istek yazmak - örneğin atime güncellemelerini düşünün) bazı temel depolamaya çevirir.

Ancak, bu talepleri özellikle fiziksel, kalıcı depolamaya çevirmek zorunda değildir . Çekirdek sözleşmesi, belirli bir sistem çağrısı kümesinin yayınlanmasının söz konusu dosyanın içeriğini sağlayacağı yönündedir . Tam olarak bizim fiziksel alemimizde "dosya" bulunduğu yerde buna ikincildir.

Açık /procgenellikle bilinenler olarak monte edilir procfs. Bu özel bir dosya sistemi türüdür, ancak bir dosya sistemi olduğu için, örneğin bir ext3yere monte edilmiş bir dosya sisteminden gerçekten farklı değildir . Böylece istek, tüm bu dosya ve dizinleri bilen ve çekirdek veri yapılarından belirli bilgileri geri alan procfs dosya sistemi sürücü koduna iletilir .

Bu durumda "depolama katmanı", çekirdek veri yapılarıdır ve procfsbunlara erişmek için temiz ve kullanışlı bir arayüz sağlar. Montaj işlemlerinin /procyalnızca kurallara uygun olduğunu unutmayın; başka bir yere kolayca monte edebilirsiniz. Aslında, bu bazen yapılır, örneğin chroot hapishanelerinde, orada çalışan işlemin bir nedenden dolayı / proc'a erişmesi gerektiğinde yapılır.

Bazı dosyaya bir değer yazarsanız aynı şekilde çalışır; çekirdek düzeyinde, yani bir dizi çevirir open(), seek(), write(), close()yeniden dosya sistemi sürücüsü geçirilen olsun aramalar; Yine, bu özel durumda, procfs kodu.

fileDönen görmenin özel nedeni empty, procfs tarafından sunulan dosyaların çoğunun 0 bayt boyutunda olması. 0 bayt boyutunun çekirdek tarafında bir optimizasyon olması muhtemeldir (/ proc içindeki dosyaların çoğu dinamiktir ve uzunluğunu kolayca değiştirebilir, muhtemelen bir okunandan diğerine okunur ve her dizinin okunan her dosyanın uzunluğunu hesaplar) potansiyel olarak çok pahalı olabilir). Strace ya da benzeri bir araçla çalıştırarak kendi sisteminizde doğrulayabileceğiniz bu cevaba yapılan yorumlar, fileönce stat()herhangi bir özel dosyayı algılamak için bir çağrı yapar ve ardından dosya boyutu 0 olarak bildirilirse, bu fırsatı değerlendirir. , iptal edin ve dosyayı boş olarak bildirin.

Bu davranış aslında belgelenmiştir edilebilir belirterek geçersiz -sveya --special-filesüzerinde file, çağırma olarak yan etkileri olabilir manuel sayfada belirtilen rağmen. Aşağıdaki alıntı, 17 Ekim 2011 tarihli, BSD dosya 5.11 kılavuz sayfasından alınmıştır.

Normalde, dosya yalnızca stat (2) raporlarının normal dosyalar olduğu argüman dosyalarının türünü okumaya ve belirlemeye çalışır. Bu, sorunları önler, çünkü özel dosyaları okumanın kendine özgü sonuçları olabilir. -sSeçeneğin belirtilmesi, dosyanın blok veya karakter özel dosyaları olan bağımsız değişken dosyalarını da okumasına neden olur. Bu, özel dosyaları engelleyen ham disk bölümlerindeki verilerin dosya sistemi türlerini belirlemek için kullanışlıdır. Bu seçenek ayrıca bazı sistemlerde ham disk bölümleri için sıfır boyut bildirdiğinden, dosyanın stat (2) tarafından bildirildiği şekilde dosya boyutunu göz ardı etmesine neden olur .


5
strace file /proc/versionVeya ile baktığınızda ltrace -S /proc/version, optimizasyon oldukça küçüktür. stat()Önce bir çağrı yapar ve boyutun 0 olduğunu bulur, bu nedenle - atlar open()- ama ondan önce birkaç sihirli dosya yükler.
ott--

2
@ Bu gerçekten olayların garip bir dizi, ama ott-- olabilir Birden dosya adları için geçebilir gerçeği ile ilişkili file. Bu şekilde, dosya sihirli dosyaları önceden yükler, ardından komut satırı parametresini parametre ile işler; yerine içine sihirli dosya yükleme hareketli "sadece dosyanın türünü belirlemek için denemeden önce bunu bu karmaşıklığı artıracak kodlarına dahil belirli biridir". stat()Dönüş değerine çağrı yapmak ve harekete geçmek esasen zararsızdır; hataları ortaya çıkaran ilave iç durum risklerini takip etmede karmaşıklık eklemek.
bir CVn

@ ott-- Aslında, file“dosya boş” raporlarının nedeni , statözel dosyaları (boru adı, cihazlar adı verilen…) tespit etmeye çağırması ve boş dosyaları işlemeyi durdurmak için bu fırsatı kullanmasıdır. file -s /proc/version“ASCII metni” bildirir.
Gilles 'SO- kötülük olmayı bırak'

4
@Gilles -sBlok / char özel cihazlar için gerekiyordu. Sonunda filekaynağa baktım ve fsmagic.c'nin sonunda bu açıklamayı neden bunun ASCII textyerine neden döndüğünü gördüm empty:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
ott--

15

Bu dizinde, çekirdeğin aygıtları nasıl görüntüleyebileceğini, çekirdek ayarlarını düzenleyebilir, çekirdeğe aygıtları ekleyebilir ve tekrar kaldırabilirsiniz. Bu dizinde doğrudan bellek kullanımı ve G / Ç istatistiklerini görebilirsiniz.

Hangi disklerin monte edildiğini ve hangi dosya sistemlerinin kullanıldığını görebilirsiniz. Kısacası, neye bakacağınızı biliyorsanız, Linux sisteminizin her yönü bu dizinden incelenebilir.

/procDizin normal bir dizin değil. Bir önyükleme CD'sinden önyükleme yapacak ve sabit sürücünüzdeki bu dizine bakacak olsaydınız, boş olduğunu görürdünüz. Normal çalışan sisteminize baktığınızda oldukça büyük olabilir. Ancak, herhangi bir sabit disk alanı kullanıyor gibi görünmüyor. Bunun nedeni sanal bir dosya sistemi olmasıdır.

Yana /procdosya sistemi sanal bir dosya sistemidir ve bellekte bulunan, yeni bir /procdosya sistemi Linux makine yeniden başlatılır her zaman oluşturulur.

Başka bir deyişle, Linux sisteminin bağırsaklarına bir dosya ve dizin türü arayüzü ile kolayca göz atma ve dürtme aracıdır. /procDizindeki bir dosyaya baktığınızda, doğrudan Linux çekirdeğindeki bir belleğe bakıyorsunuz ve ne görebildiğini görüyorsunuz.

Dosya sistemindeki katmanlar

Resim tanımını buraya girin

Örnekler:

  • İçinde /proc, çalışan her işlem için işlem kimliğiyle adlandırılmış bir dizin vardır. Bu dizinler, süreçler hakkında yararlı bilgiler içeren dosyalar içerir, örneğin:
    • exe: İşlemin başlatıldığı diskteki dosyaya sembolik bir bağlantı olan.
    • cwd: işlemin çalışma dizinine sembolik bir bağlantı olan.
    • wchan: okunduğunda, işlemin açık olduğu bekleme kanalını döndürür.
    • maps: okunduğunda, işlemin hafıza haritalarını döndürür.
  • /proc/uptime çalışma süresini bir boşlukla ayırarak saniye cinsinden iki ondalık değer olarak döndürür:
    • çekirdeğin başlamasından bu yana geçen süre.
    • çekirdeğin boşta kaldığı süre.
  • /proc/interrupts: Kesintilerle ilgili bilgi için.
  • /proc/modules: Bir modül listesi için.

Daha ayrıntılı bilgi için, bkz . Proc veya kernel.org .


"Bir açılış CD'sinden önyükleme yapacak ve sabit diskinizdeki bu dizine bakacak olsaydınız boş olduğunu göreceksiniz." Bu, / proc'a özgü olmayan, temel dosya sisteminin monte edilmediği herhangi bir bağlama noktasına geneldir. Aynı önyükleme CD'sinden önyükleme yapar ve bunun gibi bir şey mount -t procfs procfs /mnt/procyaparsanız, şu anda çalışan çekirdeği / proc'u görürsünüz.
bir CVn

5

Haklısın, gerçek dosyalar değiller.

En basit ifadeyle, çekirdeği doğrudan çağırmak yerine normal dosya okuma ve yazma yöntemlerini kullanarak çekirdeği ile konuşmanın bir yoludur. Unix'in “her şey bir dosya” felsefesi ile aynı doğrultuda.

İçindeki dosyalar /procfiziksel olarak hiçbir yerde bulunmaz, ancak çekirdek orada okuduğunuz ve yazdığınız dosyalara tepki verir ve depoya yazmak yerine, bilgileri bildirir veya bir şey yapar.

Benzer şekilde, dosyalar /devgerçekten de geleneksel anlamda dosyalar değildir (bazı sistemlerde dosyalar /devgerçekte diskte bulunsa da, atıfta bulundukları cihazdan başka bir şey alamazlar) - konuşmanıza olanak tanırlar normal Unix dosyası G / Ç API'sini kullanan bir cihaza - veya kabukları gibi kullanan herhangi bir şeye


1
Daha çok * nix'e benzer, sadece bir dosyanın güvenliği sağlanabilir. Erişim kontrol listeleri dosya sisteminde sürdüğünden, ayrıcalıklı kaynakların, dosya sistemi sürücüsü tarafından önceden sağlanan ortak mekanizmayı kullanarak güvenceye alınması uygundur. Bu, çekirdek yapılarına erişen ve proc dosya sistemi sanal dosyalarından okuyarak izinlerini yükseltmeden çalıştırmalarına izin veren araçların uygulanmasını kolaylaştırır.
Pekka,

3

İçinde /procdizinde, iki adet içerik türünün ilk numaralandırılmış dizin ve ikinci bir sistem bilgileri dosyası vardır.

/procsanal bir dosya sistemidir. Örneğin, yaparsanız ls -l /proc/stat, 0 bayt boyutunda olduğunu fark edersiniz, ancak “cat / proc / stat” yaparsanız, dosyanın içinde bir miktar içerik görürsünüz.

Bir yapın ls -l /procve sadece sayılarla dizinleri çok göreceksiniz. Bu sayılar işlem kimliklerini (PID) temsil eder. Bu numaralı dizindeki dosyalar, söz konusu PID ile olan işleme karşılık gelir.

Altında bulunan bazı dosyalar /proccpuinfo, meminfo ve loadavg gibi sistem bilgilerini içerir.

Bazı Linux komutları bu /procdosyalardaki bilgileri okur ve görüntüler. Örneğin, free komutu /proc/meminfodosyadaki hafıza bilgilerini okur , formatlar ve görüntüler.

Tek tek /procdosyalar hakkında daha fazla bilgi edinmek için “man 5 FILENAME” kullanın.

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

2
Bu bana daha çok "içinde / proc içinde ne kullanılır?" Gibi geliyor. "nasıl çalışır / proc çalışır?" Yararlı bilgiler, ancak mutlaka bu soruyu cevaplama .
bir CVn

/ Proc içindeki her dosya çalışma zamanı bilgisidir, yani çekirdeğin bir kısmını / proc / meminfo kısmını çalıştırdığınızda dosya içeriğini üreten bir fonksiyon çalışır.
Shailesh

3

Minimum çalıştırılabilir örnek

Bence bu şeyleri anlamanın en iyi yolu aslında onlarla oynamaktır, işte bir procfs girişi yaratan bir çekirdek modülü:

myprocfs.c

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
#include <uapi/linux/stat.h> /* S_IRUSR */

static const char *filename = "lkmc_procfs";

static int show(struct seq_file *m, void *v)
{
    seq_printf(m, "abcd\n");
    return 0;
}

static int open(struct inode *inode, struct  file *file)
{
    return single_open(file, show, NULL);
}

static const struct file_operations fops = {
    .llseek = seq_lseek,
    .open = open,
    .owner = THIS_MODULE,
    .read = seq_read,
    .release = single_release,
};

static int myinit(void)
{
    proc_create(filename, 0, NULL, &fops);
    return 0;
}

static void myexit(void)
{
    remove_proc_entry(filename, NULL);
}

module_init(myinit)
module_exit(myexit)
MODULE_LICENSE("GPL");

ve sonra bununla etkileşimde bulunuruz:

insmod procfs.ko
cat /proc/lkmc_procfs

ve bu çıktıyı üretir:

abcd

Bu örnekten, procdosyaların open, readve gibi rasgele "dosyayla ilgili sistem çağrıları" uygulamamıza izin verdiğini açıkça görüyoruz llseek.

Bu sistem çağrıları daha sonra çekirdekle keyfi iletişim kurmak için kullanılabilir.

Bu nedenle, bu dosyaların dosya sistemindeki gerçek dosyalarla ilgisi yoktur ve bu neredeyse hepsi için geçerlidir.

Örneğin küçük örneğimizde, readher zaman geri dönen , işe yaramaz bir dosya hazırlıyoruz abcd\n.

İşte bu çekirdek modülüyle kolayca ve güvenle inşa etmek ve oynamak için tam otomatik QEMU + Buildroot kurulumum:

Diğer bazı benzer arayüzler şunları içerir:

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.