蚊章汇 - 文件系统
type: channel
link: https://linuxcn.bwsl.wang/tag/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/
items: 如何将你的文件系统转换为 Btrfs
items: Btrfs 文件系统入门
items: #新闻拍一拍# 微软水下数据中心在两年之后浮出水面
items: 在 Linux 文件系统中导航的技巧
items: 使用 mergefs 增加虚拟存储
items: Linux 文件系统类型导览
items: 详解 Linux 中的虚拟文件系统
items: 如何在 Linux 分区或逻辑卷中创建文件系统
items: 如何在 Linux 上对驱动器进行分区和格式化
items: 如何在 Linux 中查看已挂载的文件系统类型

如何将你的文件系统转换为 Btrfs
type: item
date: 2022-05-11T23:46:14+08:00
description: 引言这篇概述文章将告诉你为何以及如何迁移你的当前分区到 Btrfs 文件系统。如果你对此感兴趣，请阅读这篇分步指南来完成。从 Fedora 33 开始，新安装的 Fedora 操作系统默认文件系统为 Btrfs。我确信大部分用户现在已经听说了它的优势：写时复制、内置校验、灵活的压缩方式、简易的快照和回滚方式。它确实是一个现代化的文件系统，为桌面存储带来新的功能。在升级到 Fedora 33 后，我想利用 Btrfs 的优势，但对我个人来说，我不想因为“只是为了改变文件系统”而去重装整个系统。我发现（只有）寥寥无几的具体如何做转换的教程，所以我决定在这里分享我的详细经验。小心！这样做你是在玩火。希望你阅读以下内容时不要感到惊讶：在编辑分区和转换文件系统时，你的数据可能会被破坏和丢失。最终，你可能会得到一个不能启动的操作系统，并面临数据恢复的风险。你可能会无意删除你的分区，或者以其它方式破坏了你的操作系统。这些转换过程即使对于生产系统来说也是安全的 —— 前提是你提前做好了计划，对关键数据做好了备份和回滚计划。作为一个 可以执行超级权限的系统管理员，你可以在没有限制、没有任何常规安全防护措施的情况下，做任何事情。安全的方式：重装 Fedora重装操作系统是转换文件系统到 Btrfs 的 “官方” 方式，推荐给大多数用户使用。因此，如果在这个教程中有那么一点不确定，就选择这种方式。步骤大致如下：备份你的主文件夹和你系统中可能会用到的任何数据，比如 /etc。（编者按：虚拟机也是这样）将已安装的安装包以列表形式保存到到文件中。重新安装 Fedora，删除你当前的分区，并选择新的 Btrfs 默认分区方案。恢复主文件夹的内容，并使用软件包列表文件重装软件包。对于详细的步骤和命令，请看一位社区用户在 ask.fedoraproject.org 站点的评论。如果正确完成，你将得到一个和之前一样的操作系统，使丢失数据的风险最小化。转换的利弊让我们快速澄清一下：这种文件系统转换有什么优势和劣势？优势：当然，不需要重新安装！你的系统里的所有文件和之前一模一样。技术上来说，没有备份的情况下，就地进行是可能的。你会学到许多关于 Btrfs 的知识！如果所有都按计划进行，会是相当快的一个过程。劣势：你必须熟悉终端环境和 shell 命令。你可能会丢失数据，参见上文。如果出了什么问题，你得自己解决。特别之处：你需要大约 20% 的可用磁盘空间才能成功转换。但对于完整的备份和重装方式，你可能需要的空间更多。你可以在转换过程中自定义你分区的所有参数，但如果选择重装，你也可以从 Anaconda 自定义。LVM 怎么办？在近期几次 Fedora 安装中，LVM 布局一直是默认的。如果你有一个带有多个分区（例如 / 和 /home）的 LVM 分区布局，你得以某种方式合并它们，来获得 Btrfs 所有性能。如果选择这样做，你可以单独转换分区到 Btrfs 文件系统，同时保留卷组。然而，迁移到 Btrfs 文件系统的优势之一是摆脱 LVM 分区布局强加的限制。你也可以利用 Btrfs 文件系统提供的收发功能在转换后来合并分区。另见 《Fedora 杂志》： 利用 LVM 回收硬盘空间、从 Btrfs 快照中恢复文件 以及 在 Btrfs 和 LVM-ext4 两者之间做选择。了解 Btrfs建议阅读以下内容对 Btrfs 文件系统是什么有一个基础的了解。如果你没有把握，只有选择重装 Fedora 这种安全的方式。必须了解的：Fedora Magazine：Btrfs 来到 Fedora 33Btrfs 系统管理指南, 尤其是 关于子卷和 flat 子卷布局。btrfs-convert 指南有用的资源：man 8 btrfs – 命令行界面man 5 btrfs – 挂载参数man btrfs-convert – 要用到的转换工具man btrfs-subvolume – 管理子卷转换步骤创建一个实时镜像由于不能转换已挂载的文件系统，我们将通过 Fedora 实时镜像 Live Image 进行。安装 Fedora 镜像写入工具，然后 “烧录” Fedora 33 到你的 U 盘中来创建实时镜像。释放磁盘空间btrfs-convert 会在分区的剩余空间重新创建文件系统的元数据，同时保持所有已有的 ext4 文件系统数据还在它当前的位置上。不幸的是，所需的剩余空间的大小无法提前知道：如果没有足够的空间，转换将会失败（但不会破坏数据）。这里有一些释放空间有用的方法：利用 baobab 来识别大容量的文件和文件夹，然后移除。如果可能的话，不要手动删除主文件夹以外的文件。清理旧的系统日志：journalctl –vacuum-size=100M。如果你正使用 Docker…

Btrfs 文件系统入门
type: item
date: 2021-05-30T15:02:32+08:00
description: B-tree 文件系统（Btrfs）融合了文件系统和卷管理器。它为 Linux 操作系统提供了高级文件系统应当拥有的诸多不错的功能特性。好几年前 Btrfs 就已经可以在 Linux 中使用了，所以你可能已经熟悉它了。如果没有，你可能对它尚有疑虑，尤其是如果你使用的是 Fedora 工作站 （Btrfs 现在是它的默认文件系统）。本文旨在帮助你熟悉它及其高级功能，例如 写时复制 和 校验和。Btrfs 是 “B-Tree Filesystem” 的缩写，实际上是文件系统和卷管理器的结合体。它通常被视为对 ZFS 的回应，ZFS 早在 2005 年就被引入 Sun 微系统的 Solaris 操作系统中，现在基本上被一个名为 OpenZFS 的开源实现所取代。Ubuntu 和 FreeBSD 常常使用 OpenZFS。其他具有类似特性的示例有红帽的 Stratis 和 Linux 逻辑卷管理器 Logical Volume Manager （LVM）。安装为了尝试 Btrfs，我下载了 Fedora 33 工作站 ISO 文件 并将其安装到一个新的虚拟机（VM）中。安装过程与以前的版本没有变化。我没有自定义任何设置，包括驱动器分区和格式化，以保持本教程的准确“开箱即用”设置。当虚拟机启动并运行后，我安装并运行了 GNOME 分区编辑器（GParted），以获得一个良好的、工厂级的驱动器布局视图。从安装这一点来说，与你以前所习惯的情况没什么不同；事实上，你可以正常使用该系统，甚至可能没有注意到文件系统是 Btrfs。然而，拥有这个新的默认文件系统使你能够利用几个很酷的特性。检查 Btrfs 文件系统我暂时没有找到特定于 Btrfs 的图形工具，尽管它的一些功能已经被合并到现有的磁盘管理工具中。在命令行中，你可以更仔细地查看 Btrfs 格式：# btrfs filesystem show Label: 'fedora_localhost-live' uuid: f2bb02f9-5c41-4c91-8eae-827a801ee58a Total devices 1 FS bytes used 6.36GiB devid 1 size 10.41GiB used 8.02GiB path /dev/vda3 修改 Btrfs 标签我首先注意到的是安装程序设置的文件系统标签：fedora_localhost-live。这是不准确的，因为它现在是一个已安装的系统，不再是 livecd。所以我使用 btrfs filesystem label 命令对其进行了更改。修改 Btrfs 标签非常的简单：# btrfs filesystem label / fedora_localhost-live # btrfs filesystem label / fedora33workstation # btrfs filesystem label / fedora33workstation 管理 Btrfs 子卷子卷看起来像是可以由 Btrfs 管理的标准目录。我的新 Fedora 33 工作站上有几个子卷：# btrfs subvolume list / ID 256 gen 2458 top level 5 path home ID 258 gen 2461 top level 5 path root ID 265 gen 1593 top level 258 path var/lib/machines 使用 btrfs subvolume Create 命令创建新的子卷，或使用 btrfs subvolume delete 删除子卷：# btrfs subvolume create /opt/foo Create subvolume '/opt/foo' # btrfs subvolume list / ID 256 gen 2884 top level 5 path home ID 258 gen 2888 top level 5 path root ID 265 gen 1593 top level 258 path var/lib/machines ID 276 gen 2888 top level 258 path opt/foo # btrfs subvolume delete /opt/foo Delete subvolume (no-commit): '/opt/foo' 子卷允许设置配额、拍摄快照以及复制到其他位置和其他主机等操作。那么系统管理员如何利用这些功能？用户主目录又是如何操作的呢？添加用户就像从前一样，添加一个新的用户帐户会创建一个主目录供该帐户使用：# useradd student1 # getent passwd s…

#新闻拍一拍# 微软水下数据中心在两年之后浮出水面
type: item
date: 2020-09-16T18:13:28+08:00
description: 微软水下数据中心在两年之后浮出水面两年前，微软将一个数据中心沉入奥克尼群岛海岸附近的海床上。两年之后，它将该数据中心从海床上捞了回来，研究人员对其进行了评估。855 个服务器中只有 8 个发生了故障，故障率为陆地的八分之一。来源：solidot拍一拍：数据中心放在海底具有节能、安全和低损耗等好处，值得探索。Red Hat 牵头推进 NVFS 文件系统NVFS 的目标是成为像英特尔 Optane DCPMM 那样的高速文件系统。NVFS面向基于DAX的设备（直接访问），并将整个设备映射成一个线性地址空间，从而绕过 Linux 内核的块层和缓冲区缓存。在持久性内存上，NVFS 文件系统的性能非常好，一般来说比 EXT2/EXT4/XFS（有/没有 DAX）以及之前的 NOVA 文件系统要好得多。来源：cnbeta拍一拍：针对持久性内存存储设备，这种高性能文件系统可以让 Linux 提供高端服务。IBM 宣布向 OpenPOWER 社区贡献两项核心技术在今天召开的 OpenPOWER 峰会上，IBM 宣布将向 OpenPOWER 社区贡献 A2O POWER 处理器核心和开放认知环境（Open-CE）。目前，A2O 处理器核心已经作为 POWER ISA 核心开源，从而在 SoC 设计中嵌入使用。A2O 比前代产品具有更好的单线程性能，并支持 2 路 SMT、PowerISA 2.07 和模块化设计。来源：cnbeta拍一拍：期待 OpenPOWER 能在生态上取得更多成功。

在 Linux 文件系统中导航的技巧
type: item
date: 2020-05-22T19:41:35+08:00
description: cd 命令可能是任何 Linux 用户学习的前 10 个命令之一，但这并不是在 Linux 文件系统中导航的唯一方法，这里还有其他一些方法。无论你是在文件系统中四处查看、寻找文件还是尝试进入重要目录，Linux 都可以提供很多帮助。在本文中，我们将介绍一些技巧，使你可以在文件系统中移动，查找和使用所需的命令也更加轻松。添加到 $PATH确保你不必花费大量时间在 Linux 系统上查找命令的最简单、最有用的方法之一就是在 $PATH 变量中添加适当的目录。但是，添加到 $PATH 变量中的目录顺序非常重要。它们确定系统在目录中查找要运行命令的目录顺序–在找到第一个匹配项时停止。例如，你可能希望将家目录放在第一个，这样，如果你创建的脚本与其他可执行文件有相同的名称，那么只要输入该脚本的名称，它便会运行。要将家目录添加到 $PATH 变量中，可以执行以下操作：$ export PATH=~:$PATH~ 字符代表家目录。如果将脚本保存在 bin 目录中，下面的会有效：$ export PATH=~/bin:$PATH然后，你可以运行位于家目录中的脚本，如下所示：$ myscript Good morning, you just ran /home/myacct/bin/myscript重要提示：上面显示的命令会添加到你的搜索路径中，因为 $PATH（当前路径）被包含在内。它们不会覆盖它。你的搜索路径应该在你的 .bashrc 文件中配置，任何你打算永久化的更改也应该添加到那里。使用符号链接符号链接提供了一种简单而明显的方式来记录可能经常需要使用的目录的位置。例如，如果你管理网站的内容，那么可能需要通过创建如下链接来使你的帐户“记住”网页文件的位置：ln -s /var/www/html www参数的顺序很重要。第一个（/var/www/html）是目标，第二个是你创建的链接的名称。如果你当前不在家目录中，那么以下命令将执行相同的操作：ln -s /var/www/html ~/www设置好之后，你可以使用 cd www 进入 /var/www/html。使用 shoptshopt 命令还提供了一种让移动到其他目录更加容易的方法。当你使用 shopt 的 autocd 选项时，只需输入名称即可转到目录。例如：$ shopt -s autocd $ www cd -- www /home/myacct/www $ pwd -P /var/www/html $ ~/bin cd -- /home/myacct/bin $ pwd /home/myacct/bin在上面的第一组命令中，启用了 shopt 命令的 autocd 选项。输入 www，就会调用 cd www 命令。由于此符号链接是在上面的 ln 命令示例之一中创建的，因此将我们移至 /var/www/html。 pwd -P 命令显示实际位置。在第二组中，键入 ~/bin 会调用 cd 进入在用户家目录的 bin 目录。请注意，当你输入的是命令时，autocd 行为将不会生效，即使它也是目录的名称。shopt 是 bash 内置命令，它有很多选项。这只是意味着你不必在要进入每个目录的名称之前输入 cd。要查看 shopt 的其他选项，只需输入 shopt。使用 $CDPATH可能进入特定目录的最有用技巧之一，就是将你希望能够轻松进入的路径添加到 $CDPATH 中。这将创建一个目录列表，只需输入完整路径名的一部分即可进入。一方面，这可能有点棘手。你的 $CDPATH 需要包含要移动到的目录的父目录，而不是目录本身。例如，假设你希望仅通过输入 cd html 就可以移至 /var/www/html 目录，并仅使用 cd 和简单目录名即可移至 /var/log 中的子目录。在这种情况下，此 $CDPATH 就可以起作用：$ CDPATH=.:/var/log:/var/www你将看到：$ cd journal /var/log/journal $ cd html /var/www/html当你输入的不是完整路径时，$CDPATH 就会生效。它向下查看其目录列表，以查看指定的目录是否存在于其中一个目录中。找到匹配项后，它将带你到那里。在 $CDPATH 开头保持 . 意味着你可以进入本地目录，而不必在 $CDPATH 中定义它们。$ export CDPATH=".:$CDPATH" $ Videos cd -- Videos /home/myacct/Videos在 Linux 文件系统键切换并不难，但是如果你使用一些方便的技巧轻松地到达各个位置，那你可以节省一些大脑细胞。via: https://www.networkworld.com/article/3533421/tricks…

使用 mergefs 增加虚拟存储
type: item
date: 2020-05-11T06:07:46+08:00
description: 如果你想在一个媒体项目中用到了多个磁盘或分区，不想丢失任何现有数据，但又想将所有文件都存放在一个驱动器下，该怎么办？这时，mergefs 就能派上用场！mergerfs 是一个联合文件系统，旨在简化存储和管理众多商业存储设备上的文件。你需要从他们的 GitHub 页面获取最新的 RPM。Fedora 的版本名称中带有 “fc” 和版本号。例如，这是 Fedora 31 的版本： mergerfs-2.29.0-1.fc31.x86\_64.rpm。安装和配置 mergefs使用 sudo 安装已下载的 mergefs 软件包：$ sudo dnf install mergerfs-2.29.0-1.fc31.x86_64.rpm现在，你可以将多个磁盘挂载为一个驱动器。如果你有一台媒体服务器，并且希望所有媒体文件都显示在一个地方，这将很方便。如果将新文件上传到系统，那么可以将它们复制到 mergefs 目录，mergefs 会自动将它们复制具有足够可用空间的磁盘上。这是使你更容易理解的例子：$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 $ ls -l /disk1/Videos/ total 1 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv $ ls -l /disk2/Videos/ total 2 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv在此例中挂载了两块磁盘，分别为 disk1 和 disk2。两个驱动器都有一个包含文件的 Videos 目录。现在，我们将使用 mergefs 挂载这些驱动器，使它们看起来像一个更大的驱动器。$ sudo mergerfs -o defaults,allow_other,use_ino,category.create=mfs,moveonenospc=true,minfreespace=1M /disk1:/disk2 /mediamergefs 手册页非常庞杂，因此我们将说明上面提到的选项。defaults：除非指定，否则将使用默认设置。allow_other：允许 sudo 或 root 以外的用户查看文件系统。use_ino：让 mergefs 提供文件/目录 inode 而不是 libfuse。虽然不是默认值，但建议你启用它，以便链接的文件共享相同的 inode 值。category.create=mfs：根据可用空间在驱动器间传播文件。moveonenospc=true：如果启用，那么如果写入失败，将进行扫描以查找具有最大可用空间的驱动器。minfreespace=1M：最小使用空间值。disk1：第一块硬盘。disk2：第二块硬盘。/media：挂载驱动器的目录。看起来是这样的：$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 $ df -hT | grep media 1:2 fuse.mergerfs 66M 1.4M 60M 3% /media你可以看到现在 mergefs 挂载显示的总容量为 66M，这是两块硬盘的总容量。继续示例：有一个叫 Baby's second Xmas.mkv 的 30M 视频。让我们将其复制到用 mergerfs 挂载的 /media 文件夹中。$ ls -lh "Baby's second Xmas.mkv" -rw-rw-r--. 1 curt curt 30M Apr 20 08:45 Baby's second Xmas.mkv $ cp "Baby's second Xmas.mkv" /media/Videos/这是最终结果：$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 31M 9.8M 76% /disk2 $ df -hT | grep media 1:2 fuse.mergerfs 66M 31M 30M 51% /media从磁盘空间利用率中可以看到，因为 disk1 没有足够的可用空间，所以 mergefs 自动将文件复制到 disk2。这是所有文件详情：$ ls -l /…

Linux 文件系统类型导览
type: item
date: 2019-08-28T01:55:00+08:00
description: Linux 文件系统多年来在不断发展，让我们来看一下文件系统类型。虽然对于普通用户来说可能并不明显，但在过去十年左右的时间里，Linux 文件系统已经发生了显著的变化，这使它们能够更好对抗损坏和性能问题。如今大多数 Linux 系统使用名为 ext4 的文件系统。 “ext” 代表“ 扩展 extended ”，“4” 表示这是此文件系统的第 4 代。随着时间的推移添加的功能包括：能够提供越来越大的文件系统（目前大到 1,000,000 TiB）和更大的文件（高达 16 TiB），更抗系统崩溃，更少碎片（将单个文件分散为存在多个位置的块）以提高性能。ext4 文件系统还带来了对性能、可伸缩性和容量的其他改进。实现了元数据和日志校验和以增强可靠性。时间戳现在可以跟踪纳秒级变化，以便更好地对文件打戳（例如，文件创建和最后更新时间）。并且，在时间戳字段中增加了两个位，2038 年的问题（存储日期/时间的字段将从最大值翻转到零）已被推迟到了 400 多年之后（到 2446）。文件系统类型要确定 Linux 系统上文件系统的类型，请使用 df 命令。下面显示的命令中的 -T 选项显示文件系统类型。 -h 显示“易读的”磁盘大小。换句话说，调整报告的单位（如 M 和 G），使人们更好地理解。$ df -hT | head -10 Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 2.9G 0 2.9G 0% /dev tmpfs tmpfs 596M 1.5M 595M 1% /run /dev/sda1 ext4 110G 50G 55G 48% / /dev/sdb2 ext4 457G 642M 434G 1% /apps tmpfs tmpfs 3.0G 0 3.0G 0% /dev/shm tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs tmpfs 3.0G 0 3.0G 0% /sys/fs/cgroup /dev/loop0 squashfs 89M 89M 0 100% /snap/core/7270 /dev/loop2 squashfs 142M 142M 0 100% /snap/hexchat/42请注意，/（根）和 /apps 的文件系统都是 ext4，而 /dev 是 devtmpfs 文件系统（一个由内核填充的自动化设备节点）。其他的文件系统显示为 tmpfs（驻留在内存和/或交换分区中的临时文件系统）和 squashfs（只读压缩文件系统的文件系统，用于快照包）。还有 proc 文件系统，用于存储正在运行的进程的信息。$ df -T /proc Filesystem Type 1K-blocks Used Available Use% Mounted on proc proc 0 0 0 - /proc当你在整个文件系统中游览时，可能会遇到许多其他文件系统类型。例如，当你移动到目录中并想了解它的文件系统时，可以运行以下命令：$ cd /dev/mqueue; df -T . Filesystem Type 1K-blocks Used Available Use% Mounted on mqueue mqueue 0 0 0 - /dev/mqueue $ cd /sys; df -T . Filesystem Type 1K-blocks Used Available Use% Mounted on sysfs sysfs 0 0 0 - /sys $ cd /sys/kernel/security; df -T . Filesystem Type 1K-blocks Used Available Use% Mounted on securityfs securityfs 0 0 0 - /sys/kernel/security与其他 Linux 命令一样，这里的 . 代表整个文件系统的当前位置。这些和其他独特的文件系统提供了一些特殊功能。例如，securityfs 提供支持安全模块的文件系统。Linux 文件系统需要能够抵抗损坏，能够承受系统崩溃并提供快速、可靠的性能。由几代 ext 文件系统和新一代专用文件系统提供的改进使 Linux 系统更易于管理和更可靠。via: https://www.networkworld.com/article/3432990/a-guided-tour-of-linux-file-system-types.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linu…

详解 Linux 中的虚拟文件系统
type: item
date: 2019-05-22T08:01:12+08:00
description: 虚拟文件系统是一种神奇的抽象，它使得 “一切皆文件” 哲学在 Linux 中成为了可能。什么是文件系统？根据早期的 Linux 贡献者和作家 Robert Love 所说，“文件系统是一个遵循特定结构的数据的分层存储。” 不过，这种描述也同样适用于 VFAT（ 虚拟文件分配表 Virtual File Allocation Table ）、Git 和Cassandra（一种 NoSQL 数据库）。那么如何区别文件系统呢？文件系统基础概念Linux 内核要求文件系统必须是实体，它还必须在持久对象上实现 open()、read() 和 write() 方法，并且这些实体需要有与之关联的名字。从 面向对象编程 的角度来看，内核将通用文件系统视为一个抽象接口，这三大函数是“虚拟”的，没有默认定义。因此，内核的默认文件系统实现被称为虚拟文件系统（VFS）。如果我们能够 open()、read() 和 write()，它就是一个文件，如这个主控台会话所示。VFS 是著名的类 Unix 系统中 “一切皆文件” 概念的基础。让我们看一下它有多奇怪，上面的小小演示体现了字符设备 /dev/console 实际的工作。该图显示了一个在虚拟电传打字控制台（tty）上的交互式 Bash 会话。将一个字符串发送到虚拟控制台设备会使其显示在虚拟屏幕上。而 VFS 甚至还有其它更奇怪的属性。例如，它可以在其中寻址。我们熟悉的文件系统如 ext4、NFS 和 /proc 都在名为 file\_operations 的 C 语言数据结构中提供了三大函数的定义。此外，个别的文件系统会以熟悉的面向对象的方式扩展和覆盖了 VFS 功能。正如 Robert Love 指出的那样，VFS 的抽象使 Linux 用户可以轻松地将文件复制到（或复制自）外部操作系统或抽象实体（如管道），而无需担心其内部数据格式。在用户空间这一侧，通过系统调用，进程可以使用文件系统方法之一 read() 从文件复制到内核的数据结构中，然后使用另一种文件系统的方法 write() 输出数据。属于 VFS 基本类型的函数定义本身可以在内核源代码的 fs/*.c 文件 中找到，而 fs/ 的子目录中包含了特定的文件系统。内核还包含了类似文件系统的实体，例如 cgroup、/dev 和 tmpfs，在引导过程的早期需要它们，因此定义在内核的 init/ 子目录中。请注意，cgroup、/dev 和 tmpfs 不会调用 file_operations 的三大函数，而是直接读取和写入内存。下图大致说明了用户空间如何访问通常挂载在 Linux 系统上的各种类型文件系统。像管道、dmesg 和 POSIX 时钟这样的结构在此图中未显示，它们也实现了 struct file_operations，而且其访问也要通过 VFS 层。VFS 是个“垫片层”，位于系统调用和特定 file_operations 的实现（如 ext4 和 procfs）之间。然后，file_operations 函数可以与特定于设备的驱动程序或内存访问器进行通信。tmpfs、devtmpfs 和 cgroup 不使用 file_operations 而是直接访问内存。VFS 的存在促进了代码重用，因为与文件系统相关的基本方法不需要由每种文件系统类型重新实现。代码重用是一种被广泛接受的软件工程最佳实践！唉，但是如果重用的代码引入了严重的错误，那么继承常用方法的所有实现都会受到影响。/tmp：一个小提示找出系统中存在的 VFS 的简单方法是键入 mount | grep -v sd | grep -v :/，在大多数计算机上，它将列出所有未驻留在磁盘上，同时也不是 NFS 的已挂载文件系统。其中一个列出的 VFS 挂载肯定是 /tmp，对吧？谁都知道把 /tmp 放在物理存储设备上简直是疯了！图片：https://tinyurl.com/ybomxyfo为什么把 /tmp 留在存储设备上是不可取的？因为 /tmp 中的文件是临时的（！），并且存储设备比内存慢，所以创建了 tmpfs 这种文件系统。此外，比起内存，物理设备频繁写入更容易磨损。最后，/tmp 中的文件可能包含敏感信息，因此在每次重新启动时让它们消失是一项功能。不幸的是，默认情况下，某些 Linux 发行版的安装脚本仍会在存储设备上创建 /tmp。如果你的系统出现这种情况，请不要绝望。按照一直优秀的 Arch Wiki 上的简单说明来解决问题就行，记住分配给 tmpfs 的内存就不能用于其他目的了。换句话说，包含了大文件的庞大的 tmpfs 可能会让系统耗尽内存并崩溃。另一个提示：编辑 /etc/fstab 文件时，请务必以换行符结束，否则系统将无法启动。（猜猜我怎么知道。）/p…

如何在 Linux 分区或逻辑卷中创建文件系统
type: item
date: 2019-04-10T17:14:00+08:00
description: 学习在你的系统中创建一个文件系统，并且长期或者非长期地挂载它。在计算技术中，文件系统控制如何存储和检索数据，并且帮助组织存储媒介中的文件。如果没有文件系统，信息将被存储为一个大数据块，而且你无法知道一条信息在哪结束，下一条信息在哪开始。文件系统通过为存储数据的文件提供名称，并且在文件系统中的磁盘上维护文件和目录表以及它们的开始和结束位置、总的大小等来帮助管理所有的这些信息。在 Linux 中，当你创建一个硬盘分区或者逻辑卷之后，接下来通常是通过格式化这个分区或逻辑卷来创建文件系统。这个操作方法假设你已经知道如何创建分区或逻辑卷，并且你希望将它格式化为包含有文件系统，并且挂载它。创建文件系统假设你为你的系统添加了一块新的硬盘并且在它上面创建了一个叫 /dev/sda1 的分区。1、为了验证 Linux 内核已经发现这个分区，你可以 cat 出 /proc/partitions 的内容，就像这样：[root@localhost ~]# cat /proc/partitions major minor #blocks name 253 0 10485760 vda 253 1 8192000 vda1 11 0 1048575 sr0 11 1 374 sr1 8 0 10485760 sda 8 1 10484736 sda1 252 0 3145728 dm-0 252 1 2097152 dm-1 252 2 1048576 dm-2 8 16 1048576 sdb2、决定你想要去创建的文件系统种类，比如 ext4、XFS，或者其他的一些。这里是一些可选项：[root@localhost ~]# mkfs.<tab><tab> mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs3、为了这次练习的目的，选择 ext4。（我喜欢 ext4，因为如果你需要的话，它可以允许你去压缩文件系统，这对于 XFS 并不简单。）这里是完成它的方法（输出可能会因设备名称或者大小而不同）：[root@localhost ~]# mkfs.ext4 /dev/sda1 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=8191 blocks 194688 inodes, 778241 blocks 38912 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=799014912 24 block groups 32768 blocks per group, 32768 fragments per group 8112 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done4、在上一步中，如果你想去创建不同的文件系统，请使用不同变种的 mkfs 命令。挂载文件系统当你创建好文件系统后，你可以在你的操作系统中挂载它。1、首先，识别出新文件系统的 UUID 编码。使用 blkid 命令列出所有可识别的块存储设备并且在输出信息中查找 sda1：[root@localhost ~]# blkid /dev/vda1: UUID="716e713d-4e91-4186-81fd-c6cfa1b0974d" TYPE="xfs" /dev/sr1: UUID="2019-03-08-16-17-02-00" LABEL="config-2" TYPE="iso9660" /dev/sda1: UUID="wow9N8-dX2d-ETN4-zK09-Gr1k-qCVF-eCerbF" TYPE="LVM2_member" /dev/mapper/test-test1: PTTYPE="dos" /dev/sda1: UUID="ac96b366-0cdd-4e4c-9493-bb93…

如何在 Linux 上对驱动器进行分区和格式化
type: item
date: 2018-12-02T18:12:46+08:00
description: 这里有所有你想知道的关于设置存储器而又不敢问的一切。在大多数的计算机系统上，Linux 或者是其它，当你插入一个 USB 设备时，你会注意到一个提示驱动器存在的警告。如果该驱动器已经按你想要的进行分区和格式化，你只需要你的计算机在文件管理器或桌面上的某个地方列出驱动器。这是一个简单的要求，而且通常计算机都能满足。然而，有时候，驱动器并没有按你想要的方式进行格式化。对于这些，你必须知道如何查找准备连接到您计算机上的存储设备。什么是块设备？硬盘驱动器通常被称为“块设备”，因为硬盘驱动器以固定大小的块进行读写。这就可以区分硬盘驱动器和其它可能插入到您计算机的一些设备，如打印机、游戏手柄、麦克风，或相机。一个简单的方法用来列出连接到你 Linux 系统上的块设备就是使用 lsblk （list block devices）命令：NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 237.5G 0 part └─luks-e2bb...e9f8 253:0 0 237.5G 0 crypt ├─fedora-root 253:1 0 50G 0 lvm / ├─fedora-swap 253:2 0 5.8G 0 lvm [SWAP] └─fedora-home 253:3 0 181.7G 0 lvm /home sdb 8:16 1 14.6G 0 disk └─sdb1 8:17 1 14.6G 0 part最左列是设备标识符，每个都是以 sd 开头，并以一个字母结尾，字母从 a 开始。每个块设备上的分区分配一个数字，从 1 开始。例如，第一个设备上的第二个分区用 sda2 表示。如果你不确定到底是哪个分区，那也不要紧，只需接着往下读。lsblk 命令是无损的，仅仅用于检测，所以你可以放心的使用而不用担心破坏你驱动器上的数据。使用 dmesg 进行测试如果你有疑问，你可以通过在 dmesg 命令的最后几行查看驱动器的卷标，这个命令显示了操作系统最近的日志（比如说插入或移除一个驱动器）。一句话，如果你想确认你插入的设备是不是 /dev/sdc ，那么，把设备插到你的计算机上，然后运行这个 dmesg 命令：$ sudo dmesg | tail显示中列出的最新的驱动器就是你刚刚插入的那个。如果你拔掉它，并再运行这个命令一次，你可以看到，这个设备已经被移除。如果你再插上它再运行命令，这个设备又会出现在那里。换句话说，你可以监控内核对驱动器的识别。理解文件系统如果你只需要设备卷标，那么你的工作就完成了。但是如果你的目的是想创建一个可用的驱动器，那你还必须给这个驱动器做一个文件系统。如果你还不知道什么是文件系统，那么通过了解当没有文件系统时会发生什么可能会更容易理解这个概念。如果你有多余的设备驱动器，并且上面没有什么重要的数据资料，你可以跟着做一下下面的这个实验。否则，请不要尝试，因为根据其设计目的，这个肯定会删除您的资料。当一个驱动器没有文件系统时也是可以使用的。一旦你已经肯定，正确识别了一个驱动器，并且已经确定上面没有任何重要的资料，那就可以把它插到你的计算机上 —— 但是不要挂载它，如果它被自动挂载上了，那就请手动卸载掉它。$ su - # umount /dev/sdx{,1}为了防止灾难性的复制 —— 粘贴错误，下面的例子将使用不太可能出现的 sdx 来作为驱动器的卷标。现在，这个驱动器已经被卸载了，尝试使用下面的命令：# echo 'hello world' > /dev/sdx你已经可以将数据写入到块设备中，而无需将其挂载到你的操作系统上，也不需要一个文件系统。再把刚写入的数据取出来，你可以看到驱动器上的原始数据：# head -n 1 /dev/sdx hello world这看起来工作得很好，但是想象一下如果 “hello world” 这个短语是一个文件，如果你想要用这种方法写入一个新的文件，则必须：知道第 1 行已经存在一个文件了知道已经存在的文件只占用了 1 行创建一种新的方法来在后面添加数据，或者在写第 2 行的时候重写第 1 行例如：# echo 'hello world > this is a second file' >> /dev/sdx获取第 1 个文件，没有任何改变。# head -n 1 /dev/sdx hello world但是，获取第 2 个文件的时候就显得有点复杂了。# head -n 2 /dev/sdx | tail -n 1 this is a second file显然，通过这种方式读写数据并不实用，因此，开发人员创建了一个系…

如何在 Linux 中查看已挂载的文件系统类型
type: item
date: 2018-11-05T07:00:44+08:00
description: 如你所知，Linux 支持非常多的文件系统，例如 ext4、ext3、ext2、sysfs、securityfs、FAT16、FAT32、NTFS 等等，当前被使用最多的文件系统是 ext4。你曾经疑惑过你的 Linux 系统使用的是什么类型的文件系统吗？没有疑惑过？不用担心！我们将帮助你。本指南将解释如何在类 Unix 的操作系统中查看已挂载的文件系统类型。在 Linux 中查看已挂载的文件系统类型有很多种方法可以在 Linux 中查看已挂载的文件系统类型，下面我将给出 8 种不同的方法。那现在就让我们开始吧！方法 1 – 使用 findmnt 命令这是查出文件系统类型最常使用的方法。findmnt 命令将列出所有已挂载的文件系统或者搜索出某个文件系统。findmnt 命令能够在 /etc/fstab、/etc/mtab 或 /proc/self/mountinfo 这几个文件中进行搜索。findmnt 预装在大多数的 Linux 发行版中，因为它是 util-linux 包的一部分。如果 findmnt 命令不可用，你可以安装这个软件包。例如，你可以使用下面的命令在基于 Debian 的系统中安装 util-linux 包：$ sudo apt install util-linux下面让我们继续看看如何使用 findmnt 来找出已挂载的文件系统。假如你只敲 findmnt 命令而不带任何的参数或选项，它将像下面展示的那样以树状图形式列举出所有已挂载的文件系统。$ findmnt示例输出：正如你看到的那样，findmnt 展示出了目标挂载点（TARGET）、源设备（SOURCE）、文件系统类型（FSTYPE）以及相关的挂载选项（OPTIONS），例如文件系统是否是可读可写或者只读的。以我的系统为例，我的根（/）文件系统的类型是 EXT4 。假如你不想以树状图的形式来展示输出，可以使用 -l 选项来以简单平凡的形式来展示输出：$ findmnt -l你还可以使用 -t 选项来列举出特定类型的文件系统，例如下面展示的 ext4 文件系统类型：$ findmnt -t ext4 TARGET SOURCE FSTYPE OPTIONS / /dev/sda2 ext4 rw,relatime,commit=360 └─/boot /dev/sda1 ext4 rw,relatime,commit=360,data=orderedfindmnt 还可以生成 df 类型的输出，使用命令$ findmnt --df或$ findmnt -D示例输出：SOURCE FSTYPE SIZE USED AVAIL USE% TARGET dev devtmpfs 3.9G 0 3.9G 0% /dev run tmpfs 3.9G 1.1M 3.9G 0% /run /dev/sda2 ext4 456.3G 342.5G 90.6G 75% / tmpfs tmpfs 3.9G 32.2M 3.8G 1% /dev/shm tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup bpf bpf 0 0 0 - /sys/fs/bpf tmpfs tmpfs 3.9G 8.4M 3.9G 0% /tmp /dev/loop0 squashfs 82.1M 82.1M 0 100% /var/lib/snapd/snap/core/4327 /dev/sda1 ext4 92.8M 55.7M 30.1M 60% /boot tmpfs tmpfs 788.8M 32K 788.8M 0% /run/user/1000 gvfsd-fuse fuse.gvfsd-fuse 0 0 0 - /run/user/1000/gvfs你还可以展示某个特定设备或者挂载点的文件系统类型。查看某个特定的设备：$ findmnt /dev/sda1 TARGET SOURCE FSTYPE OPTIONS /boot /dev/sda1 ext4 rw,relatime,commit=360,data=ordered查看某个特定的挂载点：$ findmnt / TARGET SOURCE FSTYPE OPTIONS / /dev/sda2 ext4 rw,relatime,commit=360你甚至还可以查看某个特定标签的文件系统的类型：$ findmnt LABEL=Storage更多详情，请参考其 man 手册。$ man findmntfindmnt 命令已足够完成在 Linux 中查看已挂载文件系统类型的任务，这个命令就是为了这个特定任务而生的。然而，还存在其他方法来查看文件系统的类型，假如你感兴趣的话，请接着往下看。方…