Чи є слеш (/) частиною назви кореневого каталогу Linux?


46

Чи /дійсно slash ( ) є частиною назви кореневого каталогу Linux? Або це просто символ для цього?

Що про /etcтощо?

Оновлення

Припустимо, /dev/sda2це блоковий пристрій кореневого каталогу Linux.

$ sudo debugfs / dev / sda2
налагодження 1,44,1 (24 березня 2018)
налагодження:   pwd
[pwd] ВСТАВЛЕНО: 2 PATH: /
[корінь] ВСТАВКА: 2 ПАТ: /
налагодження:   stat /
Inode: 2    Тип:     Режим каталогу : 0755 Прапори: 0x80000
Покоління: 0 Версія: 0x00000000: 00000077
Користувач: 0 Група: 0 Проект: 0 Розмір: 4096
Файл ACL: 0
Посилання: 25 Блок рахунків: 8
Фрагмент: Адреса: 0 Кількість: 0 Розмір: 0
 ctime: 0x5b13c9f1: 3f017990 - Нд 3 червня 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - Вс 3 червня 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - Нд 3 червня 15:28:57 2018
тривалість: 0x5aad1843: 00000000 - сб 17 березня 16:59:39 2018
Розмір зайвих полів inode: 32
ДОСЛІДЖЕННЯ:
(0): 9249

Отже, там є каталог, inode №2, але він не має імені.


1
Щодо недавнього оновлення, який показує деякий debugfsвихід. Чи можете ви пояснити, як це змінює питання?
— Кусалаланда

Це не так. Я просто хотів завершити відповіді. але я не хотів додати ще одного. тому я оновив його. якщо ви можете ввести відповідь у своїй відповіді, видалить їх
— mlibre

Відповіді:


61

Стандарт POSIX.1-2008 говорить

Ім'я шляху, що складається з одного, /має відповідати кореневому каталогу процесу. Недійсне ім'я шляху не вдалося вирішити.

Стандарт додатково робить відмінність між іменами файлів і іменами шляхами . /- ім'я шляху для шляху кореневого каталогу. Ім'я каталогу - "кореневий каталог", але у файловій системі воно безіменне, воно не має імені файлу. Якби у нього було ім'я файлу, це ім'я було б записом у каталозі над кореневим каталогом, а такого каталогу немає.

Символ /ніколи не може бути частиною імені файлу, оскільки це роздільник шляху.

Для наочності: /це не ім’я кореневого каталогу, а шлях до нього, його шлях .

/etc- інша назва. Це назва абсолютного шляху до etcкаталогу. Ім'я каталогу на цьому шляху - це etc(ім'я файлу etc).

/usr/local/bin/curl- це ім'я шляху curlвиконуваного файлу так само, /etcяк і ім'я шляху до etcкаталогу.


"Якби у нього було ім'я файлу, це ім'я було б записом каталогу в каталозі над кореневою директорією" Це були б дві речі, технічно - номер імені inode (які, як ми знаємо, є inode 2). Також цікаво відзначити, що /..вказує на те /, що /він має , і має для себе запис у каталозі - це добре старе /.; всі ці 3 речі вказують на один і той же індед - 2.
— Сергій Колодяжний

@SergiyKolodyazhnyy Технічно кореневий каталог "per-process", що має значення в середовищі chroot. У chroot номер inode кореневого каталогу не був би конкретним числом (це було б число inode кореня chroot). Крім того, я думаю, що число 2 (у нехротованих ситуаціях) залежить від використовуваної файлової системи.
— Kusalananda

Я також зауважив, що /визначається в термінах кореня кожного процесу, але я не знав, що inode в chrootне обов'язково 2. Дуже цікавий факт. Також виникає питання про те, що таке /каталог для привілейованих процесів ядра. Чи означає це лише ті процеси у користувальницькому просторі, /з якими вони асоціюються?
— Сергій Колодяжний

37

коса риса - роздільник ; Імена каталогів не включають роздільники, але повні назви шляхів містять роздільники.

Тож "кореневий рівень" / не має назви . У більшості Unix-подібних систем це трактується як особливий випадок .і ..(хоча, звичайно, немає різниці між цими на кореневому рівні).

Номенклатура може відрізнятися. Наприклад, POSIX.1-2017 перераховує деякі часто використовувані визначення :

  • 3.2 Абсолютна назва шляху

    Ім'я шляху, що починається з одного або більше двох <slash>символів; див. також Pathname .

  • 3.271 Pathname

    Рядок, який використовується для ідентифікації файлу. У контексті POSIX.1-2008 ім'я контуру може бути обмежено байтами {PATH_MAX}, включаючи кінцевий нульовий байт. Він має необов'язкові початкові <slash>символи, за якими слідує нуль або більше імен файлів, розділених <slash>символами. Ім'я шляху може необов'язково містити один або декілька <slash>символів, що відкладаються . Кілька послідовних <slash>символів вважаються такими ж, як один <slash>, за винятком випадків, коли саме два провідні <slash>символи.

    Примітка. Якщо ім'я шляху складається лише з байтів, що відповідають символам з набору символів портативного файлу (див. Набір символів портативного файлу ), <slash>символів та одного завершення<NUL>символу, ім'я шляху буде застосовано як символьний рядок у всіх підтримуваних локалях; в іншому випадку ім'я шляху може бути лише рядком (а не символьним рядком). Крім того, оскільки однобайтове кодування <slash>символу повинно бути однаковим у всіх локалях і не відбуватись у межах багатобайтового символу, посилання на <slash>символ у межах імені шляху добре визначені, навіть якщо ім'я шляху не є символом рядок. Однак це властивість не обов'язково має бути застосовано до символів, що залишилися в наборі символів портативного імені файлу.

  • 3.272 Компонент шляху

    Див. Ім'я файлу у файлі .

  • 3.170 Назва файлу

    Послідовність байтів, що складається з 1 до {NAME_MAX}байтів, використовуваних для імені файлу. Байти, що складають ім'я, не повинні містити символів <NUL>або <slash>символів. У контексті імені шляху кожне ім'я файлу має супроводжуватись символом <slash>або <NUL>; в іншому випадку ім'я файлу, за яким <NUL>символом утворюється рядок (але не обов'язково символьний рядок). Назви файлів крапки і dot-dotмають особливе значення. Ім'я файлу іноді називають "компонентом імені шляху". Дивіться також Pathname .

Отже ... якщо ви шукаєте роз'яснення , це може бути не вашою першою зупинкою. Підручники, такі як ця сторінка UNIX Concepts, є корисними, наприклад, вказуючи, що "повна назва шляху" є синонімом "абсолютного" імені шляху.


3
Nitpick: точка і крапка - це назви файлів, а не імена. Власне, стандарт POSIX має цікаву формулювання "Як особливий випадок, у кореневій директорії точка-крапка може посилатися на самий кореневий каталог". (мій акцент).
— Кусалаланда

Отже, читаючи специфікацію до букви, /не є дійсним іменем файлу чи компонентом імені шляху, і це не рядок, який містить такі компоненти, але це все-таки цілком правильне ім'я шляху для однієї певної каталогі. Що має існувати, хоча частина, яка цього вимагає, не зазначає його "ім'я". Якось мені це здається трохи кумедним.
— ilkkachu

На нього відповідає POSIX : Він має необов'язкові початкові символи, а за ними нуль або більше імен файлів, розділених символами.
— Томас Дікі

@Kusalananda перегляньте обґрунтування специфіки для вашого акценту. визначено травень у специфікаціях - це чітка заява про впевненість щодо тестів на впровадження. там, де він може бути використаний, специфікація забезпечує будь-якого прихильника визначеного поведінки. Іншими словами, будь-яка реалізація може розраховувати на ..на /зв'язок /.
— mikeserv

19

У Unix файли (і каталоги - це лише файли) не мають "імен". У посиланнях є імена, посилання - це записи в каталозі, які відображають назви файлів.

Ви могли б сказати, що посилання дають імена файлів, але примітка: це означає , що файл може мати більш ніж одне ім'я, так як воно може мати більш ніж одне посилання.

Оскільки кореневий каталог - це кореневий каталог, то немає жодного каталогу "вище", в якому може бути посилання на нього, тому не може бути імені, пов'язаного з ним. Теоретично можна було б додати посилання на кореневий каталог в якійсь іншій директорії, але більшість Unices забороняє додавати посилання на існуючі каталоги, оскільки це може призвести до циклів у ієрархії файлової системи (що насправді спрямований графік) та виявлення циклів у графіку дорого, але їх виявлення може призвести до нескінченної рекурсії при спробі вирішення імен в ядрі.

Отже, в основному кореневий каталог не має імені, оскільки над ним немає каталогу, в якому ми могли б записати ім'я.

Як було зазначено в інших відповідях, нам потрібно розрізняти ім’я та шлях (ім’я). До кореневого каталогу можна посилатися через шлях (ім'я) /.


Так, файли можуть мати кілька імен, як і люди. Чоловік моєї молодшої дочки зазвичай йде за своїм прізвищем, але він, очевидно, повинен відповідати і на своє ім'я. Основне ім'я кореневого каталогу "/", вимовляється "коса", тому що його абсолютна назва шляху "/" (а імена на основі відносних імен не особливо корисні). (Називаючи це "root", ризикує заплутатися з "/ root", яке завжди слід називати "корінь косою рискою".
— Monty Harder

1
Мені подобається те, що у нього немає імені, оскільки немає вищого каталогу, в якому записати це ім’я. Це добре пояснює концепцію.
— Джо

7

Використання слова "ім'я" трохи гнучко; воно може посилатися на "повністю кваліфіковану назву шляху"; він міг посилатися на "запис каталогу"; це може посилатися на "ім'я файлу", що передається різним функціям або процедурам.

Так, наприклад, /etc/fooі /var/tmp/../../etc/fooта /tmp/../../../../../../fooє всіма шляхами зі посиланням на той же файл; всі вони є дійсними іменами , як це є fooв /etcкаталозі.

Тому повернемося до основ.

Ім'я файлу в unix складається з компонентів, розділених роздільником каталогів /. Насправді єдиним обмеженням компонентів є те, що вони не можуть містити /символів або NUL; все інше дозволено.

Таким чином, «повне ім'я шлях» /etcє повною рядком: /etc. Це означає, що він містить etcкомпонент у кореневій директорії.

Аналогічно /x/y/z/fooбув би fooкомпонент у /x/y/zкаталозі.

Тепер кореневий каталог унікальний тим, що він не має компонента в батьківському каталозі; він тільки має повний шлях до файлу в якості його імені: /.

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