Tim Asked: 2018-04-12 07:37:48 +0800 CST2018-04-12 07:37:48 +0800 CST 2018-04-12 07:37:48 +0800 CST 根目录如何用于解析绝对路径名? 772 APUE 说 每个进程还有一个根目录,用于解析绝对路径名。可以使用 chroot 函数更改此根目录。 我认为只有相对路径名需要解析。所以我想知道 绝对路径名的解析是什么意思? 如何chroot使用根目录来解析绝对路径名?谢谢。 filenames chroot 2 个回答 Voted Johan Myréen 2018-04-12T08:33:20+08:002018-04-12T08:33:20+08:00 例如,当内核解析/usr/share/man/man1/cat.1.gz为一个 inode 时,它必须从 root 开始/,然后一直向下运行到cat.1.gz. 在相对路径名的情况下,它只需要在当前目录中查找文件。 也许您正在考虑如何获取当前工作目录的绝对路径?要确定路径,您必须从当前目录开始,通过所有中间目录直到根目录。(但请注意,当给定文件的相对路径时,内核不会这样做,例如作为open系统调用的参数。) Best Answer G-Man Says 'Reinstate Monica' 2018-04-13T11:59:33+08:002018-04-13T11:59:33+08:00 所有路径名都需要解析。显然,进程将路径名作为系统调用的参数传递给内核,例如: creat或open, link或rename, unlink或rmdir, chmod或chown, chdir或chroot, execve, 等等考虑一个看起来像这样的路径名 … a / b / c 内核对此的解释方式是: 开始(文件系统中的某处), 查找名为a1的目录。 如果未找到,则返回错误。 如果找到,则在该目录中搜索名为b. 如果未找到,则返回错误。如果找到,则在该目录中搜索名为2 的目录条目。 如果未找到,则返回错误3。 如果找到,则返回该 inode。c 注意路径名开头和算法第一行的混淆。很简单:如果路径名以斜杠开头(即,它是“绝对路径名”,例如/a/b/c, , a/b/c),搜索从进程的当前工作目录开始。 您可能会问“这是如何实现的?” 嗯,当然,内核维护着很多关于每个进程的信息,包括 PID、PPID 和各种进程组标识符, 真实、有效、保存的 UID 和 GID,以及补充 GID 列表, 打开文件, 信号配置, 和更多。我遗漏了很多东西,因为它们与这个问题无关。我省略了环境变量,因为它们不是由内核维护的;它们由用户空间程序维护。内核所做的只是支持一种将环境变量从一个程序传递到另一个程序的机制execve。 出于戏剧性目的,我在上面的列表中遗漏了两件事: 进程的根目录,以及 当前工作目录 这些是指向 inode 的指针。我希望每个人都了解进程的当前工作目录是如何设置的——进程调用chdir,将路径名作为参数传递给它;内核按照上述过程解释路径名(将其解析为 inode),并在成功后将当前目录指针设置为指向该 inode。 进程的根目录的设置方式相同,除了chroot系统调用。 (注意,在任何一种情况下,如果路径名参数以 开头,则路径名解析从调用系统调用时生效/的进程的根目录开始 。) 一些例子: 如果您的当前目录是/home/tim (并且您的进程根目录是文件系统根目录),那么 如果你访问/etc/services,你会得到/etc/services, 如果你访问.bashrc,你会得到/home/tim/.bashrc。 如果你这样做chroot /filesystem/tim (假设有一个同名的目录,并且你可以访问它,并且你有必要的权限chroot),那么 如果你访问/etc/services,你会得到/filesystem/tim/etc/services, 如果你访问/,你会得到/filesystem/tim,所以 如果你chroot /,什么都不会改变; 如果你chroot /filesystem/john,它会尽力chroot去/filesystem/tim/filesystem/john。 由于根目录和当前目录存储为指向 inode 的指针,因此系统不需要“定位”它们。 __________ 1 即,查找指向模式指示它是目录的inode 的目录条目,即(i_mode & IFMT) == IFDIR。 2 对于路径名的最后一段,它不关心它是什么类型的文件;它可以是一个目录、一个普通文件、一个命名管道、一个符号链接、一个设备……等等。 3 如果没有找到路径名的最后一段,但系统调用是 or(等价的),或者任何其他不能创建目录条目的东西,操作不会失败。creat(file, mode)open(file, O_CREAT, mode)
例如,当内核解析
/usr/share/man/man1/cat.1.gz
为一个 inode 时,它必须从 root 开始/
,然后一直向下运行到cat.1.gz
. 在相对路径名的情况下,它只需要在当前目录中查找文件。也许您正在考虑如何获取当前工作目录的绝对路径?要确定路径,您必须从当前目录开始,通过所有中间目录直到根目录。(但请注意,当给定文件的相对路径时,内核不会这样做,例如作为
open
系统调用的参数。)所有路径名都需要解析。显然,进程将路径名作为系统调用的参数传递给内核,例如:
creat
或open
,link
或rename
,unlink
或rmdir
,chmod
或chown
,chdir
或chroot
,execve
,等等考虑一个看起来像这样的路径名
内核对此的解释方式是:
注意路径名开头和算法第一行的混淆。很简单:如果路径名以斜杠开头(即,它是“绝对路径名”,例如
/a/b/c
, ,a/b/c
),搜索从进程的当前工作目录开始。您可能会问“这是如何实现的?” 嗯,当然,内核维护着很多关于每个进程的信息,包括
和更多。我遗漏了很多东西,因为它们与这个问题无关。我省略了环境变量,因为它们不是由内核维护的;它们由用户空间程序维护。内核所做的只是支持一种将环境变量从一个程序传递到另一个程序的机制
execve
。出于戏剧性目的,我在上面的列表中遗漏了两件事:
这些是指向 inode 的指针。我希望每个人都了解进程的当前工作目录是如何设置的——进程调用
chdir
,将路径名作为参数传递给它;内核按照上述过程解释路径名(将其解析为 inode),并在成功后将当前目录指针设置为指向该 inode。进程的根目录的设置方式相同,除了
chroot
系统调用。(注意,在任何一种情况下,如果路径名参数以 开头,则路径名解析从调用系统调用时生效
/
的进程的根目录开始 。)一些例子:
/home/tim
(并且您的进程根目录是文件系统根目录),那么/etc/services
,你会得到/etc/services
,.bashrc
,你会得到/home/tim/.bashrc
。chroot /filesystem/tim
(假设有一个同名的目录,并且你可以访问它,并且你有必要的权限chroot
),那么/etc/services
,你会得到/filesystem/tim/etc/services
,/
,你会得到/filesystem/tim
,所以chroot /
,什么都不会改变;chroot /filesystem/john
,它会尽力chroot
去/filesystem/tim/filesystem/john
。由于根目录和当前目录存储为指向 inode 的指针,因此系统不需要“定位”它们。
2 对于路径名的最后一段,它不关心它是什么类型的文件;它可以是一个目录、一个普通文件、一个命名管道、一个符号链接、一个设备……等等。 3 如果没有找到路径名的最后一段,但系统调用是 or(等价的),或者任何其他不能创建目录条目的东西,操作不会失败。__________
1 即,查找指向模式指示它是目录的inode 的目录条目,即
(i_mode & IFMT) == IFDIR
。creat(file, mode)
open(file, O_CREAT, mode)