1
0
wiki/Technology/ComputerStorage/4.-文件系统.html

1028 lines
520 KiB
HTML
Raw Normal View History

2024-09-03 21:23:28 +08:00
<!DOCTYPE html>
<html><head><title>4. 文件系统</title><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="4. 文件系统"/><meta property="og:description" content="描述."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../../static/icon.png"/><meta name="description" content="描述."/><meta name="generator" content="Quartz"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><script async src="https://umami.7wate.com/script.js" data-website-id="c061efdc-95dd-4d21-9d04-a1ffda0a85b9"></script><script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?94d8ccb156eb7c65abf317e6e01cdba9";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-MHMEL0F832"></script><script>
(function() {
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-MHMEL0F832');
})();
</script><link href="../../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&amp;family=Schibsted Grotesk:wght@400;700&amp;family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&amp;display=swap" rel="stylesheet" type="text/css" spa-preserve/><script src="../../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch(`../../static/contentIndex.json`).then(data => data.json())</script></head><body data-slug="Technology/ComputerStorage/4.-文件系统"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h1 class="page-title "><a href="../..">📚 X·Eden</a></h1><div class="spacer mobile-only"></div><div class="search "><div id="search-icon"><p>Search</p><div></div><svg tabIndex="0" aria-labelledby="title desc" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title id="title">Search</title><desc id="desc">Search</desc><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></div><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="Search for something" placeholder="Search for something"/><div id="results-container"></div></div></div></div><div class="darkmode "><input class="toggle" id="darkmode-toggle" type="checkbox" tabIndex="-1"/><label id="toggle-label-light" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xmlSpace="preserve"><title>Light mode</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"></path></svg></label><label id="toggle-label-dark" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="nightIcon" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background='new 0 0 100 100'" xmlSpace="preserve"><title>Dark mode</title><path d="M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.008-14.65,35.369 c0,13.36,5.203,25.921,14.
<h3 id="linux-文件系统">Linux 文件系统<a aria-hidden="true" tabindex="-1" href="#linux-文件系统" class="internal"> §</a></h3>
<p>Linux 文件系统始于 1987 年,当时 Linus Torvalds 在创建 Linux 内核时,选择了 Minix 文件系统。Minix 文件系统由 Andrew S. Tanenbaum 为 Minix 操作系统设计,具有简单且可靠的特点。然而,由于其最大文件和文件系统大小仅为 64MB以及文件名长度限制为 14 字符,无法满足更复杂的需求。</p>
<p>1992 年Rémy Card 开发了第一个专为 Linux 设计的文件系统 <strong>Extended File System (EXT)</strong>,以解决 Minix 文件系统的限制问题。EXT 的最大文件和文件系统大小分别为 2GB文件名长度扩展到 255 字符。然而EXT 仍然缺乏日志功能和对更大规模的支持。</p>
<p>1993 年Rémy Card 发布了 EXT2 文件系统,这成为 Linux 内核 2.0 版的默认文件系统。EXT2 支持的最大文件大小为 2TB最大文件系统大小为 4TB尽管没有日志功能但它提供了更大的文件和文件系统支持并改进了性能。</p>
<p>1994 年Silicon GraphicsSGI开发了 <strong>XFS 文件系统</strong>,最初用于其 IRIX 操作系统。XFS 以其高性能和可扩展性在科学计算和数据密集型应用中广泛使用,支持的最大文件和文件系统大小分别为 18EB具有高效的日志记录机制。</p>
<p>2001 年Stephen Tweedie 发布了 EXT3 文件系统,这是 EXT2 的升级版本增加了日志功能以提高数据可靠性和系统恢复速度。EXT3 保持了 EXT2 的文件和文件系统大小限制,并且向后兼容 EXT2。同年Hans Reiser 开发了 ReiserFS这是第一个默认支持日志功能的文件系统支持的最大文件和文件系统大小分别为 8TB 和 16TB。ReiserFS 以高效的小文件存储和快速目录查找而闻名,但后续发展受限,逐渐被其他文件系统取代。</p>
<p>2004 年Sun Microsystems 开发并发布了 <strong>ZFS 文件系统</strong>,最初用于 Solaris 操作系统现在已移植到多个平台。ZFS 提供了极高的数据完整性和灵活性,支持的最大文件和文件系统大小为 256 兆亿亿字节,并集成了文件系统和逻辑卷管理、数据完整性校验、快照和复制、自动修复等新特性,适用于企业存储解决方案和云存储环境。</p>
<p>2007 年Oracle 公司开发的 <strong>Btrfs 文件系统</strong>首次发布旨在提供高级管理功能和高可靠性。Btrfs 支持的最大文件和文件系统大小均为 16EB具有快照、内联数据压缩、子卷管理和在线文件系统检查等新特性适用于需要高级存储管理和数据保护的场景。</p>
<p>2008 年,由 Theodore Tso 领导开发的 EXT4 文件系统发布,成为 EXT3 的继任者。EXT4 显著改进了性能和可靠性,支持的最大文件大小达到 1EB最大文件系统大小为 16TB并引入了延迟分配、多块分配、无日志模式和在线碎片整理等新特性。</p>
<p>Linux 文件系统从 Minix 到 EXT再到更高级的 EXT4、Btrfs、XFS 和 ZFS 的发展过程中,每一次升级都带来了更大的存储支持、更高的性能和可靠性,以及更多的管理功能。</p>
<h4 id="ext4">EXT4<a aria-hidden="true" tabindex="-1" href="#ext4" class="internal"> §</a></h4>
<p>EXT4Fourth Extended File System于 2008 年发布,由 Theodore Tso 领导开发,作为 EXT3 的继任者。EXT4 的发展旨在解决 EXT3 在大规模存储和性能上的限制并引入了许多新特性和性能改进。EXT4 成为现代 Linux 系统的主流文件系统,广泛应用于各种场景,从个人电脑到企业级服务器。它的设计兼顾了向后兼容和未来扩展的需求,使其在稳定性和性能上都有显著提升。</p>
<p><img src="https://static.7wate.com/2024/07/29/3e52bf8a5c229.png" alt="EXT4"/></p>
<p><strong>特点</strong></p>
<ul>
<li><strong>最大文件大小</strong>1EBExabyte</li>
<li><strong>最大文件系统大小</strong>16TBTerabyte</li>
<li><strong>文件碎片整理</strong>引入了延迟分配Delayed Allocation技术这一特性通过推迟分配数据块的位置来减少文件碎片提高了文件系统性能。</li>
<li><strong>多块分配</strong>多块分配Multiblock Allocation允许一次性分配多个块减少文件碎片提高写入效率。</li>
<li><strong>日志模式</strong>支持多种日志模式Journal Mode包括数据模式、元数据模式和延迟模式以平衡性能和数据安全。</li>
<li><strong>文件系统检查</strong>引入了快速文件系统检查功能Fast Fsck通过存储已校验的文件系统部分减少了文件系统检查时间。</li>
<li><strong>无日志模式</strong>支持无日志模式No Journaling Mode适用于对性能要求极高而对数据安全要求不高的场景。</li>
<li><strong>在线碎片整理</strong>:支持在线碎片整理功能,允许在不卸载文件系统的情况下进行碎片整理,提高了系统的可用性。</li>
</ul>
<h4 id="btrfs">Btrfs<a aria-hidden="true" tabindex="-1" href="#btrfs" class="internal"> §</a></h4>
<p>BtrfsB-Tree 文件系统)由 Oracle 公司于 2007 年首次发布旨在提供高级管理功能和高可靠性。Btrfs 的设计目标是应对大规模存储系统的需求并提供丰富的数据管理功能。Btrfs 在开发初期得到了广泛关注,被认为是未来 Linux 文件系统的发展方向之一。它的许多特性,如快照、压缩和自我修复,使其在数据密集型和高可靠性要求的应用场景中具有显著优势。</p>
<p><img src="https://static.7wate.com/2024/07/29/c275d0287d3ef.jpg" alt="Btrfs"/></p>
<p><strong>特点</strong></p>
<ul>
<li><strong>最大文件大小</strong>16EBExabyte</li>
<li><strong>最大文件系统大小</strong>16EB</li>
<li><strong>快照</strong>支持快照Snapshot功能可以快速创建文件系统的时间点副本用于数据备份和恢复。</li>
<li><strong>内联数据压缩</strong>支持内联数据压缩Inline Compression有效减少存储空间需求。</li>
<li><strong>子卷管理</strong>支持子卷Subvolume管理允许在同一文件系统中创建多个逻辑卷提供更灵活的存储管理。</li>
<li><strong>在线文件系统检查</strong>支持在线文件系统检查和修复Online Scrubbing and Repair可以在系统运行时检测和修复数据损坏。</li>
<li><strong>自我修复</strong>:内置数据校验和自我修复功能,自动检测并修复数据损坏,确保数据完整性。</li>
<li><strong>可扩展性</strong>:高可扩展性,支持大规模存储需求,并允许在不中断服务的情况下进行文件系统扩展和缩减。</li>
</ul>
<h4 id="xfs">XFS<a aria-hidden="true" tabindex="-1" href="#xfs" class="internal"> §</a></h4>
<p>XFS 文件系统由 Silicon GraphicsSGI于 1994 年开发,最初用于其高性能计算和图形工作站的 IRIX 操作系统。XFS 以其高性能和可扩展性著称,特别适合处理大文件和高并发 I/O 操作。随着时间的推移XFS 被移植到 Linux 平台,并在数据密集型应用和科学计算领域得到了广泛应用。</p>
<p><img src="https://static.7wate.com/2024/07/29/d1f355f6dd2f2.jpg" alt="XFS"/></p>
<p><strong>特点</strong></p>
<ul>
<li><strong>最大文件大小</strong>18EBExabyte</li>
<li><strong>最大文件系统大小</strong>18EB</li>
<li><strong>日志记录机制</strong>高效的日志记录机制Efficient Logging减少了系统崩溃后的恢复时间提高了数据可靠性。</li>
<li><strong>直接 I/O</strong>:支持直接 I/ODirect I/O允许应用程序直接访问磁盘绕过文件系统缓存提高了 I/O 性能。</li>
<li><strong>可扩展性</strong>:极高的可扩展性,能够处理极大规模的存储需求,适用于高性能计算和数据中心。</li>
<li><strong>动态扩展</strong>支持文件系统的动态扩展Dynamic Allocation在不卸载文件系统的情况下进行扩展。</li>
<li><strong>并发支持</strong>:优秀的并发支持,适用于高并发的 I/O 操作场景,如数据库和大规模数据处理。</li>
</ul>
<h4 id="zfs">ZFS<a aria-hidden="true" tabindex="-1" href="#zfs" class="internal"> §</a></h4>
<p>ZFSZettabyte File System由 Sun Microsystems 开发,最初用于 Solaris 操作系统现已移植到多个平台。ZFS 于 2004 年首次发布旨在提供极高的数据完整性和灵活性。ZFS 的设计理念是将文件系统和逻辑卷管理融合在一起,简化存储管理,同时提供强大的数据保护和管理功能。其创新的设计和丰富的特性使其在企业存储解决方案和云存储环境中得到了广泛应用。</p>
<p><img src="https://static.7wate.com/2024/07/29/579b07803dbdd.jpg" alt="ZFS"/></p>
<p><strong>特点</strong></p>
<ul>
<li><strong>最大文件大小</strong>256 兆亿亿字节</li>
<li><strong>最大文件系统大小</strong>256 兆亿亿字节</li>
<li><strong>集成文件系统和逻辑卷管理</strong>ZFS 将文件系统和逻辑卷管理融合在一起,提供统一的存储管理界面,简化了管理操作。</li>
<li><strong>数据完整性校验</strong>内置数据校验Data Integrity Verification和自我修复功能确保数据在传输和存储过程中的完整性。</li>
<li><strong>快照和克隆</strong>支持快照Snapshot和克隆Clone功能可以快速创建数据副本用于备份和测试。</li>
<li><strong>自动修复</strong>当检测到数据损坏时ZFS 能自动从冗余数据中恢复,确保数据的高可靠性。</li>
<li><strong>高级存储管理</strong>支持数据压缩、去重Deduplication和动态磁盘池Dynamic Storage Pooling提高存储效率和灵活性。</li>
<li><strong>可扩展性</strong>:高可扩展性,支持大规模存储环境,适用于企业级和云计算场景。</li>
</ul>
<h4 id="对比表">对比表<a aria-hidden="true" tabindex="-1" href="#对比表" class="internal"> §</a></h4>
<table><thead><tr><th>文件系统</th><th>最大文件大小</th><th>最大文件系统大小</th><th>日志功能</th><th>快照</th><th>压缩</th><th>数据校验</th><th>自我修复</th><th>应用场景</th></tr></thead><tbody><tr><td>EXT4</td><td>1EB</td><td>16TB</td><td></td><td></td><td></td><td></td><td></td><td>现代 Linux 系统,广泛应用于个人电脑和服务器</td></tr><tr><td>Btrfs</td><td>16EB</td><td>16EB</td><td></td><td></td><td></td><td></td><td></td><td>高级存储管理和数据保护,适用于服务器和企业级应用</td></tr><tr><td>XFS</td><td>18EB</td><td>18EB</td><td></td><td></td><td></td><td></td><td></td><td>高并发 I/O 和大文件处理,适用于高性能计算和数据密集型应用</td></tr><tr><td>ZFS</td><td>256 兆亿亿字节</td><td>256 兆亿亿字节</td><td></td><td></td><td></td><td></td><td></td><td>企业存储解决方案和云存储环境,提供极高的数据完整性和灵活性</td></tr></tbody></table>
<h3 id="windows-文件系统">Windows 文件系统<a aria-hidden="true" tabindex="-1" href="#windows-文件系统" class="internal"> §</a></h3>
<p>1980 年代中期,微软推出了最初的文件系统——<strong>FAT 文件系统File Allocation Table</strong>,用于 MS-DOS 操作系统。FAT 文件系统简单且高效,适用于当时的硬盘存储需求。它最初有 FAT12 和 FAT16 两个版本分别用于小型和中型存储设备。FAT16 支持的最大分区大小为 2GB文件名长度为 8.3 格式(即最多 8 个字符的文件名加上 3 个字符的扩展名)。</p>
<p>1993 年,随着 Windows NT 3.1 的发布,微软引入了<strong>NTFS 文件系统New Technology File System</strong>。NTFS 提供了许多先进的功能如文件和文件系统的权限管理、日志记录、文件压缩和加密等。NTFS 支持的最大文件和文件系统大小大幅提升,文件名长度扩展到 255 字符。</p>
<p>1996 年FAT32 文件系统随着 Windows 95 OSR2 的发布而推出,旨在克服 FAT16 的限制。FAT32 支持的最大分区大小为 2TB文件名长度仍为 8.3 格式,但增加了长文件名支持,允许最多 255 个字符。FAT32 广泛用于 U 盘和小型存储设备,因其跨平台兼容性而受到欢迎。</p>
<p>2001 年,随着 Windows XP 的发布NTFS 文件系统成为默认文件系统。NTFS 的优势包括支持大文件和大分区、更好的数据安全性和可靠性以及改进的磁盘空间利用率。Windows XP 还继续支持 FAT32 文件系统,以保持对旧系统和设备的兼容性。</p>
<p>2006 年Windows Vista 发布,引入了 NTFS 3.1 版本,增加了对事务性 NTFSTxF的支持以提高文件操作的可靠性和一致性。虽然 TxF 在后来版本中被弃用,但它显示了 NTFS 在功能和性能上的不断改进。</p>
<p>2012 年,随着 Windows 8 的发布,微软推出了<strong>ReFS 文件系统Resilient File System</strong>旨在提供更高的数据完整性和可扩展性。ReFS 具有自动修复、数据校验、数据损坏隔离等特性特别适用于大规模数据存储和虚拟化环境。ReFS 支持的最大文件大小和文件系统大小为 1YB1 百万 TB</p>
<p>2017 年,随着 Windows 10 的更新,<strong>微软引入了对 Linux 文件系统(如 Ext4 和 Btrfs的支持</strong>,通过 Windows Subsystem for LinuxWSL使用户能够在 Windows 上使用 Linux 文件系统和工具。这标志着 Windows 文件系统生态的进一步扩展和兼容性提升。</p>
<p>Windows 文件系统的发展历程从早期的 FAT 和 FAT16逐步发展到功能强大的 NTFS再到专为大规模数据存储设计的 ReFS每一次升级都带来了更高的性能、可靠性和功能。现代 Windows 操作系统还通过 WSL 支持 Linux 文件系统,展示了其在兼容性和多样性上的持续改进。</p>
<h4 id="ntfs">NTFS<a aria-hidden="true" tabindex="-1" href="#ntfs" class="internal"> §</a></h4>
<p>NTFSNew Technology File System由 Microsoft 于 1993 年随 Windows NT 3.1 发布,作为 FAT 文件系统的继任者。NTFS 设计初衷是提供更高的安全性、可靠性和可扩展性,适应企业级应用的需求。它的发展伴随着 Windows NT 系列操作系统的进化,从最初的 NT 3.1 到后来的 Windows 2000、XP、Vista、7、8 和 10。NTFS 的引入标志着文件系统安全性和性能的显著提升,使其成为 Windows 系统的标准文件系统。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>文件和卷加密</strong>:支持 EFSEncrypting File System加密技术提供文件和文件夹级别的加密保护。</li>
<li><strong>磁盘配额</strong>:允许管理员设置磁盘配额,限制用户或组的磁盘使用量。</li>
<li><strong>压缩</strong>:支持文件和文件夹的压缩功能,节省存储空间。</li>
<li><strong>日志功能</strong>:具有日志功能,记录文件系统元数据的变更,确保数据完整性和快速恢复。</li>
<li><strong>单个文件和卷大小</strong>:支持高达 256TB 的单个文件和卷大小,满足大规模存储需求。</li>
<li><strong>权限管理</strong>:提供细粒度的文件和文件夹权限设置,增强了数据安全性。</li>
<li><strong>索引服务</strong>:支持文件内容索引,加快文件搜索速度。</li>
</ul>
<h4 id="fat32">FAT32<a aria-hidden="true" tabindex="-1" href="#fat32" class="internal"> §</a></h4>
<p>FAT32File Allocation Table 32是 FAT 文件系统的改进版,于 1996 年随 Windows 95 OSR2 发布。FAT32 旨在解决 FAT16 的容量限制问题提供更大的卷和文件支持。由于其良好的兼容性FAT32 在便携设备和多平台数据交换中得到广泛应用。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>兼容性</strong>FAT32 可以在多种操作系统(如 Windows、MacOS、Linux之间无缝使用广泛用于便携式存储设备。</li>
<li><strong>卷和文件大小</strong>:支持最高 4GB 的单个文件和 2TB 的卷大小。</li>
<li><strong>效率</strong>:较小的簇大小提高了磁盘空间的利用率。</li>
<li><strong>简单性</strong>:文件系统结构简单,易于实现和维护。</li>
<li><strong>局限性</strong>:不支持文件加密、磁盘配额和文件压缩等高级功能。</li>
</ul>
<h4 id="exfat">exFAT<a aria-hidden="true" tabindex="-1" href="#exfat" class="internal"> §</a></h4>
<p>exFATExtended File Allocation Table于 2006 年由 Microsoft 发布,旨在替代 FAT32专为闪存存储设备如 SD 卡和 USB 闪存驱动器优化。exFAT 解决了 FAT32 在文件大小和卷大小上的限制,同时保持了跨平台兼容性。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>文件和卷大小</strong>:支持高达 128PB 的卷大小和无实际限制的文件大小,适用于大容量存储需求。</li>
<li><strong>优化性能</strong>:针对闪存存储器优化,提供更高的读写性能。</li>
<li><strong>跨平台兼容性</strong>:广泛支持多种操作系统,适合便携式存储设备。</li>
<li><strong>簇大小</strong>:支持更大的簇大小,适合处理大文件。</li>
<li><strong>简单性</strong>:比 NTFS 结构简单,适合嵌入式系统和便携设备。</li>
</ul>
<h4 id="refs">ReFS<a aria-hidden="true" tabindex="-1" href="#refs" class="internal"> §</a></h4>
<p>ReFSResilient File System于 2012 年由 Microsoft 发布,作为 NTFS 的继任者,主要用于 Windows Server 环境。ReFS 设计初衷是提高数据可用性和弹性,特别适用于大规模数据存储和虚拟化环境。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>数据完整性</strong>:采用校验和算法,检测和修复数据损坏,提高数据可靠性。</li>
<li><strong>自动修复</strong>:支持自动修复功能,通过冗余数据副本自动修复损坏的数据。</li>
<li><strong>弹性</strong>:设计用于处理极大规模的数据卷和文件,支持高达数百 PB 的存储容量。</li>
<li><strong>性能优化</strong>:针对虚拟化和大规模存储场景进行了优化,提高了性能和效率。</li>
<li><strong>兼容性</strong>:虽然 ReFS 不完全兼容所有 NTFS 功能,但它与 Windows Server 和存储空间Storage Spaces高度集成。</li>
</ul>
<h4 id="对比表-1">对比表<a aria-hidden="true" tabindex="-1" href="#对比表-1" class="internal"> §</a></h4>
<table><thead><tr><th>文件系统</th><th>最大文件大小</th><th>最大卷大小</th><th>日志功能</th><th>文件和卷加密</th><th>磁盘配额</th><th>压缩</th><th>跨平台兼容性</th><th>应用场景</th></tr></thead><tbody><tr><td>NTFS</td><td>256TB</td><td>256TB</td><td></td><td></td><td></td><td></td><td>部分兼容</td><td>Windows 桌面和服务器,企业级应用</td></tr><tr><td>FAT32</td><td>4GB</td><td>2TB</td><td></td><td></td><td></td><td></td><td>广泛兼容</td><td>便携式存储设备,多平台数据交换</td></tr><tr><td>exFAT</td><td>无实际限制</td><td>128PB</td><td></td><td></td><td></td><td></td><td>广泛兼容</td><td>闪存存储设备,便携式大容量存储</td></tr><tr><td>ReFS</td><td>35PB</td><td>35PB</td><td></td><td></td><td></td><td></td><td>部分兼容</td><td>大规模数据存储虚拟化环境Windows Server</td></tr></tbody></table>
<h3 id="macos-主流文件系统">MacOS 主流文件系统<a aria-hidden="true" tabindex="-1" href="#macos-主流文件系统" class="internal"> §</a></h3>
<p>1984 年Apple 推出了用于 Macintosh 计算机的初代文件系统——<strong>MFSMacintosh File System</strong>。MFS 是一个简单的文件系统,支持单级目录结构和 128KB 的块大小。虽然对于早期的 Macintosh 计算机来说足够但随着存储需求的增加MFS 的局限性逐渐显现。</p>
<p>1985 年Apple 发布了**HFSHierarchical File System**以替代 MFS。HFS 引入了分层目录结构,支持更大容量的硬盘和文件系统,最大支持 2GB 的卷和 2GB 的文件大小。HFS 采用 512 字节的块大小,并增加了多级目录支持,极大地改善了文件管理。</p>
<p>1998 年,随着 Mac OS 8.1 的发布Apple 推出了<strong>HFS+(也称为 Mac OS Extended</strong>,这是对 HFS 的重大改进。HFS+ 引入了更小的块大小4KB大幅提高了磁盘空间利用率支持的最大卷和文件大小分别扩展到 8EBexabytes。HFS+ 还引入了 Unicode 支持,使文件名能够包含更多的字符。</p>
<p>2002 年Mac OS X 10.2 Jaguar 发布HFS+ 成为默认文件系统。随着系统的不断更新HFS+ 增加了许多新功能,包括文件压缩、稀疏文件支持和更高效的文件存储。</p>
<p>2014 年Apple 在 OS X Yosemite 中引入了 Core Storage这是一个逻辑卷管理器允许用户创建加密卷和使用 Fusion Drive 技术,将 SSD 和 HDD 组合成一个卷以提高性能和存储效率。</p>
<p>2016 年Apple 发布了 macOS Sierra并引入了<strong>APFSApple File System</strong>。APFS 是对 HFS+ 的彻底重构设计目标是提高性能、安全性和可靠性。APFS 支持 64 位文件 ID最大支持的文件和卷大小为 8EB具有更快的目录操作、更高效的空间管理和更强的数据完整性保障。APFS 还支持快照、克隆、加密和原子操作,极大地提升了文件系统的功能性和用户体验。</p>
<p>2017 年macOS High Sierra 发布APFS 成为默认文件系统。APFS 特别针对 SSD 优化,但也兼容 HDD 和外部存储设备。APFS 的推出标志着 macOS 文件系统迈向现代化和高效管理的新阶段。</p>
<p>macOS 文件系统从最初的 MFS 到 HFS再到 HFS+ 和现代的 APFS每一次升级都带来了显著的改进和新功能。随着存储需求和技术的发展Apple 不断提升文件系统的性能、可靠性和功能,确保 macOS 能够满足现代用户的需求。</p>
<h4 id="hfs">HFS+<a aria-hidden="true" tabindex="-1" href="#hfs" class="internal"> §</a></h4>
<p>HFS+Hierarchical File System Plus也称为 Mac OS Extended是 Apple 于 1998 年推出的文件系统,用于替代早期的 HFS 文件系统。HFS+ 是为适应更大的存储需求和提高文件管理效率而设计的。它首次随 Mac OS 8.1 引入,并在之后的多个 Mac OS 版本中成为标准文件系统。HFS+ 通过增加文件大小和卷大小的支持,改进文件命名和目录结构,满足了当时不断增长的存储需求。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>最大文件大小</strong>8EBExabyte</li>
<li><strong>最大卷大小</strong>8EB</li>
<li><strong>硬链接和软链接</strong>:支持硬链接和软链接,提供更灵活的文件管理方式。</li>
<li><strong>文件压缩</strong>:支持文件压缩,减少存储空间的占用。</li>
<li><strong>分层目录结构</strong>:改进的分层目录结构,支持更大的文件和目录。</li>
<li><strong>Unicode 支持</strong>:改进的文件名编码,支持 Unicode 字符集,增强了跨平台兼容性。</li>
<li><strong>数据完整性</strong>:支持日志功能,记录文件系统的元数据更改,提高数据完整性和恢复速度。</li>
</ul>
<h4 id="apfs">APFS<a aria-hidden="true" tabindex="-1" href="#apfs" class="internal"> §</a></h4>
<p><strong>文化和发展历史</strong></p>
<p>APFSApple File System是 Apple 于 2017 年发布的新一代文件系统,设计初衷是替代 HFS+以满足现代存储需求。APFS 针对 SSD 和闪存存储器进行了优化显著提升了性能和数据安全性。APFS 随着 macOS High Sierra 的发布而引入,并逐渐成为 macOS、iOS、watchOS 和 tvOS 的标准文件系统。其设计注重高性能、高安全性和高效的存储管理,适应了当前和未来的数据存储需求。</p>
<p><strong>特点</strong></p>
<ul>
<li><strong>最大文件大小</strong>8EBExabyte</li>
<li><strong>最大卷大小</strong>8EB</li>
<li><strong>快照</strong>:支持快照功能,可以在不同时间点创建文件系统的副本,方便数据恢复和备份。</li>
<li><strong>克隆</strong>:支持克隆功能,在不占用额外存储空间的情况下创建文件或目录的副本。</li>
<li><strong>加密</strong>:内置强大的加密功能,支持单文件和整个卷的加密,增强了数据安全性。</li>
<li><strong>空间共享</strong>支持空间共享Space Sharing多个卷可以共享同一存储池有效利用存储空间。</li>
<li><strong>文件和目录压缩</strong>:支持高效的文件和目录压缩,节省存储空间。</li>
<li><strong>高效存储</strong>:优化的元数据管理和文件系统布局,提供更高的存储效率和性能。</li>
<li><strong>崩溃保护</strong>:具备崩溃保护机制,通过快速重启和数据恢复,确保数据的高可用性。</li>
</ul>
<h4 id="对比表-2">对比表<a aria-hidden="true" tabindex="-1" href="#对比表-2" class="internal"> §</a></h4>
<table><thead><tr><th>文件系统</th><th>发布年份</th><th>最大文件大小</th><th>最大卷大小</th><th>日志功能</th><th>硬链接</th><th>软链接</th><th>文件压缩</th><th>快照</th><th>克隆</th><th>加密</th><th>空间共享</th><th>应用场景</th></tr></thead><tbody><tr><td>HFS+</td><td>1998 年</td><td>8EB</td><td>8EB</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>早期 Mac OS 系统,个人计算和多媒体处理</td></tr><tr><td>APFS</td><td>2017 年</td><td>8EB</td><td>8EB</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>现代 macOS、iOS、watchOS 和 tvOS 设备,提供高性能和数据安全性</td></tr></tbody></table>
<h2 id="文件系统结构与管理">文件系统结构与管理<a aria-hidden="true" tabindex="-1" href="#文件系统结构与管理" class="internal"> §</a></h2>
<h3 id="文件系统结构">文件系统结构<a aria-hidden="true" tabindex="-1" href="#文件系统结构" class="internal"> §</a></h3>
<h4 id="层次">层次<a aria-hidden="true" tabindex="-1" href="#层次" class="internal"> §</a></h4>
<p>文件系统层次结构指的是文件和目录的组织方式。大多数现代文件系统采用层次结构即目录和子目录构成树状结构。根目录Root Directory是树的起点其他所有文件和目录都可以从根目录访问。</p>
<ul>
<li><strong>根目录</strong>:文件系统的顶层目录,通常表示为 <code>/</code>(在 Unix 和 Linux 系统中)或 <code>C:\</code>(在 Windows 系统中)。</li>
<li><strong>目录和子目录</strong>:目录是包含其他文件和目录的容器。子目录是父目录的一部分,形成树状层次结构。</li>
<li><strong>文件</strong>:存储数据的基本单位,可以是文本文档、图像、可执行程序等。</li>
</ul>
<h4 id="结构图">结构图<a aria-hidden="true" tabindex="-1" href="#结构图" class="internal"> §</a></h4>
<p><img src="https://static.7wate.com/2024/07/29/da3a3c6bfe7b9.png" alt="Why-is-Inode-Used-in-Linux.png"/></p>
<pre><code class="mermaid">graph TD
Superblock
Inode1
DataBlock1
DataBlock2
DataBlock3
IndirectBlock1
Superblock -->|Contains| FS_Size[File System Size]
Superblock -->|Contains| Block_Size[Block Size]
Superblock -->|Contains| Free_Block_Count[Free Block Count]
Superblock -->|Contains| Free_Inode_Count[Free Inode Count]
Superblock -->|Contains| FS_State[File System State]
Superblock -->|Contains| FS_ID[File System ID]
Superblock -->|Contains| Root_Inode[Root Inode]
Inode1 -->|Points to| DirectBlock1[Direct Block 1]
Inode1 -->|Points to| DirectBlock2[Direct Block 2]
Inode1 -->|Points to| IndirectBlock1
IndirectBlock1 -->|Points to| DataBlock1
IndirectBlock1 -->|Points to| DataBlock2
IndirectBlock1 -->|Points to| DataBlock3
</code></pre>
<ul>
<li><strong>超级块Superblock</strong>:包含文件系统的元数据,例如文件系统大小、块大小、空闲块数量、空闲 Inode 数量、文件系统状态、文件系统 ID、根 Inode 等。</li>
<li><strong>索引节点Inode</strong>:包含文件的元数据,并指向文件的数据块。
<ul>
<li><strong>直接指针Direct Pointers</strong>:直接指向数据块。</li>
<li><strong>一次间接指针Indirect Pointers</strong>:指向一个包含数据块指针的块,每个指针指向一个数据块。</li>
</ul>
</li>
<li><strong>数据块Data Block</strong>:实际存储文件数据的基本单元。</li>
</ul>
<h4 id="超级块superblock">超级块Superblock<a aria-hidden="true" tabindex="-1" href="#超级块superblock" class="internal"> §</a></h4>
<p>超级块是文件系统的核心元数据结构,存储文件系统的整体信息。每个文件系统都有一个超级块,用于描述文件系统的特性和状态。</p>
<blockquote>
<p>超级块就像是图书馆的管理员记录的总册,它包含了图书馆的总体信息,比如图书馆有多大,每个书架的大小,图书馆的状态(是否开放,有没有损坏等),以及图书馆的标识符和根目录的位置。</p>
</blockquote>
<table><thead><tr><th>项目</th><th>描述</th></tr></thead><tbody><tr><td>文件系统大小</td><td>文件系统的总大小,包括所有的数据块。</td></tr><tr><td>块大小</td><td>文件系统中每个数据块的大小,通常为 1KB、2KB、4KB 或 8KB。</td></tr><tr><td>空闲块数量</td><td>当前可用的数据块数量,表示文件系统中剩余的可用空间。</td></tr><tr><td>空闲 Inode 数量</td><td>当前可用的索引节点数量,表示文件系统中可用的文件/目录数。</td></tr><tr><td>文件系统挂载状态</td><td>文件系统是否已挂载,以及以何种模式挂载(只读或读写)。</td></tr><tr><td>文件系统标识符</td><td>唯一标识文件系统的 ID用于区分不同的文件系统实例。</td></tr><tr><td>文件系统版本</td><td>文件系统的版本号,表示文件系统的格式版本。</td></tr><tr><td>根目录 Inode</td><td>指向根目录的索引节点号,根目录是文件系统的入口。</td></tr><tr><td>块组描述符位置</td><td>存储块组描述符Block Group Descriptor的位置用于描述块组的结构。</td></tr><tr><td>超级块备份位置</td><td>存储超级块备份的位置,通常在文件系统的多个位置保存超级块备份。</td></tr><tr><td>文件系统状态</td><td>文件系统当前的状态,如是否干净卸载、是否需要检查等。</td></tr><tr><td>文件系统创建时间</td><td>文件系统创建的时间戳。</td></tr><tr><td>文件系统修改时间</td><td>最后一次修改文件系统元数据的时间戳。</td></tr><tr><td>上次挂载时间</td><td>文件系统上次被挂载的时间戳。</td></tr><tr><td>上次卸载时间</td><td>文件系统上次被卸载的时间戳。</td></tr><tr><td>最大挂载次数</td><td>在需要进行文件系统检查之前,文件系统可以挂载的最大次数。</td></tr><tr><td>文件系统检查间隔时间</td><td>在需要进行文件系统检查之前,文件系统可以运行的最长时间间隔。</td></tr><tr><td>文件系统标志</td><td>指示文件系统特性的标志,如只读、已被卸载等。</td></tr><tr><td>文件系统日志位置</td><td>存储文件系统日志的起始位置,用于恢复文件系统的一致性。</td></tr><tr><td>默认权限掩码</td><td>创建文件时使用的默认权限掩码。</td></tr><tr><td>文件系统特性</td><td>文件系统支持的特性标志,如是否支持大文件、是否启用日志等。</td></tr></tbody></table>
<p>超级块是文件系统管理的核心,一旦损坏,整个文件系统将无法使用。超级块的损坏可能导致文件系统无法挂载或文件数据丢失。因此,文件系统通常会在多个位置保存超级块的副本,以提高容错性。</p>
<ul>
<li><strong>主超级块</strong>:文件系统中的主要超级块,通常位于文件系统的第一个块。</li>
<li><strong>备份超级块</strong>为了防止单点故障文件系统会在多个位置保存超级块的副本。不同文件系统的备份策略不同例如EXT2/3/4 文件系统在每组块Block Group中保存备份超级块。</li>
</ul>
<h4 id="索引节点inode">索引节点Inode<a aria-hidden="true" tabindex="-1" href="#索引节点inode" class="internal"> §</a></h4>
<p>Inode 是文件系统中的核心数据结构,用于存储文件元数据。每个文件和目录都有一个唯一的 Inode负责记录文件的相关信息。</p>
<blockquote>
<p>Inode 就像每本书的标签,它记录了每本书的详细信息,比如书名、作者、出版日期、类别以及书在书架上的位置。</p>
</blockquote>
<table><thead><tr><th>项目</th><th>描述</th></tr></thead><tbody><tr><td>文件类型</td><td>指示文件的类型,如普通文件、目录、符号链接等。</td></tr><tr><td>文件大小</td><td>文件的总字节数。</td></tr><tr><td>文件权限</td><td>文件的访问权限包括读r、写w和执行x权限。</td></tr><tr><td>所有者信息</td><td>文件的所有者用户 IDUID和所属组 IDGID</td></tr><tr><td>创建时间</td><td>文件创建的时间戳。</td></tr><tr><td>修改时间</td><td>文件内容最后修改的时间戳。</td></tr><tr><td>访问时间</td><td>文件最后访问的时间戳。</td></tr><tr><td>链接计数</td><td>指向此 Inode 的硬链接数量。</td></tr><tr><td>数据块指针</td><td>指向存储文件内容的数据块的指针,包括直接指针、一次间接指针、二次间接指针和三次间接指针。</td></tr><tr><td>文件系统标志</td><td>用于指示文件系统特性和状态的标志。</td></tr><tr><td>文件生成号</td><td>文件的唯一标识符通常用于网络文件系统NFS</td></tr><tr><td>文件大小(高位)</td><td>文件大小的高位部分,用于支持大文件。</td></tr><tr><td>数据块数量</td><td>文件使用的数据块总数。</td></tr><tr><td>文件系统标识符</td><td>标识文件系统类型或版本的标识符。</td></tr><tr><td>数据块指针数量</td><td>数据块指针的总数,包括直接和间接指针。</td></tr><tr><td>直接指针</td><td>直接指向数据块的指针,通常有 12 个直接指针。</td></tr><tr><td>一次间接指针</td><td>指向一个包含数据块指针的块,每个指针指向一个数据块。</td></tr><tr><td>二次间接指针</td><td>指向一个包含一次间接指针块的块,每个一次间接指针指向一个包含数据块指针的块。</td></tr><tr><td>三次间接指针</td><td>指向一个包含二次间接指针块的块,每个二次间接指针指向一个包含一次间接指针块的块。</td></tr></tbody></table>
<p>Inode 负责管理文件的存储位置通过数据块指针指向文件的实际数据块。Inode 不存储文件名,文件名和 Inode 的关联关系存储在目录项中。</p>
<ol>
<li><strong>直接指针</strong>:直接指向数据块的指针,通常一个 Inode 有 12 个直接指针。</li>
<li><strong>一次间接指针</strong>:指向一个包含数据块指针的块,每个指针指向一个数据块。</li>
<li><strong>二次间接指针</strong>:指向一个包含一次间接指针块的块,每个一次间接指针指向一个包含数据块指针的块。</li>
<li><strong>三次间接指针</strong>:指向一个包含二次间接指针块的块,每个二次间接指针指向一个包含一次间接指针块的块。</li>
</ol>
<p>这种指针结构使得 Inode 能够高效地管理小文件和大文件,同时提供良好的性能。</p>
<h4 id="数据块data-block">数据块Data Block<a aria-hidden="true" tabindex="-1" href="#数据块data-block" class="internal"> §</a></h4>
<p>数据块是文件系统中存储文件实际内容的基本单元。文件的所有数据都存储在数据块中,由 Inode 通过指针进行管理。数据块的大小通常为 4KB但可以根据文件系统的配置有所不同。常见的块大小有 1KB、2KB、4KB 和 8KB 等。</p>
<blockquote>
<p>数据块是文件系统中存储文件实际内容的基本单元,就像图书馆的书架上的每一层存放书的地方。</p>
</blockquote>
<p>数据块用于存储文件的实际数据内容。Inode 通过直接和间接指针指向相应的数据块,以组织和管理文件数据。</p>
<ul>
<li><strong>小文件存储</strong>对于小文件数据可以存储在少量数据块中甚至可能只使用一个数据块。Inode 的直接指针能够高效地管理这些数据块。</li>
<li><strong>大文件存储</strong>:对于大文件,可能需要多个直接指针、间接指针和多级间接指针来管理数据块。通过这种层次化指针结构,文件系统能够有效地管理大文件,同时保持性能。</li>
<li><strong>数据块分配</strong>:文件系统在创建和扩展文件时,会动态分配数据块。为了减少碎片化和提高性能,文件系统通常会尽量连续分配数据块。</li>
<li><strong>数据块缓存</strong>:为了提高文件读写性能,操作系统会使用内存缓存(如页缓存)来缓存数据块的内容,减少磁盘 I/O 操作。</li>
</ul>
<h3 id="文件系统管理">文件系统管理<a aria-hidden="true" tabindex="-1" href="#文件系统管理" class="internal"> §</a></h3>
<h4 id="文件系统的创建与挂载">文件系统的创建与挂载<a aria-hidden="true" tabindex="-1" href="#文件系统的创建与挂载" class="internal"> §</a></h4>
<ul>
<li>
<p><strong>创建文件系统</strong></p>
<p>在 Unix/Linux 系统中,可以使用 <code>mkfs</code> 命令创建文件系统。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="sh" data-theme="default"><code data-language="sh" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 创建一个 EXT4 文件系统。</span></span>
<span data-line><span style="color:var(--shiki-token-function);">mkfs.ext4</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/dev/sda1</span></span></code></pre></div>
<p><strong>步骤</strong></p>
<ol>
<li>选择并准备存储设备(如磁盘分区)。</li>
<li>选择适当的文件系统类型。</li>
<li>使用 <code>mkfs</code> 命令创建文件系统。</li>
</ol>
</li>
<li>
<p><strong>挂载文件系统</strong></p>
<p>使用 <code>mount</code> 命令将文件系统挂载到目录。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 将设备 `/dev/sda1` 挂载到 `/mnt` 目录。</span></span>
<span data-line><span style="color:var(--shiki-token-function);">mount</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/dev/sda1</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/mnt</span></span></code></pre></div>
<p><strong>步骤</strong></p>
<ol>
<li>创建挂载点目录(如 <code>/mnt</code>)。</li>
<li>使用 <code>mount</code> 命令挂载文件系统。</li>
<li>查看挂载状态,可以使用 <code>df -h</code><code>mount</code> 命令。</li>
</ol>
</li>
</ul>
<h4 id="文件系统的格式化和修复">文件系统的格式化和修复<a aria-hidden="true" tabindex="-1" href="#文件系统的格式化和修复" class="internal"> §</a></h4>
<ul>
<li>
<p><strong>格式化文件系统</strong></p>
<p>格式化文件系统可以使用 <code>mkfs</code> 命令。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="sh" data-theme="default"><code data-language="sh" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 格式化设备 `/dev/sda1` 为 EXT4 文件系统</span></span>
<span data-line><span style="color:var(--shiki-token-function);">mkfs.ext4</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/dev/sda1</span></span></code></pre></div>
<p><strong>步骤:</strong></p>
<ol>
<li>确保设备未挂载。</li>
<li>使用 <code>mkfs</code> 命令进行格式化。</li>
</ol>
</li>
<li>
<p><strong>修复文件系统</strong></p>
<p>在 Unix/Linux 系统中,可以使用 <code>fsck</code> 命令检查和修复文件系统。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="sh" data-theme="default"><code data-language="sh" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 检查并修复设备 `/dev/sda1` 上的文件系统</span></span>
<span data-line><span style="color:var(--shiki-token-function);">fsck</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/dev/sda1</span></span></code></pre></div>
<p><strong>步骤</strong></p>
<ol>
<li>确保文件系统未挂载(对于根文件系统,可以在单用户模式下进行)。</li>
<li>使用 <code>fsck</code> 命令检查文件系统的完整性。</li>
<li>根据检查结果进行修复。</li>
</ol>
</li>
</ul>
<h4 id="文件权限与用户管理">文件权限与用户管理<a aria-hidden="true" tabindex="-1" href="#文件权限与用户管理" class="internal"> §</a></h4>
<ul>
<li>
<p><strong>文件权限</strong></p>
<p>文件权限分为读r、写w和执行x三种。权限应用于文件所有者User、文件所属组Group和其他用户Others</p>
<table><thead><tr><th>组别</th><th>r</th><th>w</th><th>执行x</th></tr></thead><tbody><tr><td>User</td><td>4</td><td>2</td><td>1</td></tr><tr><td>Group</td><td>4</td><td>2</td><td>1</td></tr><tr><td>Others</td><td>4</td><td>2</td><td>1</td></tr></tbody></table>
<p>使用 <code>chmod</code> 命令修改文件权限。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="sh" data-theme="default"><code data-language="sh" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 将文件 `filename` 的权限设置为 `rwxr-xr-x`</span></span>
<span data-line><span style="color:var(--shiki-token-function);">chmod</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">755</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">filename</span></span></code></pre></div>
</li>
<li>
<p><strong>用户和组管理</strong></p>
<p>用户管理:使用 <code>useradd</code> 命令添加用户,<code>usermod</code> 命令修改用户,<code>userdel</code> 命令删除用户。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 添加新用户 `username`</span></span>
<span data-line><span style="color:var(--shiki-token-function);">useradd</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">username</span></span></code></pre></div>
<p>组管理:使用 <code>groupadd</code> 命令添加组,<code>groupmod</code> 命令修改组,<code>groupdel</code> 命令删除组。例如:</p>
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 添加新组 `groupname`</span></span>
<span data-line><span style="color:var(--shiki-token-function);">groupadd</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">groupname</span></span></code></pre></div>
</li>
</ul>
<h2 id="分布式文件系统">分布式文件系统<a aria-hidden="true" tabindex="-1" href="#分布式文件系统" class="internal"> §</a></h2>
<p>分布式文件系统Distributed File SystemDFS是一种通过网络将文件存储在多个节点上的系统。它允许文件和数据跨越多台计算机进行存储和访问从而实现高可用性、高性能和高扩展性。以下内容将详细介绍几种常见的分布式文件系统包括 Hadoop Distributed File System (HDFS)、Google File System (GFS)、GlusterFS 和 CephFS。</p>
<h3 id="hadoop-distributed-file-system-hdfs">Hadoop Distributed File System (HDFS)<a aria-hidden="true" tabindex="-1" href="#hadoop-distributed-file-system-hdfs" class="internal"> §</a></h3>
<h4 id="概述">概述<a aria-hidden="true" tabindex="-1" href="#概述" class="internal"> §</a></h4>
<p><a href="https://hadoop.apache.org/" class="external">Hadoop Distributed File System</a> (HDFS) 是 Apache Hadoop 项目的一部分专为大数据处理设计。HDFS 能够处理大规模数据集支持高吞吐量的数据访问并具备良好的容错性。HDFS 最早由 Doug Cutting 和 Mike Cafarella 在 2005 年开发,灵感来源于 Google File System (GFS)。它主要用于存储和管理海量的数据,支持并行处理和分布式计算。</p>
<h4 id="历史发展">历史发展<a aria-hidden="true" tabindex="-1" href="#历史发展" class="internal"> §</a></h4>
<p>HDFS 的历史发展与 Hadoop 项目的演进密切相关。2005 年Doug Cutting 和 Mike Cafarella 开始开发 Hadoop最初作为 Nutch 搜索引擎项目的一部分。2006 年Hadoop 被 Yahoo!采用并迅速成长为大数据处理的核心技术之一。2008 年Hadoop 成为 Apache 的顶级项目HDFS 作为其关键组件,随着大数据生态系统的扩展和完善,逐渐发展成现今广泛应用的分布式文件系统。</p>
<h4 id="架构与组件">架构与组件<a aria-hidden="true" tabindex="-1" href="#架构与组件" class="internal"> §</a></h4>
<pre><code class="mermaid">graph TD;
Client[Client] -->|Metadata Request| NN[NameNode];
Client -->|Read/Write Data| DN1[DataNode 1];
Client -->|Read/Write Data| DN2[DataNode 2];
Client -->|Read/Write Data| DN3[DataNode 3];
subgraph Metadata
NN[NameNode] -->|Stores| BMR1[Block Metadata 1];
NN -->|Stores| BMR2[Block Metadata 2];
NN -->|Stores| BMR3[Block Metadata 3];
end
subgraph Storage
DN1[DataNode 1] -->|Contains| B1[Block 1];
DN1 -->|Contains| B2[Block 2];
DN2[DataNode 2] -->|Contains| B3[Block 3];
DN2 -->|Contains| B4[Block 4];
DN3[DataNode 3] -->|Contains| B5[Block 5];
DN3 -->|Contains| B6[Block 6];
end
B1 -.->|Metadata| BMR1;
B2 -.->|Metadata| BMR2;
B3 -.->|Metadata| BMR3;
B4 -.->|Metadata| BMR1;
B5 -.->|Metadata| BMR2;
B6 -.->|Metadata| BMR3;
classDef clientStyle fill:#f9f,stroke:#333,stroke-width:2px;
classDef nnStyle fill:#9f9,stroke:#333,stroke-width:2px;
classDef dnStyle fill:#99f,stroke:#333,stroke-width:2px;
classDef blockStyle fill:#ff9,stroke:#333,stroke-width:2px;
classDef metadataStyle fill:#f99,stroke:#333,stroke-width:2px;
class Client clientStyle;
class NN nnStyle;
class DN1,DN2,DN3 dnStyle;
class B1,B2,B3,B4,B5,B6 blockStyle;
class BMR1,BMR2,BMR3 metadataStyle;
</code></pre>
<p>HDFS 采用主从架构,由 NameNode 和多个 DataNode 组成:</p>
<ul>
<li><strong>NameNode</strong>负责管理文件系统的命名空间和元数据。它记录文件和目录的树形结构并维护每个文件块的位置。NameNode 是 HDFS 的核心,所有的文件操作请求都需要通过 NameNode 来完成。</li>
<li><strong>DataNode</strong>:负责存储实际的数据块,并执行块的读写操作。每个 DataNode 定期向 NameNode 汇报其状态(心跳信号和块报告),以便 NameNode 能追踪数据块的分布和健康状态。</li>
</ul>
<p>此外,还有一些辅助组件:</p>
<ul>
<li><strong>Secondary NameNode</strong>:负责定期获取 NameNode 的元数据快照,辅助 NameNode 进行崩溃恢复,但不替代 NameNode 的功能。</li>
<li><strong>JournalNode</strong>:在高可用 HDFS 配置中,用于保存 NameNode 的元数据日志,确保在主 NameNode 失败时可以无缝切换到备 NameNode。</li>
</ul>
<h4 id="数据存储和复制机制">数据存储和复制机制<a aria-hidden="true" tabindex="-1" href="#数据存储和复制机制" class="internal"> §</a></h4>
<p>HDFS 将文件划分为固定大小的数据块(默认 64MB 或 128MB并将每个数据块复制到多个 DataNode 上(默认 3 个副本),以提高数据的可靠性和容错性。数据块的多副本机制确保即使某个 DataNode 发生故障,数据仍然可以从其他副本中恢复。</p>
<pre><code class="mermaid">sequenceDiagram
participant Client as Client
participant NameNode as NameNode
participant DataNode1 as DataNode 1
participant DataNode2 as DataNode 2
participant DataNode3 as DataNode 3
Client->>NameNode: Request to Write File
NameNode-->>Client: Respond with DataNodes and Block IDs
note right of NameNode: NameNode allocates blocks and selects DataNodes for storage.
Client->>DataNode1: Write Block 1 (part 1)
DataNode1-->>Client: ACK Block 1 (part 1) Received
Client->>DataNode2: Write Block 1 (part 2)
DataNode2-->>Client: ACK Block 1 (part 2) Received
Client->>DataNode3: Write Block 1 (part 3)
DataNode3-->>Client: ACK Block 1 (part 3) Received
Client->>NameNode: Notify Block 1 Written
note right of NameNode: NameNode updates block metadata with DataNode locations.
Client->>DataNode1: Write Block 2 (part 1)
DataNode1-->>Client: ACK Block 2 (part 1) Received
Client->>DataNode2: Write Block 2 (part 2)
DataNode2-->>Client: ACK Block 2 (part 2) Received
Client->>DataNode3: Write Block 2 (part 3)
DataNode3-->>Client: ACK Block 2 (part 3) Received
Client->>NameNode: Notify Block 2 Written
note right of NameNode: NameNode updates block metadata with DataNode locations.
Client->>DataNode1: Write Block 3 (part 1)
DataNode1-->>Client: ACK Block 3 (part 1) Received
Client->>DataNode2: Write Block 3 (part 2)
DataNode2-->>Client: ACK Block 3 (part 2) Received
Client->>DataNode3: Write Block 3 (part 3)
DataNode3-->>Client: ACK Block 3 (part 3) Received
Client->>NameNode: Notify Block 3 Written
note right of NameNode: NameNode updates block metadata with DataNode locations.
Client->>NameNode: Request to Read File
NameNode-->>Client: Respond with DataNodes and Block IDs
note right of NameNode: NameNode provides block locations for requested file.
Client->>DataNode1: Read Block 1
DataNode1-->>Client: Send Block 1 Data
Client->>DataNode2: Read Block 2
DataNode2-->>Client: Send Block 2 Data
Client->>DataNode3: Read Block 3
DataNode3-->>Client: Send Block 3 Data
</code></pre>
<ul>
<li><strong>数据块划分</strong>:大文件被拆分成多个数据块存储在不同的 DataNode 上,以实现并行处理。</li>
<li><strong>副本管理</strong>NameNode 决定每个数据块的副本数量和存放位置,确保副本均匀分布,以提高系统的可靠性和读取效率。</li>
<li><strong>副本放置策略</strong>为了提高数据的可靠性和可用性HDFS 通常将一个副本放在本地机架,第二个副本放在同一机架的不同节点上,第三个副本放在不同机架的节点上。</li>
</ul>
<h4 id="hdfs-的优缺点及应用场景">HDFS 的优缺点及应用场景<a aria-hidden="true" tabindex="-1" href="#hdfs-的优缺点及应用场景" class="internal"> §</a></h4>
<p><strong>优点</strong></p>
<ul>
<li><strong>高容错性</strong>:通过数据块的多副本机制保障数据安全。当一个或多个 DataNode 发生故障时,数据仍然可以从其他副本中恢复。</li>
<li><strong>高吞吐量</strong>适合大规模数据的批处理。HDFS 优化了数据的流式传输,支持大文件的高吞吐量数据访问。</li>
<li><strong>可扩展性</strong>:易于扩展集群规模。通过添加新的 DataNodeHDFS 可以方便地扩展存储容量和处理能力。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>不适合低延迟的数据访问</strong>HDFS 设计初衷是为批处理优化,而不是低延迟的随机读写操作。</li>
<li><strong>小文件存储效率低</strong>HDFS 更适合大文件存储,小文件会带来元数据管理的负担和存储效率问题。</li>
</ul>
<p><strong>应用场景</strong></p>
<ul>
<li><strong>大数据分析与处理</strong>:如 MapReduce 任务。HDFS 被广泛应用于大数据分析平台,支持海量数据的并行处理。</li>
<li><strong>数据仓库和日志处理</strong>HDFS 常用于数据仓库的底层存储,以及日志数据的存储和处理。</li>
</ul>
<h3 id="google-file-system-gfs">Google File System (GFS)<a aria-hidden="true" tabindex="-1" href="#google-file-system-gfs" class="internal"> §</a></h3>
<h4 id="设计目标">设计目标<a aria-hidden="true" tabindex="-1" href="#设计目标" class="internal"> §</a></h4>
<p>Google File System (GFS) 是 Google 设计的一种可扩展的分布式文件系统旨在支持大规模数据处理应用。GFS 的设计目标包括高容错性、高性能和高扩展性。GFS 的诞生背景是为了应对 Google 在互联网搜索和数据分析中面临的大量数据存储和处理需求。GFS 被设计为能够处理海量数据集,并且能够在廉价硬件上运行,同时具备良好的容错性和高性能。</p>
<h4 id="历史发展-1">历史发展<a aria-hidden="true" tabindex="-1" href="#历史发展-1" class="internal"> §</a></h4>
<p>GFS 的开发始于 2000 年,最初由 Sanjay Ghemawat、Howard Gobioff 和 Shun-Tak Leung 领导的团队设计。GFS 在 2003 年正式发布,并在 Google 内部得到广泛应用,支持 Google 搜索、广告和其他大规模数据处理任务。GFS 的设计和实现奠定了现代分布式文件系统的基础,影响了后来的许多文件系统,如 HDFS。</p>
<h4 id="架构与组件-1">架构与组件<a aria-hidden="true" tabindex="-1" href="#架构与组件-1" class="internal"> §</a></h4>
<p><img src="https://static.7wate.com/2024/07/30/4fe1c09f185a5.svg" alt="GoogleFileSystemGFS.svg"/></p>
<p>GFS 采用主从架构,由一个 Master 和多个 ChunkServer 组成:</p>
<ul>
<li><strong>Master</strong>管理文件系统元数据如命名空间、访问控制信息和文件块chunk的位置信息。Master 还负责协调系统中的各种操作,如数据块的分配、复制和负载均衡。</li>
<li><strong>ChunkServer</strong>:存储实际的文件块,并执行读写请求。每个 ChunkServer 都存储多个文件块,并通过心跳机制向 Master 汇报其状态和所持有的数据块信息。</li>
</ul>
<p>GFS 的架构还包括一个客户端库,提供给应用程序使用,使其能够与 GFS 进行交互。客户端直接与 ChunkServer 通信进行数据读写操作,从而减轻 Master 的负担。</p>
<h4 id="数据分片与复制策略">数据分片与复制策略<a aria-hidden="true" tabindex="-1" href="#数据分片与复制策略" class="internal"> §</a></h4>
<p>GFS 将文件划分为固定大小的块64MB每个块有一个唯一的全局 ID并被复制到多个 ChunkServer 上(默认 3 个副本),以提高数据的可靠性。</p>
<ul>
<li><strong>数据块划分</strong>:每个文件被拆分成固定大小的数据块,这些数据块被分布存储在不同的 ChunkServer 上。</li>
<li><strong>副本管理</strong>:每个数据块默认有三个副本,分布在不同的 ChunkServer 上,以确保高可用性和容错性。</li>
<li><strong>副本放置策略</strong>GFS 通过副本放置策略确保数据在不同物理位置和机架之间分布,以提高系统的容错性和数据可用性。</li>
</ul>
<p>Master 负责监控数据块的副本情况,并在副本丢失或损坏时自动创建新的副本。</p>
<h4 id="gfs-的优缺点及应用场景">GFS 的优缺点及应用场景<a aria-hidden="true" tabindex="-1" href="#gfs-的优缺点及应用场景" class="internal"> §</a></h4>
<p><strong>优点</strong></p>
<ul>
<li><strong>高容错性</strong>通过多副本和定期的完整性检查保障数据安全。GFS 能够在硬件故障频繁发生的环境中保持高可用性。</li>
<li><strong>高性能</strong>适合大文件的高吞吐量数据访问。GFS 优化了数据的流式传输,支持大规模数据处理任务。</li>
<li><strong>可扩展性</strong>:通过增加 ChunkServer 节点GFS 可以轻松扩展存储容量和计算能力。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>主节点是单点故障</strong>:尽管 GFS 设计了多种机制来提高 Master 的可靠性,但它仍然是单点故障。如果 Master 失败,系统的可用性会受到影响。</li>
<li><strong>不适合小文件和低延迟数据访问</strong>GFS 更适合大文件存储和批处理任务,对小文件和低延迟访问的支持较差。</li>
</ul>
<p><strong>应用场景</strong></p>
<ul>
<li><strong>大规模数据处理应用</strong>:如 Google 的搜索和数据分析任务。GFS 能够处理 PB 级数据,并支持高效的数据读写和分析。</li>
<li><strong>存储和处理大量日志数据</strong>GFS 非常适合存储和处理来自多个数据源的大量日志文件,支持大规模日志分析和数据挖掘。</li>
</ul>
<h3 id="glusterfs">GlusterFS<a aria-hidden="true" tabindex="-1" href="#glusterfs" class="internal"> §</a></h3>
<h4 id="概述与历史">概述与历史<a aria-hidden="true" tabindex="-1" href="#概述与历史" class="internal"> §</a></h4>
<p>GlusterFS 是一个开源的分布式文件系统,旨在处理海量数据存储。它最初由 Gluster 公司开发,并已被 Red Hat 收购。GlusterFS 以其高扩展性和灵活性而著称,能够在无需改变应用程序代码的情况下,通过聚合多台存储服务器,实现高性能和高可用性的数据存储解决方案。</p>
<p>GlusterFS 的设计理念是通过对等架构peer-to-peer architecture消除单点故障增强系统的容错性和扩展性。自 2005 年首次发布以来GlusterFS 已经经历了多次重大更新和改进,成为企业级存储解决方案的首选之一。</p>
<h4 id="架构与工作原理">架构与工作原理<a aria-hidden="true" tabindex="-1" href="#架构与工作原理" class="internal"> §</a></h4>
<p><img src="https://static.7wate.com/2024/07/30/331481dca84ea.png" alt="glusterfs-frame.png"/></p>
<p>GlusterFS 采用无中心节点的对等架构每个节点同时充当客户端和服务器。它通过将多个存储服务器聚合成一个大的并行文件系统来实现扩展。GlusterFS 的主要组件包括:</p>
<ul>
<li><strong>Gluster 节点Gluster Node</strong>:每个节点既是客户端又是服务器,负责存储和提供文件数据。</li>
<li><strong>Brick</strong>每个节点上的存储单元通常是一个挂载点或目录。多个砖组成一个卷volume</li>
<li><strong>Volume</strong>:由多个砖组成,是 GlusterFS 的基本存储单元。卷通过聚合不同的砖提供存储服务。</li>
</ul>
<p>GlusterFS 的工作原理包括:</p>
<ul>
<li><strong>卷管理</strong>通过卷管理器Volume Manager来创建和配置卷。卷可以是分布式卷、复制卷或条带化卷根据应用需求选择合适的卷类型。</li>
<li><strong>分布式哈希表DHT</strong>用于分布式卷的文件分配。DHT 根据文件名计算哈希值,并将文件分配到合适的砖上。</li>
<li><strong>自我修复</strong>GlusterFS 具有内置的自我修复机制,当检测到数据不一致时,会自动进行数据同步和修复。</li>
</ul>
<h4 id="存储卷的管理与配置">存储卷的管理与配置<a aria-hidden="true" tabindex="-1" href="#存储卷的管理与配置" class="internal"> §</a></h4>
<p>GlusterFS 通过卷Volume管理存储。卷由一个或多个砖Brick组成每个砖对应一个存储服务器上的目录。常见的卷类型包括</p>
<ul>
<li><strong>分布式卷Distributed Volume</strong>:将文件分布在所有砖上,适合需要高吞吐量和大容量的应用场景。</li>
<li><strong>复制卷Replicated Volume</strong>:在多个砖之间复制文件,提高数据的冗余性和可用性,适合高可用性需求的应用。</li>
<li><strong>条带化卷Striped Volume</strong>:将文件分块存储在多个砖上,适合大文件的高性能读写需求。</li>
<li><strong>分布式复制卷Distributed Replicated Volume</strong>:结合分布和复制特性,既保证数据的高可用性,又能扩展存储容量。</li>
</ul>
<p>配置卷的步骤包括:</p>
<ol>
<li><strong>创建卷</strong>:使用 <code>gluster volume create</code> 命令创建所需类型的卷。</li>
<li><strong>启动卷</strong>:使用 <code>gluster volume start</code> 命令启动创建的卷。</li>
<li><strong>挂载卷</strong>:使用客户端将卷挂载到本地文件系统,通常使用 FUSEFilesystem in Userspace挂载。</li>
</ol>
<h4 id="glusterfs-的优缺点及应用场景">GlusterFS 的优缺点及应用场景<a aria-hidden="true" tabindex="-1" href="#glusterfs-的优缺点及应用场景" class="internal"> §</a></h4>
<p><strong>优点</strong></p>
<ul>
<li><strong>高可扩展性</strong>:可以通过添加节点无缝扩展存储容量,适应数据增长需求。</li>
<li><strong>高可用性</strong>:通过数据复制和分布式架构实现数据的高可用性,避免单点故障。</li>
<li><strong>灵活性</strong>:支持多种卷类型,能够根据不同应用需求进行灵活配置。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>性能在高负载下可能下降</strong>:在高负载情况下,性能可能会受到影响,需要优化配置。</li>
<li><strong>配置和管理相对复杂</strong>:需要一定的专业知识和经验进行配置和管理,特别是在大规模部署时。</li>
</ul>
<p><strong>应用场景</strong></p>
<ul>
<li><strong>大规模数据存储和备份</strong>:适合企业级大规模数据存储和备份解决方案,能够提供高可用性和数据安全性。</li>
<li><strong>多媒体内容存储和分发</strong>:适用于多媒体文件的存储和分发,如视频、音频和图像文件,能够支持高吞吐量和大文件存储需求。</li>
<li><strong>虚拟化环境和云计算</strong>:支持虚拟机和容器存储,适用于云计算和虚拟化环境中的数据存储解决方案。</li>
</ul>
<h3 id="cephfs">CephFS<a aria-hidden="true" tabindex="-1" href="#cephfs" class="internal"> §</a></h3>
<h4 id="概述-1">概述<a aria-hidden="true" tabindex="-1" href="#概述-1" class="internal"> §</a></h4>
<p>CephFS 是 Ceph 分布式存储系统的一部分,提供 POSIX 兼容的文件系统接口。CephFS 利用 Ceph 强大的分布式存储架构实现高性能和高可靠性的文件存储服务。Ceph 的设计目标是创建一个统一的、可扩展的存储平台支持对象存储、块存储和文件系统。CephFS 通过元数据服务器MDS和对象存储设备OSD协同工作实现了文件系统的高效管理和数据存储。</p>
<p><img src="https://static.7wate.com/2024/07/30/3df1ca92d21bb.png" alt="RESTful_access.png"/></p>
<h4 id="历史发展-2">历史发展<a aria-hidden="true" tabindex="-1" href="#历史发展-2" class="internal"> §</a></h4>
<p>Ceph 的开发始于 2004 年,由 Sage Weil 在加州大学圣克鲁兹分校作为博士研究项目启动。2010 年Ceph 项目被 Inktank 公司商业化,随后于 2014 年被 Red Hat 收购。Ceph 的设计灵感来源于需要高扩展性和高性能的分布式存储解决方案,其独特的 CRUSH 算法和无中心架构使其在众多分布式存储系统中脱颖而出。</p>
<h4 id="ceph-集群的架构与组件">Ceph 集群的架构与组件<a aria-hidden="true" tabindex="-1" href="#ceph-集群的架构与组件" class="internal"> §</a></h4>
<p>Ceph 集群由以下几部分组成:</p>
<ul>
<li><strong>Monitor (MON)</strong>负责维护集群状态、管理元数据和认证服务。Monitor 节点保持集群的一致性和健康状态,管理集群成员和元数据信息。</li>
<li><strong>Object Storage Device (OSD)</strong>:负责存储数据并处理数据的读写请求。每个 OSD 节点负责管理一部分数据存储,执行数据复制、恢复和再平衡等操作。</li>
<li><strong>Metadata Server (MDS)</strong>管理文件系统的元数据支持快速文件系统操作。MDS 维护文件系统的目录结构和文件元数据,处理客户端的文件操作请求。</li>
</ul>
<h4 id="元数据服务器mds和对象存储设备osd">元数据服务器MDS和对象存储设备OSD<a aria-hidden="true" tabindex="-1" href="#元数据服务器mds和对象存储设备osd" class="internal"> §</a></h4>
<p>CephFS 通过 MDS 管理文件系统元数据OSD 存储实际的数据。MDS 和 OSD 协同工作,实现高效的数据存取和元数据管理。</p>
<ul>
<li><strong>Metadata Server (MDS)</strong>MDS 负责处理文件系统的元数据操作如目录查询、文件创建和删除。MDS 分担了文件系统操作的负载提高了整体系统的性能和响应速度。CephFS 支持多个 MDS 节点,以实现负载均衡和高可用性。</li>
<li><strong>Object Storage Device (OSD)</strong>OSD 节点负责存储数据块,并执行数据读写操作。每个文件被分解为多个数据块,并通过 Ceph 的 CRUSH 算法分布在多个 OSD 节点上。OSD 节点之间通过网络进行数据同步和恢复,确保数据的一致性和可靠性。</li>
</ul>
<h4 id="cephfs-的优缺点及应用场景">CephFS 的优缺点及应用场景<a aria-hidden="true" tabindex="-1" href="#cephfs-的优缺点及应用场景" class="internal"> §</a></h4>
<p><strong>优点</strong></p>
<ul>
<li><strong>高性能</strong>支持高吞吐量和低延迟的数据访问。CephFS 利用高效的元数据管理和数据分布策略,实现快速的数据读写操作。</li>
<li><strong>高可扩展性</strong>:通过添加更多的 OSD 和 MDS 节点实现水平扩展。CephFS 可以根据存储需求的增长灵活扩展,无需中断服务。</li>
<li><strong>高可靠性</strong>通过多副本和纠删码保障数据安全。CephFS 具备强大的数据保护机制,确保数据在硬件故障或网络故障时的安全性。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>部署和配置相对复杂</strong>CephFS 的部署和配置需要较高的技术知识和经验,特别是在大规模集群环境中。</li>
<li><strong>需要较高的硬件资源支持</strong>CephFS 的性能和可靠性依赖于高质量的硬件资源包括高速网络、SSD 存储和充足的内存。</li>
</ul>
<p><strong>应用场景</strong></p>
<ul>
<li><strong>高性能计算HPC和科学研究数据存储</strong>CephFS 适用于需要高吞吐量和大规模数据存储的高性能计算和科学研究领域。</li>
<li><strong>企业级数据存储和备份解决方案</strong>CephFS 提供可靠的企业级存储解决方案,适用于存储和备份大量企业数据,确保数据的高可用性和安全性。</li>
<li><strong>云计算和虚拟化环境</strong>CephFS 支持云计算和虚拟化环境中的数据存储需求,提供灵活的存储扩展能力和高效的数据访问性能。</li>
</ul></article></div><div class="right sidebar"><div class="graph "><h3>Graph View</h3><div class="graph-outer"><div id="graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:1,&quot;scale&quot;:1.1,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div><svg version="1.1" id="global-graph-icon" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xmlSpace="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:-1,&quot;scale&quot;:0.9,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class><h3>Table of Contents</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content"><ul class="overflow"><li class="depth-0"><a href="#文件系统" data-for="文件系统">文件系统</a></li><li class="depth-1"><a href="#linux-文件系统" data-for="linux-文件系统">Linux 文件系统</a></li><li class="depth-1"><a href="#windows-文件系统" data-for="windows-文件系统">Windows 文件系统</a></li><li class="depth-1"><a href="#macos-主流文件系统" data-for="macos-主流文件系统">MacOS 主流文件系统</a></li><li class="depth-0"><a href="#文件系统结构与管理" data-for="文件系统结构与管理">文件系统结构与管理</a></li><li class="depth-1"><a href="#文件系统结构" data-for="文件系统结构">文件系统结构</a></li><li class="depth-1"><a href="#文件系统管理" data-for="文件系统管理">文件系统管理</a></li><li class="depth-0"><a href="#分布式文件系统" data-for="分布式文件系统">分布式文件系统</a></li><li class="depth-1"><a href="#hadoop-distributed-file-system-hdfs" data-for="hadoop-distributed-file-system-hdfs">Hadoop Distributed File System (HDFS)</a></li><li class="depth-1"><a href="#google-file-system-gfs" data-for="google-file-system-gfs">Google File System (GFS)</a></li><li class="depth-1"><a href="#glusterfs" data-for="glusterfs">GlusterFS</a></li><li class="depth-1"><a href="#cephfs" data-for="cephfs">CephFS</a></li></ul></div></div><div class="backlinks "><h3>Backlinks</h3><ul class="overflow"><li>No backlinks found</li></ul></div><div class="explorer mobile-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{&quot;path&quot;:&quot;Journal&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal/2024&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal/2024/W33&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Obsidian&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Obsidian/Templates&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog/2018&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog/2020&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog/2021&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog/2022&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog/2023&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Blog/2024&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/个人成长&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/医学健康&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/历史&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/哲学宗教&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/心理&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/政治军事&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Personal/Book/教育学习&quot;,&quot;collapsed&q
function toggleCallout() {
const outerBlock = this.parentElement;
outerBlock.classList.toggle(`is-collapsed`);
const collapsed = outerBlock.classList.contains(`is-collapsed`);
const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight;
outerBlock.style.maxHeight = height + `px`;
let current = outerBlock;
let parent = outerBlock.parentElement;
while (parent) {
if (!parent.classList.contains(`callout`)) {
return;
}
const collapsed2 = parent.classList.contains(`is-collapsed`);
const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight;
parent.style.maxHeight = height2 + `px`;
current = parent;
parent = parent.parentElement;
}
}
function setupCallout() {
const collapsible = document.getElementsByClassName(
`callout is-collapsible`
);
for (const div of collapsible) {
const title = div.firstElementChild;
if (title) {
title.removeEventListener(`click`, toggleCallout);
title.addEventListener(`click`, toggleCallout);
const collapsed = div.classList.contains(`is-collapsed`);
const height = collapsed ? title.scrollHeight : div.scrollHeight;
div.style.maxHeight = height + `px`;
}
}
}
document.addEventListener(`nav`, setupCallout);
window.addEventListener(`resize`, setupCallout);
</script><script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
mermaid.initialize({
startOnLoad: false,
securityLevel: 'loose',
theme: darkMode ? 'dark' : 'default'
});
document.addEventListener('nav', async () => {
await mermaid.run({
querySelector: '.mermaid'
})
});
</script><script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../../postscript.js" type="module"></script></html>