Як від’єднати (видалити) спеціальне тверде посилання ".", Створене для папки?


29

У Linux, коли ви створюєте папку, вона автоматично створює два жорстких посилання на відповідний inode. Одна - це папка, яку ви попросили створити, а інша - .спеціальна папка цієї папки.

Приклад:

$ 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людину, але не міг знайти способу це зробити. Коли я намагаюся видалити .все, що я отримую, це:

rm: "." і ".." не можна видалити

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

EDIT: Можливо, я не зрозумів свою посаду, але я хочу зрозуміти основний механізм, який відповідає за .файли та причини, за якими їх не можна видалити.

Я знаю, що стандарт POSIX забороняє папку з менш ніж 2 жорсткими посиланнями, але насправді не розумію, чому. Я хочу знати, чи можна це зробити в будь-якому випадку.



@StephenKitt Будь ласка, дивіться мою редакцію.
Фантастичність

1
Я відкликав свій голос, давайте подивимося, як відбувається голосування ...
Стівен Кітт

2
Обидва потрібні для відносних шляхів. чому б ви хотіли зняти ці (крім простого цікавості)?
HalosGhost

@HalosGhost Мені просто цікаво ха-ха, досліджуючи обмеження системи та те, як і чому вона була розроблена таким чином.
Фантастичність

Відповіді:


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

Це знову створює .запис каталогу.


Дуже цікаво! Дякую! Тож .папка дійсно існує всередині FS, і інструменти очікують її належної роботи.
Фантастичність

Дуже приємно з вас, я не знаю Linux та його FS достатньо, щоб знайти собі подібну інформацію, тому я дуже вдячний, що ви знайдете час, щоб відповісти мені :)
Fantatitude

3
Чи можете ви спробувати змінити "rmdir" (який фактично видаляє inode) на "unlink" (що видаляє лише запис каталогу). Здається, він залишає функціонуючий каталог, що працює в основному (немає помилок mountабо ls). Я не бачив, чи виникають інші проблеми.
BowlOfRed

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

1
@GiacomoCatenazzi не безпосередньо, дозволи та права власності зберігаються в inode, а не в каталозі.
Стівен Кітт

5

Немає можливості видалити цей запис каталогу. .Введення означає «цей каталог», то ..засіб введення «цього каталог батьківського каталог». Насправді вони не є жорсткими посиланнями, саме так створюється / представляється структура каталогу.


Я знаю про це, мені просто цікаво, якщо це можливо, оскільки вони здаються жорсткими посиланнями. Якщо їх немає, то чому вони додавали б до числа жорстких посилань inode?
Фантастичність

3
> Вони насправді не є жорсткими посиланнями, саме так створюється / представляється структура каталогу. Також дублікат. unix.stackexchange.com/questions/289385/…
Xalorous

@Xalorous І так, що саме представляє ці спеціальні файли, якщо вони не є жорсткими посиланнями, що вони? Вони існують, тому вони повинні бути десь, за винятком випадків, коли вони просто автоматично показуються lsіншими інструментами, що мені не здається реалістичним.
Фантастичність

@Fantatitude - це те, як папка представляє себе для реалізації вимоги POSIX, що rmdir не зможе видалити PWD.
Xalorous

1
У традиційних файлових системах Unix вони є справжніми жорсткими посиланнями. Вони синтезуються з льоту драйвером для інших файлових систем.
Бармар

2

Як описано в Примітках Лева до вихідного коду Unix 6на початку Unix був файл диска, де і файли, і каталоги були представлені на диску структурами inode. Існував спеціальний біт, який вказував, що вміст файлу - це каталог. Кожен inode мав посилання на свій власний inode, який дозволяв файлу знати, в якому каталозі він знаходиться. Винятком була директорія '/', яка володіла собою. Також було посилання на зміст. Якщо в inode не було вмісту, його можна повернути у вільний список. Оскільки каталог був просто блаженним файлом, навіть порожній каталог повинен був містити вміст, щоб не збирати сміття. Таким чином .. .. був посиланням inode на батьківський inode та. був там, щоб вказати, що каталог все ще був корисним. rmdir (зателефонувавши відключити) може видалити.


0

Як говорить "можливий дублікат відповіді" повідомлення , стандарт POSIX вказує, що якщо rmdir намагається видалити поточний каталог, він вийде з ладу.

З усього, що ви будуєте, ви повинні мати фундамент. Важко визначити відносні шляхи без способу сказати "тут". Тож "." визначається як "тут".

Також ви можете видалити 'dot' і 'dot dot'. Напишіть власну ОС, яка не визначає їх. Хоча Unix (і розширення Mac OSX), Linux і навіть MS DOS і Windows всі використовують крапки і точки.

TL; DR - "крапка" є у визначенні ОС.


Ця відповідь хороша здебільшого для TL; DR.
Джошуа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.