Является ли косая черта (/) частью имени корневого каталога Linux?

46

Является ли slash ( /) частью имени корневого каталога Linux? Или это просто символ?

Как насчет /etcи так далее?

Обновить

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

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24 марта 2018 года)
debugfs:   pwd
[pwd] INODE: 2 PATH: /
[root] INODE: 2 PATH: /
debugfs:   stat /
Индекс: 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
crtime: 0x5aad1843: 00000000 - сб 17 марта 16:59:39 2018
Размер дополнительных полей индекса: 32
экстентов:
(0): 9249

Таким образом, там есть каталог, индекс № 2, но у него нет имени.

mlibre
источник
1
Что касается вашего недавнего обновления, показывающего некоторые debugfsрезультаты. Не могли бы вы уточнить, как это меняет вопрос?
Кусалананда
Это не так. Я просто хотел закончить ответы. но я не хотел добавлять еще один. поэтому я обновил его. если вы можете вставить строку ответа в свой ответ, то удалите их
mlibre

Ответы:

61

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

Путь, состоящий из одного, /должен преобразовываться в корневой каталог процесса. Нулевое имя не может быть успешно разрешено.

Стандарт далее проводит различие между именами файлов и путями . /путь к корневому каталогу Имя каталога - «корневой каталог», но в файловой системе оно безымянно, у него нет имени файла. Если бы у него было имя файла, это имя было бы записью в каталоге над корневым каталогом, и такого каталога нет.

Символ /никогда не может быть частью имени файла, поскольку он является разделителем пути.

Для ясности: /это не имя корневого каталога, а путь к нему, его путь .

/etcэто другое имя пути. Это имя абсолютного пути к etcкаталогу. Имя каталога по этому пути etc(его имя файла etc).

/usr/local/bin/curlэто путь к curlисполняемому файлу так же, /etcкак путь к etcкаталогу.

Кусалананда
источник
«Если бы у него было имя файла, это имя было бы записью в каталоге над корневым каталогом». Технически это были бы две вещи - номер и имя индекса (который, как мы знаем, является индексом 2). Также интересно отметить, что это /..указывает на /и /имеет запись в каталоге для себя - это старый добрый /.; все эти 3 вещи указывают на один и тот же индекс - 2.
Сергей Колодяжный
@SergiyKolodyazhnyy Технически , корневым каталогом является «per-process», что важно в средах chroot. В chroot номер inode корневого каталога не будет конкретным номером (это будет номер inode корневого каталога chroot). Кроме того, я думаю, что число 2 (в ситуациях без использования chroot) зависит от используемой файловой системы.
Кусалананда
Я также заметил, что /это определяется с точки зрения корневого каталога для каждого процесса, но я не знал, что inode in chrootне обязательно 2. Очень интересный факт. Это также поднимает вопрос о том, что является /каталогом для привилегированных процессов ядра. Означает ли это, что только процессы пользовательского пространства связаны /с ними?
Сергей Колодяжный
37

косая черта - это разделитель ; имена каталогов не включают разделители, но полные пути включают разделители.

Таким образом, «корневой уровень» / не имеет названия . В большинстве Unix-подобных систем это рассматривается как особый случай, подобный .и ..(хотя, конечно, нет разницы между ними на корневом уровне).

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

  • 3.2 Абсолютный путь

    Путь, начинающийся с одного или более двух <slash>символов; см. также Путь .

  • 3.271 Путь

    Строка, используемая для идентификации файла. В контексте POSIX.1-2008 имя пути может быть ограничено байтами {PATH_MAX}, включая завершающий нулевой байт. Он имеет необязательные начальные <slash>символы, за которыми следуют ноль или более имен файлов, разделенных <slash>символами. Путь может дополнительно содержать один или несколько завершающих <slash>символов. Несколько последовательных <slash>символов считаются одинаковыми <slash>, за исключением случая, когда в нем ровно два ведущих <slash>символа.

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

  • 3.272 Компонент Pathname

    Смотрите имя файла в имени файла .

  • 3.170 Имя файла

    Последовательность байтов, состоящая из 1 {NAME_MAX}байта, используемая для именования файла. Байты, составляющие имя, не должны содержать символы <NUL>или <slash>. В контексте имени пути каждое имя файла должно сопровождаться символом <slash>или <NUL>; в другом месте имя файла, за которым следует <NUL>символ, образует строку (но не обязательно символьную строку). Имена файлов имеют точку и dot-dotимеют особое значение. Имя файла иногда называют «компонентом пути». Смотрите также Путь .

Так что ... если вы ищете разъяснений , это может быть не вашей первой остановкой. Учебники, такие как эта страница UNIX Concepts , полезны, например, указывают, что «полный путь» является синонимом «абсолютного» пути ».

Томас Дики
источник
3
Nitpick: точка и точка-точка являются именами файлов, а не путями. На самом деле, стандарт POSIX имеет любопытную формулировку: «В особом случае в корневом каталоге точка-точка может относиться к самому корневому каталогу». (мой акцент).
Кусалананда
Таким образом, чтение спецификации к букве /не является допустимым именем файла или компонентом пути, и это не строка, содержащая такие компоненты, но это все же полностью допустимое имя пути для одного определенного каталога. Который должен существовать, хотя та часть, которая требует этого, не упоминает своего «имени». Почему-то я нахожу это немного забавным.
ilkkachu
Ответ в POSIX : он имеет необязательные начальные символы, за которыми следуют ноль или более имен файлов, разделенных символами.
Томас Дики
@Kusalananda рассмотрите спецификацию для вашего акцента. может , в спецификации Определяет , четкое заявление поручителя в отношении испытаний реализации. где может использоваться, спецификация гарантирует любого начинающего приверженца определенного поведения. Другими словами, любая реализация может рассчитывать на ..на /связь /.
mikeserv
19

В Unix файлы (а каталоги - это просто файлы) не имеют «имен». Ссылки имеют имена, ссылки - это записи в каталоге, которые сопоставляют имена с файлами.

Вы можете сказать, что ссылки дают имена файлам, но обратите внимание: это означает, что файл может иметь более одного имени, поскольку он может иметь более одной ссылки.

Поскольку корневой каталог, в общем, является корневым каталогом, не существует каталога «более высокого уровня», внутри которого может быть ссылка на него, поэтому с ним не может быть связано имя. Теоретически было бы возможно добавить ссылку на корневой каталог в какой-то другой каталог, но большинство Unices запрещают добавлять ссылки на существующие каталоги, потому что это может привести к циклам в иерархии файловой системы (которая на самом деле является ориентированным графом) и обнаружению циклов в графике это дорого, но не обнаружение их может привести к бесконечной рекурсии при попытке разрешения имен в ядре.

Итак, в основном, корневой каталог не имеет имени, потому что над ним нет каталога, в котором мы могли бы записать имя.

Как указывалось в других ответах, мы должны различать имя и путь (имя). К корневому каталогу можно обращаться по пути (имени) /.

Йорг Миттаг
источник
Да, файлы могут иметь более одного имени, как и люди. Муж моей младшей дочери обычно носит свое второе имя, но он, очевидно, тоже должен ответить на свое имя. Основное имя корневого каталога - «/», произносится как «косая черта», поскольку его абсолютный путь - «/» (а имена, основанные на относительных путях, не особенно полезны). (Называя его «root», вы рискуете запутаться с «/ root», который всегда следует называть «slash root».
Монти Хардер
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каталоге.

Теперь корневой каталог уникален тем, что у него нет компонента в родительском каталоге; он только имеет полный путь к файлу в качестве его имени: /.

Стивен Харрис
источник