简单聊聊write的背后 ,然后详细讲述是如何落盘的

Lab File System

Add support for double indirect block

In this assignment you’ll increase the maximum size of an xv6 file. Currently xv6 files are limited to 268 blocks, or 268*BSIZE bytes (BSIZE is 1024 in xv6). This limit comes from the fact that an xv6 inode contains 12 “direct” block numbers and one “singly-indirect” block number, which refers to a block that holds up to 256 more block numbers, for a total of 12+256=268 blocks.

  • 你需要修改xv6文件系统,让其支持双层间接索引块, 一个doubly-indirect inode 可有 contain 256*256 个blocks, 因此单个文件的大小为256*256+256+11 个blocks·

Modify bmap() so that it implements a doubly-indirect block, in addition to direct blocks and a singly-indirect block. You’ll have to have only 11 direct blocks, rather than 12, to make room for your new doubly-indirect block; you’re not allowed to change the size of an on-disk inode. The first 11 elements of ip->addrs[] should be direct blocks; the 12th should be a singly-indirect block (just like the current one); the 13th should be your new doubly-indirect block. You are done with this exercise when bigfile writes 65803 blocks and usertests runs successfully:

  • 确保你理解bmap函数在干什么,画出ip->addrs[], indirect block 和 doubly-indect block 和 singly-indirectblock 的关系,

You will implement the symlink(char *target, char *path) system call, which creates a new symbolic link at path that refers to file named by target. For further information, see the man page symlink. To test, add symlinktest to the Makefile and run it. Your solution is complete when the tests produce the following output (including usertests succeeding).

  • 添加一个系统调用所需的所有内容,在user/user.h 添加函数声明, user/usys.pl 添加存根, kernel/syscall.h 添加系统调用号等
  • 理解所谓的软链接是什么, 软链接其实就是新建一个txt文件,里面存放着一个路径 如/root/etc/someFile的内容, 仅此而已
  • 在kernel/stat.h里新增文件类型T_SYMLINK,代表着文件为软链接文件
  • 在kernel/fcntl.h 新增O_NOFOLLOW的flag, 注意这个flag的bits 不能和已有的其他flags冲突
  • 实现symlink的时候, target不存在也可以返回成功,你需要选择一些地方来存放target path的路径, 比如inode 的data block
  • 修改open系统调用以应对打开一个指向软链接的path,如果文件不存在, open return fail,当一个进程以O_NOFOLLOW open一个文件时, open系统调用应该打开这个symlink文件
  • 如果softlink文件里面的内容还是一个softlink, 你应该递归的往下查找,直到一个不是link的文件被找到. 如果link形成了一个环,你必须返回一个错误码, 同样的当递归深度大于一些值时,你应该也需要返回错误码
  • Other system calls (e.g., link and unlink) must not follow symbolic links; these system calls operate on the symbolic link itself.
  • symbolic links 不适用于目录文件

为什么需要软链接

软链接(Symbolic Link,也称为符号链接或符号连接)和硬链接(Hard Link)都是 Unix 和类 Unix 文件系统中用于创建文件或目录之间的引用的方法。它们的主要目的是允许多个路径引用同一文件或目录,但它们的实现和应用场景有所不同。

软链接和硬链接的区别如下:

  1. 实现原理:
    • 硬链接:硬链接是一个指向文件的 inode 的引用。它与原始文件共享相同的 inode 和数据块,因此具有相同的文件内容、权限和所有权。在创建硬链接时,原始文件和硬链接本质上是相同的文件,只是文件名不同。
    • 软链接:软链接则是一个特殊的文件,它包含了指向另一个文件或目录的路径。软链接本身有一个独立的 inode,它的内容是目标文件或目录的路径。
  2. 适用范围:
    • 硬链接:硬链接通常仅适用于普通文件,而不能用于目录(除非是特定的 Unix 文件系统和具有特殊权限的用户)。硬链接还限于同一文件系统。
    • 软链接:软链接既可以引用文件,也可以引用目录。此外,软链接可以跨文件系统引用。
  3. 文件删除:
    • 硬链接:当删除一个硬链接时,文件内容不会受到影响,除非是最后一个指向该文件的硬链接被删除。只有在最后一个硬链接被删除后,文件的数据块和 inode 才会被释放。
    • 软链接:当删除一个软链接时,目标文件或目录不会受到影响。但是,如果删除了目标文件或目录,软链接将变为一个指向不存在的路径的“死链接”。

为什么需要软链接?软链接的主要优点在于它们的灵活性。由于软链接可以引用目录和跨文件系统引用,它们在以下场景中尤为有用:

  • 当需要在不同位置引用同一个文件或目录时,可以使用软链接,而无需复制内容。
  • 当需要更改文件或目录的位置时,可以使用软链接指向新的位置,而不会破坏依赖于原始路径的程序或配置。
  • 软链接可以用于版本控制和备份,例如,在 Linux 系统中,软链接经常用于引用动态库的不同版本。

思考如果你对很多文件都是硬链接的话, 你删除其中一个硬链接并不会在文件系统中删除该文件,只有当所有硬链接都被删除之后, 该文件才会真正从磁盘消失

0%