7.4 文件共享

L44

学习目标

文件共享通过有向无环图和符号链接实现,提高存储利用率。

  • 基于有向无循环图实现文件共享:多个目录项指向同一索引结点,实现硬链接共享。
  • 利用符号链接实现文件共享:创建特殊文件(符号链)指向共享文件的路径,访问时按路径查找。
  • 硬链接与符号链接的区别:硬链接直接指向索引结点,符号链接通过路径名间接指向。
  • 符号链接的问题:每次访问需读盘查找路径,开销大;需为每个链接配置索引结点,耗费空间。

原理 · 深入理解

7.4 文件共享

本节概览:先建立「文件共享」的框架,再依次展开下列小节。

  1. 基于有向无循环图实现文件共享
  2. 利用符号链接实现文件共享

7.4.1 基于有向无循环图实现文件共享

严格的树形结构目录中,每个文件只允许有一个父目录,由属主目录独占;其它用户要访问必须经过属主目录,共享是不对称的,因此树形目录不适合文件共享。

若允许一个文件有多个父目录(属于不同用户),即构成有向无循环图 DAG(Directed Acyclic Graph),便可用对称方式实现共享,而不必再通过属主目录。

图7-13 有向无循环图目录层次 / alice bob mail mail shared 共享文件可以有两个父目录,但图中不许出现环。
图7-13 有向无循环图目录层次

实现 DAG 共享的关键是引用索引结点:文件的物理地址及其它属性不再放在目录项中,而是放在索引结点中;目录项只设文件名及指向相应索引结点的指针。

这样多个目录项可指向同一个索引结点,文件主与链接者通过各自的目录项共享同一索引结点,再由索引结点中的连接计数 N 记录共享者数量。

图7-14 基于索引结点的共享方式 目录项 a.c 目录项 b.c 同一个 i-node 盘块地址 · 连接计数 = 2 两个文件名指向同一索引结点,属性只存一份,删除要等连接计数到 0。
图7-14 基于索引结点的共享方式

三个用户共享文件:C 创建新文件(文件主),其他用户通过链接共享该文件。

图7-15 进程B链接前后的情况 链接前:各用各的 硬链接后:共享 inode
图7-15 进程B链接前后的情况

7.4.2 利用符号链接实现文件共享

符号链接方式也存在一些问题。

  1. 访问开销大:其它用户读共享文件时,系统按给定路径名逐个分量查找目录,直至找到索引结点,每次访问都可能多次读盘,启动磁盘频率高。
  2. 占用磁盘空间:要为每个共享用户建立一条符号链,链本身是一个文件,尽管很简单,仍需配置一个索引结点,耗费一定磁盘空间。
图7-16 使用符号链接的目录层次 alice / notes 真正的数据文件 bob / notes 符号链接 路径名 链接项里存的是对方的路径,不是 i-node 号。 原文件搬走或改名后,符号链接可能悬空。 硬链接共享 inode;符号链接跨文件系统、还可指向目录。
图7-16 使用符号链接的目录层次

符号链接(Symbolic Linking)的基本思想:允许一个文件或子目录有多个父目录,但其中只有一个作为主(属主)父目录,其它几个父目录都通过符号链接方式与之相链接,简称链接父目录。

为使链接父目录 D5 共享文件 F8,由系统创建一个 LINK 类型的新文件,取名为 F,写入 D5 中。新文件 F 中只含被链接文件 F8 的路径名,这种链接方法称为符号链接,新文件中的路径名即符号链。

当用户通过 D5 访问被链接的文件 F8、且要读 LINK 类新文件时,请求被 OS 截获;OS 根据新文件中的路径名找到 F8,再对它进行读(写),从而实现用户对文件 F 的共享。

利用符号链的共享方式存在的问题。

  1. 其他用户读共享文件时,系统按文件路径名逐个分量查找目录,每次访问可能多次读盘,访问开销大
  2. 要为每个共享用户建立一条符号链,链本身也是文件,需配置索引结点,耗费磁盘空间

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

文件共享

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能举出嵌入式简化保护的一种做法。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • 多租户物联网网关为何又要细粒度 ACL?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表