Как отсоединить (удалить) специальную жесткую ссылку «.», Созданную для папки?


29

В Linux, когда вы создаете папку, она автоматически создает две жесткие ссылки на соответствующий индекс. Одна - папка, которую вы просили создать, другая - .специальная папка, эта папка.

Пример:

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

Как вы можете видеть, оба folderи .внутри folderимеют одинаковый номер инода (показано с -iопцией).

Есть ли способ удалить эту специальную .жесткую ссылку?

Это только для экспериментов и любопытства. Также я думаю, что ответ может относиться и к ..специальному файлу.

Я пытался заглянуть в rmчеловека, но не мог найти способ сделать это. Когда я пытаюсь удалить .все, что я получаю, это:

рм: "." и ".." нельзя удалить

Мне действительно любопытно, как все эти вещи работают, поэтому не воздерживайтесь от подробного описания предмета.

РЕДАКТИРОВАТЬ: Может быть, я не был ясен с моим постом, но я хочу понять основной механизм, который отвечает за .файлы и причины, почему они не могут быть удалены.

Я знаю, что стандарт POSIX запрещает папку с менее чем 2 жесткими ссылками, но на самом деле не понимаю, почему. Я хочу знать, возможно ли это сделать в любом случае.



@StephenKitt Пожалуйста, смотрите мои изменения.
Fantattitude

1
Я отозвал свой голос, давайте посмотрим, как закончится голосование ...
Стивен Китт

2
Оба необходимы для относительных путей. почему вы хотите удалить их (кроме простого любопытства)?
HalosGhost

@HalosGhost Я просто очень любопытен, ха-ха, исследую ограничения системы и то, как и почему она была разработана таким образом.
Fantattitude

Ответы:


46

Технически возможно удалить ., по крайней мере, на файловых системах EXT4. Если вы создадите образ файловой системы test.img, смонтируете его и создадите testпапку, а затем снова размонтируете ее, вы можете отредактировать ее, используя debugfs:

debugfs -w test.img
cd test
unlink .

debugfsне жалуется и покорно удаляет .запись каталога в файловой системе. testКаталог еще годен к употреблению, с одной неожиданностью:

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

показывает только

..

так .действительно прошло. Тем не менее cd ., ls ., до pwdсих пор ведут себя как обычно!

Ранее я проводил этот тест с использованием rmdir ., но он удаляет inode каталога ( огромное спасибо BowlOfRed за указание на это ), который оставляет висящуюtest запись каталога и является реальной причиной возникших проблем. В этом случае testпапка становится непригодной для использования; после установки изображения, бег lsпроизводит

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

и журнал ядра показывает

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

Запуск e2fsckв этой ситуации на изображении полностью удаляет testкаталог (его индекс удален, поэтому восстановить нечего).

Все это показывает, что .существует как конкретная сущность в файловой системе EXT4. Из кода файловой системы в ядре у меня сложилось впечатление, что оно ожидает .и ..существует, и предупреждает, если они этого не делают (см. namei.c), Но с помощью unlink .теста на основе я не увидел этого предупреждения. e2fsckне любит отсутствующую .запись в каталоге и предлагает ее исправить:

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

Это воссоздает .запись каталога.


Очень интересно! Спасибо! Таким образом, .папка действительно существует внутри ФС, и инструменты ожидают, что она будет работать правильно.
Fantattitude

Очень мило с вашей стороны, я не знаю Linux и его FS достаточно для того, чтобы найти такую ​​информацию, поэтому я очень благодарен, что вы нашли время, чтобы ответить мне :)
Fantattitude

3
Можете ли вы попробовать изменить «rmdir» (который фактически удаляет индекс) на «unlink» (который только удаляет запись каталога). Похоже, что он покидает в основном работающий каталог (без ошибок mountили ls). Я не видел, возникают ли другие проблемы.
BowlOfRed

@BowlOfRed большое спасибо, это очень хороший момент - так что мой rmdir .фактически уничтожил testи оставил это как висячую запись каталога, которая, как вы ожидаете, вызовет проблемы. Я проверю unlinkи обновлю свой ответ!
Стивен Китт

1
@GiacomoCatenazzi не напрямую, разрешения и права собственности хранятся в inode, а не в записи каталога.
Стивен Китт

5

Нет возможности удалить эту запись каталога. .Ввода означает «этот каталог», то ..средство ввода «этого каталог родительского каталог». На самом деле это не жесткие ссылки, просто структура каталогов создается / представляется.


Я знаю об этом, мне просто любопытно, возможно ли это, поскольку они кажутся жесткими ссылками. Если это не так, почему они суммируют количество жестких ссылок в inode?
Fantattitude

3
> На самом деле это не жесткие ссылки, просто структура каталогов создается / представляется. Также дубликат. unix.stackexchange.com/questions/289385/…
Xalorous

@Xalorous И что именно представляет эти специальные файлы, если они не являются жесткими ссылками, то что это? Они существуют, поэтому они должны быть где-то, за исключением случаев, когда их lsавтоматически показывают или другие инструменты, что мне не кажется реалистичным.
Fantattitude

@Fatattitude - это то, как папка представляет себя для реализации требования POSIX о том, что rmdir не сможет удалить PWD.
Ксалори

1
В традиционных файловых системах Unix это настоящие жесткие ссылки. Они синтезируются на лету драйвером для других файловых систем.
Бармар

2

Как описано в заметках Lion по исходному коду Unix 6В ранних версиях Unix был дисковый файл, в котором и файлы, и каталоги были представлены на диске структурами inode. Был специальный бит, который указывал, что содержимое файла было каталогом. Каждый инод имел ссылку на свой собственный инод, который позволял файлу знать, в каком каталоге он находится. Исключением был каталог / /, который владел собой. Была также ссылка на содержание. Если в иноде нет содержимого, его можно вернуть в свободный список. Поскольку каталог был просто благословенным файлом, даже пустой каталог должен был содержать содержимое, чтобы он не собирался мусором. Таким образом, .. была ссылкой inode на родительский inode и. был там, чтобы указать, что каталог еще можно было использовать. rmdir (вызывая unlink) может удалить.


0

Как говорится в ответе «возможный дубликат» , стандарт POSIX указывает, что если rmdir попытается удалить текущий каталог, он потерпит неудачу.

Что бы вы ни строили, у вас должен быть фундамент. Трудно определить относительные пути без возможности сказать «здесь». Так что '.' определяется как «здесь».

Кроме того, вы можете удалить «точка» и «точка точка». Напишите свою собственную ОС, которая не определяет их. Хотя Unix (и, соответственно, Mac OSX), Linux и даже MS DOS и Windows используют точки и точки.

TL; DR - «точка» в определении ОС.


Этот ответ хорош в основном для TL; DR.
Джошуа
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.