当前位置: 首页 > 科技观察

使用Linux这么久,才知道这些概念

时间:2023-03-13 18:10:19 科技观察

大家应该都知道Linux和UNIX中的文件系统是以/为根的树状文件结构,/是Linux和UNIX中的根目录,而它也是文件系统的起点。所有的文件和目录都位于/路径下,包括我们经常听到的/usr、/etc、/bin、/home等。在早期的UNIX系统中,各个厂商都定义了自己文件系统的命名结构,比较混乱,不易区分。为了避免Linux系统上的这种命名混乱,1994年推出了FSSTND(FileSystemStandard)的Linux文件系统层次标准,后来UNIX团队将FSSTND发扬光大,成为了后来的FHS(FileSystemHierarchyStandard)。FHS标准使得很多Linux发行版(Linuxdistribution)都有统一的文件系统命名标准。也就是说:FHS是一种文件系统命名标准。一般来说,Linux发行版需要遵循FHS规定的目录结构和目录内容文件类型权限。但是,FHS只定义了两层规范。第一层是/下的各个目录应该放什么文件数据,比如/etc下需要放配置文件,可执行文件等需要放在/bin和/sbin下;第二层定义了/usr和/var这两个目录,比如/usr/share需要放共享数据,/var/log需要放系统登录文件等。下面给大家介绍一下定义/下的Linux规范。FHS规范我在下面描述的规范只是FHS文档中指定的目录和文件的一个子集,完整的规范可以在http://www.pathname.com/fhs/在线获得。首先介绍一下根目录的重要性和意义:根目录是整个系统中最重要的目录,后面的目录都是从根目录派生出来的。更重要的是,根目录与开机、恢复、系统修复有关。因为系统启动需要特定的环境,所以当系统出现故障时,根目录中还必须包含能够修复文件系统的程序。所以FHS规定根目录的分区大小不能设置太大。其实越小越好,以减少错误率。FHS还规定这些目录应该存在于根目录下。/homedirectory/homedirectory是系统默认的用户主文件夹(homedirectory)。/boot目录/boot目录包含启动操作系统所需的静态文件,例如Linux内核,这些文件对系统的启动至关重要。LinuxKernel常用的文件名是vmlinuz,但如果使用grub2引导程序,也会有一个/boot/grub2目录。我刚搭建的Linux,boot是这个样子的。永远不要删除/boot目录,这样做可能会导致系统无法启动。/dev目录/dev目录是一些设备节点,这些设备节点是Linux系统中的设备或者是内核提供的虚拟设备。这些设备节点对于系统的正常运行也很关键。/dev目录及其子目录下的设备是字符设备和块设备。字符设备是鼠标、键盘和调制解调器,而块设备是硬盘和软盘驱动器。在/dev目录下存放文件相当于存放了一个设备。比较重要的文件是/dev/hda:主IDE通道上的masterdevice,当提到IDE/ATA硬盘时,主通道就是第一和第二个驱动器连接主板或接口卡的通道。/dev/hdb:主IDE通道上的从设备。/dev/tty0:第一个虚拟控制台。Virtualconsole,又称VC,又称虚拟终端VT,是计算机用户界面的键盘和显示器的概念组合。/dev/tty1:第二个虚拟控制台。/dev/sda:主要SCSI和SATA通道上的第一个设备。/dev/lp0:第一个并口。下面是我的linux下的目录。/etc目录/etc目录是为计算机的本地配置文件保留的。系统的主要配置文件都放在该目录下,如账号密码、服务启停等。一般来说,该目录下的普通用户只有读权限。只有root用户才有修改权限(权限可以看笔者之前的文章,看看这篇linux权限,一目了然!)/etc下的几个重要文件包括/etc/modprobe.d内核驱动模块下的几个重要文件/etc是/etc/modprobe.d内核驱动模块/etc/passwd存放用户密码/etc/fstab存放挂载信息/etc/issue存放系统启动显示内容不要在/etc目录下存放二进制文件,最好在/sbin和/bin。/etc目录下有两个重要的文件,/etc/x11用来存放XWindow系统配置文件,比如xorg.conf,/etc/opt主要用来存放第三方协同软件的相关配置文件/选择。/lib目录系统中有很多函数库,/lib目录就像一个仓库,用来存放执行/bin和/sbin中的二进制文件所需要的库。这些共享库镜像对于系统启动和在根文件系统中执行命令尤为重要。/media目录是media媒体的英文,意思是/media可以存放可移动媒体(如USB、DVD、CD-ROM和Zip磁盘)的挂载点和子目录。/mnt目录如果你想临时挂载一些额外的设备,可以将它们放在/mnt目录中。其实/mnt最早的用途和/media是一样的,但是在/media之后,这个目录是用来临时挂载的。/opt目录/opt/目录为大多数应用程序包提供存储,将文件放在/opt/目录中的包会创建一个与该包同名的目录。反过来,这个目录保存着否则会分散在整个文件系统中的文件,为系统管理员提供了一种简单的方法来确定每个文件在特定包中的作用。例如,如果sample是位于/opt/目录中的特定包的名称,则所有文件都放在/opt/sample/目录中的目录中,例如二进制文件的/opt/sample/bin/和/opt/sample/man/用于手册页。/proc目录/proc目录本身就是一个虚拟文件系统(virtualfilesystem),它存放在内存中的数据,比如系统核心信息,行程信息,外围设备网络状态等。因为这个目录下的数据是在内存,不占用磁盘空间。该目录下比较重要的文件有/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/net/。/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:\Windows\+C:\Programfiles\的组合。一般来说,刚安装好系统后,这个目录会占用大量的磁盘容量。/usr的子目录推荐有如下内容*/usr/bin/*一般用户可以使用的命令都放在这个目录下。从CentOS7开始,/usr/bin下的指令和/bin目录下的指令是完全一样的。*/usr/lib/*基本上和/lib的功能一样,所以把/lib链接到这个目录下。/usr/local系统管理员建议将本机下载的软件安装到该目录,便于管理。/usr/sbin并不是系统正常运行所需要的系统命令,最常见的是一些网络服务器软件的服务命令,但基本功能与/sbin类似,所以目前/sbin链接到这个目录。/usr/share共享文件存放区,该目录下有/usr/share/man、/usr/share/doc、/usr/share/zoneinfo/usr/games这些子目录和游戏相关的数据放置/usr/includeC/C++等编程语言的header和include也是直接挂钩的。/usr/src一般源码建议放在这里,src是source的意思,核心源码建议放在/usr/src/linux目录下。/run目录早期的FHS规定系统启动后产生的各种信息都放在/var/run目录下,新版的FHS规定在/run下。/var目录如果说/usr是安装时占用磁盘容量较大的目录,那么/var则是系统运行后逐渐占用磁盘容量的目录。/var主要包括缓存、登录文件、某些软件运行产生的目录,包括程序文件,如MySQL数据库文件等。常见目录包括/var/cache应用缓存目录/var/crash系统错误信息/var/loglogrecord/var/runprocessidentificationdata/var/tmptemporaryfiledirectory/var/lockfilelockrecord/srvdirectorysrv可以看成是service的缩写,一些网络服务启动后,需要检索这些服务使用的数据目录,WWW、FTP等常用服务。CentOS7在目录排列上与之前的版本有所不同,上面已经大致介绍过了。这是一个摘要。最大的区别是许多本应在根目录中的目录已移至/usr,然后是链接设置,这些包括/bin->/usr/bin/sbin->/usr/sbin/lib->/usr/lib/lib64->/usr/lib64/var/lock->/run/lock/var/run->/run为了让大家直观的看到这些目录是干什么的,我手绘了一张图。图中这些目录之间的关系很像一棵树,所以这个目录也叫目录树。这个目录树已经很清楚了,没什么好说的。绝对路径和相对路径与其他系统相同。Linux中的路径也分为绝对路径(absolute)和相对路径(relative)。图中目录树中的/boot、/usr/local等都是相对于当前文件路径写的。例如../var/log目录需要在这里注明。相对路径是根据你当前路径的相对位置。例如,如果您当前在/boot目录中,您想移动到/usr/src目录。目录:。:表示当前目录,也可以用./表示。:代表上一级目录,或者../可以代表绝对路径和相对路径的选择:当文件路径很长的时候,建议使用相对路径,因为你没有将所有路径都写成绝对路径,但直接使用../即可;但就文件路径的正确性而言,绝对路径优于相对路径。如果你正在写一个管理系统的程序,一定要使用绝对路径,因为无论你的文件路径在哪里,绝对路径都会找到指定的文件;如果移动相对路径,则可能找不到文件。.与目录相关的指令下面说一下与目录相关的几个指令。cdcd是更改目录的缩写。该指令可以切换当前工作目录。有以下四种切换方式:cd/路径名#表示切换到指定的目录cd./#表示切换到当前工作目录(不做任何切换)cd..#表示切换到当前目录的上层目录工作目录cd~#表示回到当前用户目录cd/路径名#表示切换到指定的工作目录cd./#表示切换到当前工作目录(不做任何切换)cd..#表示切换到当前工作目录的上层目录cd~#表示回到当前用户目录下面我们来演示一下这四种cd切换方式的操作,可以看出我们使用cd/usr/local来切换到命令目录;使用cd./不切换任何目录(浪费两秒钟);使用cd..切换到当前工作目录上一级;使用cd~切换到当前登录用户的默认工作目录。这里需要注意的是cd~,如果直接使用cd,切换效果和cd~是一样的,也就是“cd~==cd”。pwd上面还有一个指令是pwd,这个指令是我们最常用的指令,它的使用频率和cd差不多,因为一个cd指令后面往往跟着一个pwd指令,可见pwd指令的重要性.pwd是PrintWorkingDirectory的缩写,是打印出当前目录的指令。但是pwd不仅可以用来显示当前工作路径,还可以用来显示指定工作目录下的文件路径,不过这个命令好像没什么用,因为我们已经知道工作目录下的路径了,还打印什么出去?mkdirmkdir用于新建目录,是makedirectory的缩写,一般来说,后面会跟两个参数。-m:设置文件权限,直接设置,不考虑默认的文件创建权限-p:递归创建目录下面是使用mkdir创建文件目录的操作如上图所示,我们在下面创建了一个名为test1的文件/tmp文件目录空目录并打印出当前工作目录。如果想创建一个不希望其他用户访问的目录,可以使用上图中的如下命令mkdir-m711test2ls-ld列出文件目录的详细信息。可以看到详细信息的第一部分是文件权限。一个一个创建目录太麻烦了。现在我们要快速创建这些目录。比如我们要创建/test1/test2/test3/test4这样的目录格式。我们使用以下代码。Linux会建议我们不能使用这种创建方式。这时候就需要参数-p,它可以让我们递归创建目录,如下图,但是不推荐使用-p,因为很容易出现错别字。..rmdirrmdir用于删除空目录。它的使用与mkdir非常相似。mkdir-p用于递归创建目录。同样,rmdir-p也可以递归删除目录。如下图,这里需要注意的是,rmdir只是删除了空目录,也就是说,如果目录中有内容,是不能删除的。如何删除它?可以直接使用rm-r删除。mv使用mv修改目录的名称。例如,我们创建了一个名为test的目录。后来觉得这个目录反映不了它的属主。我们想更改它的名称。这时候我们可以使用mv命令。修订。了解了基本的目录操作之后,我们来思考一个问题,为什么我们可以在各个目录下执行ls命令来显示内容呢?按理说,ls不应该只用在它的存储路径上吗?首先,我们需要先了解一下PATH的概念。PATH是一个环境变量。当我们执行一条命令时,系统会先根据PATH的设置,在各个PATH下寻找名为ls的可执行文件。如果有多个可执行文件,则优先查找的优先执行。本文转载自微信公众号“程序员cxuan”,可通过以下二维码关注。转载本文请联系程序员cxuan公众号。