弄清楚各种linux文件系统

本文深入探讨了Linux虚拟文件系统(VFS)的运作机制及其在Linux系统中的重要性。介绍了VFS如何作为文件系统间的桥梁,使得不同的文件系统能够共存并提供统一的接口。同时,文章还讲解了根文件系统的安装过程以及其他文件系统的分类。

    今天经过一顿狂研,终于对linux的文件系统这个东西有了更深入层次的认识,稍微捋清了一点他们的关系!
    在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构。Linux的最重要特征之一就是支持多种文件系统,这样它更加灵

活,并可以和许多其它种操作系统共存。由于系统已将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序

将看到统一的文件系统。  
    大多数由windows平台转来的用户在使用linux文件系统的时候都会感到困惑。linux文件系统与windows文件系统有很大的差别。本文设身

处地的为新手介绍他们的不同点并且向新手介绍linux的文件系统。
  作为开端,只有一个单独的顶级目录结构。所有一切都从 '根' 开始,用 '/' 代表, 并且延伸到子目录。DOS/Windows有不同的分区,同

时目录都存于分区上。linux则通过 '加载' 的方式把所有分区都放置在 '根' 下制定的目录里。windows下最接近于 '根' 的是c:。
  一句话总结:Windows下,目录结构属于分区;Linux下,分区 '加载' 于目录结构。
    在linux系统中,目前已经开发出多种文件系统,那么如何让这些文件系统能共存在一个系统中呢,从linux 2.0开始,引入了虚拟文件系

统管理器 VFS的概念。
    Linux 下的文件系统主要可分为三大块:
① 一是上层的文件系统的系统调用,
② 二是虚拟文件系统交换器 VFS(Virtual Filesystem Switch),
③ 三是挂载到 VFS 中的各实际文件系统,例如 ext2,jffs 等。

一、关于VFS
    VFS的确切叫法是Virtual Filesystem Switch虚拟文件系统交换器,这里的VFS中的“S”是指的switch,这个需要强调一下的,它很容易

被混淆成“system”,如果理解成“system”将是不正确的,请多加注意。
    VFS是具体文件系统filesystem的一个管理器。
    VFS是Linux内核中的一个软件层,一种软件机制,它也提供了内核中的一个抽象功能,允许不同的文件系统共存,可以称它为 Linux 的文

件系统管理者,与它相关的数据结构只存在于物理内存当中。所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵 VFS 的目录树

(在 Linux 的源代码里称之为 namespace),实际上便是在内存中建立相应的数据结构。VFS 目录树在 Linux 的文件系统模块中是个很重要的

概念,不要将其与实际文件系统目录树混淆,VFS 中的各目录其主要用途是用来提供实际文件系统的挂载点。
    平时所叫的文件系统是指可能会被挂载到目录树中的各个实际文件系统,所谓实际文件系统,即是指VFS 中的实际操作最终要通过它们来

完成而已,并不意味着它们一定要存在于某种特定的存储设备上(如ramfs是利用VFS自身结构而形成的内存文件系统,只存在于内存)。比如

在笔者的 Linux 机器下就注册有"rootfs"、"proc"、"ext2"、"sockfs" 等十几种文件系统。
    而rootfs将是挂载在这个目录树的根结点(root),即 "/"目录上的。有了VFS,那么对文件的操作将使用统一的接口,将来通过文件系统

调用对 VFS 发起的文件操作等指令将被 rootfs 文件系统中相应的函数接口所接管。
    同样,这个VFS目录树还有其他目录结点(如/dev)可供挂载,至于在 VFS 的目录树中向其中某个目录(安装点 mount point)上挂载

(mount)一个文件系统的过程,可简单描述为:将某一设备(dev_name)上某一文件系统(file_system_type)安装到VFS目录树上的某一安装点

(dir_name)。它要解决的问题是:将对 VFS 目录树中某一目录的操作转化为具体安装到其上的实际文件系统的对应操作。比如说,如果将

hda2 上的根文件系统(假设文件系统类型为 ext2)安装到了VFS新建立的 "/dev" 目录上(此时,"/dev" 目录就成为了安装点),那么安装成功

之后应达到这样的目的,即:对 VFS 文件系统的 "/dev" 目录执行 "ls" 指令,该条指令应能列出 hda2 上 ext2 文件系统的根目录下所有的

目录和文件。很显然,这里的关键是如何将对 VFS 树中 "/dev" 的目录操作指令转化为安装在其上的 ext2 这一实际文件系统中的相应指令。
记住:对目录或文件的操作将最终由目录或文件所对应的 inode 结构中的 i_op 和 i_fop 所指向的函数表中对应的函数来执行。所以,不管

最终解决方案如何,都可以设想必然要通过将对 "/dev" 目录所对应的 inode 中 i_op 和 i_fop 的调用转换到 hda2 上根文件系统 ext2 中

根目录所对应的 inode 中 i_op 和 i_fop 的操作。

安装根文件系统:
    不管怎么样,安装一个文件系统到 VFS 中某一安装点的过程原理毕竟都是一样的,安装根文件系统也是一样,前面所说的rootfs是挂载在

VFS目录树的"/"上其实是不准确的,其实是“/root"上的,看一下下面安装根文件系统的过程就明白了:
    这个过程大致是:首先要确定待安装的 ext2 文件系统的来源,其次是确定 ext2 文件系统在 VFS中的安装点,然后便是具体的安装过程


    关于第一问题,Linux 2.4.20 的内核另有一大堆的代码去解决,大概记住它是要解决到哪里去找要安装的文件系统的就可以了,这里我们

不妨就认为要安装的根文件系统就来自于主硬盘的第一分区 hda1.
    关于第二个问题,Linux 2.4.20 的内核把来自于 hda1 上 ext2 文件系统安装到了 VFS 目录树中的"/root" 目录上。其实,把 ext2 文

件系统安装到 VFS 目录树下的哪个安装点并不重要(VFS 的根目录除外),只要是这个安装点在 VFS 树中是存在的,并且内核对它没有另外的

用途。如果读者喜欢,尽可以自己在 VFS 中创建一个 "/Windows" 目录,然后将 ext2 文件系统安装上去作为将来用户进程的根目录,没有什

么不可以的。问题的关键是要将进程的根目录和当前工作目录设定好,因为毕竟只用用户进程才去关心现实的文件系统,要知道笔者的这篇稿

子可是要存到硬盘上去的。
    在 Linux 下,设定一个进程的当前工作目录是通过系统调用 sys_chdir() 进行的。初始化期间,Linux 在将 hda1 上的 ext2 文件系统

安装到了 "/root" 上后,通过调用 sys_chdir("/root") 将当前进程,也就是 init_task 进程的当前工作目录(pwd)设定为 ext2 文件系统的

根目录。记住此时 init_task进程的根目录仍然是图 3 中的 dentry,也就是 VFS 树的根目录,这显然是不行的,因为以后 Linux 世界中的

所有进程都由这个 init_task 进程派生出来,无一例外地要继承该进程的根目录,如果是这样,意味着用户进程从根目录搜索某一目录时,实

际上是从 VFS 的根目录开始的,而事实上却是从 ext2 的根文件开始搜索的。这个矛盾的解决是靠了在调用完 mount_root() 函数后,系统调

用的下面两个函数:

 sys_mount(".", "/", NULL, MS_MOVE, NULL);
 sys_chroot(".");
 
    其主要作用便是将 init_task 进程的根目录转化成安装上去的 ext2 文件系统的根目录。有兴趣的读者可以自行去研究这一过程。
    所以在用户空间下,更多地情况是只能见到 VFS 这棵大树的一叶(/root这个目录),而且还是被安装过文件系统了的,实际上对用户空

间来说还是不可见。我想,VFS 更多地被内核用来实现自己的功能,并以系统调用的方式提供过用户进程使用,至于在其上实现的不同文件系

统的安装,也只是其中的一个功能罢了。

    总之,记住VFS 中各目录的主要用途是为以后挂载文件系统提供挂载点。所以真正的文件操作还是要通过挂载后的文件系统提供的功能接

口来进行就行了。
注:本节内容主要参考:http://www.ibm.com/developerworks/cn/linux/l-vfs/ 解析 Linux 中的 VFS 文件系统机制,作者:Ricard Chen

    二、关于其他文件系统
    这里要说的是相当于上节说的“实际文件系统”(与VFS虚拟文件系统区别开的)。
    这里说的实际文件系统可以分两种:
    一种也是叫虚拟的,其实可以叫pseudo的,或者可以理解为linux内核级的FS,如devfs,/proc,sysfs;ramfs,tmpfs(Virtual memory file system)等等,它们仅是个文件系统,而不是块设备,与下面的实际文件系统都不是在一个级别,不是一个层次的东西,是不能作为rootfs的,但是若嵌入式设备Flash上启动的是经过压缩的内核时,可以用ramfs,tmpfs实现ramdisk作为根文件系统。

    另一种是包含在flash或者硬盘等其他硬件块设备上的或者网络设备上的,如flash上的有jffs/jffs2,yaffs,硬盘ext2,网络nfs等等。
     

<think>好的,我现在需要帮助用户在Linux系统中使用shell命令创建一个TXT文件,内容为123456。首先,我得确定用户的需求是什么。他们可能刚接触Linux,需要基本的文件创建指导。 我应该考虑不同的方法,比如使用echo命令的重定向,或者使用touch创建空文件后再写入内容。用户可能不知道这些命令的区别,所以需要解释清楚。 首先,echo命令可以直接将内容输出到文件。如果文件不存在,系统会自动创建。因此,最简单的命令应该是: $$ echo "123456" > test.txt $$ 但这里需要注意,如果test.txt已经存在,>会覆盖原有内容。用户可能需要知道这一点,避免数据丢失。 另外,如果用户想追加内容而不是覆盖,可以使用>>,但根据题目,他们只需要创建文件并写入123456,所以>更合适。 还有另一种方法,比如使用printf命令: $$ printf "123456" > test.txt $$ 不过echo更简单直接,可能更适合新手。 接下来,我需要验证这些命令的正确性。比如,执行后检查文件是否存在,内容是否正确。可以用cat命令查看: $$ cat test.txt $$ 预期输出是123456,没有换行。因为echo默认会在末尾添加换行符,而printf不会。所以如果用户使用echo,文件内容会是123456加上一个换行。但题目中并没有提到是否需要换行,可能需要指出这一点差异。 比如,如果用户希望文件内容严格是123456而没有换行,应该用printf。否则,使用echo会多一个换行符。这可能影响后续的文件处理,所以需要根据实际需求选择。 不过题目中的示例内容123456并没有特别说明是否需要换行,所以两种方法都可以,但需要明确说明区别。可能用户并不在意,但作为教程,应该指出潜在的差异。 另外,可能有人会用cat命令结合输入重定向,比如: $$ cat > test.txt << EOF 123456 EOF $$ 这种方法适用于多行内容,但对于单行来说稍显复杂。可能对于新手来说,echo更简单。 最后,确保命令语法正确,比如引号的使用,重定向符号的位置。用户可能容易把>和文件名之间的空格弄错,但正确的格式是命令 > 文件名,中间有空格。 总结,最推荐的命令是使用echo,并说明可能的换行问题。或者根据用户是否需要换行来选择echo或printf。</think>在Linux系统中使用Shell命令创建包含“123456”的TXT文件,步骤如下: --- ### **方法1:使用 `echo` 命令(自动换行)** 1. 执行命令: ```bash echo "123456" > test.txt ``` - `>` 表示将输出重定向到文件,若文件不存在则自动创建。 - **注意**:`echo` 默认在末尾添加换行符,文件实际内容为 `123456\n`(末尾多一个空行)。 2. 验证结果: ```bash cat test.txt ``` --- ### **方法2:使用 `printf` 命令(无换行符)** 若需严格避免换行符,使用: ```bash printf "123456" > test.txt ``` - `printf` 不会自动添加换行符,文件内容严格为 `123456`。 --- ### **方法3:通过文本编辑器 `nano` 或 `vim`** 1. 打开编辑器: ```bash nano test.txt ``` 2. 输入 `123456`,按 `Ctrl+O` 保存,再按 `Ctrl+X` 退出。 --- ### **关键区别** | 命令 | 文件内容 | 是否换行 | |---------|--------------|------------------------| | `echo` | `123456\n` | 是(末尾有换行符) | | `printf`| `123456` | 否 | 根据实际需求选择方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值