(2021) 25 [持久化] 文件系统实现:FAT和UNIX文件系统

(2021) 25 [持久化] 文件系统实现:FAT和UNIX文件系统

南京大学操作系统课蒋炎岩老师网络课程笔记。

视频:https://www.bilibili.com/video/BV1HN41197Ko?p=25
讲义:http://jyywiki.cn/OS/2021/slides/15.slides#/

背景

回顾

应用眼中的文件系统:一组API

  • 文件系统管理:mount
  • 目录管理:mkdir, rmkdir, link, symlink, unlink…
  • 文件管理:open, mmap, read, write, lseek…

本次课的内容和目标

理解两个文件系统的实现:

  • FAT
  • UNIX文件系统 / ext2

文件系统的实现:需求分析

例子:Linux文件系统的初始化

最小系统镜像

最小的 Linux 系统镜像

将上面的最小镜像下载后解压,构造 Linux 启动时的 “根文件系统”,随操作系统启动加载,你可以像调试你的 oslab 一样调试 Linux~!

initramfs
├── busybox
└── init
  • /busybox是个二进制文件
    • ELF 64-bit LSB executable, statically linked
  • /init 只有 3 行,实际只做一件事: 执行 busybox:exec /busybox sh

Linux 启动第一个应用程序时的状态

UNIX的SHELL实际上是将用户的命令翻译成了一系列系统调用

“几乎什么也没有”,但所有的一切都可以被系统调用 “创建” 出来,包括

  • mount - 文件系统管理
  • mkdir, rmkdir, link, symlink, unlink… - 目录管理
  • open, mmap, read, write, lseek… - 文件管理
/busybox mkdir -p /bin && /busybox mv /busybox /bin/
c1="arch ash base64 cat chattr chgrp chmod chown conspy cp cpio cttyhack date dd df dmesg dnsdomainname dumpkmap echo ed egrep false fatattr fdflush fgrep fsync getopt grep gunzip gzip hostname hush ionice iostat ipcalc kbd_mode kill link linux32 linux64 ln login ls lsattr lzop makemime mkdir mknod mktemp more mount mountpoint mpstat mt mv netstat nice nuke pidof ping ping6 pipe_progress printenv ps pwd reformime resume rev rm rmdir rpm run-parts scriptreplay sed setarch setpriv setserial sh sleep stat stty su sync tar touch true umount uname usleep vi watch zcat"
c2="[ [[ awk basename bc beep blkdiscard bunzip2 bzcat bzip2 cal chpst chrt chvt cksum clear cmp comm crontab cryptpw cut dc deallocvt diff dirname dos2unix dpkg dpkg-deb du dumpleases eject env envdir envuidgid expand expr factor fallocate fgconsole find flock fold free ftpget ftpput fuser groups hd head hexdump hexedit hostid id install ipcrm ipcs killall last less logger logname lpq lpr lsof lspci lsscsi lsusb lzcat lzma man md5sum mesg microcom mkfifo mkpasswd nc nl nmeter nohup nproc nsenter nslookup od openvt passwd paste patch pgrep pkill pmap printf pscan"
c3="pstree pwdx readlink realpath renice reset resize rpm2cpio runsv runsvdir rx script seq setfattr setkeycodes setsid setuidgid sha1sum sha256sum sha3sum sha512sum showkey shred shuf smemcap softlimit sort split ssl_client strings sum sv svc svok tac tail taskset tcpsvd tee telnet test tftp time timeout top tr traceroute traceroute6 truncate ts tty ttysize udhcpc6 udpsvd unexpand uniq unix2dos unlink unlzma unshare unxz unzip uptime users uudecode uuencode vlock volname w wall wc wget which who whoami whois xargs xxd xz xzcat yes"
for cmd in $c1 $c2 $c3; do/bin/busybox ln -s /bin/busybox /bin/$cmd
done
mkdir -p /proc && mount -t proc  none /proc
mkdir -p /sys  && mount -t sysfs none /sys

文件系统的实现

在一个 I/O 设备 (驱动) 上实现 “目录树” 的数据结构。

VFS:管理所有文件系统共享的部分

  • 对象 (inode) 分配/回收、路径/符号链接解析、挂载
  • 定义了每个具体文件系统需要实现的接口

具体的文件系统(如有设备的ext4,无设备的procfs)其实就是一组API,是将一个设备抽象成一棵树的代码。

利用块设备驱动:read_block, write_block,得到目录/文件 API:mkdir, rmdir, link, unlink, open, read, write, stat

内存上的数据结构和磁盘上的数据结构

实际上,我们平时所谈到的数据结构默认是内存上的数据结构,而文件系统相当于是在磁盘(更准确地说是 ”持久化的,不支持随机读写的存储设备“)上实现一种数据结构

注意:我们的持久化存储设备(磁盘、SSD等)不支持像内存RAM那样的随机访问,即每次至少要访问一个块(如4KiB,512B)。

在内存上,我们拥有的API是访问一个字(节)(如malloc / free),在磁盘上我们拥有的API是读写一个块(read_block, write_block), (可以称为balloc, bfree)。在这些API的基础上实现出我们想要的数据结构,实现出上面提到的文件、目录、文件系统管理的API,那这就是文件系统。

FAT (File Allocation Table)

FAT是个简单而古老的文件系统,基本所有平台都支持这种文件系统。 一路走来有FAT12,FAT16,FAT32,exFAT等。

需求

在很久很久以前,存储设备的空间远没有今天这么大。如5.25" 软盘:单面 180 KiB,360 个 512B 扇区 (sectors),在这样的设备上持久化数据,应该选用怎样的数据结构?

抛开workload谈优化,就是耍流氓。

需求:

  • 树状的目录结构
  • 系统中以小文件为主 (几个 block 以内)
  • 无需支持链接

实现方式:链表。任何复杂的高级数据结构都显得浪费。

用链表存储数据:两种设计

两种选择

  1. 在每个数据块后放置指针
    • 优点:实现简单、无须单独开辟存储空间
    • 缺点:数据的大小不是 2k2^k2k; 单纯的 lseek 需要读整块数据
  2. 将指针集中存放在文件系统的某个区域
    • 优点:局部性好;lseek 更快
    • 缺点:集中存放的数据损坏将导致数据丢失 (怎么办?)

哪种方式的缺陷是致命、难以解决的?

集中保存所有指针

FAT文件系统选择将指针集中存放在文件系统的某个区域,这个区域称为File Allocation Table,这也正是FAT名称的由来。

集中存储的指针容易损坏?存 n 份就行!FAT-12/16/32 (FAT entry,即 “next 指针” 的大小)。

在这里插入图片描述

“File Allocation Table” 文件系统

RTFM 得到必要的细节

  • 逻辑上,文件/目录都是字节序列 (虚拟化的磁盘),以 cluster (簇) 为单位链接 (FAT 集中存储链表的 next)。
  • 目录也是文件,一个 (filename, size, firstblock) 的列表,顺序存储。
struct fat_volume {struct fat_header header;struct fat[FAT_NUM];char clusters[CLUSTER_SZ][];
};

FAT: 链接存储的文件

“FAT” 的 “next” 数组

  • 0: free; 2...MAX: allocated;
  • ffffff7: bad cluster; ffffff8-ffffffe, -1: end-of-file

更细节的信息如图。
在这里插入图片描述

目录树实现:目录文件

以普通文件的方式存储 “目录” 这个数据结构

  • FAT: 目录 = 32-byte 定长目录项的集合
  • 操作系统在解析时把标记为目录的目录项 “当做” 目录即可。另外,可以用连续的若干个目录项存储 “长文件名”。
    在这里插入图片描述

FAT: 性能与可靠性

性能

  • 优点: 小文件简直太合适了。
  • 缺点:但大文件的随机访问就不行了,4 GB 的文件跳到末尾 (4 KB cluster) 就要有 220 次链表 next 操作,缓存能部分解决这个问题。
  • 在 FAT 时代,磁盘连续访问性能更佳(现在也是连续访问更佳,但没差那么多),使用时间久的磁盘会产生碎片 (fragmentation),malloc 也会产生碎片,不过对性能影响不太大。

可靠性

  • 维护若干个 FAT 的副本防止元数据损坏,有额外的同步开销。
  • 损坏的 cluster 在 FAT 中标记。

ext2 / UNIX 文件系统

思考:更好的文件系统,需要做到什么

怎样才能支持更好的随机访问呢?

不能 “尽善尽美”,但可以在 “实际 workload” 下尽可能好。

SummaryFindings
Most files are smallRoughly 2K is the most common size
Average file size is growingAlmost 200K is the average
Most bytes are stored in large filesA few big files use most of the space
File systems contains lots of filesAlmost 100K on average
File systems are roughly half fullEven as disks grow, file systems remain ~50% full
Directories are typically smallMany have few entries; most have 20 or fewer

ext2 / UNIX文件系统

ext2

按对象方式集中存储文件/目录元数据

  • 增强局部性 (更易于缓存)

  • 支持链接(名字不同,但是同一个文件)

    为了支持链接,文件对象inode(包括文件元数据等)需要单独存储。

  • 为大小文件区分 fast/slow path

    • 小的时候应该用数组,连链表遍历都省了
    • 大的时候应该用树 (B-Tree; Radix-Tree; …),快速的随机访问

ext2磁盘镜像格式

对磁盘进行分组:
在这里插入图片描述

“superblock”:文件系统元数据

  • 文件 (inode) 数量
  • block group 信息
    • ext2.h 里有你需要知道的一切

ext2 innode

在这里插入图片描述

ext2目录文件

与 FAT 本质相同:在文件上建立目录的数据结构。

注意到 inode 统一存储,目录文件中存储文件名到 inode 编号的 key-value mapping。

在这里插入图片描述

ext2性能与可靠性

大文件的随机读写性能提升明显 (O(1)O(1)O(1))

  • 支持链接 (一定程度减少空间浪费)
  • inode 在磁盘上连续存储,便于缓存/预取
  • 依然有碎片的问题

但可靠性依然是个很大的问题

  • 存储 inode 的数据块损坏是很严重的,但现代的磁盘相对于FAT时代的软盘,设备可靠性要好一些。

寻找更高效的数据结构 — BTRFS

btrfs: Everything is a B-tree

  • The BTRFS B-tree… knows only about “keys, items, and block headers.”
  • 数据结构由多个 copy-on-write 的 tree 组成
    • subvolume, extent allocation tree, checksum tree, chunk and device tree, reloc tree, …
    • O. Rodeth, et al. BTRFS: The Linux B-tree filesystem. ACM Transactions on Storage (ToS), 9(3), 2013.

在这里插入图片描述

总结

本次课内容与目标

  • 理解两个文件系统的设计与实现
    • FAT: 链表 + 元数据存储在目录项
    • UNIX 文件系统/ext2: bitmap + inode + 索引

Takeaway messages

  • 文件系统是磁盘 (驱动) 上的数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用计算机模拟地球诞生,计算机模拟显示早期金星或像地球一样宜居

虽然金星的绰号是“地球的邪恶孪生化身”,但它和地球上的一切都不同:灼热、干燥并且被有毒烟云笼罩。不过,就在10亿或20亿年前,这两个任性的“兄弟”可能更加相似。最新的计算机模拟显示,早期的金星看上去和地球很像&a…

海南大学计算机原理,海南大学微机原理课件 第一章 计算机基础知识

第一章计算机基础知识数 制1.1一.计算机使用的数制及其相互转换 十进制(D)、二进制(B)、八进制(O)和十六进制(H). 数制中用少量数码按次序排列成数位,并按由低到高的进位方式进行计 数。(数码的个数称为基数) D---0,1,2,3,4,5,6,7,8,9------数码十个(基为10)-------…

Linux中的二进制可执行文件和脚本可执行文件及Shebang

Linux中的二进制可执行文件和脚本可执行文件及Shebang 二进制可执行文件 我们知道&#xff0c;一个C程序经过预处理、编译、汇编、链接就会得到一个二进制可执行文件&#xff0c;这种文件在Linux中叫做ELF文件。比如我们有一个C源代码hello.c&#xff1a; #include <stdi…

pe能用的固态硬盘测试软件,通用pe工具箱教你如何让硬盘4K对齐

昨天小编教大家如何查看电脑硬盘是否4K对齐&#xff0c;马上就有读者告诉小编&#xff0c;查看电脑硬盘是否4K对齐的方法学到了&#xff0c;那么我使用的固态硬盘如何做到4K对齐呢&#xff1f;问的好啊&#xff01;现如今用户对电脑硬件的要求是越来越高。很多用户都不仅仅满足…

[2020-ECCV]PIPAL-a Large-Scale Image Quality Assessment Dataset for Perceptual Image Restoration论文简析

[2020-ECCV] PIPAL: a Large-Scale Image Quality Assessment Dataset for Perceptual Image Restoration 论文简析 论文&#xff1a;https://arxiv.org/abs/2007.12142 代码及数据集&#xff1a;https://github.com/HaomingCai/PIPAL-dataset 概述 本文认为随着图像重建&…

郫都区计算机老师周俊老师,教师节,带你走进郫都教师背后的故事

点击“郫都教育”关注我们&#xff1a;)有这样一群人“师者&#xff0c;所以传道&#xff0c;授业&#xff0c;解惑也”是他们奉献一生的事业“随风潜入夜&#xff0c;润物细无声”是他们培养英才的责任“春蚕到死丝方尽&#xff0c;蜡炬成灰泪始干”是他们追求终生的信仰值此第…

(2021) 18 [代码讲解] 可执行文件

(2021) 18 [代码讲解] 可执行文件 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p18 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/C8.slides#/ 背景 回顾 程序 状态机 状态机执行 状态机上的路径状…

如何学习计算机思维,刘康平:为什么我们每个人都应该学习计算思维?

不久前&#xff0c;微软亚洲研究院资深学术合作经理刘康平应邀在“造就”做了演讲&#xff0c;以下为演讲节选&#xff0c;由“造就”授权转载。刘康平 微软亚洲研究院资深学术合作经理以中国象棋为例&#xff0c;在这样一个棋局上&#xff0c;你怎么用最快的方式找到「将」和「…

链接与加载-NJU-JYY

(2021) 19 [代码讲解] 从零实现动态加载 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1N741177F5?p15 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/C9.slides#/ 背景 回顾&#xff1a; ELF可执行文件 只要能完成…

计算机械功的公式,机械功率计算公式

初中物理公式物理量(单位) 公式 备注 公式的变形速度V(m/S) v S /t (S:&#xff1a;路程&#xff1b; t&#xff1a;:时间 )重力G(N) Gmg (m&#xff1a;质量&#xff1b;g&#xff1a;9.8N/kg或者10N/kg)密度ρ(kg/m3) ρ m&#xff1a;质量/V&#xff1a;体积 (m&#xff1a;…

饥荒联机自建服务器有什么用,联机版饥荒使用专用服务器的好处 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-02-15存档保存位置是?很多玩家对此并不是很了解,不过别着急哟,下面99单机小编就为你带来高玩分享的相关技巧心得攻略,希望大家能喜欢. 联机版的存档与单机版是不同的,由于联机版饥荒建 ...标签&#xff1a;游戏资讯 攻略秘籍发布时间&#xff1a;201…

(2021) 26 [持久化] 持久数据的可靠性:RAID和journaling

(2021) 26 [持久化] 持久数据的可靠性&#xff1a;RAID和journaling 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p26 讲义&#xff1a;http://jyywiki.cn/OS/2021/slides/16.slides#/ 背景 回顾 文件系统 …

计算机-p命令,OD(电脑命令)_百度百科

od 命令用途是以指定格式显示文件。常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如&#xff0c;程序可能输出大量的数据记录&#xff0c;每个数据是一个单精度浮点数。这些数据记录存放在一个文件中&#xff0c;如果想查看下这个数据&…

Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决

Linux下编译、链接、加载运行C OpenCV的两种方式及常见问题的解决 在Linux下安装完OpenCV C之后&#xff08;还没有安装的读者请参考Ubuntu 18.04 安装OpenCV C&#xff09;&#xff0c;本文将探索Linux下编译、链接C OpenCV的两种方式&#xff0c;并且给出笔者在初次尝试时遇…

win10无法检验服务器出示的ssl证书,win10系统网站启用ssL安全证书的操作方法

win10系统网站启用ssL安全证书的操作方法?很多win10用户在使用电脑的时候&#xff0c;会发现win10系统网站启用ssL安全证书的的现象&#xff0c;根据小编的调查并不是所有的朋友都知道win10系统网站启用ssL安全证书的的问题怎么解决&#xff0c;不会的朋友也不用担心&#xff…

Linux下构建自己的C++共享库并配合pkg-config生成链接选项

Linux下构建自己的C共享库并配合pkg-config生成链接选项 本文将以C链表的新建、打印操作为例构建自己的共享库&#xff0c;并在实际调试代码时尝试使用。我们在做数据结构题时经常需要将链表打印出来看一下结果&#xff0c;但是并没有一种库函数可以让我们直接调用来打印自己的…

webkitlineclamp css3,-webkit-line-clamp

无标题文档static&#xff1a;对象遵循常规流。top&#xff0c;right&#xff0c;bottom&#xff0c;left等属性不会被应用。 relative&#xff1a; 对象遵循常规流&#xff0c;并且参照自身在常规流中的位置通过top&#xff0c;right&#xff0c;bottom&#xff0c;left属性进…

Linux内核初探

Linux内核初探 内核的组成部分 kernel&#xff1a;内核核心文件&#xff0c;一般为bzp_w_picpath&#xff0c;经过压缩处理的镜像文件&#xff1b;通常内核核心文件保存在/boot/目录下&#xff0c;名称为vmlinuz-version-release kernel object(ko)&#xff1a;内核对象&…

Nplayer本地文件拷到服务器,手把手教你简易NAS构建,手机/平板/智能电视随意调取,家庭存储云共享,有了自己的网络云盘后再也不用担心容量不够了!...

之前嫌键盘侠烦&#xff0c;写这些也没意义所以把账号注销了文章删除了&#xff0c;现在想了想我抗吧12级老蛆还喷不过这帮小兔崽子&#xff1f;换了skt.ruo秽土转生&#xff0c;求喷子和我在各评论对线。特别是匿名dog见一个怼死一个。下面是之前号写的内容原文 -#简介NAS全称…

gdb 入门

gdb 入门 简介 gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说&#xff0c;GDB主要帮助你完成下面四个方面的功能&#xff1a; 1、启动你的程序&#xff0c;可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点…