精华内容
下载资源
问答
  • Linux文件系统以及目录结构简介
    千次阅读
    2016-09-13 10:53:51

    Linux和Windows操作系统中的文件系统些不同,在学习使用Linux之前,能够了解这个不同之处助于后续的学习。本文先对Windows和Linux上面文件系统的一些概念进行区分,然后介绍一些Linux文件系统相关的原理,最后较为详细地介绍了Linux系统的目录结构。

    一、Linux和Windows文件系统
    下面分别简单介绍一下启动Windows和Linux之后,它们是怎样看待自己世界的。着重介绍Linux。

    1、Window上面的文件系统
    Windows系统中一切东西都是存放在硬盘上的。启动系统后,先硬盘,再硬盘上的分区和每个分区所对应的文件系统,最后是存放在某个分区特定的文件系统中的文件,也就是说,Windows是通过“某个硬盘-硬盘上的某个分区-分区上的特定文件系统-特定文件系统中的文件”这样的顺序来访问到一个文件的。

    具体点说,假设我们的机器上面一个硬盘,硬盘分为个区,那么我们启动系统之后就会看到C,D,E个分区(也就是我们启动系统后看到的”C”盘,”D”盘等),每个分区可以被格式化为各自不同的文件系统(例如NTFS格式,FAT32格式等,文件系统的基本功能就是为了存放文件的,不同文件系统区别一般在于管理其中存放的文件的功能的强弱,分区被格式化成指定格式的文件系统之后,就可以存放任何文件和目录了。这里,我们可以把文件大体分为两种:系统文件和用户文件。一般来说系统文件(例如Windows操作系统本身,一些系统程序,程序运行所需的库文件,以及一些系统配置文件等)存放的默认位置在C盘,当然也可以在安装时候指定在其他盘;其它用户文件,包含用户后来安装的程序以及一些数据文件等,用户可以把它们随意存放在任意的分区。

    这样组织优点更缺点。优点是:用户存放东西的位置比较自由,系统结构简单便于新用户上手。缺点很多这里只列出几种:(1由于对“系统文件”和“用户文件”存放位置缺乏细致的规定,数据组织的方式显得比较凌乱,并且两种文件之间很容易相互干扰(例如数据文。(2用户的使用经验对系统的使用效率影响很大。一般来说,我们使用Windows时候合理使用分区会提升的系统效率。例如根据需要设置合理的系统分区(C分区的大小,尽量少往C盘存放数据文件,根据具体情况可以将一些“重要并且常用的” 程序安装在C分区,随时保持系统目录的清洁和大小助于提升系统的运行速度,用户安装的一般软件尽量不要安装在C盘,安装软件时候指定的位置最好采用默认标准目录名称(例如X:\Program Files目录,这里X表示盘符而不要自己定义一些奇怪名字的目录,这样便于软件的维护等等。(3共享不便。Windows上经验的用户们会将自己的目录结构组织好,但是每个用户组织自己内容的方式是不一样的,所以他的机器上哪里存放了什么内容,别人很难知道,为共享带来了麻烦。但是这些在Linux系统中,情况就所不同了。

    2、Linux上面的文件系统
    在Linux系统中,正好相反,一切东西都是存放在一个唯一的“虚拟文件系统”中的,这个“虚拟文件系统”是树状的结构以一个根目录开始。启动系统后,先有这个虚拟文件系统,再硬盘,再把某个硬盘的某个分区做为这个虚拟文件系统的一部分(用某个子目录表示这个分区,再通过这个虚拟文件系统中对应硬盘分区的那个子目录确定硬盘分区中的特定文件系统,最后的文件就存放在这个特定的文件系统中,也就是说,Linux系统是通过“虚拟文件系统-硬盘-硬盘上的分区-分区上的特定文件系统-特定文件系统中的文件”这样的顺序来访问一个文件的。

    可能对习惯了使用Windows的用户来说,这样的组织点不太适应,这里的“虚拟文件系统”,实质就是一颗目录树,最开始的目录叫做根目录,根目录中又有每一级子目录,或者文件,子目录又有子子目录和文件,其中每个子目录都特定的功能这个功能是约定俗成了的后面会详细说明……和Windows中把硬盘分成的C,D,E分区的概念不同了,Linux中最开始根本就没有硬盘的概念,就只有一个纯粹的“虚拟文件系统”。如果想要使用哪个硬盘的某个分区,就把那个分区“挂载”到某个子目录之下,这样硬盘中的分区,文件系统,目录等内容就呈现到了那个子目录里面。也就是说,在Linux中,我们使用硬盘中的数据,实际是先把硬盘“挂载”到某个子目录下,然后通过那个子目录来访问硬盘的。硬盘中原的数据组织结构都反映到了子目录上,成为了整个“虚拟文件系统”根目录下的一颗子树。

    也许人会问,没这个“虚拟文件系统”就无法使用硬盘,但是最开始没有硬盘,那么这个“虚拟文件系统”以及相应的组织结构是怎么存放起来的呢?这个问题,就像先鸡还是先蛋这个问题一样看似简单实则……但是在Linux中,很轻易地跳出了这个思维循环,问题的答案并没在“虚拟文件系统”和“硬盘”这两者之间徘徊,而是第者——“内存”,Linux系统启动起来之后,整个“虚拟文件系统”的组织结构,都是随着每次系统的启动自动在内存中建立好了的,根本就不需要硬盘。

    Linux这样组织它的目录结构,缺点当然更多的是优点。缺点就是,最开始“虚拟文件系统”中的每个子目录的功能是事先规定好了的,我们需要事先知道那些目录存放哪些文件,然后在相应的位置中创建自己的内容(当然最开始的新手,也可以像Windows那样随意地创建目录和文件,实际上最开始的目录也不多,主要就那么几个,花不了多长时间就会明白它们的作用的,本文后面着重对这些目录进行介绍。而它的优点这里只说几点:(1当我们了解了这些目录的功能之后,我们对整个Linux操作系统的运行机理也会一个大致的了解。(2助于我们以一种最高效的方式组织自己的数据,分类清晰并且不会对系统运行有任何影响,规定了最开始每个目录的功能,并没有限制我们的自由,因为我们知道我们可以在哪里创建自己的子目录并且在子目录中任意创建自己的文件。(3由于一个统一性的目录组织结构,所以Linux上面的用户在共享数据的时候,能够很容易地猜测出他所需要的数据大致存放在什么位置,同时也不会影响到私有数据的保密性(怎么存放自己的私有数据,那是用户自己决定的。

    3、Linux文件系统在操作系统中的位置
    在Linux系统中,主要两个东西:“虚拟文件系统”中的文件和Linux操作系统内核本身。逻辑上可以认为前者属于上层,后者在下层,前者基于后者,后者依赖前者而存在。

    Linux把除了它本身(Linux操作系统内核以外的一切事物都看作是在“虚拟文件系统”中的文件了。无论是键盘,鼠标,数据,程序,CPU,内存,网卡……无论是硬件、软件、数据还是内存中的东西,我们都可以在虚拟文件系统中的相应子目录对他们进行访问和操作,操作统一。而实现这些管理的幕后就是Linux操作系统内核本身:启动Linux系统的时候,首先电脑把操作系统内核加载到内存中,内核本身提供了文件管理,设备管理,内存管理,CPU进程调度管理,网络管理等功能,等内核运行起来之后,就在内存中建立起相应的“虚拟文件系统”,最后就是内核利用它提供的那些功能,来管理虚拟文件系统中的硬件软件等各种资源了。

    Linux把提供操作系统本身功能(管理计算机软硬件资源的那些部分划给了操作系统内核,使得操作系统内核成为一个独立的部分,有它自己的源代码;其他的一切(软件,硬件,数据)都根据其特性有自己的源代码或者自由地组织并且存放在那个“虚拟文件系统中”由操作系统内核来管理。这样,将系统本身和系统所管理的资源分开,有助于对系统或者系统所管理的资源进行灵活的定制和扩展,还能按需快速建立起只适合自己使用的操作系统(实际Ubuntu,Fedora,RedHat等各种不同的Linux操作系统简单来说就是对其文件系统和内核进行了不同的配置而产生的“大众化”的操作系统,相比之下,Windows就显得非常地零乱复杂,将系统、软件、硬件都混在了一起。

    另外,我们还要注意个问题,就是在我们的角度上,是使用路径来访问一个文件的。表示文件的路径由“文件所在的目录+各级目录的分隔符+文件”个部分组成,这无论在Windows还是Linux上面,都是一样的,所不同的是,Windows下面目录分隔符是“\”,Linux下面是“/”,也许这也是两者之间为了表示其各自立场不同的一个原因吧?^_^

    例如:
    Window系统上的文件:D:\Program Files\PPStream\PPStream.exe
    Linux系统上的文件:/usr/bin/screen

    二、Linux上面的虚拟文件系统目录组织
    实质上,我们启动系统所看到的“根目录”,逻辑上是Linux虚拟文件系统的根目录中的一个子目录,我们看不到除了这个“根目录”以外的其他的目录,那些目录和操作系统的具体实现相关是被操作系统内核隐藏起来了的,所以这里就介绍我们所能看到的文件系统中的“根目录”的各个子目录中的作用吧。

    在Linux文件系统中的每一个子目录都有特定的目的和用途。一般都是根据FHS标准定义一个正式的文件系统结构的,这个标准规定了哪些目录应该哪些作用。这里我们先介绍一些日常经常用到的目录,然后给出FHS相关的内容。

    1、常用的重要目录
    这里,根据本人的使用经验,给出比较常见重要的一些目录,最开始我们对它们有所了解就可以了。随着对Linux使用的经验的加深,我们会了解越来越多的目录。对目录的功能知道得越多,我们对Linux系统的工作原理就理解的越深刻,理解操作系统的工作原理,更助于我们更为规范地使用和理解系统中每个目录存在的意义,直至最后几乎知道系统中的每个文件……
    /
    根目录。
    包含了几乎所的文件目录。相当于中央系统。进入的最简单方法是:cd /。

    /boot
    引导程序,内核等存放的目录。
    这个目录,包括了在引导过程中所必需的文件,引导程序的相关文件(例如grub,lilo以及相应的配置文件以及Linux操作系统内核相关文件(例如vmlinuz等一般都存放在这里。在最开始的启动阶段,通过引导程序将内核加载到内存,完成内核的启动(这个时候,虚拟文件系统还不存在,加载的内核虽然是从硬盘读取的,但是没经过Linux的虚拟文件系统,这是比较底层的东西来实现的。然后内核自己创建好虚拟文件系统,并且从虚拟文件系统的其他子目录中(例如/sbin 和 /etc加载需要在开机启动的其他程序或者服务或者特定的动作(部分可以由用户自己在相应的目录中修改相应的文件来配制。如果我们的机器中包含多个操作系统,那么可以通过修改这个目录中的某个配置文件(例如grub.conf来调整启动的默认操作系统,系统启动的择菜单,以及启动延迟等参数。

    /sbin
    超级用户可以使用的命令的存放目录。
    存放大多涉及系统管理的命令(例如引导系统的init程序,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令(但是时普通用户也可能会用到。这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin等目录是相似的,我们要记住,凡是目录sbin中包含的都是root权限才能执行的,这样就行了。后面会具体区分。

    /bin
    普通用户可以使用的命令的存放目录。
    系统所需要的那些命令位于此目录,比如ls、cp、mkdir等命令;类似的目录还/usr/bin,/usr/local/bin等等。这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命令就是放在这里。

    /lib
    根目录下的所程序的共享库目录。
    此目录下包含系统引导和在根用户执行命令时候所必需用到的共享库。做个不太好但是比较形象的比喻,点类似于Windows上面的system32目录。理说,这里存放的文件应该是/bin目录下程序所需要的库文件的存放地,也不排除一些例外的情况。类似的目录还/usr/lib,/usr/local/lib等等。

    /dev
    设备文件目录。
    在Linux中设备都是以文件形式出现,这里的设备可以是硬盘,键盘,鼠标,网卡,终端,等设备,通过访问这些文件可以访问到相应的设备。设备文件可以使用mknod命令来创建,具体参见相应的命令;而为了将对这些设备文件的访问转化为对设备的访问,需要向相应的设备提供设备驱动模块(一般将设备驱动编译之后,生成的结果是一个*.ko类型的二进制文件,在内核启动之后,再通过insmod等命令加载相应的设备驱动之后,我们就可以通过设备文件来访问设备了。一般来说,想要Linux系统支持某个设备,只要个东西:相应的硬件设备,支持硬件的驱动模块,以及相应的设备文件。

    /home
    普通用户的家目录($HOME目录。
    在Linux机器上,用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。通常而言,系统的每个用户都自己的家目录,目录以用户名作为名字存放在/home下面(例如quietheart用户,其家目录的名字为/home/quietheart。该目录中保存了绝大多数的用户文件(用户自己的配置文件,定制文件,文档,数据等),root用户除外(参见后面的/root目录。由于这个目录包含了用户实际的数据,通常系统管理员为这个目录单独挂载一个独立的磁盘分区,这样这个目录的文件系统格式就可能和其他目录不一样了(尽管表面上看,这个目录还是属于根目录的一棵子树上),有利于数据的维护。

    /root
    用户root的$HOME目录
    系统管理员(就是root用户或超级用户)的主目录比较特殊,不存放在/home中,而是直接放在/root目录下了。

    /etc
    全局的配置文件存放目录。
    系统和程序一般都可以通过修改相应的配置文件,来进行配置。例如,要配置系统开机的时候启动那些程序,配置某个程序启动的时候显示什么样的风格等等。通常这些配置文件都集中存放在/etc目录中,所以想要配置什么东西的话,可以在/etc下面寻找我们可能需要修改的文件。一些大型套件,如X11,在 /etc 下它们自己的子目录。系统配置文件可以放在这里或在 /usr/etc。 不过所程序总是在 /etc 目录下查找所需的配置文件,你也可以将这些文件链接到目录 /usr/etc。另外,还一个需要注意的常见现象就是,当某个程序在某个用户下运行的时候,可能会在该用户的家目录中生成一个配置文件(一般这个文件最开始就是/etc下相应配置文件的拷贝,存放相应于“当前用户”的配置,这样当前用户可以通过配置这个家目录的配置文件,来改变程序的行为,并且这个行为只是该用户特的。原因就是:一般来说一个程序启动,如果需要读取一些配置文件的话,它会首先读取当前用户家目录的配置文件,如果存在就使用;如果不存在它就到/etc下读取全局的配置文件进而启动程序。就是这个配置文件不自动生成,我们手动在自己的家目录中创建一个文件的话,也有许多程序会首先读取到这个家目录的文件并且以它的配置作为启动的选项(例如我们可以在家目录中创建vim程序的配置文件.vimrc,来配置自己的vim程序。

    /usr
    这个目录中包含了命令库文件和在通常操作中不会修改的文件。
    这个目录对于系统来说也是一个非常重要的目录,其地位类似Windows上面的”Program Files”目录(请原谅我可能这样做比较不太恰当^_^。安装程序的时候,默认就是安装在此文件内部某个子文件夹内。输入命令后系统默认执行/usr/bin下的程序(当然,前提是这个目录的路径已经被添加到了系统的环境变量中。此目录通常也会挂载一个独立的磁盘分区,它应保存共享只读类文件,这样它可以被运行Linux的不同主机挂载。

    /usr/lib
    目标库文件,包括动态连接库加上一些通常不是直接调用的可执行文件的存放位置。
    这个目录功能类似/lib目录,理说,这里存放的文件应该是/bin目录下程序所需要的库文件的存放地,也不排除一些例外的情况。

    /usr/bin
    一般使用者使用并且不是系统自检等所必需可执行文件的目录。
    此目录相当于根文件系统下的对应目录(/bin,非启动系统,非修复系统以及非本地安装的程序一般都放在此目录下。

    /usr/sbin
    管理员使用的非系统必须的可执行文件存放目录。
    此目录相当于根文件系统下的对应目录(/sbin,保存系统管理程序的二进制文件,并且这些文件不是系统启动或文件系统挂载 /usr 目录或修复系统所必需的。

    /usr/share
    存放共享文件的目录。
    在此目录下不同的子目录中保存了同一个操作系统在不同构架下工作时特定应用程序的共享数据(例如程序文档信息)。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目录下的这些类似数据。

    /usr/include
    C程序语言编译使用的头文件。
    linux下开发和编译应用程序所需要的头文件一般都存放在这里,通过头文件来使用某些库函数。默认来说这个路径被添加到了环境变量中,这样编译开发程序的时候编译器会自动搜索这个路径,从中找到你的程序中可能包含的头文件。

    /usr/local
    安装本地程序的一般默认路径。
    当我们下载一个程序源代码,编译并且安装的时候,如果不特别指定安装的程序路径,那么默认会将程序相关的文件安装到这个目录的对应目录下。例如,安装的程序可执行文件被安装(安装实质就是复制到了/usr/local/bin下面,此程序(可执行文件所需要依赖的库文件被安装到了/usr/local/lib目录下,被安装的软件如果是某个开发库(例如Qt,Gtk等那么相应的头文件可能就被安装到了/usr/local/include中等等。也就是说,这个目录存放的内容,一般都是我们后来自己安装的软件的默认路径,如果择了这个默认路径作为软件的安装路径,被安装的软件的所文件都限制在这个目录中,其中的子目录就相应于根目录的子目录。

    /proc
    特殊文件目录。
    这个目录采用一种特殊的文件系统格式(proc格式,内核支持这种格式。其中包含了全部虚拟文件。它们并不保存在磁盘中,也不占据磁盘空间(尽管命令ls -c会显示它们的大小)。当您查看它们时,您实际上看到的是内存里的信息,这些文件助于我们了解系统内部信息。例如:

    ├1/ 关于进程1的信息目录。每个进程在/proc 下一个名为其进程号的目录。
    ├cpuinfo 处理器信息,如类型、制造商、型号和性能。
    ├devices 当前运行的核心配置的设备驱动的列表。
    ├dma 显示当前使用的DMA通道。
    ├filesystems 核心配置的文件系统。
    ├interrupts 显示使用的中断,and how many of each there have been.
    ├ioports 当前使用的I/O端口。
    ├kcore 系统物理内存映象。与物理内存大小一样,但实际不占这么多内存;
    ├kmsg 核心输出的消息。也被送到syslog 。
    ├ksyms 核心符号表。
    ├loadavg 系统”平均负载”;3个没意义的指示器指出系统当前的工作量。
    ├meminfo 存储器使用信息,包括物理内存和swap。
    ├modules 当前加载了哪些核心模块。
    ├net 网络协议状态信息。
    ├self 到查看/proc 的程序的进程目录的符号连接。
    ├stat 系统的不同状态
    ├uptime 系统启动的时间长度。
    └version 核心版本。

    /opt
    可择的文件目录。
    这个目录表示的是可择的意思,些自定义软件包或者第方工具,就可以安装在这里。比如在Fedora Core 5.0中,OpenOffice就是安装在这里。些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以把它们的安装路径设置成/opt这样来安装。这个目录的作用一点类似/usr/local。

    /mnt
    临时挂载目录。
    这个目录一般是用于存放挂载储存设备的挂载目录的,比如磁盘,光驱,网络文件系统等,当我们需要挂载某个磁盘设备的时候,可以把磁盘设备挂载到这个目录上去,这样我们可以直接通过访问这个目录来访问那个磁盘了。一般来说,我们最好在/mnt目录下面多建立几个子目录,挂载的时候挂载到这些子目录上面,因为通常我们可能不仅仅是挂载一个设备吧?

    /media
    挂载的媒体设备目录。
    挂载的媒体设备目录,一般外部设备挂载到这里,例如cdrom等。比如我们插入一个U盘,我们一般会发现,Linux自动在这个目录下建立一个disk目录,然后把U盘挂载到这个disk目录上,通过访问这个disk来访问U盘。

    /var
    内容经常变化的目录。
    此目录下文件的大小可能会改变,如缓冲文件,日志文件,缓存文件,等一般都存放在这里。

    /tmp
    临时文件目录。
    该目录存放系统中的一些临时文件,文件可能会被系统自动清空。的系统直接把tmpfs类型的文件系统挂载到这个目录上,tmpfs文件系统由Linux内核支持,在这个文件系统中的数据,实际上是内存中的,由于内存的数据断电易失,当系统重新启动的时候我们就会发现这个目录被清空了。

    /lost+found
    恢复文件存放的位置。
    当系统崩溃的时候,在系统修复过程中需要恢复的文件,可能就会在这里被找到了,这个目录一般为空。

    以上目录,是最常见的重要目录。其中,有些目录初学者容易混淆,这里简单区分一下:
    /bin,/sbin与/usr/bin,/usr/sbin:
    /bin一般存放对于用户和系统来说“必须”的程序(二进制文件。
    /sbin一般存放用于系统管理的“必需”的程序(二进制文件,一般普通用户不会使用,根用户使用。
    /usr/bin一般存放的只是对用户和系统来说“不是必需的”程序(二进制文件。
    /usr/sbin一般存放用于系统管理的系统管理的不是必需的程序(二进制文件)。

    /lib与/usr/lib:
    /lib和/usr/lib的区别类似/bin,/sbin与/usr/bin,/usr/sbin。
    /lib一般存放对于用户和系统来说“必须”的库(二进制文件。
    /usr/lib一般存放的只是对用户和系统来说“不是必需的”库(二进制文件。

    其他还一些目录例如/home/user/bin,/home/user/opt,/home/user/etc,/usr/local/etc等等,其作用都是类似于/etc,/bin等目录的,可能只是层次概念不同了,使用Linux时间长了,会逐渐体会到其中的含义。

    当然,我们可以无视这些目录,像使用Windows那样自由的,不管啥文件,想往哪存就往哪存,还是那句话,使用Linux时间长了,会逐渐体会到其中的含义,到时候也许我们想要乱来都不行了呢。^_^

    2、对文件系统目录的分类标准
    在大多数Linux系统上面,我们可以使用一个命令:“man hier”,通过这个命令的输出,就知道“根目录”中所子目录的作用了。这个命令含义我不多说了,总之这里的hier就是对Linux文件系统中各级目录的标准功能,是一个大家都约定俗成了的东西。想要了解每个目录更详细的信息,需要仔细参考”man hier”的输出。下面就是一个比较简短的中文描述的对文件系统目录分类的FHS标准,也就是对”man hier”的简单翻译。
    NAME 名称
    hier - 文件系统描述
    DESCRIPTION 描述

    一个典型的Linux系统具以下几个目录结构:
    /
    根目录是所目录树开始的地方。

    /bin
    此目录下包括了单用户方式及系统启动或修复所用到的所执行程序。

    /boot
    包括了引导程序的静态文件。此目录下包括了在引导过程中所必需的文件。系统装载程序及配制文件在 /sbin 和 /etc 目录中找到。

    /dev
    对应物理设备的指定文件或驱动程序。参见mknod(1)。

    /dos
    如果MS-DOS和Linux共存于一台计算机时,这里通常用于存放DOS 文件系统。

    /etc
    用于存放本地机的配置文件。一些大型套件,如X11,在 /etc 下它们自己的子目录。系统配置文件可以放在这里或在 /usr/etc。 不过所程序总是在 /etc 目录下查找所需的配置文件,你也可以将这些文件链接到目录 /usr/etc.

    /etc/skel
    当建立一个新用户账号时,此目录下的文件通常被复制到用户的主目录下。

    /etc/X11X11
    window system所需的配置文件。

    /home
    在Linux机器上,用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。

    /lib
    此目录下包含系统引导和在根用户执行命令所必需用到的共享库。

    /mnt
    挂载临时文件系统的挂载点。

    /proc
    这是提供运行过程和核心文件系统 proc 挂载点。这一”伪”文件系统在以下章节中详细叙述 proc(5)。

    /sbin
    类似于 /bin 此目录保存了系统引导所需的命令,但这些命令一般使用者不能执行。

    /tmp
    此目录用于保存临时文件,临时文件在日常维护或在系统启动时无需通知便可删除

    /usr
    此目录通常用于从一个独立的分区上挂载文件。它应保存共享只读类文件,这样它可以被运行Linux的不同主机挂载。

    /usr/X11R6
    X-Window系统 Version 11 release 6.

    /usr/X11R6/bin
    X-Windows系统使用的二进制文件;通常是在对更传统的 /usr/bin/X11 中文件的符号连接。

    /usr/X11R6/lib
    保存与X-Windows系统关数据文件。

    /usr/X11R6/lib/X11
    此目录保存与运行X-Windows系统关其他文件。通常是对来自 /usr/lib/X11 中文件的符号连接。

    /usr/X11R6/include/X11
    此目录保存包括使用X11窗口系统进行编译程序所需的文件。通常是对来 /usr/lib/X11 中文件的符号连接。

    /usr/bin
    这是执行程序的主要目录,其中的绝大多数为一般使用者使用,除了那些启动系统或修复系统或不是本地安装的程序一般都放在此目录下。

    /usr/bin/X11
    X11执行文件放置的地方;在Linux系统中,它通常是对 /usr/X11R6/bin. 符号连接表

    /usr/dict
    此目录保存拼写检查器所使用的词汇表文件。

    /usr/doc
    此目录下应可以找到那些已安装的软件文件。

    /usr/etc
    此目录可用来那些存放整个网共享的配置文件。然而那可执行命令指向总是使用参照使用 /etc 目录下的文件。 /etc 目录下连接文件应指向 /usr/etc. 目录下适当的文件。

    /usr/include
    C程序语言编译使用的Include”包括”文件。

    /usr/include/X11
    C程序语言编译和X-Windows系统使用的 Include”包括”文件。它通常中指向 /usr/X11R6/include/X11. 符号连接表。

    /usr/include/asm
    申明汇编函数的Include”包括”文件,它通常是指向 /usr/src/linux/include/asm 目录的符号连接

    /usr/include/linux
    包含系统变更的信息通常是指向 /usr/src/linux/include/linux 目录的符号连接表,来获得操作系统特定信息。
    (注:使用者应在此自行包含那些保证自己开发的程序正常运行所需的libc 函数库。不管怎样,Linux核心系统不是设计用来执行直接运行用户程序的,它并不知道用户程序需要使用哪个版本的libc库 。如果你随意将 /usr/include/asm 和 /usr/include/linux 指向一个系统核心,系统很可能崩溃。Debian系统不这么做。它使用 libc*-dev运行包中提供的核心系统标识,以保证启动所正确的文件。)

    /usr/include/g++
    GNU C++编译程序所使用的Include”包括”文件。

    /usr/lib
    目标库文件,包括动态连接库加上一些通常不是直接调用的可执行文件案。一些复杂的程序可能在此占用整个子目录。

    /usr/lib/X11
    存放X系统数据文件及系统配置文件的地方。 Linux中通常是指向 /usr/X11R6/lib/X11 目录的符号连接表。

    /usr/lib/gcc-lib
    GNU C 编译程序所使用的可执行文件案和”包括”文件。 gcc(1).

    /usr/lib/groff
    GNU groff 文件格式系统所使用的文件。

    /usr/lib/uucp
    uucp(1) 所使用的文件。

    /usr/lib/zoneinfo
    关时区信息文件文件。

    /usr/local
    安装在本地执行程序的地方。

    /usr/local/bin
    在此地放置本地执行程序的二进制文件。

    /usr/local/doc
    放置本地文件。

    /usr/local/etc
    安装在本地程序的配置文件。

    /usr/local/lib
    安装在本地程序的库文件。

    /usr/local/info
    安装在本地程序关信息文件。

    /usr/local/man
    安装在本地程序使用手册。

    /usr/local/sbin
    安装在本地的系统管理程序。

    /usr/local/src
    安装在本地程序的原始码。

    /usr/man
    手册页通常放在此目录,或相关子目录下。

    /usr/man//man[1-9]
    此目录在指定的地方以原始码形式存放手册页。系统在所的手册页中使用自己独特的语言及代码集,可能会省略 substring 子字符串。

    /usr/sbin
    此目录保存系统管理程序的二进制码,这些文件不是系统启动或文件系统挂载 /usr 目录或修复系统所必需的。

    /usr/share
    在此目录下不同的子目录中保存了同一个操作系统在不同构架下工作时特定应用程序的共享数据。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目录下的这些数据。

    /usr/src
    系统不同组成部份的源文件包括参考数据报。不要将你自己与项目关的文件放这里,因为在安装软件外,/usr下的文件属性除通常设为只读。

    /usr/src/linux
    系统核心资源通常拆包安装于此。这是系统中重要的一环,因为 /usr/include/linux 符号连接表指向此目录。你应当使用其他目录来来编译建立新核心。

    /usr/tmp
    此目录不再使用了。它应指向目录 /var/tmp。 这个链接只是出于系统兼容的目的,一般不再使用。

    /var
    此目录下文件的大小可能会改变,如缓冲文件可日志文件。

    /var/adm
    此目录为 /var/log 甩替代,通常是指向 /var/log 的符号连接表。

    /var/backups
    此目录用来存放重要系统文件的后备文件

    /var/catman/cat[1-9] or /var/cache/man/cat[1-9]
    此目录存储根据手册分类预先格式化的参考手册页。(这些参考手册页是相互独立的)

    /var/lock
    此目录存储锁定文件。依据命名习惯,设备锁定文件是 LCKxxxxx xxxxx与在文件系统中该设备名相同,使用的格式是HDU UUCP锁定文件,例如包含进程标识PID的锁定文件是一个10字节的ASCII格式的数字,后面跟一个换行符。

    /var/log
    各种日志文件。

    /var/preserve
    这是 vi(1) 存放正在编辑中的文件,以便以后可以恢复。

    /var/run
    运行时的变量文件,如存放进程标识和登入使用者信息的文件。 (utmp) 此目录下文件在系统启动时被自动清除。

    /var/spool
    各种程序产生的缓冲或排除等待的文件

    /var/spool/at
    at(1) 的作业存缓区

    /var/spool/cron
    cron(1) 的作业存缓区

    /var/spool/lpd
    打印缓存文件。

    /var/spool/mail
    使用者邮箱。

    /var/spool/smail
    存放 smail(1) 邮件发送程序的缓冲文件。

    /var/spool/news
    新闻子系统的缓冲目录

    /var/spool/uucp
    uucp(1) 的缓冲文件

    /var/tmp
    类似 /tmp, 此目录保存未指定持续时间的临时文件。

    参考网址
    http://www.linuxsense.org/archives/9227.html#more-9227
    http://www.myefly.net/linux-dir-fun

    更多相关内容
  • [ linux ] 文件系统目录结构详解

    千次阅读 多人点赞 2021-12-07 20:29:21
    一、linux文件结构介绍 1、Linux目录结构的特点 Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。...Linux的虚拟文件系统允许众多不同类型的文件系统共存,并支持

    昨天,有个小学弟了我一个linux面试题目,和她解答完之后我就想在C站开一个专栏,用于linux和windows的学习

    我是这么想的,从linux入手,再写windows,最后总结常见区别

    本文主要写了linux的文件结构介绍、linux文件系统的介绍、linux文件系统的基本操作,快捷键,通配符等等

    下篇文章会写都文件的具体操作命令

    目录

    一、linux文件结构介绍

    1、Linux目录结构的特点

    2. Linux目录结构

    常见:

    补充:

    二、Linux文件系统介绍

    1. 索引介绍:

    2. Linux链接介绍

    1. 硬链接:

    2. 软连接(符号链接):

    三、linux文件系统操作

    1. 文件的基本概念

    文件取名必须遵守以下规则:

    2. Linux系统下的通配符(20个)

    3. Linux系统下的常用快捷操作(七个)

    四、专栏分享


    一、linux文件结构介绍

    1、Linux目录结构的特点

    Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。

    微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。

    但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树型目录不一定是并列的。

    Linux的虚拟文件系统允许众多不同类型的文件系统共存,并支持跨文件系统的操作。

    Linux的文件是无结构字符流式文件,不考虑文件内部的逻辑结构,只把文件简单地看作是一系列字符的序列。

    Linux的文件可由文件拥有者或超级用户设置相应的访问权限而收到保护。

    Linux把所有的外部设备都看作文件,可以使用与文件系统相同的系统调用来读写外部设备。

    2. Linux目录结构

    常见:

     /:是所有文件的根目录;

    /bin:存放二进制可执行命令目录;

    /home:用户主目录的基点目录,默认情况每个用户主目录都设在该目录下,如默认:用户user01的主目录是/home/user01,可用~user01表示

    /lib:存放标准程序设计库目录,又叫动态链接共享库目录,目录中文件类似windows里的后缀名为dll的文件;

    /etc:存放系统管理和配置文件目录;

    /dev:存放设备特殊文件目录,如声卡文件,磁盘文件等;

    /usr:最庞大的目录,存放应用程序和文件目录;

    /proc:虚拟目录,是系统内存的映射,可直接访问这个目录来获取系统信息;

    /root:系统管理员的主目录(特权阶级)

    /var:存放系统产生的经常变化文件的目录,例如打印机、邮件等假脱机目录、日志文件、格式化后的手册页以及一些应用程序的数据文件等;

    /tmp:存放公用临时文件目录。

    补充:

    /etc/rc.d 启动的配置文件和脚本

    /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序

    /mnt 系统提供这个目录是让用户临时挂载其他的文件系统。

    /lost+found 这个目录平时是空的,用于存放系统非正常关机而留下未保存的文件

    /usr其中包含:

    /usr/X11R6 存放X window的目录

    /usr/bin 众多的应用程序

    /usr/sbin 超级用户的一些管理程序

    /usr/doc linux文档

    /usr/include linux下开发和编译应用程序所需要的头文件

    /usr/lib 常用的动态链接库和软件包的配置文件

    /usr/man 帮助文档

    /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里

    /usr/local/bin 本地增加的命令

    /usr/local/lib 本地增加的库

    二、Linux文件系统介绍

    文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。

    linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。

    一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。

    1. 索引介绍:

    Llinux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。

    索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。

    一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。

    系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。

    linux文件系统将文件索引节点号和文件名同时保存在目录中。

    所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。

    对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。

    因此,在磁盘上的同一个文件可以通过不同的路径去访问它。

    2. Linux链接介绍

      可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。

    1. 硬链接:

    原文件名和链接文件名都指向相同的物理地址。

    目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)

    文件在磁盘中只有一个拷贝,节省硬盘空间;

    由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除。

    2. 软连接(符号链接):

    符号连接:用ln -s命令建立文件的符号连接符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。

    可以删除原有的文件而保存连接文件,没有防止误删除功能。

    三、linux文件系统操作

    1. 文件的基本概念

    在linux中,一切皆文件。文件是由创建者定义的,具有文件名的一组相关元素的集合,文件可以是文本文档、图片、程序等。

    Linux系统下文件名长度根据不同类型文件系统有所不同。

    文件取名必须遵守以下规则:

    1. 除“/”外,所有字符都可使用;

    2. 转义字符最好不用,如“ ? ”," * "(星号)," "(空格),“ $ ”,“ & ”等;

    3. 避免使用“ + ”,“ - ”或“ . ”作为普通文件名的第一个字符(在Linux下以“ . ”开头的文件都是隐藏文件);

    4. Linux系统的文件名大小写敏感。

    2. Linux系统下的通配符(20个)

    *  :通配符,代表任意字符(0到多个)

    ?:通配符,代表一个字符

    #  :注释

    \   :转义符号,将特殊字符或通配符还原成一般符号

    |   :分割两个管线命令的界定


    ;   :连续性命令的界定

    ~  :用户的根目录

    $  :变量前需要加的变量值

    !   :逻辑运算中的“非”

    /   :路径分割符号


    >  :输出导向,分别为“取代”和“累加”

    >>:输出导向,分别为“取代”和“累加”

    '   :不具有变量置换功能

    "   :具有变量置换功能

    `   :quote符号,两个`中间为可以先执行的指令


    ()  :中间为子shell的起始与结束

    []  :中间为字符组合

    {}  :中间为命令区块组合

    &&:当该符号前一个指令执行成功时,执行后一个指令

    ||   :当该符号前一个指令执行失败时,执行后一个指令

    3. Linux系统下的常用快捷操作(七个)

    Ctrl+C:终止当前命令

    Ctrl+D:输入结束

    Ctrl+M:相当于Enter

    Ctrl+S:暂停屏幕的输出

    Ctrl+Q:恢复屏幕的输出

    Ctrl+U:在提示符下,将整行命令删除

    Ctrl+Z:暂停当前命令

    四、[ linux ] linux 文件操作详解

    直接点击链接看详细解读


    1. 显示文件内容(6个):cat、more、less、head、tail

    2. 搜索、排序、去重(三个):grep、sort、uniq

    3. 比较(两个):comm、diff

    4. 复制、删除、移动(三个):cp、rm、mv

    5. 统计(一个):wc

    6. 查找(一个):find

    7. 压缩解压缩(三个):bzip2、gzip、tar


    五、[ linux ] linux 目录操作详解

    直接点击链接看详细解读


    1. 切换工作目录和显示当前目录(3个):cd、pwd、ls

    2. 创建和新建目录(2个):mkdir、rmdir

    3. 改变文件或目录存取权限命令(1个):权限概念、文件长格式解读、chmod

    4. 改变用户组和文件组(2个):chgrp、chown

    5. 链接文件(1个):ln


    六、专栏分享

    推荐阅读:[ linux ] linux 目录操作详解

                      [ linux ] linux 文件操作详解

                      [ 渗透入门篇 ] 渗透行业必备术语大集合(一)

                      [ 应急响应 ]服务器(电脑)受到攻击该如何处理?(一)

    每个专栏都在持续更新中~~~

    渗透测试自学篇

    网络基础

    web基础知识点

    操作系统篇

    python爬虫

    闲聊

    面试总结

    python

    通讯安全

    靶场

    展开全文
  • 文件系统目录结构

    千次阅读 2018-09-14 16:22:54
      Linux以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是...不同于纯粹的ext2之类的文件系统,我把它称为文件体系,一切...

      Linux以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。而这些种类繁多的文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。不同于纯粹的ext2之类的文件系统,我把它称为文件体系,一切皆文件和文件目录树的资源管理方式一起构成了Linux的文件体系,让Linux操作系统可以方便使用系统资源。

    一、文件系统概述

    1、linux文件系统模型

      由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层。
    这里写图片描述

    2、文件I/O与标准I/O

      文件IO又被称为不带缓冲的IO,“不带缓冲“是指每个读写操作都调用系统内核的一个系统调用。文件IO与标准IO的区别在于:

    • 标准IO默认采用缓冲机制,打开文件的同时,在内存中建立一个缓冲区;而文件IO一般不会建立缓冲区,需要手动创建;
    • 标准IO针对的是控制台、打印输出到屏幕等;文件IO主要是对文件操作、读写硬盘等;
    • 标准IO是跨平台的,二文件IO只适用于Unix/Linux平台。

    3、文件描述符

      对内核而言,所打开的文件都是通过文件描述符引用,当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符,该文件描述符对文件进行读写操作。
      通过将文件描述符0与标准输入相关联,将文件描述符1与标准输出相关联,将文件描述符2与标准错误相关联(STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO)。

    4、缓冲机制

      基于流的操作最终都会以系统调用的形式进行IO操作,为了通过程序的运行效率,流对象通常会提供缓冲区,以减少系统调用的次数。

    1. 全缓冲:直到缓冲区被填满,才调用系统IO函数。

    2. 行缓冲:直到遇到换行符’\n’,才调用系统IO函数。

    3. 无缓冲:没有缓冲区,数据立即读入或者输出到外存文件或设备上。

    二、文件类型

      UNIX系统的大多数文件是普通文件或目录,但是也有另外一些文件类型。文件类型包括如下几种:

    1、普通文件(-)

    • 从Linux的角度来说,类似mp4、pdf、html这样应用层面上的文件类型都属于普通文件;
    • Linux用户可以根据访问权限对普通文件进行查看、更改和删除。

    2、目录文件(d,directory file)

    • 目录文件对于用惯Windows的用户来说不太容易理解,目录也是文件的一种;
    • 目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问权限,你就可以随意访问这些目录下的文件(普通文件的执行权限就是目录文件的访问权限),但是只有内核的进程能够修改它们;
    • 虽然不能修改,但是我们能够通过vim去查看目录文件的内容。

    3、块设备文件(b,block)和字符设备文件(c,char)

    • 这些文件一般隐藏在/dev目录下,在进行设备读取和外设交互时会被使用到;
    • 比如磁盘光驱就是块设备文件,串口设备则属于字符设备文件;
    • 系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外。

    4、符号链接(l,symbolic link)

    • 这种类型的文件类似Windows中的快捷方式,是指向另一个文件的间接指针,也就是我们常说的软链接。

    5、FIFO(p,pipe)

    • 管道文件主要用于进程间通讯。比如使用mkfifo命令可以创建一个FIFO文件,启用一个进程A从FIFO文件里读数据,启动进程B往FIFO里写数据,先进先出,随写随读。

    6、套接字(s,socket)

    • 用于进程间的网络通信,也可以用于本机之间的非网络通信;
    • 这些文件一般隐藏在/var/run目录下,证明着相关进程的存在。

    使用ls -l 命令 也可以查看文件的类型:

    # ls -l
    总用量 40
    drwxr-xr-x 2 root   root    4096 Mar 30 16:42 test
    -rw-r--r-- 1 root   root     872 Mar 30 15:04 test.c
    

    三、文件系统结构与工作原理

      ext4文件系统的结构:
    这里写图片描述

    引导块:为磁盘分区的第一个块,记录文件系统分区的一些信息,,引导加载当前分区的程序和数据被保存在这个块中,一般占用2kB。

    超级块:用于存储文件系统全局的配置参数(譬如:块大小,总的块数和inode数)和动态信息(譬如:当前空闲块数和inode数),其处于文件系统开始位置的1k处,所占大小为1k。为了系统的健壮性,最初每个块组都有超级块和组描述符表(以下将用GDT)的一个拷贝,但是当文件系统很大时,这样浪费了很多块(尤其是GDT占用的块多),后来采用了一种稀疏的方式来存储这些拷贝,只有块组号是3, 5 ,7的幂的块组(譬如说1,3,5,7,9,25,49…)才备份这个拷贝。通常情况下,只有主拷贝(第0块块组)的超级块信息被文件系统使用,其它拷贝只有在主拷贝被破坏的情况下才使用。

    块组描述符:GDT用于存储块组描述符,其占用一个或者多个数据块,具体取决于文件系统的大小。它主要包含块位图,inode位图和inode表位置,当前空闲块数,inode数以及使用的目录数(用于平衡各个块组目录数),具体定义可以参见ext3_fs.h文件中struct ext3_group_desc。每个块组都对应这样一个描述符,目前该结构占用32个字节,因此对于块大小为4k的文件系统来说,每个块可以存储128个块组描述符。由于GDT对于定位文件系统的元数据非常重要,因此和超级块一样,也对其进行了备份。GDT在每个块组(如果有备份)中内容都是一样的,其所占块数也是相同的。从上面的介绍可以看出块组中的元数据譬如块位图,inode位图,inode表其位置不是固定的,当然默认情况下,文件系统在创建时其位置在每个块组中都是一样的,如图2所示(假设按照稀疏方式存储,且n不是3,5,7的幂)

    块组:每个块组包含一个块位图块,一个 inode 位图块,一个或多个块用于描述 inode 表和用于存储文件数据的数据块,除此之外,还有可能包含超级块和所有块组描述符表(取决于块组号和文件系统创建时使用的参数)。下面将对这些元数据作一些简要介绍。

    块位图:块位图用于描述该块组所管理的块的分配状态。如果某个块对应的位未置位,那么代表该块未分配,可以用于存储数据;否则,代表该块已经用于存储数据或者该块不能够使用(譬如该块物理上不存在)。由于块位图仅占一个块,因此这也就决定了块组的大小。

    Inode位图:Inode位图用于描述该块组所管理的inode的分配状态。我们知道inode是用于描述文件的元数据,每个inode对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去;否则可以使用。由于其仅占用一个块,因此这也限制了一个块组中所能够使用的最大inode数量。

    Inode表:Inode表用于存储inode信息。它占用一个或多个块(为了有效的利用空间,多个inode存储在一个块中),其大小取决于文件系统创建时的参数,由于inode位图的限制,决定了其最大所占用的空间。

    以上这几个构成元素所处的磁盘块成为文件系统的元数据块,剩余的部分则用来存储真正的文件内容,称为数据块,而数据块其实也包含数据和目录。

    读取文件的过程:

    1. 根据文件所在目录的inode信息,找到目录文件对应数据块;

    2. 根据文件名从数据块中找到对应的inode节点信息;

    3. 从文件inode节点信息中找到文件内容所在数据块块号;

    4. 读取数据块内容。

    这里写图片描述

    四、目录结构

    / (root 文件系统) : root 文件系统是文件系统的顶级目录。它必须包含在挂载其它文件系统前需要用来启动 Linux 系统的全部文件。它必须包含需要用来启动剩余文件系统的全部可执行文件和库。文件系统启动以后,所有其他文件系统作为 root 文件系统的子目录挂载到标准的、预定义好的挂载点上。

    /bin :目录包含用户的可执行文件。

    /boot:包含启动 Linux 系统所需要的静态引导程序和内核可执行文件以及配置文件。

    /dev:该目录包含每一个连接到系统的硬件设备的设备文件。这些文件不是设备驱动,而是代表计算机上的每一个计算机能够访问的设备。

    /etc:包含主机计算机的本地系统配置文件。

    /home:主目录存储用户文件,每一个用户都有一个位于 /home 目录中的子目录(作为其主目录)。

    /lib:包含启动系统所需要的共享库文件。

    /media:一个挂载外部可移动设备的地方,比如主机可能连接了一个 USB 驱动器。

    /mnt:一个普通文件系统的临时挂载点(如不可移动的介质),当管理员对一个文件系统进行修复或在其上工作时可以使用。

    /opt:可选文件,比如供应商提供的应用程序应该安装在这儿。

    /sbin:系统二进制文件。这些是用于系统管理的可执行文件。

    /tmp:临时目录。被操作系统和许多程序用来存储临时文件。用户也可能临时在这儿存储文件。注意,存储在这儿的文件可能在任何时候在没有通知的情况下被删除。

    /usr:该目录里面包含可共享的、只读的文件,包括可执行二进制文件和库、man 文件以及其他类型的文档。

    /var:可变数据文件存储在这儿。这些文件包括日志文件、MySQL 和其他数据库的文件、Web 服务器的数据文件、邮件以及更多。

    五、与目录结构相关的函数

    struct stat
    {
    	dev_t         st_dev;      //文件的设备编号
        ino_t         st_ino;      //节点
        mode_t        st_mode;     //文件的类型和存取的权限
        nlink_t       st_nlink;    //连到该文件的硬连接数目,刚建立的文件值为1
        uid_t         st_uid;       //用户ID
        gid_t         st_gid;       //组ID
        dev_t         st_rdev;   //若此文件为设备文件,则为其设备编号
        off_t         st_size;      //文件字节数(文件大小)
        unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
        unsigned long st_blocks;    //块数
        time_t        st_atime;     //最后一次访问时间
        time_t        st_mtime;     //最后一次修改时间
        time_t        st_ctime;     //最后一次改变时间(指属性)
    };
    
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
    /*
    功能:通过文件名file_name获取文件信息,并保存在buf所指的结构体stat中。
    返回值:执行成功则返回0,失败返回-1。
    */
    int stat(const char *file_name, struct stat *buf);
    
    /*
    功能:打开一个目录。
    返回值:成功则返回DIR*型态的目录流, 打开失败则返回NULL。
    */
    DIR* opendir(constchar * path );
    
    /*
    功能:读取目录,需要循环读取dp中的文件和目录,
    	每读取一个文件或目录都返回一个dirent结构体指针。
    返回值:dirent结构体指针。
    */
    struct dirent* readdir(DIR* dp);  
    
    /*
    功能:用来设置参数dp目录流目前的读取位置为原来开头的读取位置。
    */
    void rewinddir(DIR *dp);
    
    /*
    功能:关闭参数dp所指的目录流。
    返回值:关闭成功则返回0,,失败返回-1。
    */
    int closedir(DIR*dp);
    
    /*
    功能:获取当前dp位置。
    返回值:返回目录流dp的当前位置,
    		此返回值代表距离目录文件开头的偏移量,有错误发生时返回-1。
    */
    long int telldir(DIR *dp);
    
    /*
    功能:用来设置参数dp目录流当前的读取位置,在调用readdir()时便从此
    	新位置开始读取。参数loc代表距离目录文件开头的偏移量。
    */
    void seekdir(DIR *dp,long int loc);
    

    【Demo(遍历目录下的所有文件和文件夹)】:

    #include <stdio.h>
    #include <dirent.h>
    #include <sys/types.h>
    int main(int argc, char *argv[])
    {    
    	if (2 != argc)    
    	{        
    		printf("Usage: ListFile SourceFolder ");
    		return 1;    
    	}    
    	DIR* pDir = NULL;    
    	struct dirent* ent = NULL;    
    	pDir = opendir(argv[1]);    
    	if (NULL == pDir)
    	{        
    		printf("Source folder not exists!");
    		return 1;    
    	}    
    	while (NULL != (ent=readdir(pDir)))    
    	{      
    	    printf("%s ", ent->d_name);  
    	}    
    	closedir(pDir);  
    	pDir = NULL;    
    	ent = NULL;    
    	return 1;
    }
    

    参考:https://blog.csdn.net/xingyue0422/article/details/78395858
    https://www.cnblogs.com/bellkosmos/p/detail_of_linux_file_system.html
    https://blog.csdn.net/new0801/article/details/63687127
    https://blog.csdn.net/iteye_19319/article/details/81396884
    https://blog.csdn.net/yuan_hong_wei/article/details/50324667

    展开全文
  • Linux文件系统目录结构详解

    万次阅读 2017-10-08 13:09:34
    对于每一个Linux学习者来说,了解Linux文件系统目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux...

    引言

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux目录结构的相关知识。

    在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。

    linux文件系统的最顶端是/,我们称/为Linux的root(根目录),也就是 Linux操作系统的文件系统。Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

    FHS诞生

    谈到目录结构,不得不首先了解一下FHS团队的来由。
    由于linux是开放源代码,最开始各大公司和团体根据linux的核心代码做各自的操作,编程。这样就造成在根下的目录的不同。这样就造成个人不能使用他人的linux系统的PC。因为你根本不知道一些基本的配置,文件在哪里,这就造成了混乱。这就是FHS(Filesystem Hierarchy Standard )机构诞生的原因。该机构是linux爱好者自发的组成的一个团体,主要是是对linux做一些基本的要求,不至于是操作者换一台主机就成了linux的‘文盲’。
    根据FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。
    事实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:
     
    可分享的(shareable)
    不可分享的(unshareable)
    不变的(static)
    /usr (软件放置处)
    /etc (配置文件)
    /opt (第三方协力软件)
    /boot (开机与核心档)
    可变动的(variable)
    /var/mail (使用者邮件信箱)
    /var/run (程序相关)
    /var/spool/news (新闻组)
    /var/lock (程序相关)
    四中类型:
    1. 可分享的:
    可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
    2. 不可分享的:
    自己机器上面运作的装置文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
    3. 不变的:
    有些数据是不会经常变动的,跟随着distribution而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;
    4. 可变动的:
    经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。
    事实上,FHS针对目录树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:
    / (root, 根目录):与开机系统有关;
    /usr (unix software resource):与软件安装/执行有关;
    /var (variable):与系统运作过程有关。

    根目录 (/) 的意义与内容

    根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、 函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区, 因为越大的分区内你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。
    因此FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。说白了,就是根目录和Windows的C盘一个样。
    根据以上原因,FHS认为根目录(/)下应该包含如下子目录:
    目录
    应放置档案内容
    /bin
    系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat, chmod(修改权限) , chown, date, mv, mkdir, cp, bash等等常用的指令。
    /boot
    主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。
    /dev
    在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等
    /etc
    系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 FHS建议不要放置可执行档(binary)在这个目录中。 比较重要的档案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目录有:/etc/init.d/ :所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop
    /etc/xinetd.d/ :这就是所谓的super daemon管理的各项服务的设定档目录。
    /etc/X11/ :与X Window有关的各种设定档都在这里,尤其是xorg.conf或XF86Config这两个X Server的设定档。
    /home
    这是系统预设的使用者家目录(home directory)。 在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号:
    ~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。
    /lib
    系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。
    /media
    media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy, /media/cdrom等等。
    /mnt
    如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦。 只是有了/media之后,这个目录就用来暂时挂载用了。
    /opt
    这个是给第三方协力软体放置的目录 。 什么是第三方协力软体啊?举例来说,KDE这个桌面管理系统是一个独立的计画,不过他可以安装到Linux系统中,因此KDE的软体就建议放置到此目录下了。 另外,如果妳想要自行安装额外的软体(非原本的distribution提供的),那么也能够将你的软体安装到这里来。 不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
    /root
    系统管理员(root)的家目录。 之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。
    /sbin
    Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些伺服器软体程式,一般则放置到/usr/sbin/当中。至于本机自行安装的软体所产生的系统执行档(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。
    /srv
    srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。
    /tmp
    这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊。 因为FHS甚至建议在开机时,应该要将/tmp下的资料都删除。
    事实上FHS针对根目录所定义的标准就仅限于上表,不过仍旧有些目录也需要我们了解一下,具体如下:
    目录
    应放置文件内容
    /lost+found
    这个目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时,将一些遗失的片段放置到这个目录下。 这个目录通常会在分割槽的最顶层存在,例如你加装一个硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录/disk/lost+found
    /proc
    这个目录本身是一个虚拟文件系统(virtual filesystem)喔。 他放置的资料都是在内存当中,例如系统核心、行程资讯(process)(是进程吗?)、周边装置的状态及网络状态等等。因为这个目录下的资料都是在记忆体(内存)当中,所以本身不占任何硬盘空间。比较重要的档案(目录)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虚拟内存吗[guest]?
    /sys
    这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。
    除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分区则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录, 就不能够与根目录放到不同的分区去。那哪些目录不可与根目录分开呢?有底下这些:
    /etc:配置文件
    /bin:重要执行档
    /dev:所需要的装置文件
    /lib:执行档所需的函式库与核心所需的模块
    /sbin:重要的系统执行文件
    这五个目录千万不可与根目录分开在不同的分区。

    /usr 的意义与内容

    依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何透过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网络内的其他主机来使用喔。
    /usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据啦。这点要注意。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。
    因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows 系统的C:\Windows\ + C:\Program files\这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。 一般来说,/usr的次目录建议有底下这些:
    目录
    应放置文件内容
    /usr/X11R6/
    为X Window System重要数据所放置的目录,之所以取名为X11R6是因为最后的X版本为第11版,且该版的第6次释出之意。
    /usr/bin/
    绝大部分的用户可使用指令都放在这里。请注意到他与/bin的不同之处。(是否与开机过程有关)
    /usr/include/
    c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档。
    /usr/lib/
    包含各应用软件的函式库、目标文件(object file),以及不被一般使用者惯用的执行档或脚本(script)。 某些软件会提供一些特殊的指令来进行服务器的设定,这些指令也不会经常被系统管理员操作, 那就会被摆放到这个目录下啦。要注意的是,如果你使用的是X86_64的Linux系统, 那可能会有/usr/lib64/目录产生
    /usr/local/
    统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦。 你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib...的次目录
    /usr/sbin/
    非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)
    /usr/share/
    放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文本文件嘛。在此目录下常见的还有这些次目录:/usr/share/man:联机帮助文件
    /usr/share/doc:软件杂项的文件说明
    /usr/share/zoneinfo:与时区有关的时区文件
    /usr/src/
    一般原始码建议放置到这里,src有source的意思。至于核心原始码则建议放置到/usr/src/linux/目录下。

    /var 的意义与内容

    如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的文件,包括缓存(cache)、登录档(log file)以及某些软件运作所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。常见的次目录有:
    目录
    应放置文件内容
    /var/cache/
    应用程序本身运作过程中会产生的一些暂存档
    /var/lib/
    程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去
    /var/lock/
    某些装置或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置时, 就可能产生一些错误的状况,因此就得要将该装置上锁(lock),以确保该装置只会给单一软件所使用。 举例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机烧片? 如果两个人同时刻录,那片子写入的是谁的数据?所以当第一个人在刻录时该刻录机就会被上锁, 第二个人就得要该装置被解除锁定(就是前一个人用完了)才能够继续使用
    /var/log/
    非常重要。这是登录文件放置的目录。里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等。
    /var/mail/
    放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中,通常这两个目录是互为链接文件。
    /var/run/
    某些程序或者是服务启动后,会将他们的PID放置在这个目录下
    /var/spool/
    这个目录通常放置一些队列数据,所谓的“队列”就是排队等待其他程序使用的数据。 这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中, 但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中。
    由于FHS仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的文件或目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。

    目录树(directory tree)

    在Linux底下,所有的文件与目录都是由根目录开始的。那是所有目录与文件的源头, 然后再一个一个的分支下来,因此,我们也称这种目录配置方式为:目录树(directory tree), 这个目录树的主要特性有:
    目录树的启始点为根目录 (/, root);
    每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。
    每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
    如果我们将整个目录树以图的方法来显示,并且将较为重要的文件数据列出来的话,那么目录树架构就如下图所示:

    以下是对这些目录的解释:

    /:根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。


    /bin:/usr/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。例如cp、ls、cat,等等。


    /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。


    /dev :dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备文件,在Linux中访问设备的方式和访问文件的方式是相同的。访问该目录下某个文件,相当于访问某个设备,其功能类似DOS下的.sys和Win下的.vxd。例如:/dev/hda代表第一个物理IDE硬盘。常用的是挂载光驱mount /dev/cdrom /mnt。


    /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前记得备份。注:/etc/X11存放与x windows有关的设置。


    /home:用户的主目录,在Linux中,系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,比如说有个用户叫zhong,那他的主目录就是/home/zhong也可以用~zhong表示。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。


    /lib:/usr/lib:/usr/local/lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules。


    /lost+found:这个目录一般情况下是空的,当系统不正常关机后,这里就成了一些无家可归的文件的避难所。对了,有点类似于DOS下的.chk文件。系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found


    /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。


    /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。


    /opt:这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下。


    /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等。这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


    /root:该目录为系统管理员,也称作超级权限者的用户主目录。系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。


    /sbin:/usr/sbin:/usr/local/sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。


    /selinux:这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。


    /srv:该目录存放一些服务启动之后需要提取的数据。服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。


    /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。


    /tmp:这个目录是用来存放一些临时文件的。一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。


    /var:这个目录中存放着在不断扩充着的东西,包括各种日志文件。为了保持/usr的相对稳定,那些经常被修改的目录可以放在这个目录下,实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在/var/log目录中。放置系统执行过程中经常变化的文件,如随时更改的日志文件/var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。建议单独分区,设置较大的磁盘空间。


    /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。应用程序存放目录,/usr/bin存放应用程序,/usr/share存放共享数据,/usr/lib存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local:存放软件升级包。/usr/share/doc:系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容建议单独分区,设置较大的磁盘空间。


    绝对路径与相对路径


    除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意。因为根据档名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。 这两种文件名/路径的写法依据是这样的:
    绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;
    相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 http://www.cnblogs.com/home/dmtsai/ 等等。反正开头不是 / 就属于相对路径的写法
    而你必须要了解,相对路径是以你当前所在路径的相对位置来表示的。举例来说,你目前在 /home 这个目录下, 如果想要进入 /var/log 这个目录时,可以怎么写呢?
    cd /var/log (absolute)
    cd ../var/log (relative)
    因为你在 /home 底下,所以要回到上一层 (../) 之后,才能继续往 /var 来移动的,特别注意这两个特殊的目录:
    . :代表当前的目录,也可以使用 ./ 来表示;
    .. :代表上一层目录,也可以 ../ 来代表。
    这个 . 与 .. 目录概念是很重要的,你常常会看到 cd .. 或 ./command 之类的指令下达方式, 就是代表上一层与目前所在目录的工作状态。
    如果一个目录或文件名以一个点 . 开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。即以默认方式查找时,不显示该目录或文件。ls -a 能看见所有目录或文件(包括隐藏的)。
    实例1:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?
    命令:
    cd /var/spool/mail
    cd ../cron
    说明:
    由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中。如此就不需要在由根目录开始写起了。这个相对路径是非常有帮助的,尤其对于某些软件开发商来说。 一般来说,软件开发商会将数据放置到/usr/local/里面的各相对目录。 但如果用户想要安装到不同目录呢?就得要使用相对路径。
    实例2:网络文件常常提到类似 ./run.sh之类的数据,这个指令的意义为何?
    说明:
    由于指令的执行需要变量的支持,若你的执行文件放置在本目录,并且本目录并非正规的执行文件目录(/bin, /usr/bin等为正规),此时要执行指令就得要严格指定该执行档。./代表本目录的意思,所以./run.sh代表执行本目录下, 名为run.sh的文件。

    几个比较重要的目录


    在linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

    /etc: 这个目录相当重要,如前所述,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。你的开机与系统数据文件均在这个目录之下,因此当这个目录被破坏,那你的系统大概也就差不多该死掉了!而在往后的文件中,你会发现我们常常使用这个目录下的 /etc/rc.d/init.d 这个子目录,因为这个 init.d 子目录是开启一些 Linux 系统服务的 scripts的地方。而在 /etc/rc.d/rc.local 这个文件是开机的执行档。


    /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的,例如 root 常常使用的 userconf, netconf, perl, gcc, c++ 等等的数据都放在这几个目录中,所以如果你在提示字符下找不到某个执行档时,可以在这四个目录中查一查!其中, /bin, /usr/bin 是给系统用户(除root外的通用户)使用的指令,而 /sbin, /usr/sbin 则是给系统管理员使用的指令!


    /usr/local:这是系统预设的让你安装你后来升级的套件的目录。例如,当你发现有更新的 Web 套件(如 Apache )可以安装,而你又不想以 rpm 的方式升级你的套件,则你可以将 apache 这个套件安装在 /usr/local 底下。安装在这里有个好处,因为目前大家的系统都是差不多的,所以如果你的系统要让别人接管的话,也比较容易上手呀!也比较容易找的到数据!因此,如果你有需要的话,通常我都会将 /usr/local/bin 这个路径加到我的 path 中。

     
    /home:这个是系统将有账号的人口的家目录设置的地方。


    /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,不论是登入、各类服务的问题发生时的记录、以及常态性的服务记录等等的记录目录,所以当你的系统有问题时,就需要来这个目录记录的文件数据中察看问题的所在啰!另外mail的预设放置也是在这里。


    /usr/share/man, /usr/local/man:这两个目录为放置各类套件说明档的地方,例如你如果执行 man man,则系统会自动去找这两个目录下的所有说明文件。



    详解几个目录


    /dev:目录

    dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
    Linux沿袭Unix的风格,将所有设备认成是一个文件。
      设备文件分为两种:块设备文件(b)和字符设备文件(c)
      设备文件一般存放在/dev目录下,对常见设备文件作如下说明:
      /dev/hd[a-t]:IDE设备
      /dev/sd[a-z]:SCSI设备
      /dev/fd[0-7]:标准软驱
      /dev/md[0-31]:软raid设备
      /dev/loop[0-7]:本地回环设备
      /dev/ram[0-15]:内存
      /dev/null:无限数据接收设备,相当于黑洞
      /dev/zero:无限零资源
      /dev/tty[0-63]:虚拟终端
      /dev/ttyS[0-3]:串口
      /dev/lp[0-3]:并口
      /dev/console:控制台
      /dev/fb[0-31]:framebuffer
      /dev/cdrom => /dev/hdc
      /dev/modem => /dev/ttyS[0-9]
      /dev/pilot => /dev/ttyS[0-9]
      /dev/random:随机数设备
      /dev/urandom:随机数设备
      
      /dev目录下的节点是怎么创建的?  --->   devf或者udev会自动帮你创建得。
      kobject是sysfs文件系统的基础,udev通过监测、检测sysfs来获取新创建的设备的。

    /etc:目录

    包含很多文件.许多网络配置文件也在/etc 中
    ./etc/rc or /etc/rc.d or /etc/rc*.d :启动、或改变运行级时运行的scripts或scripts的目录.
    /etc/passwd:用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.
    /etc/fstab:启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表. Linux下,也包括用swapon -a启用的swap区的信息.
    /etc/group:类似/etc/passwd ,但说明的不是用户而是组.
    /etc/inittab:init 的配置文件.
    /etc/issue:getty 在登录提示符前的输出信息.通常包括系统的一段短说明或欢迎信息.内容由系统管理员确定.
    /etc/motd:Message Of The Day,成功登录后自动输出.内容由系统管理员确定.经常用于通告信息,如计划关机时间的警告.
    /etc/mtab:当前安装的文件系统列表.由scripts初始化,并由mount 命令自动更新.需要一个当前安装的文件系统的列表时使用,例如df 命令.
    /etc/shadow:在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对root可读.这使破译口令更困难.
    /etc/login.defs:login 命令的配置文件.
    /etc/printcap:类似/etc/termcap ,但针对打印机.语法不同.
    /etc/profile , /etc/csh.login , /etc/csh.cshrc:登录或启动时Bourne或C shells执行的文件.这允许系统管理员为所有用户建立全局缺省环境.
    /etc/securetty:确认安全终端,即哪个终端允许root登录.一般只列出虚拟控制台,这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权.
    /etc/shells:列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录.
    /etc/sysconfig:网络配置相关目录

    /proc: 目录

    档名 文件内容
    /proc/cmdline: 加载 kernel 时所下达的相关参数!查阅此文件,可了解系统是如何启动的!
    /proc/cpuinfo :本机的 CPU 的相关资讯,包含时脉、类型与运算功能等
    /proc/devices :这个文件记录了系统各个主要装置的主要装置代号,与 mknod 有关呢!
    /proc/filesystems: 目前系统已经加载的文件系统罗!
    /proc/interrupts :目前系统上面的 IRQ 分配状态。
    /proc/ioports :目前系统上面各个装置所配置的 I/O 位址。
    /proc/kcore :这个就是内存的大小啦!好大对吧!但是不要读他啦!
    /proc/loadavg:还记得 top 以及 uptime 吧?没错!上头的三个平均数值就是记录在此!
    /proc/meminfo :使用 free 列出的内存资讯,嘿嘿!在这里也能够查阅到!
    /proc/modules :目前我们的 Linux 已经加载的模块列表,也可以想成是驱动程序啦!
    /proc/mounts :系统已经挂载的数据,就是用 mount 这个命令呼叫出来的数据啦!
    /proc/swaps :到底系统挂加载的内存在哪里?呵呵!使用掉的 partition 就记录在此啦!
    /proc/partitions: 使用 fdisk -l 会出现目前所有的 partition 吧?在这个文件当中也有纪录喔!
    /proc/pci :在 PCI 汇流排上面,每个装置的详细情况!可用 lspci 来查阅!
    /proc/uptime: 就是用 uptime 的时候,会出现的资讯啦!
    /proc/version :核心的版本,就是用 uname -a 显示的内容啦!
    /proc/bus/* :一些汇流排的装置,还有 U盘 的装置也记录在此喔!

    /usr: 目录

    /usr :文件系统经常很大,因为所有程序安装在这里. /usr 里的所有文件一般来自Linux distribution;本地安装的程序和其他东西在/usr/local 下.这样可能在升级新版系统或新distribution时无须重新安装全部程序.
    /usr/etc: 存放设置文件
    /usr/games: 存放游戏和教学文件
    /usr/include :存放C开发工具的头文件
    /usr/share :存放结构独立的数据
    /usr/bin :几乎所有用户命令.有些命令在/bin 或/usr/local/bin 中.
    /usr/sbin :根文件系统不必要的系统管理命令,例如多数服务程序.
    /usr/share/man , /usr/share/info , /usr/share/doc: 手册页、GNU信息文档和各种其他文档文件.
    /usr/include: C编程语言的头文件.为了一致性这实际上应该在/usr/lib 下,但传统上支持这个名字.
    /usr/lib :程序或子系统的不变的数据文件,包括一些site-wide配置文件.名字lib来源于库(library); 编程的原始库存在/usr/lib 里.
    /usr/local :本地安装的软件和其他文件放在这里.
    /usr/src: 存放程序的源代码

    /var: 目录

    /var :包括系统一般运行时要改变的数据.每个系统是特定的,即不通过网络与其他计算机共享.
    /var/catman:当要求格式化时的man页的cache.man页的源文件一般存在/usr/man/man* 中;有些man页可能有预格式化的版本,存在/usr/man/cat* 中.而其他的man页在第一次看时需要格式化,格式化完的版本存在/var/man 中,这样其他人再看相同的页时就无须等待格式化了. (/var/catman 经常被清除,就象清除临时目录一样.)
    /var/lib :系统正常运行时要改变的文件.
    /var/local:/usr/local 中安装的程序的可变数据(即系统管理员安装的程序).注意,如果必要,即使本地安装的程序也会使用其他/var 目录,例如/var/lock .
    /var/lock:锁定文件.许多程序遵循在/var/lock 中产生一个锁定文件的约定,以支持他们正在使用某个特定的设备或文件.其他程序注意到这个锁定文件,将不试图使用这个设备或文件.
    /var/log:各种程序的Log文件,特别是login (/var/log/wtmp log所有到系统的登录和注销) 和syslog (/var/log/messages 里存储所有核心和系统程序信息. /var/log 里的文件经常不确定地增长,应该定期清除.
    /var/run:保存到下次引导前有效的关于系统的信息文件.例如, /var/run/utmp 包含当前登录的用户的信息.
    /var/spool:mail, news, 打印队列和其他队列工作的目录.每个不同的spool在/var/spool 下有自己的子目录,例如,用户的邮箱在/var/spool/mail 中.
    /var/tmp:比/tmp 允许的大或需要存在较长时间的临时文件. (虽然系统管理员可能不允许/var/tmp 有很旧的文件.)
    展开全文
  • Linux文件系统目录结构

    千次阅读 2020-10-07 15:39:54
    文章目录基本介绍Windows文件系统Linux文件系统具体的目录结构Linux目录小结 基本介绍 Windows文件系统 windows系统每个磁盘都有一个根目录结构,相当于森林。 Linux文件系统 linux的文件系统是采用级层式的树状...
  • Windows系统结构

    千次阅读 2020-12-07 19:38:34
    Windows系统结构 Windows系统结构,如图: Windows 采用了双模式结构来保护操作系统本身。操作系统核心运行在内核模式,应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块...
  • windows 系统cmd上查看目录结构

    千次阅读 2018-03-31 20:07:28
    dir:可以列出当前文件 使用tree命令生成树形结构 ... tree.txt命令,就可以把生成的文件目录树形结构写入到tree.txt文件中了,tree.txt这个文件名称是可以修改的。打开对应的文件目录,就可以看到多了一个tree.tx...
  • 理解 Linux 文件目录结构 01. 单用户操作系统和多用户操作系统(科普) 单用户操作系统:指一台计算机在同一时间 只能由一个用户 使用,一个用户独自享用系统的全部硬件和软件资源 Windows XP 之前的版本都是单...
  • Windows系统文件结构

    千次阅读 2017-03-17 19:25:32
    │ ├—system32(存放Windows系统文件和硬件驱动程序)  │ │ ├—config(用户配置信息和密码信息)  │ │ │ └—systemprofile(系统配置信息,用于恢复系统)  │ │ ├—drivers(用来存放硬件驱动...
  • 2)获取目录结构:在当前要操作的文件夹目录下输入命令tree,此时得到目录下树形的目录结构。默认情况下只显示“文件夹”而不显示文件。 3)在tree命令后面加入参数 /f 将以层次的结构显示所有文件夹及文件的名称 4...
  • 1、在目录中shift+右键,win10中用powershell打开窗口,win10以下应该是用命令行打开。...2、输入tree /f命令显示目录结构 3、输入tree /f &gt;&gt;1.txt,将目录结构写入1.txt文档 ...
  • 文件也属于系统资源,其就是一组有意义的信息、数据集合。 计算机中存放了各种各样的文件: 一个文件具有哪些属性? 文件内部的数据应该被怎样组织起来? 文件之间又应该怎么组织起来? 从下往上看Operation ...
  • Windows系统如何mount盘符到目录

    万次阅读 多人点赞 2019-08-31 10:58:50
    Windows上如何将一个文件系统分区挂载到一个目录,这其实是一个 硬需求! 是的,非常硬的需求。因为我们总是面临C盘,D盘满了却无法动态扩容问题。所以,在有一天我因为路上堵车撸了一个Linux上的最小的tinyfs之后...
  • Linux与Windows文件系统的差异比较

    万次阅读 2017-04-17 13:04:36
    而Linux的文件系统与我们所熟知的Windows文件系统的差别很大,主要体现在以下两个方面: 1.路径名分割符不同 2.路径的结构不同windows系统中的路径名分割符为\ Linux系统中的路径名分割符则是/ windows中的路径...
  • 前言:最近由于项目需要,研究了一下NTFS文件系统,NTFS文件系统windows使用的文件系统,包括NT,2000,xp系列。无奈万恶资本主义的windows将自家的东西全部藏在阴暗的角落,NTFS理所当然地也不开源,尽管没有源代码...
  • 进入对应的文件下,指定输出的文件 执行 tree > list.txt 打开list.txt 可以看到树状结构的图形 卷 Study 的文件夹 PATH 列表 卷序列号为 A6BD-F735 D:. ├─temp │ ├─BOOT-INF │ │ ├─classes │ ...
  • 操作系统 文件的物理结构文件目录 先来说一下文件文件目录。当我们建立一个文件之后,操作系统会给我们生成对应的记录文件信息的文件(记录文件) 的文件名,文件的类型,文件大小,文件访问权限等属性和文件的...
  • 一、文件目录树1、Linux文件目录分配的依据FHSFilesystem Hierarchy Standard (FHS)Filesystem Hierarchy Standard(文件系统目录标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的...
  • Ubuntu文件目录结构详解

    万次阅读 多人点赞 2017-11-23 17:06:00
    1、对于每一个Linux Ubuntu系统学习者来说,了解Linux文件系统目录结构是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解...
  • windows10 Linux子系统(wsl)文件目录

    万次阅读 多人点赞 2018-04-25 11:40:22
    使用window中的Linux子系统创建的文件究竟放在什么地方,既然作为子系统文件肯定是可以互相访问的 目录 ubuntu Linux子系统目录是在这个目录下 C:\Users\用户名\AppData\Local\Packages\...
  • Linux 文件系统类型 磁盘文件系统。 包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:autofs、coda、Ext(Extended File sytem,扩展文件系统)、Ext2、Ext3、VFAT、ISO9660(通常是CD-ROM...
  • 文章目录目录日志结构文件系统日志文件系统 日志结构文件系统 技术的改变会给当前的文件系统带来压力。这种情况下,CPU 会变得越来越快,磁盘会变得越来越大并且越来越便宜(但不会越来越快)。内存容量也是以...
  • 类Unix系统目录结构

    千次阅读 2017-12-11 09:25:25
    Windows和Linux文件系统区别 在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示: 在 Linux 下,我们是看不到这些...
  • FAT32文件系统结构详解

    万次阅读 多人点赞 2018-04-13 15:38:58
    1. SD卡中FAT32文件系统快速入门 1.1. 理论知识 1.1.1. MBR(Main Boot Record) 主引导记录,占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构 1.1.2. DBR(DOS Boot ...
  • Linux文件系统目录结构

    千次阅读 2016-02-26 19:35:27
    认识Linux系统,首先要熟悉Linux的文件系统目录结构。  Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用“/”表示),其中含有下级子目录或文件的信息;子目录中又可含有更下级的子目录或者...
  • Windows文件系统

    千次阅读 2017-04-02 12:29:04
    整理关于WIndows文件系统的一些知识。如果有什么不对,希望有人可以提出...
  • 在这个系类的开篇还是先说一下文件系统是什么吧。首先来介绍一下对u盘的格式化这个操作,格式化不是仅仅删除了所有文件,还为接下的来文件存储约定了一种存放格式,这种约定的文件存放格式就叫做文件系统。再用最...
  • Linux操作系统中的文件目录结构 “/”根目录部分有以下子目录: /usr 目录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的Linux发行版本的主要的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 530,206
精华内容 212,082
关键字:

windows文件系统的目录结构