第6章 Linux目录文件与系统启动知识

第6章 Linux目录文件与系统启动知识

6.1 Linux系统目录结构介绍

6.1.1 Linux与Windows目录结构对比

相信很多读者已经熟悉了Linux的目录结构,图6-1可以进一步帮助读者对比Windows和Linux这两个系统的结构,不太了解Linux系统目录结构的读者,通过图6-1也可快速理解。

Windows的目录形式为c:\windows\,路径分隔符是“\”(撬棍,反斜线),D、E等盘的目录结构与之类似。Linux的目录形式为/etc/hosts,路径分割符为“/”(斜线),Linux系统的一切目录都是从“/”根开始的。

6.1.2 Linux系统目录结构的基本特点

相较于Windows下的目录结构,可能会有读者在初次接触Linux的时候,觉得Linux的目录结构比较复杂,不像Windows视窗那样简单明了,从而感到很迷茫。

其实,Linux系统的目录结构同样也是很简单的,只是Linux系统的应用场景多为服务器应用且为字符界面应用,所以不像Windows系统视窗那样直观。但是,Linux系统的目录结构是很有规律的,图6-2所示的是Linux的目录结构最形象的比喻。

第6章 Linux目录文件与系统启动知识

图6-1 Linux与Windows目录结构对比

从图6-2中可以看出,Linux系统的目录结构具有如下基本特点。

第6章 Linux目录文件与系统启动知识

图6-2 Linux系统目录结构的特点

·一切从“根”开始,“/”是所有目录的起点(顶点)。

·Linux根下面的目录是一个有层次的树状结构。

·酷似一棵倒挂着的树。

除此之外,Windows系统目录与磁盘是强对应的,联系很紧密,例如,C盘下的目录文件不可能与D盘下的目录有关联或者交集。而Linux系统目录则与此不同,Linux系统的目录与磁盘等设备是不直接关联的,每个目录都可以关联(官称:挂载)在不同的设备(例如磁盘)上,例如,看似有包含关系的几个目录/、/etc、/boot、/var很可能是分布在不同的分区或磁盘上。

在逻辑上,所有的目录(包括目录下的子目录)都在最高级别的目录“/”下,根(“/”)目录是所有目录的起始点(顶点),而实际上访问目录/、/etc、/boot、/var时,可能是在访问完全不同的分区和磁盘,图6-3所示的是Linux目录结构和设备挂载的关系图。

Linux下面的设备(磁盘),如果不挂载,则是看不到入口的,就像没窗没门的监狱一样,是不能被正常使用的,如果要访问设备,就必须为设备开一个入口,这个入口就是挂载点,挂载点实质上就是一个目录,开入口的过程,就是将挂载点与磁盘设备相关联,即挂载。

第6章 Linux目录文件与系统启动知识

图6-3 Linux中磁盘分区与目录的关系

6.1.3 Linux目录结构的特点小结

·Linux系统的所有目录都是一个有层次的倒立着的树状目录结构(倒挂树形结构),“/”根是所有目录的顶点,对于Linux的目录来说,一切从根开始。

·不同目录下的数据可以跨越不同的磁盘分区或不同的磁盘设备,设备可以随意挂载到任意目录上使用。

·所有的目录都是按照一定的类别有规律地进行组织和命名的。

·没有挂载到目录上的磁盘,相当于没有门和窗户的监狱,不能被使用。磁盘等设备需要挂载后才能正常使用。

·挂载点是磁盘访问的入口,是一个目录。

·相对路径与绝对路径具有如下关系:绝对路径是指以根为起始点的路径,例如/tmp、/opt;相对路径是指相对于非“/”路径的路径,即路径开头没有“/”斜线,例如etc/sysconfig、opt/tmp等,是相对于当前路径(执行pwd可查看)的路径。

第6章 Linux目录文件与系统启动知识提示:老男孩的学习思路为“练习自己归纳总结的能力,把书由厚读薄”

6.2 Unix系统目录结构的历史典故

了解目录结构的历史典故,目的是让大家能够清晰地了解并记忆Linux的目录结构。在学习Linux时,为知识赋予一个有意义的故事,是减缓忘记的好方法。

1969年,Ken Thompson和Dennis Ritchie在小型机PDP-7上发明了Unix。1971年,他们将主机升级到了PDP-11,PDP主机如图6-4所示。

第6章 Linux目录文件与系统启动知识

图6-4 PDP主机

当时,他们使用了一种称为RK05的储存盘,盘的容量大约是1.5MB,如图6-5所示。

第6章 Linux目录文件与系统启动知识

图6-5 1.5MB RK05硬盘和马路上的下水道井盖大小对比

由于硬盘的容量很小,操作系统存储盘存放的数据(根目录)却越来越大,因此没过多久一块盘就已经装不下数据了。于是,技术人员加上了第二盘RK05,并且做了规定,第一块盘专门用来存放系统相关的程序,第二块盘专门用来存放用户自己的程序,因此,后者挂载点的目录取名为/usr。也就是说,根目录“/”挂载在第一块盘上,“/usr”目录挂载在第二块盘上。除此之外,两块盘里面的其他目录结构是完全相同的,例如:第一块盘的目录(/bin、/sbin、/lib、/tmp...)都会在/usr目录下重新出现一次,下面列出实际目录重复的情况:


[[email protected] ~]# ls -ld /bin /lib /sbin /tmp
lrwxrwxrwx.  1 root root    7 Jan 29 20:29 /bin -> usr/bin
lrwxrwxrwx.  1 root root    7 Jan 29 20:29 /lib -> usr/lib
lrwxrwxrwx.  1 root root    8 Jan 29 20:29 /sbin -> usr/sbin
drwxrwxrwt. 21 root root 4096 Jan 31 11:50 /tmp
[[email protected] ~]# ls -ld /usr/bin/ /usr/lib /usr/sbin/ /usr/tmp/
dr-xr-xr-x.  2 root root 28672 Jan 29 23:26 /usr/bin/
dr-xr-xr-x. 29 root root  4096 Jan 29 20:30 /usr/lib
dr-xr-xr-x.  2 root root 12288 Jan 29 23:26 /usr/sbin/
drwxrwxrwt.  3 root root    18 Jan 31 10:30 /usr/tmp/

不久之后,第二块存储盘也满了,然后只好又加了第三盘RK05,挂载点的目录取名为/home,并且做了规定,/home用于存放用户的数据。

目录结构的起名和定义就如此延续,具体见表6-1。随着设备的发展,硬盘的容量越来越大,各个目录的含义也进一步得到了明确。

表6-1 Linux系统诞生之初的目录及其作用表

第6章 Linux目录文件与系统启动知识

6.3 Linux的目录结构详解

6.3.1 目录层次标准(FHS)

FHS的全称为Filesystem Hierarchy Standard,中文意思是目录层次标准,是Linux的目录规范标准。详情请参见http://www.pathname.com/fhs/。

FHS定义了两层规范,具体如下。

第一层是“/”目录下的各个目录应该存放什么样的文件数据,例如,/etc目录下放置的是系统的配置文件(比如,/etc/exports、/etc/hosts等),而/bin和/sbin下存放的则是程序及系统命令。

第二层是针对/usr(unix software resource或secondary hierarchy)和/var(variable data)这两个目录的子目录来定义的。例如,/var/log下放置的是系统日志文件等。

参考资料


http://www.pathname.com/fhs/
http://www.ibm.com/developerworks/linux/library/l-proc/index.html

6.3.2 根下目录结构详解

对于每一个Linux初学者来说,花费时间掌握Linux系统的目录结构知识是很有必要的。

当使用Linux系统的时候,如果执行“ls-l/”命令就会发现,在“/”下面包含了很多目录内容,比如etc、usr、var、bin等,而在这些目录里面,还会有更多的目录或文件,它们构成了一个树状的结构。

Linux系统目录结构的最顶端是“/”,称其为根目录,根(/)目录是Linux系统所有目录的起始点,所有的目录、文件、设备都在“/”之下,根(/)目录下的目录是一个树状结构,可以这么说,“/”就是Linux文件系统的组织者、领导者,通过tree命令,可以查看Linux的一级目录结构。示例代码如下:


[[email protected] ~]# tree -L 1 / 
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
19 directories, 0 files

为了便于大家学习,这里将这些常见的目录列成表格详细说明,具体见表6-2。

表6-2 根下的目录结构知识

第6章 Linux目录文件与系统启动知识
第6章 Linux目录文件与系统启动知识
第6章 Linux目录文件与系统启动知识

6.4 重要的Linux系统文件介绍

前面讲解的是根下一级目录的作用,在实际工作中,更重要的是一些具体的目录。这些都是Linux运维人员必须要熟记的。

6.4.1 /etc系统初始化及设置相关重要文件

1./etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件

这是Linux系统第一块网卡的配置文件所在的路径,其中第一块网卡配置文件的结尾标识为eth0,第二块为eth1,以此类推。

当通过执行命令nmtui(CentOS6为setup)来修改网卡配置时,实际上就是在修改这个/etc/sysconfig/network-scripts/ifcfg-eth0文件,因此也可以通过直接编辑该文件的方式实现对网卡配置的更改(如图6-6所示)。

配置完网卡之后,可以通过重启网络服务(systemctl restart network)来使得所有网卡的配置文件生效,如果只需让某个单独的eth0网卡配置生效,则可以通过命令ifdown eth0&&ifup eth0(停掉及启动eth0网卡命令)来实现。

下面是网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0的内容详解:


[[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet         #<==上网类型,目前基本上都是以太网。
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none        #<==启动协议,获取配置方式,有none|bootp|dhcp三个选项。
DEFROUTE=yes          #<==使用默认路由。
IPV4_FAILURE_FATAL=no
NAME=eth0             #<==第一块网卡的逻辑设备名,第二块为eth1。
UUID=e62dd7a9-92fa-4805-afc9-441b567ad38d #<==通用唯一识别码 (Universally Unique
                                              Identifier),如果是VMware克隆的
                                              虚拟机,则会无法启动网卡,可以去除此项。
DEVICE=eth0           #<==第一块网卡的逻辑设备名,第二块为eth1。
ONBOOT=yes            #<==这个地方要为yes,才能保证下次开机启动时**网卡设备。
IPADDR=192.168.2.217  #<==这是虚拟机桥接模式,局域网Linux服务器的固定IP。
PREFIX=24             #<==子网掩码位数,这里是24位。
DNS1=192.168.2.1      #<==主DNS,这里默认会覆盖以及优先于/etc/resolv.conf的配置生效。
GATEWAY=192.168.2.1   #<==局域网上网网关地址。

第6章 Linux目录文件与系统启动知识提示:更多网卡配置相关的知识请执行less/usr/share/doc/initscripts-*/sysconfig.txt查看。

第6章 Linux目录文件与系统启动知识

图6-6 nmtui命令配置网卡时的配置文件

2./etc/resolv.conf:Linux系统DNS客户端配置文件

DNS(Domain Name System)在网站的运行中起到了至关重要的作用,其主要负责将网站域名解析为对应的IP地址,例如,将www.etiantian.org解析为对应的IP地址记录(如1.1.1.1),这个从域名到IP地址的解析过程,称作A记录,即Address Record。

DNS除了负责解析这个最重要的A记录之外,还有很多其他的功能呢!具体列举如下。

·设置CNAME别名记录,这个别名解析功能常被CDN加速服务商应用。

·设置MX邮件记录,这个MX记录功能,在购买或搭建邮件服务时会用到。

·设置PTR记录,反向解析,即将IP地址解析为对应的域名,与A记录的解析相反,邮件服务等业务中会用到。

更多的DNS功能,请读者参阅其他图书或者老男孩的高级架构师课程内容。

DNS分为服务端和客户端两个部分,本文讲解的是系统上网客户端层面的配置,可通过修改/etc/resolv.conf配置DNS客户端。

常见的公用DNS为:223.5.5.5/223.6.6.6/114.114.114.114/114.114.115.115(通过斜线分隔)。

配置/etc/resolv.conf方法包含如下两种。

第一种是通过图形界面进行配置,在图6-7中依次选择nmtui→“Edit a connection”→“DNS servers”,完成配置。

第6章 Linux目录文件与系统启动知识

图6-7 图形界面修改DNS客户端设置图

上述设置实际上是同时修改/etc/sysconfig/network-scripts/ifcfg-eth0和/etc/resolv.conf文件。第二种方法是直接编辑/etc/resolv.conf文件,文件的内容如下:


[[email protected] ~]# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 202.106.0.20

需要特别注意的是,在网卡配置文件里配置的DNS会覆盖/etc/resolv.conf里的DNS,因此,在新版系统(Cent OS6和Cent OS7)中,一般只配置网卡配置文件的DNS,这种方法也是笔者推荐的配置方法,如果不想在网卡配置里进行配置,则可以选择在/etc/resolv.conf里进行配置,这个配置文件的功能已经变弱了,详细配置情况可以执行man resolv.conf获取细节说明。

3./etc/hostname:主机名配置文件

/etc/hostname为CentOS7系统主机名的永久配置文件(CentOS6以前为/etc/sysconfig/network),修改主机名可采用如下两种方法。

方法1:临时修改法


[[email protected] ~]# hostname www       #<==临时生效。
[[email protected] ~]# cat /etc/hostname  #<==主机名的配置文件内容没变。
oldboy

要想方法1永久生效,需要编辑/etc/hostname进行修改。

方法2:永久修改法


[[email protected] ~]# hostnamectl set-hostname www
[[email protected] ~]# cat /etc/hostname 
www  #<==主机名的配置文件内容随之改变。

第6章 Linux目录文件与系统启动知识提示:要想立即生效,需要退出当前链接重新登录,此外,还可以通过nmtui来修改主机名。

4./etc/hosts:系统本地的DNS解析文件

/etc/hosts的作用是设定用户IP与名字(或域名)的对应解析表,相当于本地(局域网内)的DNS解析文件。

Linux系统下的这个/etc/hosts类似于C:\WINDOWS\system32\drivers\etc\hosts文件,一般在企业里进行开发或测试工作时会使用host域名解析。在企业服务器的Linux环境下,hosts的解析在机房服务器的互相调用中也很常用。下面给出一个门户网站阿里巴巴的解析的真实案例,通过该案例可以看到hosts文件在企业里的作用。

开发、产品、测试等人员将hosts文件用于已通过正式的域名测试但未上线的产品www.etiantian.org,示例如下:


hosts解析记录
192.168.2.7  www.etiantian.org

此外,在企业里,服务器之间的调用也可以通过域名(内部的DNS)来进行,这种方式可以方便运维人员独立进行服务迁移,而不依赖于开发等人员。

主机名的命名必须专业,也就是说要反映出这条解析记录的明确用途,以下是/etc/hosts门户解析案例示例代码:


taobao:
172.38.18.23   realtime-search.config-vip.taobao.com
172.65.54.47   tpbk2configslave1.config-host.taobao.com
alibaba:
172.26.58.40 vafd.china.alibaba.com
172.23.54.47 normy1.vip.xyi.cn.alidc.net

当然,解析的记录数量太大,在hosts里修改就会比较麻烦,因此大公司还可能会有内部DNS服务,来管理大量主机名/域名和IP之间的解析记录。

本地系统也要使用hosts解析,示例代码如下:


[[email protected] ~]# cat /etc/hosts
127.0.0.1  localhost.localdomain  localhost.localdomain  localhost4  localhost4.
    localdomain4  localhost  oldboy  #<==IPV4本地名称解析记录,十分重要。
::1  localhost.localdomain  localhost.localdomain  localhost6  localhost6.
    localdomain6  localhost  oldboy  #<==IPV6本地名称解析记录,十分重要。

第6章 Linux目录文件与系统启动知识提示:企业中,集群服务器中每台服务器的主机名和自身IP都要在所有服务器的host里做对应解析。

例如,下面是笔者教学Web集群实战项目中的若干IP和主机名的对应记录,要配置在每一台服务器中的/etc/hosts里,具体代码如下:


127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web02
172.16.1.8      web01
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01

5./etc/fstab:配置开机设备自动挂载的文件

/etc/fstab是一个重要的文件,其作用是配置开机设备自动挂载。前文已经讲解过了,Linux的设备必须要挂载才能使用,而刚开机时,磁盘都是没有挂载的,因此,系统开机会加载/etc/fstab文件,实现对系统分区的自动挂载,当然,管理员也可以利用这个文件实现对新增磁盘或分区的开机自动挂载功能。

/etc/fstab文件一共分为如下6列:


[[email protected] ~]# cat /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Jan 29 20:28:50 2019
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=441cb930-b1b3-4f48-9a82-61e0753c9110 /            xfs     defaults    0 0
UUID=52581b11-3fbc-4f40-bf39-d7255740da09 /boot        xfs     defaults    0 0
UUID=c9908c87-5555-4f8b-b435-a24ed42f3637 swap         swap    defaults    0 0

上述代码段中6列内容的具体说明如下。

·第1列为设备的名称或者UUID或者磁盘标签,可以通过blkid查看设备uuid。

·第2列为设备的挂载点,即访问设备的入口。

·第3列为设备的文件系统类型。详细内容可通过man mount查看或参见后文。

·第4列为挂载的属性,详细内容可通过man mount查看或参见后文。

·第5列为是否进行备份。

·第6列为开机时是否做磁盘检查,0为不做检查,1、2为做检查。

这个/etc/fstab文件在后文还会进行讲解,读者也可以执行man fstab深入了解。

6./etc/rc.local:存放开机自启动程序命令的文件

/etc/rc.local是用于存放开机自启动程序命令的文件(CentOS6里的chkconfig常用来管理yum/rpm安装的程序或服务的开机自启动,CentOS7里则使用systemctl命令进行管理)。有时IT人员自己开发的程序需要开机启动,也会习惯性地将启动命令放入/etc/rc.local。Linux开机时会将/etc/rc.local里的内容全部执行一遍,这是Linux运维人员常用的文件。

第6章 Linux目录文件与系统启动知识特别提示:从CentOS7开始,/etc/rc.local必须要先分配执行权限,里面的脚本才能执行,另外/etc/rc.local是一个软链接文件,它的真实文件所在地为/etc/rc.d/rc.local,因此在使用tar等工具备份的时候要严格注意。


[[email protected] ~]# ls -l /etc/rc.local 
lrwxrwxrwx. 1 root root 13 Jan 29 23:20 /etc/rc.local -> rc.d/rc.local

7./etc/inittab:系统启动时设定运行级别等配置的文件

/etc/inittab在早期(Centos6以前)是一个指导Linux开机启动的关键文件(CentOS7已将该文件废弃),用于设定系统启动时init进程将系统设置成什么样的运行级别(runlevel),以及加载运行级别对应的启动文件。在CentOS6里,其仅负责设定系统启动时init进程将系统设置成什么样的运行级别,其他的功能已分拆到其他文件里了。

简单地说,运行级别,就是Linux系统的不同状态,类似于人的单身、结婚、离婚等标识。从CentOS6起,inittab文件里就仅剩下一个设定运行级别了。示例代码如下:


[[email protected] ~]# cat /etc/inittab 
# inittab is only used by upstart for the default runlevel. #<==只用来设定默认运行级别。
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# System initialization is started by /etc/init/rcS.conf   #<==系统初始化会转移到/etc/
                                     init/rcS.conf。
# Individual runlevels are started by /etc/init/rc.conf  #<==单个运行级别转到/etc/init/
                                                              rc.conf。
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf  #<==禁止重启也转移了。
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,  
    #<==终端也转移了。
# with configuration in /etc/sysconfig/init.
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:  #<==系统启动时,将Linux设定固定的运行级别的配置行。  

Linux系统运行级别的说明如下:


#   0  关机(请不要将系统运行级别设置为0)
#   1  单用户模式(忘记root用户密码,可用此模式找回)  
#   2  没有NFS,多用户模式
#   3  命令行模式 文本模式(企业级服务器核心的运行状态)          
#   4  未使用
#   5  图形化模式 桌面模式 X11(桌面个人版系统的运行状态)
#   6  重启(请不要将系统运行级别设置为6)

可以通过runlevel命令,查看当前系统的运行级别,示例代码如下:


[[email protected] ~]# runlevel 
N 3 #<==N为上一次的运行级别,3为当前的运行级别。

临时修改运行级别(立刻生效)的示例代码如下:


[[email protected] ~]# init 4   #<==将运行级别修改为4,测试(生产服务器不能随意测试)。
[[email protected] ~]# runlevel
3 4
[[email protected] ~]# init 3
[[email protected] ~]# runlevel
4 3

如果想要永久修改运行级别,则需要修改/etc/inittab文件最后一行的id:3:initdefault:部分,其中数字部分就是对应的运行级别,需要重启系统使其生效。

下面是CentOS6以前的inittab文件,其中不但包含运行级别配置,还包含加载系统初始化脚本、加载各自的运行级别对应脚本、禁止三键重启、加载不同级别的TTY以及桌面设置等的配置信息,具体如下:


[[email protected] ~]# cat /etc/inittab
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
# Author:       Miquel van Smoorenburg, <[email protected]>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:  #<==启动时对Linux设定固定的运行级别。
# System initialization. 
si::sysinit:/etc/rc.d/rc.sysinit #<==执行rc.sysinit进行系统初始化。
l0:0:wait:/etc/rc.d/rc 0         #<==以下是对应7个运行级别的目录。
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now #<==禁止三键重启,破坏系统。
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  #<==UPS电源相关。
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1   #<==以下是在不同级别下加载TTY终端的设置。
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon #<==加载桌面程序的设置。

第6章 Linux目录文件与系统启动知识特别补充:上述讲解都是CentOS7以前版本的系统,CentOS7以后版本的变化很大,具体帮助就在/etc/inittab文件里,只不过内容是英文的,相关翻译及操作如下:


[[email protected] ~]# cat /etc/inittab #<==CentOS7下的inittab内容说明。
# inittab is no longer used when using systemd.
# 当使用systemd方式启动系统时,inittab文件不再使用了。
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# 在此文件中添加任何配置,都不起作用了。
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# 本文件中的Ctrl-Alt-Delete3键重启功能在/usr/lib/systemd/system/ctrl-alt-del.target中
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# systemd启动方式使用targets,而不是runlevel,默认情况下有两个主要的targets。
# multi-user.target: analogous to runlevel 3 #多用户文本模式,3运行级别。
# graphical.target: analogous to runlevel 5  #图形模式,5运行级别。
# To view current default target, run: systemctl get-default
# 若要查看当前的默认运行级别,则运行systemctl get-default命令。
# To set a default target, run:# systemctl set-default graphical.target
# 若要设置一个默认的运行级别,则运行systemctl set-default TARGET.target。

8./etc/profile及/etc/bashrc:配置系统的环境变量/别名等的文件

环境变量如PS1、TMOUT、HISTSIZE、HISTFILESIZE都可以存放在/etc/profile或/etc/bashrc这个文件中,并且全局生效。“~/.bash_profile”及“~/.bashrc”表示在当前用户中生效。

第6章 Linux目录文件与系统启动知识说明:“~”表示当前用户的家目录,以“.”开头的文件或目录是隐藏的,需要执行ls-a查看。

上述环境变量文件的生效顺序如图6-8所示,该图展示了登录Shell读取环境变量文件的流程。

第6章 Linux目录文件与系统启动知识

图6-8 环境变量文件生效顺序流程

9./etc/profile.d:用户登录后执行的脚本所在的目录

/etc/profile.d为加载系统登录程序的目录,目录里面的程序以文件的形式存在(一般以“*.sh”为扩展名),但要可执行,示例代码如下:


[[email protected] ~]# cat /etc/profile.d/oldboy.sh 
echo "welcome to oldboy linux training from /etc/profile.d"

/etc/profile.d是登录后执行的脚本所在地,在老男孩的《跟老男孩学Linux运维:Shell编程实战》一书中,讲解跳板机项目时,就是通过加载/etc/profile.d里面的脚本来登录的,登录后即出现跳板机的管理页面。

10./etc/issue和/etc/issue.net:配置在用户登录终端前显示信息的文件

/etc/issue和/etc/issue.net文件的作用是将用户登录真实终端(接显示器)前的信息显示出来,如图6-9所示。

第6章 Linux目录文件与系统启动知识

图6-9 issue用户登录之前显示的信息

/etc/issue文件的内容展示如下:


[[email protected] ~]# cat /etc/issue.net 
\S
Kernel \r on an \m

在企业服务器中,为了防止泄露服务器版本,一般会将issue文件的内容清空。

11./etc/init.d:软件启动程序所在的目录(CentOS7以前)

这个目录可用来存放通过yum或rpm工具安装的软件的默认启动程序(启动脚本)的目录。例如,sshd服务的/etc/init.d/sshd restart(相当于是service sshd restart),IT人员人为开发的软件服务启动程序也可以放置在这里,在CentOS7中该目录也已经废弃不用了,统一由systemctl取代,例如,重启sshd服务的命令为systemctl restart sshd.service。

12./etc/motd:配置用户登录系统之后显示提示内容的文件

/etc/motd文件配置的是用户登录系统之后显示的内容,相当于登录后的一个提示作用,默认是空的。示例代码如下:


[[email protected] ~]# cat /etc/motd 
[[email protected] ~]# echo 'I am oldboy teacher.' >>/etc/motd
[[email protected] ~]# cat /etc/motd 
I am oldboy teacher.
[d:\~]$                           #<==连接已经断开
Connecting to 192.168.2.217:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Thu Jan 31 14:31:14 2019 from oldboy-pc.lan
I am oldboy teacher.              #<==这就是登录之后显示的信息

13./etc/redhat-release:声明Red Hat版本号和名称信息的文件

/etc/redhat-release是用于声明Red Hat版本号和名称信息的文件,如果需要查看系统的版本等信息,可以读取这个文件进行查看。示例代码如下:


     [[email protected] ~]# cat /etc/redhat-release 
     CentOS Linux release 7.6.1810 (Core)

14./etc/sysctl.conf:Linux内核参数设置文件

这是一个涉及Linux系统性能调优的极其重要的文件,作用是设置Linux内核参数,可用来替代系统默认运行的内核参数,让系统运行得更高效。管理员可以通过sysctl-a命令查询可以设置的内核参数信息,修改sysctl.conf完毕后,执行sysctl-p使得修改的信息生效,这部分内容比较复杂,在后文Linux基础优化章节会进行深入阐述,读者可以执行man sysctl.conf命令查看该配置文件的相关帮助,设置相关参数后的运行情况可以通过读取/proc下的信息文件进行查看。CentOS7下的内核配置,还可以通过不同的文件分类进行设置,示例代码如下:


[[email protected] etc]# ls -ld /etc/sysctl.d/ /usr/lib/sysctl.d/
drwxr-xr-x. 2 root root 28 Jan 14 23:10 /etc/sysctl.d/
drwxr-xr-x. 2 root root 85 Jan 29 23:20 /usr/lib/sysctl.d/

15./etc下重要目录文件的汇总小结

表6-3中的文件和目录,是初学者需要了解和掌握的知识。

表6-3 /etc下的重要目录列表

第6章 Linux目录文件与系统启动知识

6.4.2 /usr目录的重要知识介绍

1./usr/local/:编译安装软件默认的位置路径

这个目录一般是用来存放用户自编译安装软件的目录的,对于通过源码包安装的软件,如果没有特别指定安装目录的话,一般会安装在这个目录中,相当于Windows系统下的c:\Program files。

2./usr/src:存放源码文件的目录

这个目录一般被用来存放在网上下载的软件源代码,当然了,这也是可选的,你可以根据需要进行更改。

6.4.3 /var目录下的路径知识

1./var/log:记录系统及软件运行信息文件所在的目录

/var/log目录中包含了大量记录系统及软件服务运行的日志文件,通过这些日志文件,我们可以知道系统的运行情况及故障原因,其中典型的文本日志请参见表6-4。

表6-4 典型的日志文件列表

第6章 Linux目录文件与系统启动知识

2./var/log/messages:系统级别日志文件

/var/log/messages是系统默认的日志文件,这个文件非常重要,当系统及软件遇到运行故障时,可以查看这个日志文件以获取故障信息,该文件按周自动轮循(一周来一刀,每周切割一次)。示例代码如下:


[[email protected] ~]# ls -l /var/log/messages*
-rw-------. 1 root root   1220 Mar 11 11:16 /var/log/messages
-rw-------. 1 root root 197206 Mar 11 03:05 /var/log/messages-20180311

上述轮询日志由/etc/logrotate.conf和/etc/logrotate.d/syslog控制。

3./var/log/secure:用户登录信息日志文件

这是一个有关系统安全的日志文件,日志中会记录“谁,在什么时候,从哪登录到系统,登录是否成功”等信息。ssh、telnet、ftp等服务的用户登录信息都会记录在此。示例代码如下:


[[email protected] ~]# cat /var/log/secure
Mar 11 05:16:01 www sshd[2542]: pam_unix(sshd:session): session closed for user root
Mar 11 12:00:25 www sshd[3932]: Accepted password for root from 192.168.2.1 port 52077 ssh2
Mar 11 12:00:25 www sshd[3932]: pam_unix(sshd:session): session opened for user root by (uid=0)

该文件与messages文件一样,也是按周自动轮循的。示例代码如下:


[[email protected] ~]# ls -l /var/log/secure*
-rw-------. 1 root root  270 Mar 11 12:00 /var/log/secure
-rw-------. 1 root root 3796 Mar 11 03:05 /var/log/secure-20180311

4./var/log/dmesg:记录硬件信息加载情况的日志文件

当硬件及系统内核出现问题时,可以查看这个日志文件,在解决问题时没准会有额外的收获,读者也可以通过dmesg命令来收集相关信息,为能读懂的人提供解决问题的依据。示例代码如下:


[[email protected] log]# dmesg>oldboy.log
[[email protected] log]# tail -5 oldboy.log 
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
e1000: eth0 NIC Link is Down
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
e1000: eth0 NIC Link is Down
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
提示:系统开机加载完硬件后,会执行dmesg将信息输入到/var/log/dmesg中。

6.4.4 /proc下的重要路径知识

/proc是Linux系统下的一个重要的虚拟文件系统,记录着内核和进程方方面面的信息,它是一个很重要的信息宝库,表6-5是最常用的信息文件列表。

表6-5 /proc常用的信息文件列表

第6章 Linux目录文件与系统启动知识

6.5 Linux(CentOS6)系统启动流程说明(重点)

系统管理员需要理解Linux系统的启动流程,这样才能对系统启动时出现的异常进行快速排查。在企业面试时,经常会有面试官让面试者描述Linux的启动流程细节,基于此,下面笔者就为大家简要介绍下Linux系统的启动流程,读者掌握本节的内容就够了,无须过多过细陷入无用知识的泥潭。

第一步:开启开机按钮,计算机加载BIOS自检。

打开计算机电源,计算机首先会加载BIOS(主板上的一块芯片,第0章已经讲解过了)信息,进而对CPU信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等进行自检。当正确检查完所有硬件信息后,计算机就会根据BIOS里的设置去读取相应的启动系统里的硬件设备,如果预先设定了从硬盘启动加载系统,那么BIOS就会读取硬盘的MBR(即0磁道0柱面1扇区的前446字节),接下来才开始加载内核文件,然后交由Linux来控制系统运行。相关的图解如图6-10和图6-11所示。

第6章 Linux目录文件与系统启动知识

图6-10 计算机电源按钮

第6章 Linux目录文件与系统启动知识

图6-11 计算机BIOS管理界面

第二步:读取MBR信息。

MBR全称为Master Boot Record,中文的意思是主引导记录,它位于磁盘上的0柱面0磁道1扇区,整个大小是512字节,MBR里面存放了系统预启动信息、分区表信息及分区标志等。

在MBR的512字节中,第一部分为引导记录区,占有前446字节大小,其作用是找到标记为活动的分区,并将活动分区的引导记录读入内存。

第二部分为分区表,占有后面剩下全部的66字节大小,用于记录磁盘的分区信息,这其中,前64字节是磁盘分区表信息,后2字节是分区的结束标志(后文会详解磁盘分区表)。

计算机读取BIOS所指定的磁盘MBR信息之后,就会将其读入到内存中。被读入到内存中执行的其实就是Boot Loader(引导加载程序),对应于Linux系统,就是加载Grub信息。

第三步:加载Grub菜单(Boot Loader,引导加载程序)。

引导加载程序(Boot Loader)是计算机在加载操作系统内核之前运行的一段小程序。这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境加载到一个适合的状态,以便为最终调用操作系统内核做好准备。通常,引导加载的程序依赖于硬件实现,早期的Linux系统常见的引导加载程序包含2种,即Grub和Lilo,现如今Grub已经成为了主流(类似于Windows下的boot.ini引导文件)。

引导加载程序读取grub.conf文件的配置信息,然后根据对应的配置信息来启动不同的操作系统,grub.conf的配置信息及详解如下所示:


[[email protected] boot]# cat /etc/grub.conf #<==也可读取/boot/grub/menu.lst或
                         /boot/grub/grub.conf。
...此处省略多行注释信息,其实这里的注释已经解释得很清楚了,只是90%的初学者不会看这里...
default=0 #<==默认情况下如何加载系统,0表示加载菜单中对应的第一个名字,多系统时可以调节
         默认加载项。
timeout=5 #<==表示多少秒之后开始加载默认的系统,为管理员提前选择留出时间。
splashimage=(hd0,0)/grub/splash.xpm.gz  #<==启动时显示的背景图标,(hd0,0)代表/boot
                                             分区。
hiddenmenu  #<==系统启动时,会隐藏启动菜单信息,按默认设置即可启动系统,除非用户按键干预。
password [–md5|–encrypted ] STRING      #<==编辑Grub菜单时需要认证,Linux优化之一,
                                            默认为没有。
title CentOS 6 (2.6.32-696.el6.x86_64)  #<==要启动的系统对应的项目名称,可按需修改。
root (hd0,0)  #<==引导内核文件和内核所需驱动文件所在的分区,(hd0,0)代表/boot分区。
    #<==其中hd0表示计算机的第一块磁盘,(hd0,0)中逗号后面的0表示第一个分区,即(hd0,0)表示第一块磁盘的第一个分区,即/dev/sda1(分区通常是最先独立分出的/boot分区,对应的设备名就是sda1)。
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=491eabe5-e6c0-4457-9bdb-b37cc6751308 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet  #<==位于boot分区上的内核文件,及一堆可选内核参数。
    #<==/vmlinuz-2.6.32-696.el6.x86_64为内核文件。root=UUID=后面一串数字表示根对应的设备信息(/dev/sda3),其他介绍的作用不大,忽略即可。
initrd /initramfs-2.6.32-696.el6.x86_64.img  #<==内核启动所需的驱动文件的所在地,存在于boot区。

第6章 Linux目录文件与系统启动知识提示:grub.conf的知识其实在企业Linux运维中用途不是很大,这里讲解Grub的目的是,希望能为读者了解Linux系统的整个启动流程做铺垫,RHCE认证课程会有修复grub.conf的考题,其实没什么大用,因为在IT网站的运维工作中,极少会在线处理问题,出了问题也是直接切换服务了,之后再来慢慢研究是修复还是重装。

在加载Grub菜单的过程中,如果按Esc键,即可停在原来处于隐藏状态下的Grub菜单中,如图6-12所示。

第6章 Linux目录文件与系统启动知识

图6-12 Grub启动菜单

菜单中只有一个选项,底下的小字表示可以做一些特殊的设置提示,例如,设置内核参数、加载单用户模式等。随便设置加载Grub启动参数也是会存在安全隐患的,因此,工作中可以为Grub添加密码以将其锁定(见后文Linux系统基础优化部分)。

第四步:加载kernel内核以及驱动程序。

根据Grub设定的内核映像所在的路径,系统会读取内存映像,并进行解压缩操作。完成解压缩内核之后,屏幕会输出“OK,booting the kernel”的信息。其实就是根据grub.conf中的如下设置加载内核及相关参数:


kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=491eabe5-e6c0-4457-9bdb-b37cc6751308 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

此外,还会加载内核所需的驱动程序文件,进而挂载并读取根分区的信息,加载操作系统文件。示例代码如下:


initrd /initramfs-2.6.32-696.el6.x86_64.img

第五步:启动init进程,读取inittab文件。

加载完内核的相关文件以后,系统第一个运行的程序为/sbin/init,因此,init进程对应的进程号永远为1,相当于是所有Linux进程的祖先。

此时init程序会读取/etc/inittab文件,并依据此文件来进行初始化工作。其实CentOS6以来的/etc/inittab文件最主要的作用就是设定了Linux以什么样的运行等级启动,其设定配置是“id:3:initdefault:”,其中的3就是表明Linux需要运行在3级别上,更多运行级别上文已经讲解过。

第六步:init进程执行rc.sysinit初始化系统。

在CentOS6以前的版本中,init进程会根据inittab的设置加载/etc/rc.d/rc.sysinit,并进行初始化,系统设置包括但不限于如下内容。

设置主机名、设置欢迎信息、**udev和selinux、加载/etc/fstab(挂载磁盘设备等)、设置系统时钟、读取/etc/sysctl.conf设置内核参数、**lvm及software raid设备、加载额外设备的驱动程序、各种清理操作(如清理日志)等。

有兴趣的读者可以浏览/etc/rc.d/rc.sysinit文件查看细节。

CentOS6以后,init进程不再读取inittab加载/etc/rc.d/rc.sysinit了,而是读取/etc/init/rcS.conf文件加载/etc/rc.d/rc.sysinit,并对系统进行初始化系统设置,网上的文章大多数讲的还是CentOS6以前的加载方式,在开机过程中按esc键可以看到,rc.sysinit脚本初始化硬件信息的执行过程如图6-13所示。

第七步:init进程加载内核相关模块。

CentOS5下是读取/etc/modules.conf文件或/etc/modules.d目录下的文件来加载内核模块,而在CentOS6下则是加载/etc/sysconfig/modules/下的内核模块。图6-13中结尾的一行就是加载内核模块的相关信息。

第八步:init进程执行对应运行级别下的脚本。

根据系统设定运行级别的不同,系统会运行rc0.d到rc6.d中的相应脚本程序,从而完成相应的初始化工作,以及启动相应的服务。

第6章 Linux目录文件与系统启动知识

图6-13 rc.sysinit脚本初始化硬件信息的执行过程

需要特别说明的是,在CentOS6以后的版本中,init进程不再读取inittab加载运行级别对应的脚本了,而是读取/etc/init/rc.conf加载指定运行级别下的脚本,对应运行级别的脚本目录如下所示:


[[email protected] ~]# ls /etc/rc.d -l
total 60
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc0.d      #<==0运行级别对应的脚本目录。
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc1.d      #<==1运行级别对应的脚本目录。
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc2.d      #<==2运行级别对应的脚本目录。
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc3.d      #<==3运行级别对应的脚本目录。
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc4.d      #<==4运行级别对应的脚本目录。
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc5.d      #<==5运行级别对应的脚本目录。
drwxr-xr-x. 2 root root  4096 Mar  8 09:55 rc6.d      #<==6运行级别对应的脚本目录。
-rwxr-xr-x. 1 root root   220 Mar 23  2017 rc.local   #<==开机自启动程序配置文件。
-rwxr-xr-x. 1 root root 20199 Mar 23  2017 rc.sysinit #<==初始化系统脚本。

在开机过程中按Esc键,也可以看到系统根据运行级别加载对应运行级别下脚本的执行过程,如图6-14所示。

第九步:加载/etc/rc.local。

rc.local就是在系统做好一切初始化工作之后,留给管理员自主设置的一个文件。可以将需要跟随计算机启动的程序启动命令放置到这里。

第6章 Linux目录文件与系统启动知识

图6-14 根据运行级别加载对应运行级别下脚本执行过程图

第十步:启动mingetty,进入登录前的状态。

系统读取/etc/init/tty.conf(早期也是读取inittab进行设置的),设置对应运行级别的终端,启动mingetty,进入登录前的状态,如图6-15所示。

第6章 Linux目录文件与系统启动知识

图6-15 登录前的界面

此时,输入用户及密码即可登录Linux系统,整个启动过程中的完整图解如图6-16所示。

第6章 Linux目录文件与系统启动知识

图6-16 Linux启动流程图解(CentOS6.9)

6.6 Linux(CentOS7)系统启动流程说明(重点)

CentOS7和CentOS6的启动流程绝大部分还是相同的,但也有一些小区别,例如,CentOS6下第一个启动的init进程被改为了systemd(并行启动模式),下面重点说一下CentOS7加载systemd进程后的启动流程,即从CentOS6启动流程的第五步开始讲起,前四步与CentOS6启动流程的描述一致。

第五步:启动systemd进程,加载如下文件。

1)执行initrd.target(/usr/lib/systemd/system/initrd.target)

包含挂载/etc/fstab文件中的文件系统。

2)systemd执行默认的target配置。

CentOS7已经淡化了CentOS6的运行级别概念,但是为了兼容6以前的用户习惯,仍然以运行级别文件来进行标记,并且每个运行级别文件都有相应的软连接指向,默认的启动文件是/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式。

早期的7种运行级别对应于5个启动模式:


runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target

3)systemd执行sysinit.target,初始化系统及加载basic.target准备启动系统。

4)systemd启动multi-user.target(生产工作模式)下的服务程序,即开机自启动的程序,程序目录为/etc/systemd/system和/usr/lib/systemd/system。

5)systemd执行multi-user.target下的/etc/rc.d/rc.local内容。

6)systemd执行multi-user.target下的getty.target及登录服务。

7)systemd执行graphical所需要的服务(如果安装了图形桌面功能)。

整个启动过程中的简图如图6-17所示。

第6章 Linux目录文件与系统启动知识

图6-17 CentOS7启动过程简图

6.7 本章重点

1)表6-2中根下的目录结构知识。

2)本章介绍的/etc、/var/、/usr等目录下的文件功能和作用。

3)CentOS6和CentOS7的启动流程。