.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2003 Andries Brouwer (aeb@cwi.nl) .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PATH_RESOLUTION 7 "11 апреля 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ path_resolution \- как путь преобразуется в файл .SH ОПИСАНИЕ У некоторых системных вызовов UNIX/Linux есть параметр для указания одного или нескольких имён файлов. Имя файла (или путь) преобразуется (resolved) следующим образом. .SS "Шаг 1: запуск процесса преобразования" If the pathname starts with the \(aq/\(aq character, the starting lookup directory is the root directory of the calling process. A process inherits its root directory from its parent. Usually this will be the root directory of the file hierarchy. A process may get a different root directory by use of the \fBchroot\fP(2) system call, or may temporarily use a different root directory by using \fBopenat2\fP(2) with the \fBRESOLVE_IN_ROOT\fP flag set. .PP A process may get an entirely private mount namespace in case it\(emor one of its ancestors\(emwas started by an invocation of the \fBclone\fP(2) system call that had the \fBCLONE_NEWNS\fP flag set. This handles the \(aq/\(aq part of the pathname. .PP If the pathname does not start with the \(aq/\(aq character, the starting lookup directory of the resolution process is the current working directory of the process \(em or in the case of \fBopenat\fP(2)\-style system calls, the \fIdfd\fP argument (or the current working directory if \fBAT_FDCWD\fP is passed as the \fIdfd\fP argument). The current working directory is inherited from the parent, and can be changed by use of the \fBchdir\fP(2) system call.) .PP Пути, начинающиеся с символа «/», называются абсолютными путями. Пути, не начинающиеся с символа «/», называются относительными путями. .SS "Шаг 2: обход пути" Назначаем текущим каталогом поиска начальный каталог поиска. Теперь для каждого не конечного компонента пути (подстрока, разделённая символами «/») будет производиться поиск в текущем каталоге поиска. .PP Если у процесса нет права поиска в текущем каталоге просмотра, будет возвращена ошибка \fBEACCES\fP («Доступ запрещён»). .PP Если компонент не найдет, будет возвращена ошибка \fBENOENT\fP («Нет такого файла или каталога»). .PP Если компонент найден, но не является ни каталогом, ни символической ссылкой, будет возвращена ошибка \fBENOTDIR\fP («Не является каталогом»). .PP Если компонент найден и является каталогом, значением текущего каталога поиска устанавливается этот каталог, после чего осуществляется переход к следующему компоненту. .PP If the component is found and is a symbolic link (symlink), we first resolve this symbolic link (with the current lookup directory as starting lookup directory). Upon error, that error is returned. If the result is not a directory, an \fBENOTDIR\fP error is returned. If the resolution of the symbolic link is successful and returns a directory, we set the current lookup directory to that directory, and go to the next component. Note that the resolution process here can involve recursion if the prefix ('dirname') component of a pathname contains a filename that is a symbolic link that resolves to a directory (where the prefix component of that directory may contain a symbolic link, and so on). In order to protect the kernel against stack overflow, and also to protect against denial of service, there are limits on the maximum recursion depth, and on the maximum number of symbolic links followed. An \fBELOOP\fP error is returned when the maximum is exceeded ("Too many levels of symbolic links"). .PP .\" .\" presently: max recursion depth during symlink resolution: 5 .\" max total number of symbolic links followed: 40 .\" _POSIX_SYMLOOP_MAX is 8 .\" MAXSYMLINKS is 40 .\" MAX_NESTED_LINKS .\" commit 894bc8c4662ba9daceafe943a5ba0dd407da5cd3 В текущей реализации Linux максимальное количество допустимых переходов по символическим ссылкам при преобразовании пути равно 40. В ядрах до версии 2.6.18 ограничение глубины рекурсии было равно 5. Начиная с Linux 2.6.18, это ограничение увеличилось до 8. В Linux 4.2 код ядра разрешения пути был переработан и возникновение рекурсии больше не происходит, поэтому осталось только ограничение на 40 разрешений для всего пути. .PP The resolution of symbolic links during this stage can be blocked by using \fBopenat2\fP(2), with the \fBRESOLVE_NO_SYMLINKS\fP flag set. .SS "Шаг 3: поиск последнего элемента" Поиск конечного компонента пути происходит таким же образом, как и всех других компонентов, как было описано в предыдущем шаге, но с двумя различиями: конечному компоненту не нужно быть каталогом (по крайней мере, это не важно для процесса преобразования — он может быть каталогом или не каталогом, в зависимости от требований определённого системного вызова), и если компонент не найден это необязательна ошибка — возможно, его только требуется создать. О том, чем считается последний элемент, описано в справочных страницах соответствующих системных вызовов. .SS ". и .." По соглашению, в каждом каталоге есть записи «.» и «..», которые ссылаются на сам каталог и на его родительских каталог, соответственно. .PP Процесс определения пути предполагает, что эти записи имеют свои общепринятые значения, независимо от того, присутствуют ли они на самом деле в физической файловой системе. .PP One cannot walk up past the root: "/.." is the same as "/". .SS "Точки монтирования" После команды «mount устройство путь» путь указывает на корень иерархии файловой системы устройства, и больше не указывает на то, что было раньше. .PP Можно выйти за пределы смонтированной файловой системы: «путь/..» указывает на родительский каталог «пути», лежащий вне иерархии файловой системы устройства. .PP Traversal of mount points can be blocked by using \fBopenat2\fP(2), with the \fBRESOLVE_NO_XDEV\fP flag set (though note that this also restricts bind mount traversal). .SS "Конечные символы косой черты" Если путь заканчивается на «/», то это приводит к обработке предыдущего компонента согласно шагу 2: он существует и преобразуется в каталог. В противном случае конечный «/» будет проигнорирован (или, что тоже самое, путь с конечной косой чертой «/» будет равен пути, полученному добавлением к его концу «.»). .SS "Символьная ссылка в конце" Если последний компонент пути является символической ссылкой, то это зависит от системного вызова, будет ли файл указывать на саму символическую ссылку или на её содержимое. Например, системный вызов \fBlstat\fP(2) будет работать с символической ссылкой, а \fBstat\fP(2) работает с файлом, на который указывает символическая ссылка. .SS "Ограничение длины" Существует максимально допустимая длина пути. Если путь (или какой\-нибудь промежуточный путь, полученный при разрешении символических ссылок) очень длинный, то возвращается \fBENAMETOOLONG\fP («Имя файла очень длинное»). .SS "Пустой путь" В оригинальном UNIX, пустой путь считался текущим каталогом. В наши дни в POSIX указано, что пустой путь не должен быть преобразован без ошибки. В Linux в этом случае возвращается \fBENOENT\fP. .SS "Права доступа" Биты прав файла делятся на три группы по три бита; смотрите \fBchmod\fP(1) и \fBstat\fP(2). Первая группа используется тогда, когда эффективный идентификатор пользователя вызывающего процесса равен идентификатору владельца файла. Вторая группа используется, если идентификатор группы файла равен эффективному идентификатору группы вызывающего процесса или одному из дополнительных групп вызывающего процесса (установленных \fBsetgroups\fP(2)). В остальных случаях используется третья группа. .PP Три бита используются следующим образом: первым битом задаётся доступ на чтение, вторым на запись, а последним, в случае обычных файлов — разрешение на выполнение, в в случае каталогов разрешение на поиск. .PP Для проверки доступа в Linux используется fsuid вместо эффективного идентификатора пользователя. Обычно, fsuid равен эффективному идентификатору пользователя, fsuid может быть изменён системным вызовом \fBsetfsuid\fP(2). .PP (Здесь «fsuid» сокращение от «пользовательский идентификатор в файловой системе, filesystem user ID». Это требовалось для реализации сервера NFS в пользовательском пространстве во времена, когда процессы могли посылать сигнал процессу с тем же эффективным идентификатором пользователя. Сейчас это устарело. Никто не должен использовать \fBsetfsuid\fP(2).) .PP .\" FIXME . say something about filesystem mounted read-only ? Схожим образом в Linux используется fsgid ("filesystem group ID") вместо идентификатора эффективной группы. Смотрите \fBsetfsgid\fP(2). .SS "Пропуск проверки прав доступа: суперпользователь и мандаты" .\" (but for exec at least one x bit must be set) -- AEB .\" but there is variation across systems on this point: for .\" example, HP-UX and Tru64 are as described by AEB. However, .\" on some implementations (e.g., Solaris, FreeBSD), .\" access(X_OK) by superuser will report success, regardless .\" of the file's execute permission bits. -- MTK (Oct 05) В традиционных системах UNIX суперпользователю (\fIroot\fP, идентификатор пользователя 0) доступно всё и при доступе к файлам никаких проверок ограничений не производится. .PP В Linux права суперпользователя делятся мандатами (смотрите \fBcapabilities\fP(7)). Два мандата относятся к проверка доступа к файлам: \fBCAP_DAC_OVERRIDE\fP и \fBCAP_DAC_READ_SEARCH\fP (процесс имеет эти мандаты, если его fsuid равен 0). .PP Мандат \fBCAP_DAC_OVERRIDE\fP заменяет всех проверки прав, но позволяет право выполнения только, когда установлен хотя бы один из трёх битов выполнения файла. .PP .\" FIXME . say something about immutable files .\" FIXME . say something about ACLs Мандат \fBCAP_DAC_READ_SEARCH\fP разрешает чтение и поиск в по каталогу, а также чтение обычных файлов. .SH "СМ. ТАКЖЕ" \fBreadlink\fP(2), \fBcapabilities\fP(7), \fBcredentials\fP(7), \fBsymlink\fP(7) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .