AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 437057
Accepted
Tim
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 2 个回答
  • 373 Views

2 个回答

  • Voted
  1. 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系统调用的参数。)

    • 2
  2. 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)

    • 2

相关问题

  • chroot 一个用户到不同位置的多个目录

  • aureport 可以显示文件的完整路径吗?

  • 如何以编程方式将语言环境添加到 chrooted 系统?

  • Steam 库文件夹必须位于可执行文件系统上

  • 两个点 (..) 或两个破折号 (--) 作为文件和目录名称中的分隔符

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve