万字linux系列(一)目录结构

1.1 Linux目录结构

Linux文件系统的设计中最为精彩的部分就是虚拟文件系统(Virtual File System,VFS)。通过VFS,Linux可以支持每个目录使用不同的文件系统。想象一下,在Linux中,文件和目录就像一个大杂烩,表面上看它们是普通的文件和目录,实际上却可能是存储在磁盘上的文件、保存在内存中的数据、通过网络访问的文件系统、远程磁盘上的内容,甚至是随机数生成器或输入输出设备。这种灵活性使得虚拟文件系统成为整合所有设备资源的平台。

例如,假设你有一个音乐播放器应用,你可能认为你的音乐文件只存在于硬盘中,但在Linux的世界里,这些文件可能分布在你的硬盘、内存,甚至可能从网络上实时获取。这种设计使得大量操作都可以抽象为对文件的操作,使程序的编写更加一致和统一,并且扩展性极强。

在本节中,我们将从Linux的目录结构和用途开始,带你逐步了解Linux的文件系统。所有的Linux文件都建立在虚拟文件系统(VFS)之上,如下图所示:

在这里插入图片描述

当你访问一个目录或者文件时,虽然你使用的是标准的Linux文件API,但实际操作的可能是磁盘、内存、网络或数据库等资源。因此,Linux系统中的不同目录可能对应不同的磁盘,而不同的文件可能对应不同的设备。例如:

  • /home 目录可能存储在你的硬盘上,用于保存用户的个人文件。
  • /proc 目录实际上并不存在于硬盘上,而是一个虚拟文件系统,提供关于系统进程和内核的信息。
  • /dev 目录下的文件代表不同的设备,如硬盘、终端、打印机等,这些文件允许用户和程序与设备进行交互。

通过这种设计,Linux实现了一个高度灵活和可扩展的文件系统,使得操作系统能够轻松地整合和管理多种类型的资源。

接下来,让我们深入探索Linux的目录结构,了解每个目录的用途和功能。

1.1.1 分区结构

在Linux中,/是根目录,就像是一个大树的树根,是整个文件系统的起点。你可能会问,/是对应一个磁盘还是多个磁盘呢?在/下创建目录时,这些目录属于哪个磁盘呢?

我们可以用一个简单的命令来解答这些问题:df -h。通过这个命令,你可以看到你的/目录挂载到了/dev/sda5上。

在这里插入图片描述

如果你想要看到更多信息,可以使用df -T命令,如下图所示:

在这里插入图片描述

这里显示,/的文件系统类型是ext4ext4是一种常用的日志文件系统。你可以把日志文件系统想象成一本日记,它会记录每一次文件操作的变化,确保即使在意外情况下(比如突然断电),数据也不会丢失。

接下来,你可能会好奇,/dev/sda5究竟是一块磁盘还是别的什么?为了弄清楚这个问题,我们可以使用fdisk -l命令,结果如下图所示:

在这里插入图片描述

在图中,我们可以看到在我的Linux虚拟机上,有一块30G的硬盘(当然是虚拟的)。这块硬盘下有3个设备:/dev/sda1, /dev/sda2/dev/sda5。在Linux中,以数字1~4结尾的是主分区,而4以上的数字是逻辑分区。主分区就像是硬盘的VIP区域,通常最多只能有4个主分区用于系统启动。而逻辑分区则是在主分区的基础上划分出来的,可以有更多的分区。

因此,/dev/sda2/dev/sda5之间是主分区和逻辑分区的关系。通过这种设计,可以灵活地管理和分配磁盘空间。例如,你可以将操作系统安装在一个主分区中,而将用户数据存储在逻辑分区中,这样既方便管理又提高了系统的安全性。

通过理解这些分区结构,Linux用户和系统管理员能够更加高效地配置和管理存储资源,满足各种使用需求。

1.1.2 挂载

在Linux中,分区结构最终需要挂载到目录上。比如在上面的例子中,/dev/sda5分区被挂载到了根目录/下。这意味着在/目录下创建的文件都存储在/dev/sda5分区中。此外,/dev/sda5采用的是ext4文件系统。这表明,不同的目录可以采用不同的文件系统。

将一个文件系统映射到某个目录的过程称为挂载(Mount)。就像是在房子里放置不同的家具,你可以在不同的房间里放置不同类型的家具(文件系统)。这些家具可能来自不同的地方(分区、USB设备、读卡器等)。你可以使用mount -l命令查看已经挂载的文件系统,如下图所示:

在这里插入图片描述

上图中展示了多种文件系统,包括sysfs, proc, devtmpfs, tmpfsext4。让我们看看它们的具体作用:

  • sysfs:让用户通过文件访问和设置设备驱动信息,类似于一个设备的控制中心。
  • proc:一个虚拟文件系统,让用户可以通过文件访问内核中的进程信息,就像是系统的监控台。
  • devtmpfs:在内存中创建设备文件节点,像是一个动态的设备列表。
  • tmpfs:用内存模拟磁盘文件,可以快速存取数据,类似于一个高速缓存。
  • ext4:我们常见的文件系统,用于管理磁盘上的文件。

通过这些文件系统,Linux实现了对不同设备和资源的统一管理。你可以在挂载记录中看到文件系统类型、挂载的目录(在on后面部分),以及读写权限等信息。

你也可以使用mount命令手动挂载一个文件系统到某个目录。例如,下面的命令将/dev/sda6挂载到目录/abc

mount /dev/sda6 /abc

这就像是在你的房子里新增了一个房间,并且把一个新的柜子放进这个房间。从此以后,放在这个柜子里的东西都属于/dev/sda6分区中的数据。

通过这种方式,Linux系统能够灵活地管理和使用不同的存储设备和资源,使系统更加高效和易于管理。

1.1.3 目录结构

由于Linux内的文件系统较多、用途繁杂,Linux对文件系统中的目录进行了分类,如下图所示:

在这里插入图片描述

最顶层的目录称作根目录,用/表示。/目录下用户可以再创建目录,但有一些目录随着系统创建就已经存在。接下来,我会和你一起讨论这些目录的用途。

  • /bin(二进制):包含了许多所有用户都可以访问的可执行文件,如ls, cp, cd等。这里的大多数程序都是二进制格式的,因此称作bin目录。比如,Nginx中的可执行文件会在Nginx安装目录的bin文件夹下。

  • /dev(设备文件):通常挂载在devtmpfs文件系统上,里面存放的是设备文件节点。通常这些文件直接和内存进行映射,而不是存在物理磁盘上。这里有几个有趣的虚拟设备:

    • /dev/null:可以用来销毁任何输出。你可以用>重定向符号将任何输出流重定向到/dev/null来忽略输出的结果,就像一个“黑洞”。
    • /dev/zero:一个产生数字0的虚拟设备。无论你读取多少次,都会读到0。
    • /dev/random:一个产生随机数的虚拟设备。读取这个文件中的数据,你会得到一个随机数,持续读取就会得到一系列随机数。
  • /etc(配置文件)/etc名字的含义是"and so on",即“等等及其他”。Linux用它来保管程序的配置文件。比如,MySQL通常会在/etc/mysql下创建配置文件,再比如,/etc/passwd是系统的用户配置文件,存储了用户信息。

  • /proc(进程和内核文件):存储了正在执行的进程和内核的信息。比如,你可以通过/proc/1122目录找到与进程1122关联的全部信息,还可以在/proc/cpuinfo下找到与CPU相关的全部信息。

  • /sbin(系统二进制):类似于/bin,通常包含系统启动必需的指令,也包括管理员才会使用的指令。

  • /tmp(临时文件):用于存放应用的临时文件,通常用的是tmpfs文件系统。因为tmpfs是一个内存文件系统,系统重启时会清除/tmp目录,所以这个目录不能放应用和重要的数据。

  • /var(可变数据文件):用于存储运行时的数据,比如日志通常会存放在/var/log目录下。再比如,应用的缓存文件、用户的登录行为等,都可以放到/var目录下。/var目录下的文件会长期保存。

  • /boot(启动):目录下存放了Linux的内核文件和启动镜像,通常这个目录会写入磁盘最头部的分区,启动时需要加载目录内的文件。

  • /opt(可选软件):通常会把第三方软件安装到这个目录。以后你安装软件时,可以考虑在这个目录下创建。

  • /root(root用户家目录):为了防止误操作,Linux设计中root用户的家目录没有放在/home/root下,而是放在/root目录。

  • /home(家目录):用于存放用户的个人数据,比如用户lagou的个人数据会存放到/home/lagou下。通常用户登录或执行cd指令后,都会在家目录下工作。用户通常会对自己的家目录拥有管理权限,而无法访问其他用户的家目录。

  • /media(媒体):自动挂载的设备通常会出现在/media目录下。比如,插入U盘后,较新版本的Linux通常会自动挂载,在/media下创建一个目录代表U盘。

  • /mnt(挂载):习惯上会把手动挂载的设备放到这个目录。比如插入U盘后,如果Linux没有自动挂载,可以用mount命令手动将U盘内容挂载到/mnt目录下。

  • /srv(服务数据):通常用来存放服务数据,比如你开发的网站资源文件(脚本、网页等)。现在很多团队的习惯发生了变化,有的团队会把网站相关的资源放到/www目录下,也有的放到/data下。在存放资源的角度上,还是比较灵活的。

  • /usr(Unix系统资源):包含系统需要的资源文件,通常应用程序会把安装的可执行文件也放到这个目录下。比如:

    • vim编辑器的可执行文件通常在/usr/bin目录下,区别于ls会在/bin目录下。
    • /usr/sbin中会包含通常系统管理员才会使用的指令。
    • /usr/lib目录中存放系统的库文件,比如一些重要的对象和动态链接库文件。
    • /usr/lib目录下会有大量的.so文件,这些叫作共享对象,类似Windows下的.dll文件。
    • /usr/share目录下主要是文档,比如man文档都在/usr/share/man下。
  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值