Bir klasör için yaratılmış olan “.” Özel hardlinkini nasıl kaldırabilirim?


29

Linux'ta, bir klasör oluşturduğunuzda , ilgili inode'a otomatik olarak iki sabit bağlantı oluşturur . Biri oluşturmasını istediğin klasör, diğeri .bu klasörün özel klasörü.

Örnek:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

Gördüğünüz gibi, hem folderve .İçimdeki folder(ile gösterilen aynı inode numarasına sahip -iseçeneği).

Bu özel .hardlink silmek için yine de var mı ?

Sadece deney ve merak için. Ayrıca cevabın ..özel dosyaya da uygulanabileceğini tahmin ediyorum .

rmAdama bakmaya çalıştım ama yapmanın bir yolunu bulamadım. .Hepsini kaldırmaya çalıştığımda :

rm: "." ve ".." kaldırılamaz

Bu işlerin nasıl yürüdüğünü gerçekten merak ediyorum, bu yüzden konuyla ilgili çok ayrıntılı olmaktan kaçının.

EDIT: Belki yazımdan net değildim, ancak .dosyalardan ve silinememelerinin sebeplerinden sorumlu olan mekanizmayı anlamak istiyorum .

POSIX standardının 2'den az sabit bağlantı içeren bir klasöre izin vermediğini biliyorum, ancak gerçekten nedenini anlamadım. Yine de yapmanın mümkün olup olmadığını bilmek istiyorum.


11
Olası kopyası: Niçin '.' Dizin?
Stephen Kitt

@StephenKitt Lütfen düzenlememe bakın.
Fantattitude 18:16

1
Oyumu geri çektim, oylamanın nasıl gittiğini görelim ...
Stephen Kitt

2
Her ikisi de göreceli yollar için gereklidir. neden bunları kaldırmak istiyorsun (sade bir meraktan başka)?
HalosGhost

@HalosGhost Ben sadece çok merak ediyorum, sistemin sınırlarını ve nasıl ve neden bu şekilde tasarlandığını araştırıyorum.
Fantattitude

Yanıtlar:


46

.En azından EXT4 dosya sistemlerinde silmek teknik olarak mümkündür . Bir dosya sistemi görüntüsü oluşturursanız test.img, bağlayın ve bir testklasör oluşturun , ardından tekrar bağlantısını kesin, aşağıdakileri kullanarak düzenleyebilirsiniz debugfs:

debugfs -w test.img
cd test
unlink .

debugfsşikayet etmez .ve dosya sistemine dizin girişini siler . testDizin bir şaşkınlıkla, hala kullanılabilir:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

sadece gösterir

..

bu yüzden .gerçekten gitti. Oysa cd ., ls ., pwdher zamanki gibi davranırlar!

Daha önce kullanarak bu testi yapmıştı rmdir ., ama bu (dizinin düğüm siler kocaman sayesinde BowlOfRed için bu out işaret bırakır) testsallantıda dizin girişi ve karşılaşılan sorunlar için gerçek nedeni budur. Bu senaryoda, testklasör daha sonra kullanılamaz hale gelir; Görüntüyü montaj sonrasında, koşu lsüretir

ls: cannot access '/mnt/test': Structure needs cleaning

ve çekirdek günlüğü

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

Koşu e2fsckgörüntü üzerinde bu durumda siler testdizin tamamen restore (bir şey yok bu yüzden dizin inode gitmiş).

Bütün bunlar, .EXT4 dosya sisteminde belirli bir varlık olarak bulunduğunu göstermektedir . Çekirdekteki dosya sistemi kodundan beklediği .ve var olduğu izlenimini edindim ve ..görmezlerse (görüyorlarsa namei.c) unlink .uyarırdım , ancak temelde yapılan testle bu uyarıyı görmedim. e2fsckeksik .dizin girişini beğenmez ve düzeltmeyi önerir:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

Bu, .dizin girişini yeniden oluşturur .


Çok ilginç! Teşekkür ederim! Bu yüzden .klasör FS içerisinde gerçekten var ve araçlar düzgün çalışmasını bekliyor.
Fantattitude

Gerçekten çok iyiyim, Linux ve
FS'lerini

3
"Rmdir" i (aslında inode'u kaldırır) "unlink" (değiştirerek) (sadece dizin girişini siler) değiştirmeyi deneyebilir misiniz? Çok işleyen bir dizin bırakıyor gibi görünüyor (üzerinde hata yok mountveya ls). Başka problemlerin ortaya çıkıp çıkmadığını görmedim.
BowlOfRed

@BowlOfRed çok teşekkür ederim, bu çok iyi bir nokta - bu yüzden benim sorunlara neden olmasını beklediğiniz sarkan bir dizin girişi olarak rmdir .gerçekten onu yok ediyor testve bırakıyordum. Ben kontrol unlinkedip cevabımı güncelleyeceğim!
Stephen Kitt

1
@GiacomoCatenazzi doğrudan değil, izinler ve sahiplik dizin girişinde değil inode'da saklanır.
Stephen Kitt

5

Bu dizin girişini kaldırmanın bir yolu yoktur. .Giriş düzeneği "Bu dizin", ..giriş araçlarının "bu dizinin üst dizin". Aslında zor bağlantılar değiller, dizin yapısının yaratılması / temsil edilmesi budur.


Bunu biliyorum, sadece bağlantıların zor göründüğü için mümkün olup olmadığını merak ediyorum. Eğer değilse neden inode'un hard link sayısını eklesinler?
Fantattitude

3
> Aslında zor linkler değiller, dizin yapısının yaratılması / temsil edilmesi budur. Ayrıca, çoğaltın. unix.stackexchange.com/questions/289385/…
Xalorous 18:16

@ Xalorous Ve bu nedenle, bu özel dosyaları tam olarak neyin temsil ettiği, hardlinks değillerse, bunlar nedir? Onlar var, bu yüzden onlar lsbana gerçekçi görünmeyen otomatik olarak gösteriliyorlarsa veya başka araçlar tarafından gösteriliyorlarsa, bir yerlerde olmalılar .
Fantattitude 18:16

@Fantattitude, klasörün rmdir'nin PWD'yi kaldıramadığı POSIX gereksinimini uygulamak için kendini nasıl temsil ettiğidir.
Xalorous 18:16

1
Geleneksel Unix dosya sistemlerinde gerçek bağlantılardır. Diğer dosya sistemleri için sürücü tarafından anında sentezlenirler.
Barmar,

2

Lion'un Unix 6 Kaynak Koduna İlişkin Notlarında açıklandığı gibiUnix'in başında hem dosyaların hem de dizinlerin inode yapıları tarafından diskte temsil edildiği bir disk dosyası vardı. Dosya içeriğinin bir dizin olduğunu gösteren özel bir bit vardı. Her bir inode, bir dosyanın hangi dizinde olduğunu bilmesini sağlayan kendi inode'una bir bağlantıya sahipti. Bunun istisnası, kendisine ait '/' diziniydi. Ayrıca içeriğe bir bağlantı vardı. Bir inode içeriğe sahip değilse, ücretsiz listeye geri gönderilebilir. Bir dizin sadece kutsanmış bir dosya olduğundan, boş bir dizinin bile çöp toplanmasını engelleyen içeriğe sahip olması gerekiyordu. Böylece .. .. inode'un ana inode ve. Dizinin hala kullanılabilir olduğunu belirtmek için vardı. rmdir (unlink çağırarak) kaldırabilir.


0

As sonrası 'olası yinelenen' 'ın cevabı diyor rmdir girişimleri geçerli dizin kaldırmak için eğer POSIX standardı belirtir, başarısız olarak gösterilmemesi.

İnşa ettiğin her şeyde bir temelin olmalı. Göreceli yolları “burada” demenin bir yolu olmadan tanımlamak zor. Böylece '.' 'burada' olarak tanımlanır.

Ayrıca, olabilir 'nokta' ve 'nokta nokta' kaldırın. Onları tanımlamayan kendi işletim sisteminizi yazın. Her ne kadar Unix (ve uzantı Mac OSX), Linux ve hatta MS DOS ve Windows hepsi dot ve dotdot kullanıyor.

TL; DR - 'nokta' işletim sistemi tanımındadır.


Bu cevap çoğunlukla TL için iyidir; DR.
Joshua,
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.