Linux kernel 获取绑定安装';使用内核API的源代码

Linux kernel 获取绑定安装';使用内核API的源代码,linux-kernel,filepath,kernel-module,Linux Kernel,Filepath,Kernel Module,假设sda1上的文件系统如下所示: / fedora/ ubuntu/ / boot/ bin/ dev/ etc/ home/ owner/ lib/ mnt/ boot/ opt/ proc/ root/ run/ sbin/ srv/ sys/ tmp/ usr/ var/ lib/ containers/ box/ root/ / a

假设
sda1
上的文件系统如下所示:

/
  fedora/
  ubuntu/
/
  boot/
  bin/
  dev/
  etc/
  home/
    owner/
  lib/
  mnt/
    boot/
  opt/
  proc/
  root/
  run/
  sbin/
  srv/
  sys/
  tmp/
  usr/
  var/
    lib/
      containers/
        box/
          root/
/
  app/
  bin/
  lib/
  sbin/
  user/
sda2上的文件系统如下所示:

/
  fedora/
  ubuntu/
/
  boot/
  bin/
  dev/
  etc/
  home/
    owner/
  lib/
  mnt/
    boot/
  opt/
  proc/
  root/
  run/
  sbin/
  srv/
  sys/
  tmp/
  usr/
  var/
    lib/
      containers/
        box/
          root/
/
  app/
  bin/
  lib/
  sbin/
  user/
sda3上的文件系统如下所示:

/
  fedora/
  ubuntu/
/
  boot/
  bin/
  dev/
  etc/
  home/
    owner/
  lib/
  mnt/
    boot/
  opt/
  proc/
  root/
  run/
  sbin/
  srv/
  sys/
  tmp/
  usr/
  var/
    lib/
      containers/
        box/
          root/
/
  app/
  bin/
  lib/
  sbin/
  user/
文件系统的装载如下所示:

mount /dev/sda2 /
mount /dev/sda1 /mnt/boot
mount /dev/sda3 /var/lib/containers/box/root
还执行了多个绑定安装:

mount --bind /mnt/boot/ubuntu /boot
mount --bind /home/owner /var/lib/containers/box/root/user
现在,如果给定一个
文件
结构,我如何在它所在的文件系统上检索它相应的完整路径?如果我有I
/boot/grub
,那么结果应该是
/ubuntu/grub
。如果我有
/var/lib/containers/box/root/user
,那么我应该只知道通过以下方式解决此问题:

  • 保存一个字符串,该字符串是与
    文件
    struct关联的文件名(我的内存对此不清楚)
  • 保存
    文件
    结构的源文件系统的设备号(我不知道从哪里开始获取)
  • 正在检索它所属的
    dentry
    结构(
    file.f_path.dentry
  • 从步骤6中检索上述
    dentry
    结构的父
    dentry
    结构或
    dentry
    结构(
    dentry.d\u parent
  • 保存步骤3中检索到的
    dentry
    struct下面的设备号(我不知道从哪里开始获取)
  • 将步骤1中保存的设备编号与步骤4中保存的设备编号进行比较,将上述
    dentry
    struct的对应名称前置到保存的字符串,如果设备编号匹配,则返回步骤4;如果设备编号不匹配,则停止
  • 我不希望我上面给出的步骤是有效的,我希望它会减慢内核操作。我认为,在绑定装载的情况下,
    /proc/PID/mountinfo
    显示底层文件系统上装载源的路径,必须有另一种方式