(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.pswp.cn/news/532735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532735.shtml
英文地址,請注明出處:http://en.pswp.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、可讓被調試的程序在你所指定的調置的斷點…