Jak odłączyć (usunąć) specjalny link „.” Utworzony dla folderu?

29

W systemie Linux po utworzeniu folderu automatycznie tworzy dwa twarde łącza do odpowiedniego i-węzła. Jeden to folder, który chcesz utworzyć, a drugi to .folder specjalny tego folderu.

Przykład:

$ 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 ..

Jak widać, zarówno wewnątrz , jak folderi .wewnątrz foldermają ten sam numer i-węzła (pokazany z -iopcją).

Czy istnieje możliwość usunięcia tego specjalnego .linku twardego?

To tylko dla eksperymentów i ciekawości. Wydaje mi się również, że odpowiedź może dotyczyć również ..specjalnego pliku.

Próbowałem spojrzeć na rmczłowieka, ale nie mogłem tego zrobić. Gdy próbuję usunąć .wszystko, co otrzymuję, to:

rm: "." i „..” nie można usunąć

Naprawdę jestem ciekawy, jak działają te rzeczy, więc nie powstrzymuj się od zbytniego mówienia na ten temat.

EDYCJA: Być może mój post nie był jasny, ale chcę zrozumieć mechanizm, który jest odpowiedzialny za .pliki i powody, dla których nie można ich usunąć.

Wiem, że standard POSIX nie zezwala na folder zawierający mniej niż 2 twarde linki, ale tak naprawdę nie rozumiem dlaczego. Chcę wiedzieć, czy i tak można to zrobić.

Fantattitude
źródło
11
Możliwy duplikat Dlaczego nie mogę usunąć „.” informator?
Stephen Kitt
@StephenKitt Proszę zobaczyć moją edycję.
Fantattitude
1
Cofnęłam głos, zobaczmy, jak przebiega głosowanie ...
Stephen Kitt,
2
Oba są potrzebne do względnych ścieżek. dlaczego chcesz je usunąć (inne niż zwykła ciekawość)?
HalosGhost
@HalosGhost Jestem po prostu bardzo ciekawy, haha, odkrywam ograniczenia systemu oraz to, jak i dlaczego został zaprojektowany w ten sposób.
Fantattitude 18.10.16

Odpowiedzi:

46

Technicznie możliwe jest usunięcie ., przynajmniej w systemach plików EXT4. Jeśli utworzysz obraz systemu plików test.img, zamontuj go i utwórz testfolder, a następnie odmontuj go ponownie, możesz go edytować za pomocą debugfs:

debugfs -w test.img
cd test
unlink .

debugfsnie narzeka i sumiennie usuwa pozycję .katalogu w systemie plików. testKatalog jest nadal użyteczny, z jedną niespodziankę:

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

pokazuje tylko

..

więc .naprawdę zniknął. Jednak cd ., ls ., pwdnadal zachowują się jak zwykle!

Wcześniej przeprowadzałem ten test przy użyciu rmdir ., ale to usuwa i-węzeł katalogu ( wielkie dzięki BowlOfRed za wskazanie tego ), który pozostawia wiszącytest wpis katalogu i jest prawdziwym powodem napotkanych problemów. W tym scenariuszu testfolder staje się bezużyteczny; po zamontowaniu obrazu uruchomione lsprodukuje

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

i pokazuje dziennik jądra

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

Uruchomienie e2fsckw tej sytuacji na obrazie powoduje testcałkowite usunięcie katalogu (i-węzeł katalogu zniknął, więc nie ma nic do przywrócenia).

Wszystko to pokazuje, że .istnieje jako konkretna jednostka w systemie plików EXT4. Odniosłem wrażenie z kodu systemu plików w jądrze, że oczekuje .i ..on istnieje, i ostrzega, jeśli nie (zobacz namei.c), ale w unlink .teście bazowym nie widziałem tego ostrzeżenia. e2fscknie podoba się brakujący .wpis w katalogu i oferuje go naprawić:

$ /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>?

Spowoduje to ponowne utworzenie .pozycji katalogu.

Stephen Kitt
źródło
Bardzo interesujące! Dziękuję Ci! Tak więc .folder naprawdę istnieje w FS, a narzędzia oczekują, że będzie działać poprawnie.
Fantattitude
Naprawdę miło z twojej strony, nie znam Linuksa i jego FS na tyle, by samemu znaleźć tego rodzaju informacje, więc jestem bardzo wdzięczny, że poświęciłeś mi trochę czasu, aby mi odpowiedzieć :)
Fantattitude 18.10.16
3
Czy możesz spróbować zmienić „rmdir” (który faktycznie usuwa i-węzeł) na „unlink” (który usuwa tylko pozycję katalogu). Wygląda na to, że opuszcza najczęściej działający katalog (bez błędów na mountlub ls). Nie widziałem, czy pojawią się inne problemy.
BowlOfRed
@BowlOfRed bardzo dziękuję, to bardzo dobra uwaga - więc tak rmdir .naprawdę zniszczyłem testi zostawiłem to jako wiszący wpis w katalogu, który prawdopodobnie spowodowałby problemy. Sprawdzę unlinki zaktualizuję swoją odpowiedź!
Stephen Kitt
1
@GiacomoCatenazzi nie bezpośrednio, uprawnienia i własność są przechowywane w i-węźle, a nie w pozycji katalogu.
Stephen Kitt,
5

Nie ma możliwości usunięcia tej pozycji katalogu. .Środki entry „to katalog”, to ..środki wejścia „Ten katalog jest katalog nadrzędny”. Nie są to tak naprawdę twarde łącza, tylko w ten sposób tworzona / reprezentowana jest struktura katalogów.

Jan
źródło
Wiem o tym, jestem ciekawy, czy to możliwe, ponieważ wydają się być twardymi linkami. Jeśli nie, to dlaczego mieliby sumować się do liczby linków twardych i-węzła?
Fantattitude
3
> W rzeczywistości nie są to twarde linki, tak właśnie tworzona / reprezentowana jest struktura katalogów. Również powiel. unix.stackexchange.com/questions/289385/…
Xalorous
@Xalorous A więc co dokładnie reprezentuje te specjalne pliki, jeśli nie są dowiązaniami twardymi, czym one są? Istnieją, więc muszą gdzieś być, chyba że zostaną po prostu automatycznie pokazane przez lsinne narzędzia, co nie wydaje mi się realistyczne.
Fantattitude
@Fantattitude to sposób, w jaki folder reprezentuje siebie, aby wdrożyć wymaganie POSIX, że rmdir nie będzie w stanie usunąć PWD.
Xalorous
1
W tradycyjnych systemach plików Unix są to prawdziwe twarde linki. Są one syntezowane w locie przez sterownik dla innych systemów plików.
Barmar,
2

Jak opisano w Lion's Notes na temat kodu źródłowego Unix 6wczesny Unix miał plik dyskowy, w którym zarówno pliki, jak i katalogi były reprezentowane na dysku przez struktury i-węzłów. Był specjalny bit wskazujący, że zawartość pliku była katalogiem. Każdy i-węzeł miał odsyłacz do własnego i-węzła, który pozwalał plikowi wiedzieć, w którym katalogu się znajduje. Wyjątkiem był katalog „/”, który sam był właścicielem. Był też link do treści. Jeśli i-węzeł nie miał treści, mógłby zostać zwrócony na listę darmową. Ponieważ katalog był tylko pobłogosławionym plikiem, nawet pusty katalog musiał mieć zawartość, aby zapobiec gromadzeniu śmieci. Tak więc ... był łącznikiem i-węzła z i-węzłem nadrzędnym i. wskazał, że katalog nadal nadaje się do użytku. rmdir (wywołując unlink) może usunąć.

verisimilidude
źródło
0

Jak mówi „możliwy duplikat” odpowiedzi „post ”, standard POSIX określa, że ​​jeśli rmdir spróbuje usunąć bieżący katalog, zawiedzie.

Cokolwiek zbudujesz, musisz mieć fundament. Trudno jest zdefiniować ścieżki względne bez możliwości powiedzenia „tutaj”. Więc „.” jest zdefiniowany jako „tutaj”.

Ponadto, można usunąć „kropka” i „kropka kropka”. Napisz własny system operacyjny, który ich nie definiuje. Chociaż Unix (a przez to Mac OSX), Linux, a nawet MS DOS i Windows używają kropek i kropek.

TL; DR - „kropka” jest w definicji systemu operacyjnego.

Xalorous
źródło
Ta odpowiedź jest dobra głównie dla TL; DR.
Joshua,