Bir inode (ext4) için sabit bir bağlantı nasıl oluşturulur?


17

Bir dosyanın dizin düğümünü (inode) biliyorum, ancak yolunu (veya yollarından herhangi birini) bilmiyorsam, doğrudan o inode'a sabit bir bağlantı oluşturmak mümkün mü?

Ben kullanarak dosyayı bulmak sudo find / -inum 123546ve sonra bir sabit bağlantı oluşturmak, ama bu benim uygulama için çok yavaş olurdu.

Not Bir ext4 dosya sistemi kullanıyorum.


1
Yakından ilişkili: Bir dosyayı inode ile kaldırmak veya yeniden adlandırmak (her ikisinin de doğrudan yapılması imkansızdır).
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


23

AFAIK, çekirdek API'sı ile değil. Böyle bir arabirim mevcutsa, başkalarının arama erişimine sahip olmadığı dizinlerdeki dosyalara erişmesine izin verecek şekilde süper kullanıcı ile sınırlı olması gerekir.

Ancak bunu yapmak debugfsiçin dosya sistemini kullanabilirsiniz (bağlantısı kesildikten sonra) (blok aygıta yazma erişiminiz olduğunu varsayarak).

debugfs -w / dev / block / device

( /dev/block/devicedosya sisteminin içinde bulunduğu gerçek blok cihazla değiştirin ).

Ardından, komut istemine şunu debugfsgirin:

stat < 123 >
(köşeli parantezlerle, 123'ün yerini gerçek inode numarasıyla değiştirerek) dosyanın mevcut olduğunu kontrol edin (inode'un bağlantı sayısı 0'dan büyüktür) ve bir dizin değildir.

Her şey yolundaysa girin:

ln < 123 > / newfile / yolu
sabit bağlantı oluşturmak için (yolun dosya sisteminin köküne göreli olduğunu unutmayın). Bunu takiben:

mi < 123 >
bağlantı sayısını artırmak için ( Entergeçerli değere 1 eklemek istediğiniz bağlantı sayısı hariç tüm alanlar için basın ).


6
Böyle bir arayüz ayrıca dosyanın sıfır olmayan bir bağlantı sayısına sahip olup olmadığını da kontrol etmelidir, aksi takdirde çekirdek değişmezlerini ihlal ettiği için IIRC'nin reddedildiği silinmiş ancak yine de açık bir dosyayı yeniden canlandırmak mümkün olacaktır.
Gilles 'SO- kötü olmayı bırak'


1
@PhilipCouling, bir dizindeki yürütme izni biti arama iznine dönüşür . Zaten dizinlerde dedim o zaman arama erişimi yok .
Stéphane Chazelas

3
@OrangeDog, arama izni POSIX standardı tarafından kullanılan terminolojidir.
Stéphane Chazelas

1
@mosvy: Bu kontrol çekirdekten kaldırılabilir. Gerçi kendini hortumlamaması için VFS'de birkaç yer düzeltmeniz gerekiyor. Yıllar önce tezim üzerinde çalışırken yaptım.
Joshua

3

Kullanım durumunuza bağlı olarak, başka bir yaklaşım önce tüm dosya adaylarını bir dizindeki sabit ve daha sonra özellikle ilgilendiğiniz dosyaları sıkı bir şekilde bağlayarak toplamak olabilir.

Gibi

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(inode numaralarınızın 1.000.000'dan az olduğunu varsayarsak, gerekirse daha fazla dizin oluşturun).

Daha sonra, inode'larınız 1000-bilge olarak gruplandırılır ve by-inode/ ağaçta . Oradan, onları gerektiği gibi bağlayabilirsiniz.

Bununla birlikte, altındaki dosyaların silinmesinin <path>bu ekstra sabit bağlantı nedeniyle alanı geri kazanmayacağı anlamına geldiğini unutmayın .

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.