Neden -inum tüm dosya sistemi ağacında yineleniyor?


1

Basit bir işlem yaptığımda tüm dosya sisteminde yineleme / gezinme bulmam beni şaşırtıyor.

find -inum 12345

Arka plan bilgisi olmadan bana öyle geliyor ki, bu belirli 12345 numaralı inode'lu tüm dosyaları anlatmanın çok daha kolay yolları olmalı (burada sadece bir yer tutucudur)?

Bunun için daha iyi bir yol var mı? Hangi dosya adlarının bir inode ile ilişkili olduğunu söylemek için bir dosya sisteminin tüm dizin yapısını kontrol etmeyi gerektirmeyen biri mi?

Güncelleme

Sorunu ele alan başka bir soru var Hangi dosya (lar) ın belirli bir inode numarasına ait olduğunu ancak daha iyi (daha hızlı bir yol) bulma niyetiyle hızlı bir şekilde bulun.

Bu soru daha önce neden böyle bir sorun olduğunu bilmekle ilgilidir? Belki de izinler vb. İle ilgili iyi bir neden vardır; bu, kullanıcıların tüm dosya adlarını bir inode için arama yapması için dizin yapısını geçmekten kaçınmayı kasıtlı olarak zorlaştırmaya çalışacaktır.

Yine de, herhangi bir dosya sisteminin, tüm dosya adlarını bir inode'a (en azından ayrıcalıklı root) kullanıcıya söyleyen bir problemi olması oldukça garip görünüyor.

Bu sorunun yanıtlanması en çok ilgilendiğim dosya sistemi (eğer önemliyse) ext4.


Syscall veya kabuk betiği?
PersGulf

@MohsenPahlevanzadeh benim durumumda burada bir ikili çalıştırılabilir bulabilirsiniz. Demek istediğin bu mu?
insanlıkANDpeace

Kafam karıştı, çünkü eski görevinizi okudum, siz de sistem çağrısı yazdınız.
PersGulf

@MohsenPahlevanzadeh karışıklık için özür dilerim
humanityANDpeace

Yanıtlar:


1

Çok basit bir sebep, en azından ext2 / ext3 / ext4 tipi dosya sistemlerinde, dosya adlarının, dizin tipi dosyalarında depolanan dizin giriş verileri aracılığıyla depolanmasıdır.

Bunun anlamı, tür dizinindeki dosyaların, dosya adlarını (dizinin içindeki dosyaların) ve bu dosyaların verisine yol açan düğümlerin depolanması için az çok karmaşık bir sisteme sahip olmasıdır.

biraz basitleştirilmiş (ext3 / 4 dizin ağacı geçişini hızlandırmak için hash-tablo geliştirmelerini kullanır ...) böyle bir listeye benziyor:

## filenames ##    ## inode-numbers ##
filename1            0123
filename2            01242
anotherfilename      3313
yetanotherfilename   11233

Temel olarak, dosya isimleri, sadece, derzotriyum dosyaları ile ilgili verinin içinde meydana gelir ve inode için / dosyalarının depoladığı meta veride hiçbir yerde saklanmaz . Bu nedenle, bir inode numarasıyla ilgili dosya adlarını almanın tek yolu, tüm dizin dosyalarının tüm dizin girişlerini gözden geçirmektir.


1

Sen yazdın:

-İnum 12345 basit bir buluntu yaptığımda tüm dosya sisteminde iterat / yürüyüş bulmam beni şaşırtıyor.

findtanımı gereği, varsayılan bir başlangıç ​​dizini ile verilen bir dizinde veya dizinlerde başlayan bir ağaç yürüyüşü yapar ..

find -inum 12345Geçerli çalışma dizininden başlayarak tüm dizin ağacını dolaşacaktır. .Bir dosya sistemi bağlama noktası içermediği sürece muhtemelen tüm bir dosya sistemi boyunca yürümeyecektir .

- Belirli bir inode numarası ile tüm dosyaları bulmak için daha verimli yollar vardır fsdb, debugfsve ncheckcevap size bağlı - ama findvardır bir ağaç yürüyüş yapmak nedeniyle standartları . Aradığınız inode'un yalnızca bir bağlantıya sahip olması durumunda, ilk eşleşmeden sonra ağaç yürüyüşünü sona erdirme seçeneği destekliyorsa find, -quitseçenek sunabileceğini unutmayın .

Bu diğer komutlar bile, her zaman hızlı değildir, çünkü kısmen sadece bir dizin ağacı yerine tüm bir dosya sistemine bakmak zorundadırlar, ancak çalışabilecekleri verilerle ellerinden gelenin en iyisini yaparlar. Temel sorun çoğu Unix dosya sisteminin yapısıdır.

  • Bir dosyanın inode'unda pek çok bilgi parçası bulunmaktadır, ancak “dosyanın adı veya adları” ve “dosyayı içeren dizin veya dizinler” bunlar arasında değildir.
  • Bir Unix dosya sistemindeki bir dizinin yapısı çok basittir: her biri bir (inode numarası, dosya adı) çifti olan bir girdi listesi içerir.
  • 12345 düğümünü içeren dizini veya dizinleri ve bu dizinlerin başvuruda bulunduğu adı veya adları bulmak için, çoğu Unix dosya sisteminde, bu komutların, tüm eşleşen girişleri bulana kadar, dosya sistemindeki her dizinin her girişini araştırması gerekir. Bir dosyanın inode'u , kendisine başvuran dizin girişlerinin sayısını içerir, böylece bu kadar giriş bulduklarında arama yapmayı bırakabilirler.
  • Buna karşılık, bir yönetmenin adını bulmak çok daha etkili çünkü her dizin üst dizinin inode numarasını içeriyor .., bu nedenle eşleşen bir giriş için yalnızca bir dizinin aranması gerekiyor. (Bir istisna vardır: bir dosya sisteminin kök dizini ..aynı dizine işaret eden bir girişe sahiptir.)

Bazı yeni detayları ekleyen cevap için çok teşekkür ederim. seçenekleri gerçekten de çözemiyorlar fsdbya debugfsda dahili olarak da, inode numarasının adlarını bulmak için tüm dizinleri ve girişlerini incelemeleri gerekiyor. Yine de, kullanımla birlikte gelen bir miktar ek tasarruf sağlayabilirler find. İlk yanlış yönlendirilmiş fikrim, fs'deki <-> dosya adı (ları) eşlemesinin çift yönlü olduğu ve bununla birlikte bir ağaç yürüyüşünün gerekli olmadığıydı.
insanlıkANDpeace

neden "Neyse ki bir yönetmenin adını bulmak çok daha etkili, çünkü her bir dizin kendi dizinindeki inode numarasını içeriyor" diye mi?
insanlıkANDpeace

@humanityANDpeace Neredeyse tüm Unix dosya sistemlerinde, her dizin, içerdiği dizinin ..inode numarasını içeren adlı bir girdi içerir. Bu nedenle, 4519 dizininin ismini bulmak çok basittir: bir ..girdiye bakarsınız, o girişte inode'u açarsınız (bir dizin olur), ve inode 4519 olan bir girişte ararsınız. direktörün adı. (Tam bir yol adı bulmak isterseniz de bunun içinde özel kök dizinine, gelinceye kadar, sadece işlemi tekrarlayın .ve ..aynı inode numarasıyla ilgilidir.)
Mark Plotnick

0

Daha basit bir cevap benzetme olabilir.

Bir telefon rehberinde isim yerine bir telefon numarası aradığınızı hayal edin.

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.