Чи є слеш (/) частиною назви кореневого каталогу 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.