引言这篇概述文章将告诉你为何以及如何迁移你的当前分区到 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，请小心地使用类似 docker volume prune、docker image prune -a 这样的工具。清理 GNOME Boxes 之类的虚拟机内不用的镜像。清理不用的软件包和 Flatpak 包：dnf autoremove、flatpak remove –unused。清理软件包缓存：pkcon refresh force -c -1、dnf clean all。如果你有把握，你可以谨慎的清理 ~/.cache 文件夹。转换到 Btrfs备份你所有有价值的数据，确保你的系统已完全更新，然后重启到实时镜像。运行 gnome-disks 工具找到你所拥有的设备的路径，比如 /dev/sda1（如果你在使用 LVM，它可能看起来有所不同）。检查文件系统然后执行转换：（编者按：以下命令使用 root 用户运行，谨慎使用！）$ sudo su - # fsck.ext4 -fyv /dev/sdXX （请替换为你的具体的设备路径） # man btrfs-convert （阅读它） # btrfs-convert /dev/sdXX （请替换为你的具体的设备路径） 这将会花十几分钟甚至几个小时，依据分区的大小和是机械硬盘还是固态硬盘。如果你看到错误，你可能需要更多剩余空间。作为最后的手段，你可以尝试 btrfs-convert -n。怎样回滚？如果因为某些原因转换失败，你的分区将保持在 ext4 文件系统或者它之前的状态。如果你想在成功转换之后回滚，简单如下：# btrfs-convert -r /dev/sdXX 警告！ 如果你做了以下这些事情之一，你将永久失去回滚的功能：碎片整理、均衡或者删除 ext2_saved 子卷。由于 Btrfs 文件系统的写时复制特性，你可以安全的复制/移动甚至删除文件、创建子卷，因为 ext2_saved 会保持引用旧数据。挂载和检查现在这个分区应该已经有了 Btrfs 文件系统。挂载它然后查看你的文件……和子卷！# mount /dev/sdXX /mnt （请替换为你的具体的设备路径） # man btrfs-subvolume （阅读它） # btrfs subvolume list / （使用 -t 以表格方式查看） 因为你已经阅读了 相关的手册页，你应该知道创建子卷快照是安全的，并且有 ext2-saved 子卷作为你之前数据的简易备份。是时候阅读 Btrfs 系统管理指南了，这样你就不会把常规文件夹和子卷混淆了。创建子卷我们希望实现一个“扁平”子卷布局，这和 Anaconda 默认创建的布局相同：toplevel （卷根目录，不能被默认挂载） +-- root （子卷根目录，被挂载到 /） +-- home （子卷根目录，被挂载到 /home） 你可以跳过这个步骤，或者使用一个不同的布局。这种特殊结构的优势是你可以轻松的创建 /home 的快照，并且对每个子卷使用不同的压缩和挂载参数。# cd /mnt # btrfs subvolume snapshot ./ ./root2 # btrfs subvolume create home2 # cp -a home/* home2/ 这里我们已经创建了两个子卷。root2 是一个完整的分区快照，而 home2 开始是一个空子卷，然后我们往里复制内容。（这个 cp 命令不会重复数据，所以会很快。）在 /mnt 目录（顶层子卷），删除除了 root2、home2 和 ext2_saved 之外的所有内容。重命名 root2 和 home2 子卷为 root 和 home。在 root 子卷里，清空 home 目录，以便之后我们能够挂载 home 子卷。如果都做对了，那就很简单了！修改 fstab 分区表为了重启之后挂载新卷，必须要修改 fstab，用新的行来代替旧的 ext4 文件系统挂载行。你可以使用 blkid 命令来找到你的分区的 UUID。UUID=xx / btrfs subvol=root 0 0 （请替换为你的具体 UUID） UUID=xx /home btrfs subvol=home 0 0 （请替换为你的具体 UUID） （注意如果指向的是同一个分区，那么这两个 UUID 是相同的。）这些都是新安装的 Fedora 33 的默认值。在 fstab 中，你也可以选择自定义压缩和添加类似 noatime 这样的参数。可以查看 关于压缩参数的维基页面 和 man 5 btrfs 了解所有相关的参数。chroot 到系统如果你曾经做过系统恢复，我想你肯定知道这些命令。这里，我们将得到一个 基本上 在你系统里的 shell 提示符，可以访问网络。首先，我们必须重新挂载 root 子卷到 /mnt 目录，然后挂载 /boot 和 /boot/efi 分区（它们可能有所不同，这取决于你的文件系统布局）：# umount /mnt # mount -o subvol=root /dev/sdXX /mnt （请替换为你的具体的设备路径） # mount /dev/sdXX /mnt/boot （请替换为你的具体的设备路径） # mount /dev/sdXX /mnt/boot/efi （请替换为你的具体的设备路径） 然后我们继续挂载系统设备：# mount -t proc /proc /mnt/proc # mount --rbind /dev /mnt/dev # mount --make-rslave /mnt/dev # mount --rbind /sys /mnt/sys # mount --make-rslave /mnt/sys # cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.chroot # cp -L /etc/resolv.conf /mnt/etc # chroot /mnt /bin/bash $ ping www.fedoraproject.org 重装 GRUB 及内核最容易的方法就是重装 GRUB 和 内核，因为它完成了所有必要的配置 —— 现在我们可以访问网络了。所以，在 chroot 环境内部：# mount /boot/efi # dnf reinstall grub2-efi shim # grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg # dnf reinstall kernel-core ...或者干脆重新生成 initramfs： # dracut --kver $(uname -r) --force 如果你是支持 UEFI 的系统，这里是适用的。如果你是 BIOS 的系统，请查看下面的文档。重启之前，让我们查看是否一切正常：# cat /boot/grub2/grubenv # cat /boot/efi/EFI/fedora/grub.cfg # lsinitrd /boot/initramfs-$(uname -r).img | grep btrfs 你应该在 grubenv 和 grub.cfg 有正确的分区 UUID 或指向（grubenv 可能没有更新，如有必要可以编辑它），并在 grub.cfg 中看到 insmod btrfs 配置和在 initramfs 镜像中有 btrfs 模块。参见: Fedora 系统管理指南中的 重装 GRUB 2 和 验证初始 RAM 磁盘镜像 。重启现在系统能够正常启动。如果不能，别慌，回到实时镜像修复这个问题。最坏的情况下，你可以从那里重装 Fedora 。首次启动之后检查你的新 Btrfs 文件系统一切都正常。如果你觉得没问题，你需要回收旧的 ext4 快照使用的空间，进行碎片整理和平衡子卷。后两者可能要花一些时间，并且相当耗费资源。对此你必须这样挂载顶级子卷：# mount /dev/sdXX -o subvol=/ /mnt/someFolder # btrfs subvolume delete /mnt/someFolder/ext2_saved 然后，当机器有空闲时间时，运行这些命令：# btrfs filesystem defrag -v -r -f / # btrfs filesystem defrag -v -r -f /home # btrfs balance start -m / 最后，有一个 “非写时复制” 属性，对于新系统，这个属性是为虚拟机镜像文件夹自动设置的。如果你使用虚拟机的话，可以设置它：# chattr +C /var/lib/libvirt/images $ chattr +C ~/.local/share/gnome-boxes/images 这个属性只会对在这些文件夹里的新文件生效。复制镜像并删除原镜像，你可以通过 lsattr 确认结果。总结我真心希望你发现这个教程是有用的，并且能够对是否在你的系统上转换为 Btrfs 做出谨慎而明智的决定。祝你成功转换！欢迎在评论中分享你的经验，或者遇到更深层次的问题，请在 ask.fedoraproject.org 提问。via: https://fedoramagazine.org/convert-your-filesystem-to-btrfs/作者：Gergely Gombos 选题：lujun9972 译者：hwlife 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
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 student1 student1:x:1006:1006::/home/student1:/bin/bash # ls -l /home drwx------. 1 student1 student1 80 Oct 29 00:21 student1 传统上，用户的主目录是 /home 的子目录。所有权和操作权是为所有者量身定制的，但是特殊功能来没有管理它们。而企业服务器环境是另外一种情况。通常，目录是为特定的应用程序及其用户保留的。你可以利用 Btrfs 来管理和应用对这些目录的约束。为了将 Btrfs 子卷作为用户主页，在 useradd 命令中有一个新选项：--Btrfs-subvolume-home。尽管手册页尚未更新（截至本文撰写之时），但你可以通过运行 useradd --help 来查看该选项。通过在添加新用户时传递此选项，将创建一个新的 Btrfs 子卷。它的功能与创建常规目录时的 -d 选项类似：# useradd --btrfs-subvolume-home student2 Create subvolume '/home/student2' 使用 getent passwd student2 验证用户，它将显示为正常。但是，运行 btrfs subvolume 命令列出子卷，你将看到一些有趣的内容：新用户的主目录！# 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 ID 272 gen 2459 top level 256 path home/student2 探索企业服务器环境的第二个场景。假设你需要在 /opt 中安装一个 WildFly 服务器并部署一个 Java web 应用程序。通常，你的第一步是创建一个 wildfly 用户。使用新的 --btrfs-subvolume-home 选项和 -b 选项来指定 /opt 作为基本目录：# useradd -b /opt --btrfs-subvolume-home wildfly Create subvolume '/opt/wildfly' 于是，wildfly 用户可以使用了，并且主目录设置在了 /opt/wildfly。删除用户删除用户时，有时需要同时删除该用户的文件和主目录。userdel 命令有 -r 选项，它可以同时删除 Btrfs 子卷：# userdel -r student2 Delete subvolume (commit): '/home/student2' 设置磁盘使用配额在我的一节计算机科学课上，一个学生运行了一个失控的 C 程序，然后写进了磁盘，将我们院的 Unix 系统上整个 /home 目录都填满了！在管理员终止失控进程并清除一些空间之前，服务器将无法使用。上述情况也是如此；那个 Wildfly 企业应用程序将为其用户提供越来越多的日志文件和内容存储。如何防止服务器因磁盘已满而死机？设置磁盘使用限制是个好主意。幸运的是，Btrfs 通过设置配额的方式支持这一点。配置配额需要几个步骤。第一步是在 Btrfs 文件系统上启用配额：# btrfs quota enable / 确保你知道每个子卷的配额组（qgroup）ID 号，该编号由 btrfs subvolume list 命令显示。每个子卷都需要基于 ID 号码来关联配额组。这可以通过 btrfs qgroup create 单独完成，但是，btrfs 维基提供了以下命令来加快为文件系统上的子卷创建配额组：> btrfs subvolume list \<path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} \<path> 在新安装的 Fedora 33 工作站系统中，你在根文件系统路径上操作，/。用根路径替换 \<path>：# btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} / 然后运行 btrfs quota rescan，查看新的配额组：# btrfs quota rescan / quota rescan started # btrfs qgroup show / qgroupid rfer excl -------- ---- ---- 0/5 16.00KiB 16.00KiB 0/256 272.04MiB 272.04MiB 0/258 6.08GiB 6.08GiB 0/265 16.00KiB 16.00KiB 0/271 16.00KiB 16.00KiB 0/273 16.00KiB 16.00KiB 于是现在，你可以将配额分配给其中一个配额组，然后将配额应用于其关联的子卷。因此，如果要将 student3 的主目录使用限制为 1 GB，请使用 btrfs qgroup limit 命令：# btrfs qgroup limit 1G /home/student3 查看特定子卷的配额：# btrfs qgroup show -reF /home/student3 qgroupid rfer excl max_rfer max_excl -------- ---- ---- -------- -------- 0/271 16.00KiB 16.00KiB 1.00GiB none 稍有不同的选项参数将显示所有配额组和设置的所有配额：# btrfs qgroup show -re / qgroupid rfer excl max_rfer max_excl -------- ---- ---- -------- -------- 0/5 16.00KiB 16.00KiB none none 0/256 272.04MiB 272.04MiB none none 0/258 6.08GiB 6.08GiB none none 0/265 16.00KiB 16.00KiB none none 0/271 16.00KiB 16.00KiB 1.00GiB none 0/273 16.00KiB 16.00KiB none none 其他特性这些例子提供了 Btrfs 特性的一些思考。运行 btrfs --help 查看命令的完整列表。还有许多其他值得注意的功能；例如，快照和发送/接收是两个值得学习的功能。总结讨论Btrfs 为向 Linux 提供高级文件系统特性集贡献了很多特性。这不是第一次；我知道 ZFS 在大约 15 年前引入了这种类型的文件系统，但是 Btrfs 是完全开源的，不受专利的限制。如果你想探索这个文件系统，我建议从虚拟机或备用系统开始。我想能够出现一些图形化的管理工具，为那些喜欢用图形工具的系统管理员提供便利。幸运的是，Btrfs 具有强大的开发活动，Fedora 33 项目决定将其设置为工作站上的默认值就证明了这一点。via: https://opensource.com/article/20/11/btrfs-linux作者：Alan Formy-Duval 选题：lujun9972 译者：Chao-zhi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
#新闻拍一拍# 微软水下数据中心在两年之后浮出水面
微软水下数据中心在两年之后浮出水面两年前，微软将一个数据中心沉入奥克尼群岛海岸附近的海床上。两年之后，它将该数据中心从海床上捞了回来，研究人员对其进行了评估。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 能在生态上取得更多成功。
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-for-getting-around-your-linux-file-system.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如果你想在一个媒体项目中用到了多个磁盘或分区，不想丢失任何现有数据，但又想将所有文件都存放在一个驱动器下，该怎么办？这时，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 /disk1/Videos/ total 1 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv $ ls -l /disk2/Videos/ total 30003 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv -rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv $ ls -l /media/Videos/ total 30004 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv -rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv当你将文件复制到 mergefs 挂载点时，它将始终将文件复制到有足够可用空间的硬盘上。如果池中的所有驱动器都没有足够的可用空间，那么你将无法复制它们。via: https://fedoramagazine.org/using-mergerfs-to-increase-your-virtual-storage/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
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 原创编译，Linux中国 荣誉推出
虚拟文件系统是一种神奇的抽象，它使得 “一切皆文件” 哲学在 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 文件时，请务必以换行符结束，否则系统将无法启动。（猜猜我怎么知道。）/proc 和 /sys除了 /tmp 之外，大多数 Linux 用户最熟悉的 VFS 是 /proc 和 /sys。（/dev 依赖于共享内存，而没有 file_operations 结构）。为什么有两种呢？让我们来看看更多细节。procfs 为用户空间提供了内核及其控制的进程的瞬时状态的快照。在 /proc 中，内核发布有关其提供的设施的信息，如中断、虚拟内存和调度程序。此外，/proc/sys 是存放可以通过 sysctl 命令配置的设置的地方，可供用户空间访问。单个进程的状态和统计信息在 /proc/<PID> 目录中报告。/proc/meminfo 是一个空文件，但仍包含有价值的信息。/proc 文件的行为说明了 VFS 可以与磁盘上的文件系统不同。一方面，/proc/meminfo 包含了可由命令 free 展现出来的信息。另一方面，它还是空的！怎么会这样？这种情况让人联想起康奈尔大学物理学家 N. David Mermin 在 1985 年写的一篇名为《没有人看见月亮的情况吗？现实和量子理论》。事实是当进程从 /proc 请求数据时内核再收集有关内存的统计信息，而且当没有人查看它时，/proc 中的文件实际上没有任何内容。正如 Mermin 所说，“这是一个基本的量子学说，一般来说，测量不会揭示被测属性的预先存在的价值。”（关于月球的问题的答案留作练习。）当没有进程访问它们时，/proc 中的文件为空。（来源）procfs 的空文件是有道理的，因为那里可用的信息是动态的。sysfs 的情况则不同。让我们比较一下 /proc 与 /sys 中不为空的文件数量。procfs 只有一个不为空的文件，即导出的内核配置，这是一个例外，因为每次启动只需要生成一次。另一方面，/sys 有许多更大一些的文件，其中大多数由一页内存组成。通常，sysfs 文件只包含一个数字或字符串，与通过读取 /proc/meminfo 等文件生成的信息表格形成鲜明对比。sysfs 的目的是将内核称为 “kobject” 的可读写属性公开给用户空间。kobject 的唯一目的是引用计数：当删除对 kobject 的最后一个引用时，系统将回收与之关联的资源。然而，/sys 构成了内核著名的“到用户空间的稳定 ABI”，它的大部分内容在任何情况下都没有人能“破坏”。但这并不意味着 sysfs 中的文件是静态，这与易失性对象的引用计数相反。内核的稳定 ABI 限制了 /sys 中可能出现的内容，而不是任何给定时刻实际存在的内容。列出 sysfs 中文件的权限可以了解如何设置或读取设备、模块、文件系统等的可配置、可调参数。逻辑上强调 procfs 也是内核稳定 ABI 的一部分的结论，尽管内核的文档没有明确说明。sysfs 中的文件确切地描述了实体的每个属性，并且可以是可读的、可写的，或两者兼而有之。文件中的“0”表示 SSD 不可移动的存储设备。用 eBPF 和 bcc 工具一窥 VFS 内部了解内核如何管理 sysfs 文件的最简单方法是观察它的运行情况，在 ARM64 或 x86\_64 上观看的最简单方法是使用 eBPF。eBPF（ 扩展的伯克利数据包过滤器 extended Berkeley Packet Filter ）由在内核中运行的虚拟机组成，特权用户可以从命令行进行查询。内核源代码告诉读者内核可以做什么；而在一个启动的系统上运行 eBPF 工具会显示内核实际上做了什么。令人高兴的是，通过 bcc 工具入门使用 eBPF 非常容易，这些工具在主要 Linux 发行版的软件包 中都有，并且已经由 Brendan Gregg 给出了充分的文档说明。bcc 工具是带有小段嵌入式 C 语言片段的 Python 脚本，这意味着任何对这两种语言熟悉的人都可以轻松修改它们。据当前统计，bcc/tools 中有 80 个 Python 脚本，使得系统管理员或开发人员很有可能能够找到与她/他的需求相关的已有脚本。要了解 VFS 在正在运行中的系统上的工作情况，请尝试使用简单的 vfscount 或 vfsstat 脚本，这可以看到每秒都会发生数十次对 vfs_open() 及其相关的调用。vfsstat.py 是一个带有嵌入式 C 片段的 Python 脚本，它只是计数 VFS 函数调用。作为一个不太重要的例子，让我们看一下在运行的系统上插入 USB 记忆棒时 sysfs 中会发生什么。用 eBPF 观察插入 USB 记忆棒时 /sys 中会发生什么，简单的和复杂的例子。在上面的第一个简单示例中，只要 sysfs_create_files() 命令运行，trace.py bcc 工具脚本就会打印出一条消息。我们看到 sysfs_create_files() 由一个 kworker 线程启动，以响应 USB 棒的插入事件，但是它创建了什么文件？第二个例子说明了 eBPF 的强大能力。这里，trace.py 正在打印内核回溯（-K 选项）以及 sysfs_create_files() 创建的文件的名称。单引号内的代码段是一些 C 源代码，包括一个易于识别的格式字符串，所提供的 Python 脚本引入 LLVM 即时编译器（JIT） 来在内核虚拟机内编译和执行它。必须在第二个命令中重现完整的 sysfs_create_files() 函数签名，以便格式字符串可以引用其中一个参数。在此 C 片段中出错会导致可识别的 C 编译器错误。例如，如果省略 -I 参数，则结果为“无法编译 BPF 文本”。熟悉 C 或 Python 的开发人员会发现 bcc 工具易于扩展和修改。插入 USB 记忆棒后，内核回溯显示 PID 7711 是一个 kworker 线程，它在 sysfs 中创建了一个名为 events 的文件。使用 sysfs_remove_files() 进行相应的调用表明，删除 USB 记忆棒会导致删除该 events 文件，这与引用计数的想法保持一致。在 USB 棒插入期间（未显示）在 eBPF 中观察 sysfs_create_link() 表明创建了不少于 48 个符号链接。无论如何，events 文件的目的是什么？使用 cscope 查找函数 __device_add_disk() 显示它调用 disk_add_events()，并且可以将 “mediachange” 或 “ejectrequest” 写入到该文件。这里，内核的块层通知用户空间该 “磁盘” 的出现和消失。考虑一下这种检查 USB 棒的插入的工作原理的方法与试图仅从源头中找出该过程的速度有多快。只读根文件系统使得嵌入式设备成为可能确实，没有人通过拔出电源插头来关闭服务器或桌面系统。为什么？因为物理存储设备上挂载的文件系统可能有挂起的（未完成的）写入，并且记录其状态的数据结构可能与写入存储器的内容不同步。当发生这种情况时，系统所有者将不得不在下次启动时等待 fsck 文件系统恢复工具 运行完成，在最坏的情况下，实际上会丢失数据。然而，狂热爱好者会听说许多物联网和嵌入式设备，如路由器、恒温器和汽车现在都运行着 Linux。许多这些设备几乎完全没有用户界面，并且没有办法干净地让它们“解除启动”。想一想启动电池耗尽的汽车，其中运行 Linux 的主机设备 的电源会不断加电断电。当引擎最终开始运行时，系统如何在没有长时间 fsck 的情况下启动呢？答案是嵌入式设备依赖于只读根文件系统（简称 ro-rootfs）。ro-rootfs 是嵌入式系统不经常需要 fsck 的原因。 来源：https://tinyurl.com/yxoauoubro-rootfs 提供了许多优点，虽然这些优点不如耐用性那么显然。一个是，如果 Linux 进程不可以写入，那么恶意软件也无法写入 /usr 或 /lib。另一个是，基本上不可变的文件系统对于远程设备的现场支持至关重要，因为支持人员拥有理论上与现场相同的本地系统。也许最重要（但也是最微妙）的优势是 ro-rootfs 迫使开发人员在项目的设计阶段就决定好哪些系统对象是不可变的。处理 ro-rootfs 可能经常是不方便甚至是痛苦的，编程语言中的常量变量经常就是这样，但带来的好处很容易偿还这种额外的开销。对于嵌入式开发人员，创建只读根文件系统确实需要做一些额外的工作，而这正是 VFS 的用武之地。Linux 需要 /var 中的文件可写，此外，嵌入式系统运行的许多流行应用程序会尝试在 $HOME 中创建配置的点文件。放在家目录中的配置文件的一种解决方案通常是预生成它们并将它们构建到 rootfs 中。对于 /var，一种方法是将其挂载在单独的可写分区上，而 / 本身以只读方式挂载。使用绑定或叠加挂载是另一种流行的替代方案。绑定和叠加挂载以及在容器中的使用运行 man mount 是了解 绑定挂载 bind mount 和 叠加挂载 overlay mount 的最好办法，这种方法使得嵌入式开发人员和系统管理员能够在一个路径位置创建文件系统，然后以另外一个路径将其提供给应用程序。对于嵌入式系统，这代表着可以将文件存储在 /var 中的不可写闪存设备上，但是在启动时将 tmpfs 中的路径叠加挂载或绑定挂载到 /var 路径上，这样应用程序就可以在那里随意写它们的内容了。下次加电时，/var 中的变化将会消失。叠加挂载为 tmpfs 和底层文件系统提供了联合，允许对 ro-rootfs 中的现有文件进行直接修改，而绑定挂载可以使新的空 tmpfs 目录在 ro-rootfs 路径中显示为可写。虽然叠加文件系统是一种适当的文件系统类型，而绑定挂载由 VFS 命名空间工具 实现的。根据叠加挂载和绑定挂载的描述，没有人会对 Linux 容器 中大量使用它们感到惊讶。让我们通过运行 bcc 的 mountsnoop 工具监视当使用 systemd-nspawn 启动容器时会发生什么：在 mountsnoop.py 运行的同时，system-nspawn 调用启动容器。让我们看看发生了什么：在容器 “启动” 期间运行 mountsnoop 可以看到容器运行时很大程度上依赖于绑定挂载。（仅显示冗长输出的开头）这里，systemd-nspawn 将主机的 procfs 和 sysfs 中的选定文件按其 rootfs 中的路径提供给容器。除了设置绑定挂载时的 MS_BIND 标志之外，mount 系统调用的一些其它标志用于确定主机命名空间和容器中的更改之间的关系。例如，绑定挂载可以将 /proc 和 /sys 中的更改传播到容器，也可以隐藏它们，具体取决于调用。总结理解 Linux 内部结构看似是一项不可能完成的任务，因为除了 Linux 用户空间应用程序和 glibc 这样的 C 库中的系统调用接口，内核本身也包含大量代码。取得进展的一种方法是阅读一个内核子系统的源代码，重点是理解面向用户空间的系统调用和头文件以及主要的内核内部接口，这里以 file_operations 表为例。file_operations 使得“一切都是文件”得以可以实际工作，因此掌握它们收获特别大。顶级 fs/ 目录中的内核 C 源文件构成了虚拟文件系统的实现，虚拟文件​​系统是支持流行的文件系统和存储设备的广泛且相对简单的互操作性的垫片层。通过 Linux 命名空间进行绑定挂载和覆盖挂载是 VFS 魔术，它使容器和只读根文件系统成为可能。结合对源代码的研究，eBPF 内核工具及其 bcc 接口使得探测内核比以往任何时候都更简单。非常感谢 Akkana Peck 和 Michael Eager 的评论和指正。Alison Chaiken 也于 3 月 7 日至 10 日在加利福尼亚州帕萨迪纳举行的第 17 届南加州 Linux 博览会（SCaLE 17x）上演讲了本主题。via: https://opensource.com/article/19/3/virtual-filesystems-linux作者：Alison Chariken 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Linux 分区或逻辑卷中创建文件系统
学习在你的系统中创建一个文件系统，并且长期或者非长期地挂载它。在计算技术中，文件系统控制如何存储和检索数据，并且帮助组织存储媒介中的文件。如果没有文件系统，信息将被存储为一个大数据块，而且你无法知道一条信息在哪结束，下一条信息在哪开始。文件系统通过为存储数据的文件提供名称，并且在文件系统中的磁盘上维护文件和目录表以及它们的开始和结束位置、总的大小等来帮助管理所有的这些信息。在 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-bb93531be644" TYPE="ext4" [root@localhost ~]#2、运行下面的命令挂载 /dev/sd1 设备：[root@localhost ~]# mkdir /mnt/mount_point_for_dev_sda1 [root@localhost ~]# ls /mnt/ mount_point_for_dev_sda1 [root@localhost ~]# mount -t ext4 /dev/sda1 /mnt/mount_point_for_dev_sda1/ [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 7.9G 920M 7.0G 12% / devtmpfs 443M 0 443M 0% /dev tmpfs 463M 0 463M 0% /dev/shm tmpfs 463M 30M 434M 7% /run tmpfs 463M 0 463M 0% /sys/fs/cgroup tmpfs 93M 0 93M 0% /run/user/0 /dev/sda1 2.9G 9.0M 2.7G 1% /mnt/mount_point_for_dev_sda1 [root@localhost ~]#命令 df -h 显示了每个文件系统被挂载的挂载点。查找 /dev/sd1。上面的挂载命令使用的设备名称是 /dev/sda1。用 blkid 命令中的 UUID 编码替换它。注意，在 /mnt 下一个被新创建的目录挂载了 /dev/sda1。3、直接在命令行下使用挂载命令（就像上一步一样）会有一个问题，那就是挂载不会在设备重启后存在。为使永久性地挂载文件系统，编辑 /etc/fstab 文件去包含你的挂载信息：UUID=ac96b366-0cdd-4e4c-9493-bb93531be644 /mnt/mount_point_for_dev_sda1/ ext4 defaults 0 04、编辑完 /etc/fstab 文件后，你可以 umount /mnt/mount_point_for_fev_sda1 并且运行 mount -a 命令去挂载被列在 /etc/fstab 文件中的所有设备文件。如果一切顺利的话，你可以使用 df -h 列出并且查看你挂载的文件系统：root@localhost ~]# umount /mnt/mount_point_for_dev_sda1/ [root@localhost ~]# mount -a [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 7.9G 920M 7.0G 12% / devtmpfs 443M 0 443M 0% /dev tmpfs 463M 0 463M 0% /dev/shm tmpfs 463M 30M 434M 7% /run tmpfs 463M 0 463M 0% /sys/fs/cgroup tmpfs 93M 0 93M 0% /run/user/0 /dev/sda1 2.9G 9.0M 2.7G 1% /mnt/mount_point_for_dev_sda15、你也可以检测文件系统是否被挂载：[root@localhost ~]# mount | grep ^/dev/sd /dev/sda1 on /mnt/mount_point_for_dev_sda1 type ext4 (rw,relatime,seclabel,stripe=8191,data=ordered)现在你已经知道如何去创建文件系统并且长期或者非长期的挂载在你的系统中。via: https://opensource.com/article/19/4/create-filesystem-linux-partition作者：Kedar Vijay Kulkarni (Red Hat) 选题：lujun9972 译者：liujing97 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Linux 上对驱动器进行分区和格式化
这里有所有你想知道的关于设置存储器而又不敢问的一切。在大多数的计算机系统上，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显然，通过这种方式读写数据并不实用，因此，开发人员创建了一个系统来跟踪文件的组成，并标识一个文件的开始和结束，等等。大多数的文件系统都需要一个分区。创建分区分区是硬盘驱动器的一种边界，用来告诉文件系统它可以占用哪些空间。举例来说，你有一个 4GB 的 USB 驱动器，你可以只分一个分区占用一个驱动器 （4GB），或两个分区，每个 2GB (又或者是一个 1GB，一个 3GB，只要你愿意)，或者三个不同的尺寸大小，等等。这种组合将是无穷无尽的。假设你的驱动器是 4GB，你可以使用 GNU parted 命令来创建一个大的分区。# parted /dev/sdx --align opt mklabel msdos 0 4G按 parted 命令的要求，首先指定了驱动器的路径。--align 选项让 parted 命令自动选择一个最佳的开始点和结束点。mklabel 命令在驱动器上创建了一个分区表 （称为磁盘卷标）。这个例子使用了 msdos 磁盘卷标，因为它是一个非常兼容和流行的卷标，虽然 gpt 正变得越来越普遍。最后定义了分区所需的起点和终点。因为使用了 --align opt 标志，所以 parted 将根据需要调整大小以优化驱动器的性能，但这些数字仍然可以做为参考。接下来，创建实际的分区。如果你开始点和结束点的选择并不是最优的， parted 会向您发出警告并让您做出调整。# parted /dev/sdx -a opt mkpart primary 0 4G Warning: The resulting partition is not properly aligned for best performance: 1s % 2048s != 0s Ignore/Cancel? C # parted /dev/sdx -a opt mkpart primary 2048s 4G如果你再次运行 lsblk 命令，（你可能必须要拔掉驱动器，并把它再插回去），你就可以看到你的驱动器上现在已经有一个分区了。手动创建一个文件系统我们有很多文件系统可以使用。有些是开源和免费的，另外的一些并不是。一些公司拒绝支持开源文件系统，所以他们的用户无法使用开源的文件系统读取，而开源的用户也无法在不对其进行逆向工程的情况下从封闭的文件系统中读取。尽管有这种特殊的情况存在，还是仍然有很多文件系统可以使用，选择哪个取决于驱动器的用途。如果你希望你的驱动器兼容多个系统，那么你唯一的选择是 exFAT 文件系统。然而微软尚未向任何开源内核提交 exFAT 的代码，因此你可能必须在软件包管理器中安装 exFAT 支持，但是 Windows 和 MacOS 都支持 exFAT 文件系统。一旦你安装了 exFAT 支持，你可以在驱动器上你创建好的分区中创建一个 exFAT 文件系统。# mkfs.exfat -n myExFatDrive /dev/sdx1现在你的驱动器可由封闭系统和其它开源的系统（尚未经过微软批准）内核模块进行读写了。Linux 中常见的文件系统是 ext4。但对于便携式的设备来说，这可能是一个麻烦的文件系统，因为它保留了用户的权限，这些权限通常因为计算机而异，但是它通常是一个可靠而灵活的文件系统。只要你熟悉管理权限，那 ext4 对于便携式的设备来说就是一个很棒的文件系统。# mkfs.ext4 -L myExt4Drive /dev/sdx1拔掉你的驱动器，再把它插回去。对于 ext4 文件系统的便携设备来说，使用 sudo 创建一个目录，并将该目录的权限授予用户和系统中通用的组。如果你不确定使用哪个用户和组，也可以使用 sudo 或 root 来修改出现问题的设备的读写权限。使用桌面工具很高兴知道了在只有一个 Linux shell 的时候如何操作和处理你的块设备，但是，有时候你仅仅是想让一个驱动器可用，而不需要进行那么多的检测。 GNOME 的 KDE 的开发者们提供了这样的一些优秀的工具让这个过程变得简单。GNOME 磁盘 和 KDE 分区管理器 是一个图形化的工具，为本文到目前为止提到的一切提供了一个一体化的解决方案。启动其中的任何一个，来查看所有连接的设备（在左侧列表中），创建和调整分区大小，和创建文件系统。KDE 分区管理器可以预见的是，GNOME 版本会比 KDE 版本更加简单，因此，我将使用复杂的版本进行演示——如果你愿意动手的话，很容易弄清楚 GNOME 磁盘工具的使用。启动 KDE 分区管理工具，然后输入你的 root 密码。在最左边的一列，选择你想要格式化的驱动器。如果你的驱动器并没有列出来，确认下是否已经插好，然后选择 “Tools > Refresh devices” （或使用键盘上的 F5 键）。除非你想销毁驱动器已经存在的分区表，否则请勿继续。选择好驱动器后，单击顶部工具栏中的 “New Partition Table” 。系统会提示你为该分区选择一种卷标：gpt 或 msdos 。前者更加灵活可以处理更大的驱动器，而后者像很多微软的技术一样，是占据大量市场份额的事实上的标准。现在您有了一个新的分区表，在右侧的面板中右键单击你的设备，然后选择 “New” 来创建新的分区，按照提示设置分区的类型和大小。此操作包括了分区步骤和创建文件系统。创建一个新分区要将更改应用于你的驱动器，单击窗口左上角的 “Apply” 按钮。硬盘驱动器，轻松驱动在 Linux 上处理硬盘驱动器很容易，甚至如果你理解硬盘驱动器的语言就更容易了。自从切换到 Linux 系统以来，我已经能够以任何我想要的方式来处理我的硬盘驱动器了。由于 Linux 在处理存储提供的透明性，因此恢复数据也变得更加容易了。如果你想实验并了解有关硬盘驱动器的更多的信息，请参考下面的几个提示：备份您的数据，而不仅仅是你在实验的驱动器上。仅仅需要一个小小的错误操作来破坏一个重要驱动器的分区。（这是一个用来学习重建丢失分区的很好的方法，但并不是很有趣）。反复确认你所定位的驱动器是正确的驱动器。我经常使用 lsblk 来确定我并没有移动驱动器。（因为从两个独立的 USB 端口移除两个驱动器很容易，然后以不同的顺序重新连接它们，就会很容易导致它们获得了新的驱动器标签。）花点时间“销毁”你测试的驱动器，看看你是否可以把数据恢复。在删除文件系统后，重新创建分区表或尝试恢复数据是一个很好的学习体验。还有一些更好玩的东西，如果你身边有一个封闭的操作系统，在上面尝试使用一个开源的文件系统。有一些项目致力于解决这种兼容性，并且尝试让它们以一种可靠稳定的方式工作是一个很好的业余项目。via: https://opensource.com/article/18/11/partition-format-drive-linux作者：Seth Kenlon 选题：lujun9972 译者：Jamskr 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Linux 中查看已挂载的文件系统类型
如你所知，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 中查看已挂载文件系统类型的任务，这个命令就是为了这个特定任务而生的。然而，还存在其他方法来查看文件系统的类型，假如你感兴趣的话，请接着往下看。方法 2 – 使用 blkid 命令blkid 命令被用来查找和打印块设备的属性。它也是 util-linux 包的一部分，所以你不必再安装它。为了使用 blkid 命令来查看某个文件系统的类型，可以运行：$ blkid /dev/sda1方法 3 – 使用 df 命令在类 Unix 的操作系统中，df 命令被用来报告文件系统的磁盘空间使用情况。为了查看所有已挂载文件系统的类型，只需要运行：$ df -T示例输出：关于 df 命令的更多细节，可以参考下面的指南。针对新手的 df 命令教程同样也可以参考其 man 手册：$ man df方法 4 – 使用 file 命令file 命令可以判读出某个特定文件的类型，即便该文件没有文件后缀名也同样适用。运行下面的命令来找出某个特定分区的文件系统类型：$ sudo file -sL /dev/sda1 [sudo] password for sk: /dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID=83a1dbbf-1e15-4b45-94fe-134d3872af96 (needs journal recovery) (extents) (large files) (huge files)查看其 man 手册可以知晓更多细节：$ man file方法 5 – 使用 fsck 命令fsck 命令被用来检查某个文件系统是否健全或者修复它。你可以像下面那样通过将分区名字作为 fsck 的参数来查看该分区的文件系统类型：$ fsck -N /dev/sda1 fsck from util-linux 2.32 [/usr/bin/fsck.ext4 (1) -- /boot] fsck.ext4 /dev/sda1如果想知道更多的内容，请查看其 man 手册：$ man fsck方法 6 – 使用 fstab 命令fstab 是一个包含文件系统静态信息的文件。这个文件通常包含了挂载点、文件系统类型和挂载选项等信息。要查看某个文件系统的类型，只需要运行：$ cat /etc/fstab更多详情，请查看其 man 手册：$ man fstab方法 7 – 使用 lsblk 命令lsblk 命令可以展示设备的信息。要展示已挂载文件系统的信息，只需运行：$ lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT loop0 squashfs /var/lib/snapd/snap/core/4327 sda ├─sda1 ext4 83a1dbbf-1e15-4b45-94fe-134d3872af96 /boot ├─sda2 ext4 4d25ddb0-5b20-40b4-ae35-ef96376d6594 / └─sda3 swap 1f8f5e2e-7c17-4f35-97e6-8bce7a4849cb [SWAP] sr0更多细节，可以参考它的 man 手册：$ man lsblk方法 8 – 使用 mount 命令mount 被用来在类 Unix 系统中挂载本地或远程的文件系统。要使用 mount 命令查看文件系统的类型，可以像下面这样做：$ mount | grep "^/dev" /dev/sda2 on / type ext4 (rw,relatime,commit=360) /dev/sda1 on /boot type ext4 (rw,relatime,commit=360,data=ordered)更多详情，请参考其 man 手册的内容：$ man mount好了，上面便是今天的全部内容了。现在你知道了 8 种不同的 Linux 命令来查看已挂载的 Linux 文件系统的类型。假如你知道其他的命令来完成同样的任务，请在下面的评论部分让我们知晓，我将确认并相应地升级本教程。更过精彩内容即将呈现，请保持关注！via: https://www.ostechnix.com/how-to-find-the-mounted-filesystem-type-in-linux/作者：SK 选题：lujun9972 译者：FSSlc 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出