Linux和UNIX中的文件系统是一个以为根的树状式文件结构,是Linux和UNIX中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于路径下,包括我们经常听到的usr、etc、bin、home等。在早期的UNIX系统中,各个厂家都定义了自己文件系统的命名构成,比较混乱,而且难以区分。 为了避免在Linux系统上也出现这种命名混乱的问题,在1994年推出了FSSTND(FileSystemStandard)的Linux文件系统层次结构标准,后来UNIX团队把FSSTND发扬光大,成为了后来的FHS(FileSystemHierarchyStandard)。 FHS标准使得众多的Linuxdistributions(Linux发行版)有了统一的文件系统命名标准,换一种说法:FHS就是一种文件系统的命名标准。一般来说,Linuxdistributions都需要遵循FHS规定的目录结构和目录内容文件类型的权限 但是,FHS仅仅定义了两层规范,第一层是下面的各个目录要放什么文件数据,比如etc下面需要放设置文件,bin和sbin下面需要放可执行文件等;第二层是针对usr和var这两个目录来定义的,比如usrshare需要放共享数据,varlog需要放系统登录文件等。 下面我就来为你介绍一下Linux在下都有哪些定义和规范。FHS规范 我下面介绍的这些规范,只是FHS文档指定的目录和文件的一部分,完整的标准可在http:www。pathname。comfhs在线获得。 首先先来介绍一下根目录的重要性和意义: 根目录是整个系统中最重要的一个目录,后续的目录都是以根目录为基础进行衍生,更重要的一点,根目录与开机、还原、系统修复有关,由于系统开机需要特定的环境,所以系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。所以FHS规定不要将根目录的分区大小设置的过大,实际上是越小越好,以减少出错率。 FHS同样规定了根目录下面应该要有这些目录的存在。home目录 home目录是系统默认的使用者主文件夹(homedirectory)。boot目录 boot目录包含启动操作系统所需的静态文件,比如Linux内核,这些文件对系统的启动至关重要。LinuxKernel常用的文件名为vmlinuz,但是如果你使用的是grub2这个开机程序,还会存在bootgrub2这个目录。 我刚刚搭建完成的Linux,boot下面是这样的。 千万不要删除boot目录,这样做可能会导致系统无法启动。dev目录 dev目录都是一些设备节点,这些设备节点是Linux系统中的设备或者是内核提供的虚拟设备。这些设备节点同样也对系统正常运行至关重要。dev目录和子目录下的设备是字符设备和块设备。字符设备就是鼠标、键盘、调制解调器,块设备就是硬盘、软盘驱动器。存储dev目录下的文件就相当于是存储某个设备。 比较重要的文件有 devhda:主IDE通道上的主设备,当提到IDEATA硬盘时,主通道是第一和第二驱动器连接到主板或接口卡的通道。 devhdb:主IDE通道上的从设备。 devtty0:第一个虚拟控制台。虚拟控制台又被称为VC,也称为虚拟终端VT,是用于计算机用户界面的键盘和显示器的概念组合。 devtty1:第二个虚拟控制台。 devsda:主SCSI和SATA通道上的第一个设备。 devlp0:第一个并行端口。 下面是我Linux下面的目录。 etc目录 etc目录是为计算机本地的配置文件保留的,系统主要的配置文件都放在这个目录下,比如账号密码,服务的启停,一般来说,这个目录下面一般用户只有读权限,只有root用户具有修改权限(关于权限的问题,可以阅读笔者的上一篇文章看完这篇Linux权限,通透了!) etc下比较重要的几个文件有 etcmodprobe。d内核驱动模块 etcpasswd存储用户密码 etcfstab存储挂载信息 etcissue存储系统启动是显示的内容 etc目录下不要存放二进制文件,二进制文件最好放在sbin和bin中。 etc目录下有两个重要的文件,etcx11用于存放XWindow系统配置文件,例如xorg。conf,etcopt这个主要存放第三方协力软件opt的相关配置文件。 lib目录 系统的函数库有很多,而lib目录就像一个仓库,它用于存放执行bin和sbin中二进制文件所需要的库,这些共享库映像对于系统boot和执行根文件系统中的命令特别重要。 media目录 media是媒体的英文,也就是说media下可以存放用于可移动媒体(例如USB、DVD、CDROM和Zip磁盘)的安装点和子目录。mnt目录 如果你想要暂时挂载某些额外的设备,你可以放在mnt这个目录下,其实最早的时候,mnt用途和media一样,只是后来有了media之后,这个目录就被用来临时挂载了。opt目录 opt目录为大多数应用程序软件包提供存储空间,将文件放置在opt目录中的包会创建一个与包同名的目录。反过来,该目录保存了原本会分散在整个文件系统中的文件,从而为系统管理员提供了一种简单的方法来确定特定包中每个文件的角色。 例如,如果sample是位于opt目录中的特定软件包的名称,那么所有文件都放置在optsample目录中的目录中,例如optsamplebin表示二进制文件和optsampleman用于手册页。 proc目录 proc目录本身是一个虚拟文件系统(virtualfilesystem),他放置的数据是在内存中,比如系统核心信息,行程信息,周边设备已经网络状态等。因为这个目录下的数据都是在内存中的,所以本身不占用磁盘空间。 这个目录下比较重要的文件有proccpuinfo、procdma、procinterrupts、procnet。 sbin目录 sbin目录存储root用户使用的可执行文件。sbin中的可执行文件在启动时使用,用于系统管理和执行系统恢复操作。除了bin中的二进制之外,sbin还包含启动、恢复和修复系统所需要的二进制文件。 sbin目录下包含arp、clock、halt、init、grub、ifconfig、route、shutdown等。 tmp目录 这个目录下面存放的都是一些临时文件,这些文件在系统重新启动时被清除。 sys目录 这个目录其实和proc非常类似,也是一个虚拟文件系统,主要是记录核心与系统硬件相关信息。这个目录同样也不占用磁盘空间。 usr目录 usr目录是需要好好聊聊得一个目录了,很多读者都误以为usr是user的缩写,其实usr是UnixSoftwareResource的缩写,FHS建议软件开发者应该将数据合理的放置在这个目录的次目录下,不要自己创建软件独立的目录。 所有系统默认的软件都会放在usr下面,因此这个目录有点类似Windows中的C:WindowsC:Programfiles这两个目录的综合,一般来说,系统刚安装完毕后,这个目录会占用较多的磁盘容量,usr的次目录建议有下面这些内容 usrbin一般用户能够使用的指令都放在这个目录下,CentOS7开始,usrbin下指令和bin目录下指令一毛一样。 usrlib基本上,与lib功能相同,所以lib就是链接到这个目录中的。 usrlocal系统管理员在在本机下载的软件都建议安装到这个目录下,便于管理。 usrsbin非系统正常运行所需要的系统指令,最常见的就是某些网络服务器软件的服务指令,不过基本功能与sbin差不多,因此目前sbin就是链接到此目录中的。 usrshare共享文件放置区,这个目录下还有这些次目录usrshareman,usrsharedoc,usrsharezoneinfo usrgames与游戏相关的数据放置处 usrincludeCC等程序语言的header和include放置处,也是直接链接的。 usrsrc一般源码建议放在这,src是source的意思,至于核心源码则建议放在usrsrclinux目录下。 run目录 早期的FHS规定系统开机后所产生的各项信息应该要放置到varrun目录下,新版的FHS则规范到run下面。var目录 如果说usr是安装时会占用较大磁盘容量的目录,那么var就是在系统运行后才会渐渐占用磁盘容量的目录。var主要包括高速缓存、登录文件以及某些软件运行所产生的的目录,包括程序文件,例如MySQL数据库文件等,常见的目录有 varcache应用程序缓存目录 varcrash系统错误信息 varlog日志记录 varrun进程的标识数据 vartmp临时文件目录 varlock文件锁定记录 srv目录 srv可以看做service的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录,常见的服务例如WWW,FTP。 CentOS7在目录的编排上与过去的版本不同,上面已经大致描述过了,这里做个汇总,比较大的差异就是将许多原本应该在根目录里面的目录,将全部数据挪到了usr里面去,然后进行链接设置,这些内容包括binusrbinsbinusrsbinlibusrliblib64usrlib64varlockrunlockvarrunrun 为了方便大家直观的看到这些目录都是做什么的,我手绘了一个图,图中的这些目录之间的关系很像一棵树,所以这个目录又叫做目录树。 这个目录树已经很清晰了,就没什么可说的了。绝对路径和相对路径 和其他系统一样,Linux中的路径也分为绝对路径(absolute)和相对路径(relative),这两种的写法依据如下:由根目录开始的路径都是绝对路径,比如上图目录树中的boot、usrlocal等相对于当前文件路径的写法是相对路径,比如。。varlog目录这里需要注意一点,相对路径是以你当前所在路径的相对位置来移动的,比如你当前在boot这个目录下,你想要移动到usrsrc这个目录 绝对路径表示法:usrsrc 相对路径表示法:。。usrsrc 这里还需要注意两个特殊的目录:。:代表当前目录,也可以使用。来表示。。:代表上一层目录,也可以用。。来表示 关于绝对路径和相对路径的取舍问题:当文件路径很长时,推荐使用相对路径,因为你不用向绝对路径一样,把所有的路径都写一遍,而直接使用。。即可; 但是从文件路径的正确性来说,绝对路径要比相对路径要好。 如果你是在写程序来管理系统,务必使用绝对路径,因为绝对路径不管你的文件路径在哪,都会找到指定的文件;而相对路径如果文件移动后,就可能会存在找不到文件的情况。与目录有关的指令 下面我们就来聊一聊和目录相关的几条指令cd cd就是changedirectory的缩写,这条指令能够切换当前工作目录,有下面四种切换方式cd路径名表示切换到指定的工作目录cd。表示切换到当前工作目录(无任何切换)cd。。表示切换到当前工作目录的上一层目录cd表示返回到当前用户目录 下面我们来演示一下这四个cd切换方式的操作 可以看到,我们分别使用cdusrlocal切换到了指令目录下;使用cd。没有切换任何目录(白浪费了两秒钟);使用cd。。切换到了当前工作目录的上一级;使用cd切换到了当前登录用户的默认工作目录。 这里需要注意的就是cd,如果你直接使用cd,切换效果和cd一样,也就是说cdcd。pwd 上面还有一条指令是pwd,这个指令是我们最常用的指令,它的使用频率几乎和cd一样,因为一条cd指令往往后面跟着一条pwd指令,所以你可以看出pwd指令有多么重要了把。 pwd是PrintWorkingDirectory的缩写,它是打印出当前所在目录的指令。 但是pwd不一定只用于显示当前工作路径,它还可以用来显示指定工作目录下的文件路径 不过这个指令好像没什么用,因为我们已经知道工作目录下的路径了,还打印出来做什么呢?mkdir mkdir用于创建新目录,它是makedirectory的缩写,一般来说,它后面会跟着两个参数。m:设置文件的权限,直接设置,不用考虑默认文件的创建权限p:递归创建目录 下面是使用mkdir创建文件目录的操作 如上图所示,我们在tmp文件目录下创建了一个叫做test1的空目录,并打印出了当前的工作目录。 如果你想要创建不想让其他用户访问的目录,你可以使用下面的命令mkdirm711test2 上图中的lsld列出文件目录的详细信息,可以看到,详细信息最前面的是文件的权限。 一个一个创建目录太麻烦了,现在我们想要快速创建这些目录,比如我们想要创建test1test2test3test4这种目录格式,我们使用了下面代码 Linux会提出我们不能使用这种创建方式。 此时就需要p这个参数的出现了,这个参数能够允许我们递归创建目录,如下所示 只不过使用p这种方式并不推荐使用,因为很容易打错字rmdir rmdir用于删除空目录,它的使用和mkdir非常类似,mkdirp用于递归创建目录,同样的,rmdirp也能够递归删除目录。如下图所示 这里需要注意,rmdir只是删除空目录,这也意味着目录里面有内容的话是无法删除的,那该如何删除呢?可以直接使用rmr来进行删除。mv 使用mv能够修改目录的名称,比如我们创建了一个叫做test的目录,后来我们觉得这个目录无法体现出来它的所有者,我们想要改一下它的名字,这时候就可以使用mv指令就可以修改。 在了解完基本的目录操作之后,下面来想一个问题,为什么我们能够在各种目录下执行ls指令都能够显示内容?按理说ls不应该只是在其存放路径下才能够使用吗? 首先大家需要先了解一个PATH的概念,PATH是环境变量,当我们在执行一条指令的时候,首先系统会按照PATH的设置去每个PATH下搜寻文件名为ls的可执行文件,如果有多个可执行文件,那么优先搜索到的先被执行。