《比起Windows,怎样解读Linux的文件系统与目录结构?》要点:
本文介绍了比起Windows,怎样解读Linux的文件系统与目录结构?,希望对您有用。如果有疑问,可以联系我们。
Linux 和Windows的文件系统有些不同,在学习使用 Linux 之前,若能够了解这些不同,会有助于后续学习.
本文先对Windows和 Linux 上面文件系统原理、组织概念进行区分,并给出例子、列举两者的优缺点以具体说明,最后较为详细地介绍了 Linux 系统的目录结构.
下面将介绍启动Windows和 Linux 后,在文件系统的角度上,它们分别是怎样看待自己世界的.
在Windows系统中, 一切东西都是存放在硬盘上的.启动系统后,先确定硬盘,再确定硬盘上的分区以及每个分区所对应文件系统,最后是存放在某个分区特定的文件系统中的文件. 也就是说,Windows是通过 “某个硬盘-硬盘上的某个分区-分区上的特定文件系统-特定文件系统中的文件” 这样的顺序来访问到一个文件的.
但是与Windows不同, Linux 系统中的一切都是存放在唯一的 虚拟文件系统中的,这个 虚拟文件系统是树状的结构以一个根目录开始.启动系统后,先有这个 虚拟文件系统,再识别出各个硬盘, 再把某个硬盘的某个分区挂载到这个 虚拟文件系统的某个子树上(即分区用某个子目录来表示),再确定分区对应的子目录文件系统,最后的文件就存放在这个特定的文件系统中. 也就是说, Linux 系统是通过 “虚拟文件系统-硬盘-硬盘上的分区-分区上的特定文件系统-特定文件系统中的文件” 这样的顺序来访问一个文件的.
可能对习惯了使用Windows的用户来说, Linux 的方式有些不适应,它的 虚拟文件系统,实质就是一颗目录树,最开始的目录叫做根目录,根目录中又有每一级子目录,或者文件,子目录又有子子目录和文件,其中每个子目录都特定的功能这个功能(这些是约定俗成了的,在后面 常用的重要目录 (See section 1.2.1) 中会详细说明).
也许有人会问,没有这个虚拟文件系统就无法使用硬盘,可是最开始没有硬盘,那么这个 虚拟文件系统以及相应的组织结构是怎么存放起来的呢?这个问题,就像先有鸡还是先有蛋这个问题一样看似简单实则……但是,在 Linux 中,很轻易地跳出了这个思维循环,问题的答案并没在 虚拟文件系统 和 硬盘 这两者之间徘徊,而是第三者—— 内存 ,Linux系统启动起来之后,整个 虚拟文件系统的组织结构,都是随着每次内核系统的启动自动在内存中建立好了的,根本就不需要硬盘.
另外还要注意,就是在我们用户的角度上,无论在Windows还是 Linux 上面,都是使用路径来访问一个文件的.表示文件的路径由 “文件所在的目录+各级目录的分隔符+文件” 三个部分组成,这个策略在两者之间是一样的,所不同的是,Windows下面目录分隔符是 \
, Linux 下面是 /
,也许这也是两者之间为了表示其各自立场不同的一个原因吧?^_^
在Windows系统中,我们可以把文件大体分为两种: 系统文件和用户文件 .一般来说系统文件(例如Windows操作系统本身,一些系统程序,程序运行所需的库文件,以及一些系统配置文件等)存放的默认位置在 C
盘,当然也可以在安装时候指定在其他盘;其它用户文件,包含用户后来安装的程序以及一些数据文件等,用户可以把它们随意存放在任意的分区.
在 Linux 系统中,主要有两个概念: 虚拟文件系统中的文件和 Linux操作系统内核本身.逻辑上可以认为前者属于上层,后者在下层,前者基于后者,后者依赖前者而存在.
Linux 把除了它本身(Linux操作系统内核)以外的一切事物都看作是在 虚拟文件系统中的文件了.无论是键盘,鼠标,数据,程序,CPU,内存,网卡……无论是硬件、软件、数据还是内存中的东西,我们都可以在 虚拟文件系统中的相应子目录对他们进行访问和操作,操作统一.而实现这些管理的幕后就是Linux操作系统内核本身:启动 Linux 系统的时候,首先电脑把Linux操作系统内核加载到内存中,内核本身提供了文件管理,设备管理,内存管理,CPU进程调度管理,网络管理等功能,等内核运行起来之后,就在内存中建立起相应的 虚拟文件系统,最后就是内核利用它提供的那些功能,通过管理文件的方式,来管理 虚拟文件系统中的硬件软件等各种资源了.
Linux 把提供操作系统本身功能(管理计算机软硬件资源)的那些部分划给了Linux操作系统内核,使得Linux操作系统内核成为一个独立的部分,有它自己独立的开源代码;而其它的一切(软件应用,硬件驱动,数据)都根据其特性有自己的开源代码、或者自由地组织并且存放在那个 虚拟文件系统中由Linux操作系统内核来管理.这样,将系统本身和系统所管理的资源分开,并开放源代码,有助于对系统或者系统所管理的资源进行灵活的定制和扩展,还能按需快速建立起只适合自己使用的操作系统,也利于操作系统本身的发展.实际 Ubuntu
,Fedora
, RedHat
等各种不同的 Linux 操作系统发行版,简单来说就是不同厂商对其文件系统和内核进行了不同的配置而产生的 “大众化” 的操作系统.相比之下,Windows就显得非常地零乱复杂,将系统、软件、硬件、数据都混在了一起,其不同版本只能由 Microsoft
一家公司发行.
下面用直观的例子,来说明两者的不同,以加深理解.假设我们的机器上面有一个硬盘,硬盘分为三个区.
在Windows系统中, 我们启动系统之后就会看到 C
, D
, E
, 盘符,它们分别对应硬盘上的三个分区,增加硬盘,或者分区,会导致盘符的增加(注意由于历史原因, A
, B
用于表示软驱,硬盘分区盘符从 C
开始按字母递增),这里的每个分区都各自可以被格式化为不同的文件系统(这里的文件系统,包括例如 NTFS
格式, FAT32
格式等),文件系统的基本功能就是为了存放文件的,不同文件系统区别一般在于管理其中存放的文件的功能的强弱,所以分区被格式化成指定格式的文件系统之后,就可以存放任何文件和目录了,我们看到的 C
, D
, E
内容也就对应了硬盘中相应分区的数据内容.
但是,与Windows中把硬盘分区看成 C
, D
, E
盘符不同, Linux 中最开始根本就没有硬盘的概念,就只有一个纯粹的 虚拟文件系统.如果想要使用哪个硬盘的某个分区,就把那个分区“挂载” 到某个子目录之下,这样硬盘中的分区,文件系统,目录等内容就呈现到了那个子目录里面.也就是说,在 Linux 中,我们使用硬盘中的数据,实际是先把硬盘的某个分区“挂载” 到某个子目录下,然后通过那个子目录来访问的.这个例子中, 通常硬盘会对应 虚拟文件系统中的 /dev/sda
(如有多个硬盘,则为 /dev/sda
, /dev/sdb
, ……, 按字母递增), 其三个分区对应 /dev/sda1
, /dev/sda2
, /dev/sda3
(多个分区按数字递增,不同硬盘的分区,对应为 /dev/sdb1
, /dev/sdb2
等等), 默认硬盘各个分区会被挂载到 虚拟文件系统系统中类似 /mnt/sda1/
, /mnt/sda2/, /mnt/sda3/
的目录(在 Linux 又叫挂载点)中,在/etc/fstab
文件中,我们可以找到分区文件和挂载点的对应关系描述.这样,硬盘相应的分区就做为整个 虚拟文件系统根目录下的一颗子树,反映到了子目录(挂载点)上,子目录中的内容就对应分区中的数据.
假设访问上述硬盘第三个分区 dir1
目录中的文件 test.file
再有,假设用户安装和卸载一个程序 firefox
:
C:\Program Files\Firefox
类似的目录中,或指定的安装路径中; 可执行文件一般在程序的安装路径;依赖的内部库、第三方库、和系统库可能在安装路径中,也可能在 C:\Windows\System32
, 或 C:\Windows\system
等类似的路径;而程序访问期间的系统和用户配置文件和产生的输入输出文件,可能会在安装路径配置中,或者在 C:\Windows\
下的某些文件中(比如注册表数据库文件、用户目录等),这就不一定了.而且不同的系统版本,应用程序版本下,这些目录的具体名称和路径可能会有所不同.卸载的时候由于不确定哪些地方安装了什么内容,很容易造成文件删除补全,遗留系统垃圾等现象,造成系统越来越瘫肿./usr/bin
中, 全局配置文件在/etc/firefox
类似的目录, 用户配置文件一般在用户主目录的 .firefox
的路径下(用户主目录路径名称统一格式为 /home/<username>
) ,依赖的内部库和第三方库在 /usr/lib
, 系统库在 /lib
下, 数据文件一般就在用户主目录下. 如果指定安装目录,那么所有内部库和可执行程序,全局配置文件,会在 <安装路径>
下的 bin
, lib
, etc
子目录下,其它文件一般和默认情况相同.卸载程序之时,只需在对应目录中,将可执行文件、内部库、配置文件、数据文件删除即可,基本没有不确定是否遗留垃圾文件的问题.这些都是大多数应用程序安装的和访问的默认策略,就像是不成文的业界标准,不排除有个别程序不安装这种策略部署应用,但是 Linux 用户带来 “麻烦“ 的应用,早晚也会被淘汰,不可能会流行在 Linux 系统中,这样,自然的,好的应用都保存在 Linux 系统中并逐渐流行起来,还不会破坏系统结构.可见, Linux 文件的存放和组织明显方式更高效,层次更分明.
基于上述内容,Windows和 Linux 文件系统的各有优缺点分别如下.
C
分区),尽量少往 C
盘存放数据文件,根据具体情况可以将一些 “重要并且常用的” 程序安装在 C
分区,随时保持系统目录的清洁和大小助于提升系统的运行速度,用户安装的一般软件尽量不要安装在 C
盘,安装软件时候指定的位置最好采用默认标准目录名称(例如 X:\Program Files
目录,这里 X
表示盘符而不要自己定义一些奇怪名字的目录,这样便于软件的维护等等.实质上,我们启动系统所看到的 “根目录” ,逻辑上是 Linux 虚拟文件系统的根目录中的一个子目录,我们看不到除了这个 “根目录” 以外的其他的目录,那些目录和操作系统的具体实现相关是被操作系统内核隐藏起来了的,所以这里就介绍我们所能看到的文件系统中的“根目录” 的各个子目录中的作用吧.
在 Linux 文件系统中的每一个子目录都有特定的目的和用途.一般都是根据 FHS
标准定义一个正式的文件系统结构的,这个标准规定了哪些目录应该哪些作用.这里我们先介绍一些日常经常用到的目录,然后给出 FHS
相关的内容.
这里,根据本人的使用经验,给出比较常见重要的一些目录,最开始我们对它们有所了解就可以了.随着对 Linux 使用的经验的加深,我们会了解越来越多的目录.对目录的功能知道得越多,我们对 Linux 系统的工p作原理就理解的越深刻,理解操作系统的工作原理,更助于我们更为规范地使用和理解系统中每个目录存在的意义,直至最后几乎知道系统中的每个文件……
/
根目录包含了几乎所的文件目录.相当于中央系统.进入的最简单方法是: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
会显示它们的大小).当您查看它们时,您实际上看到的是内存里的信息,这些文件助于我们了解系统内部信息.例如:/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 时间长了,会逐渐体会到其中的含义,到时候也许我们想要乱来都不行了呢.^_^
在大多数 Linux 系统上面,我们可以使用一个命令: man hier
,通过这个命令的输出,就知道“根目录”中所子目录的作用了.这个命令含义我不多说了,总之这里的 hier
就是对 Linux 文件系统中各级目录的标准功能,是一个大家都约定俗成了的东西.想要了解每个目录更详细的信息,需要仔细参考 man hier
的输出.下面就是一个比较简短的中文描述的对文件系统目录分类的 FHS
标准,也就是对 man hier
的简单翻译.
作者:吕凯
文章出处:高效开发运维微信公众号
转载请注明本页网址:
http://www.vephp.com/jiaocheng/4275.html