第6章Linux目录文件与系统启动知识第6章Linux目录文件与系统启动知识6.1Linux系统目录结构介绍
6.1.1Linux与Windows目录结构对比
相信好多读者早已熟悉了Linux的目录结构,图6-1可以进一步帮助读者对比Windows和Linux这两个系统的结构,不太了解Linux系统目录结构的读者,通过图6-1也可快速理解。
Windows的目录方式为c:windows,路径分隔符是“”(锯子,反斜线),D、E等盘的目录结构与之类似。Linux的目录方式为/etc/hosts,路径分割符为“/”(斜线),Linux系统的一切目录都是从“/”根开始的。
6.1.2Linux系统目录结构的基本特征
相较于Windows下的目录结构,可能会有读者在初次接触Linux的时侯,认为Linux的目录结构比较复杂,不像Windows视窗那样简单明了,因而倍感很苦恼。
虽然,Linux系统的目录结构同样也是很简单的,只是Linux系统的应用场景多为服务器应用且为字符界面应用,所以不像Windows系统视窗那样直观。并且,Linux系统的目录结构是很有规律的,图6-2所示的是Linux的目录结构最形象的比喻。
图6-1Linux与Windows目录结构对比
从图6-2中可以看出,Linux系统的目录结构具有如下基本特性。
图6-2Linux系统目录结构的特征
·一切从“根”开始,“/”是所有目录的起点(顶点)。
·Linux根下边的目录是一个有层次的树形结构。
·酷似一棵倒挂着的树。
除此之外,Windows系统目录与c盘是强对应的,联系很紧密,譬如,C盘下的目录文件不可能与D盘下的目录有关联或则交集。而Linux系统目录则与此不同,Linux系统的目录与c盘等设备是不直接关联的,每位目录都可以关联(官称:挂载)在不同的设备(比如c盘)上,比如,看似有包含关系的几个目录/、/etc、/boot、/var很可能是分布在不同的分区或c盘上。
在逻辑上,所有的目录(包括目录下的子目录)都在最高级别的目录“/”下,根(“/”)目录是所有目录的起始点(顶点),而实际上访问目录/、/etc、/boot、/var时,可能是在访问完全不同的分区和c盘,图6-3所示的是Linux目录结构和设备挂载的关系图。
Linux下边的设备(c盘),倘若不挂载,则是看不到入口的,如同没窗没门的看守所一样,是不能被正常使用的,假如要访问设备,就必须为设备开一个入口,这个入口就是挂载点,挂载点实质上就是一个目录,开入口的过程,就是将挂载点与c盘设备相关联,即挂载。
图6-3Linux中c盘分区与目录的关系
6.1.3Linux目录结构的特性小结
·Linux系统的所有目录都是一个有层次的倒立着的树形目录结构(倒挂树状结构),“/”根是所有目录的顶点,对于Linux的目录来说,一切从根开始。
·不同目录下的数据可以跨越不同的c盘分区或不同的c盘设备,设备可以随便挂载到任意目录上使用。
·所有的目录都是根据一定的类别有规律地进行组织和命名的。
·没有挂载到目录上的c盘,相当于没有门和阳台的看守所,不能被使用。c盘等设备须要挂载后才会正常使用。
·挂载点是c盘访问的入口,是一个目录。
·相对路径与绝对路径具有如下关系:绝对路径是指以根为起始点的路径,比如/tmp、/opt;相对路径是指相对于非“/”路径的路径,即路径开头没有“/”斜线,比如etc/sysconfig、opt/tmp等,是相对于当前路径(执行pwd可查看)的路径。
提示:老男孩的学习思路为“练习自己归纳总结的能力,把书由厚读薄”
6.2Unix系统目录结构的历史典故
了解目录结构的历史典故,目的是让你们就能清晰地了解并记忆Linux的目录结构。在学习Linux时,为知识赋于一个有意义的故事,是缓解忘掉的好方式。
1969年,KenThompson和DennisRitchie在大型机PDP-7上发明了Unix。1971年,她们将主机升级到了PDP-11,PDP主机如图6-4所示。
图6-4PDP主机
当时,她们使用了一种称为RK05的存储盘,盘的容量大概是1.5MB,如图6-5所示。
图6-51.5MBRK05硬碟和马路上的下水道窨井大小对比
因为硬碟的容量很小,操作系统储存盘储存的数据(根目录)却越来越大linux命令行,因而没过多久一块盘就早已装不下数据了。于是,技术人员加上了第二盘RK05,但是做了规定,第一块盘专门拿来储存系统相关的程序,第二块盘专门拿来储存用户自己的程序,因而,前者挂载点的目投档名为/usr。也就是说,根目录“/”挂载在第一块盘上,“/usr”目录挂载在第二块盘上。除此之外,两块盘上面的其他目录结构是完全相同的,比如:第一块盘的目录(/bin、/sbin、/lib、/tmp...)就会在/usr目录下重新出现一次,下边列举实际目录重复的情况:
[root@oldboy ~]# 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 [root@oldboy ~]# 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-1Linux系统诞生之初的目录及其作用表
6.3Linux的目录结构解读6.3.1目录层次标准(FHS)
FHS的全称为FilesystemHierarchyStandard,英文意思是目录层次标准,是Linux的目录规范标准。详情请参见/。
FHS定义了两层规范,具体如下。
第一层是“/”目录下的各个目录应当储存哪些样的文件数据,比如,/etc目录下放置的是系统的配置文件(例如,/etc/exports、/etc/hosts等),而/bin和/sbin下储存的则是程序及系统命令。
第二层是针对/usr(unixsoftwareresource或secondaryhierarchy)和/var(variabledata)这两个目录的子目录来定义的。诸如,/var/log下放置的是系统日志文件等。
参考资料
/ .html
6.3.2根下目录结构解读
对于每一个Linux初学者来说,耗费时间把握Linux系统的目录结构知识是很有必要的。
当使用Linux系统的时侯,假如执行“ls-l/”命令都会发觉,在“/”下面包含了好多目录内容,例如etc、usr、var、bin等,而在这种目录上面,就会有更多的目录或文件,它们构成了一个树形的结构。
Linux系统目录结构的最顶端是“/”,称其为根目录,根(/)目录是Linux系统所有目录的起始点,所有的目录、文件、设备都在“/”之下,根(/)目录下的目录是一个树形结构,可以如此说,“/”就是Linux文件系统的组织者、领导者,通过tree命令,可以查看Linux的一级目录结构。示例代码如下:
[root@oldboy ~]# 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.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所示)。
配置完网卡以后,可以通过重启网路服务(systemctlrestartnetwork)来促使所有网卡的配置文件生效,假如只需让某个单独的eth0网卡配置生效,则可以通过命令ifdowneth0&&ifupeth0(停掉及启动eth0网卡命令)来实现。
下边是网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0的内容解读:
[root@oldboy ~]# 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 UniqueIdentifier),如果是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 #<==局域网上网网关地址。
提示:更多网卡配置相关的知识请执行less/usr/share/doc/initscripts-*/sysconfig.txt查看。
图6-6nmtui命令配置网卡时的配置文件
2./etc/resolv.conf:Linux系统DNS顾客端配置文件
DNS(DomainNameSystem)在网站的运行中起到了至关重要的作用,其主要负责将网站域名解析为对应的IP地址,比如,将解析为对应的IP地址记录(如1.1.1.1),这个从域名到IP地址的解析过程,也称A记录,即AddressRecord。
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→“Editaconnection”→“DNSservers”,完成配置。
图6-7图形界面更改DNS顾客端设置图
上述设置实际上是同时更改/etc/sysconfig/network-scripts/ifcfg-eth0和/etc/resolv.conf文件。第二种方式是直接编辑/etc/resolv.conf文件,文件的内容如下:
[root@oldboy ~]# cat /etc/resolv.conf nameserver 8.8.8.8 nameserver 202.106.0.20
须要非常注意的是,在网卡配置文件里配置的DNS会覆盖/etc/resolv.conf里的DNS,因而,在新版系统(CentOS6和CentOS7)中,通常只配置网卡配置文件的DNS,这些方式也是笔者推荐的配置方式,假如不想在网卡配置里进行配置,则可以选择在/etc/resolv.conf里进行配置,这个配置文件的功能早已变弱了,详尽配置情况可以执行manresolv.conf获取细节说明。
3./etc/hostname:主机名配置文件
/etc/hostname为CentOS7系统主机名的永久配置文件(CentOS6曾经为/etc/sysconfig/network),更改主机名可采用如下两种方式。
方式1:临时更改法
[root@oldboy ~]# hostname www #<==临时生效。 [root@oldboy ~]# cat /etc/hostname #<==主机名的配置文件内容没变。 oldboy
要想方式1永久生效,须要编辑/etc/hostname进行更改。
方式2:永久更改法
[root@oldboy ~]# hostnamectl set-hostname www [root@oldboy ~]# cat /etc/hostname www #<==主机名的配置文件内容随之改变。
提示:要想立刻生效,须要退出当前链接重新登入,再者,还可以通过nmtui来更改主机名。
4./etc/hosts:系统本地的DNS解析文件
/etc/hosts的作用是设定用户IP与名子(或域名)的对应解析表,相当于本地(局域网内)的DNS解析文件。
Linux系统下的这个/etc/hosts类似于C:WINDOWSsystem32driversetchosts文件,通常在企业里进行开发或测试工作时会使用host域名解析。在企业服务器的Linux环境下,hosts的解析在机房服务器的相互调用中也很常用。下边给出一个门户网站阿里巴巴的解析的真实案例,通过该案例可以看见hosts文件在企业里的作用。
开发、产品、测试等人员将hosts文件用于已通过即将的域名测试但未上线的产品,示例如下:
hosts解析记录 192.168.2.7 www.etiantian
据悉,在企业里,服务器之间的调用也可以通过域名(内部的DNS)来进行,这些方法可以便捷运维人员独立进行服务迁移,而不依赖于开发等人员。
主机名的命名必须专业,也就是说要反映出这条解析记录的明晰用途,以下是/etc/hosts门户解析案例示例代码:
taobao: 172.38.18.23 realtime-search.config-vip.taobao 172.65.54.47 tpbk2configslave1.config-host.taobao alibaba: 172.26.58.40 vafd.china.alibaba 172.23.54.47 normy1.vip.xyi.alidc
其实,解析的记录数目太大,在hosts里更改都会比较麻烦,因而大公司还可能会有内部DNS服务,来管理大量主机名/域名和IP之间的解析记录。
本地系统也要使用hosts解析,示例代码如下:
[root@oldboy ~]# 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本地名称解析记录,十分重要。
提示:企业中,集群服务器中每台服务器的主机名和自身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 172.16.1.31 nfs01 172.16.1.41 backup 172.16.1.61 m01
5./etc/fstab:配置开机设备手动挂载的文件
/etc/fstab是一个重要的文件,其作用是配置开机设备手动挂载。前文早已讲解过了,Linux的设备必需要挂载能够使用,而刚开机时,c盘都是没有挂载的,因而,系统开机会加载/etc/fstab文件,实现对系统分区的手动挂载,其实,管理员也可以借助这个文件实现对新增c盘或分区的开机手动挂载功能。
/etc/fstab文件一共分为如下6列:
[root@oldboy ~]# 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或则c盘标签,可以通过blkid查看设备uuid。
·第2列为设备的挂载点,即访问设备的入口。
·第3列为设备的文件系统类型。详尽内容可通过manmount查看或参见后文。
·第4列为挂载的属性,详尽内容可通过manmount查看或参见后文。
·第5列为是否进行备份。
·第6列为开机时是否做c盘检测,0为不做检测,1、2为做检测。
这个/etc/fstab文件在后文就会进行讲解,读者也可以执行manfstab深入了解。
6./etc/rc.local:储存开机自启动程序命令的文件
/etc/rc.local是用于储存开机自启动程序命令的文件(CentOS6里的chkconfig常拿来管理yum/rpm安装的程序或服务的开机自启动,CentOS7里则使用systemctl命令进行管理)。有时IT人员自己开发的程序须要开机启动,也会习惯性地将启动命令装入/etc/rc.local。Linux开机时会将/etc/rc.local里的内容全部执行一遍linux qq,这是Linux运维人员常用的文件。
非常提示:从CentOS7开始,/etc/rc.local必需要先分配执行权限,上面的脚本能够执行,另外/etc/rc.local是一个软链接文件,它的真实文件所在地为/etc/rc.d/rc.local,因而在使用tar等工具备份的时侯要严格注意。
[root@oldboy ~]# 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 系统文件目录,就是Linux系统的不同状态,类似于人的独身、结婚、离婚等标示。从CentOS6起,inittab文件里就仅存下一个设定运行级别了。示例代码如下:
[root@oldboy ~]# 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命令,查看当前系统的运行级别,示例代码如下:
[root@oldboy ~]# runlevel N 3 #<==N为上一次的运行级别,3为当前的运行级别。
临时更改运行级别(立即生效)的示例代码如下:
[root@oldboy ~]# init 4 #<==将运行级别修改为4,测试(生产服务器不能随意测试)。 [root@oldboy ~]# runlevel 3 4 [root@oldboy ~]# init 3 [root@oldboy ~]# runlevel 4 3
假如想要永久更改运行级别,则须要更改/etc/inittab文件最后一行的id:3:initdefault:部份,其中数字部份就是对应的运行级别,须要重启系统使其生效。
下边是CentOS6曾经的inittab文件,其中不但包含运行级别配置,还包含加载系统初始化脚本、加载各自的运行级别对应脚本、禁止三键重启、加载不同级别的TTY以及桌面设置等的配置信息,具体如下:
[root@oldboy ~]# 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, # 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 #<==加载桌面程序的设置。
非常补充:上述讲解都是CentOS7曾经版本的系统,CentOS7之后版本的变化很大,具体帮助就在/etc/inittab文件里,只不过内容是英语的,相关翻译及操作如下:
[root@oldboy ~]# 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”表示在当前用户中生效。
说明:“~”表示当前用户的家目录,以“.”开头的文件或目录是隐藏的,须要执行ls-a查看。
上述环境变量文件的生效次序如图6-8所示,该图展示了登陆Shell读取环境变量文件的流程。
图6-8环境变量文件生效次序流程
9./etc/profile.d:用户登入后执行的脚本所在的目录
/etc/profile.d为加载系统登陆程序的目录,目录上面的程序以文件的方式存在(通常以“*.sh”为扩充名),但要可执行,示例代码如下:
[root@oldboy ~]# 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:配置在用户登入终端前显示信息的文件
/etc/issue和/etc/issue文件的作用是将用户登入真实终端(接显示器)前的信息显示下来,如图6-9所示。
图6-9issue用户登入之前显示的信息
/etc/issue文件的内容展示如下:
[root@oldboy ~]# cat /etc/issue S Kernel r on an m
在企业服务器中,为了避免泄密服务器版本,通常会将issue文件的内容清空。
11./etc/init.d:软件启动程序所在的目录(CentOS7曾经)
这个目录可拿来储存通过yum或rpm工具安装的软件的默认启动程序(启动脚本)的目录。诸如,sshd服务的/etc/init.d/sshdrestart(相当于是servicesshdrestart),IT人员人为开发的软件服务启动程序也可以放置在这儿,在CentOS7中该目录也早已废弃不用了,统一由systemctl代替,比如,重启sshd服务的命令为systemctlrestartsshd.service。
12./etc/motd:配置用户登入系统以后显示提示内容的文件
/etc/motd文件配置的是用户登入系统以后显示的内容,相当于登陆后的一个提示作用,默认是空的。示例代码如下:
[root@oldboy ~]# cat /etc/motd [root@oldboy ~]# echo 'I am oldboy teacher.' >>/etc/motd [root@oldboy ~]# 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:申明RedHat版本号和名称信息的文件
/etc/redhat-release是用于申明RedHat版本号和名称信息的文件,假如须要查看系统的版本等信息,可以读取这个文件进行查看。示例代码如下:
[root@oldboy ~]# 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基础优化章节会进行深入探讨,读者可以执行mansysctl.conf命令查看该配置文件的相关帮助,设置相关参数后的运行情况可以通过读取/proc下的信息文件进行查看。CentOS7下的内核配置,还可以通过不同的文件分类进行设置,示例代码如下:
[root@oldboy 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.4.2/usr目录的重要知识介绍
1./usr/local/:编译安装软件默认的位置路径
这个目录通常是拿来储存用户自编译安装软件的目录的,对于通过源码包安装的软件,假如没有非常指定安装目录的话,通常会安装在这个目录中,相当于Windows系统下的c:Programfiles。
2./usr/src:储存源码文件的目录
这个目录通常被拿来储存在网上下载的软件源代码,其实了,这也是可选的,你可以按照须要进行修改。
6.4.3/var目录下的路径知识
1./var/log:记录系统及软件运行信息文件所在的目录
/var/log目录中包含了大量记录系统及软件服务运行的日志文件,通过这种日志文件,我们可以晓得系统的运行情况及故障缘由,其中典型的文本日志请参见表6-4。
表6-4典型的日志文件列表
2./var/log/messages:系统级别日志文件
/var/log/messages是系统默认的日志文件,这个文件特别重要,当系统及软件遇见运行故障时,可以查看这个日志文件以获取故障信息,该文件按周手动轮循(一周来一刀,每周切割一次)。示例代码如下:
[root@oldboy ~]# 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等服务的用户登入信息就会记录在此。示例代码如下:
[root@oldboy ~]# 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文件一样,也是按周手动轮循的。示例代码如下:
[root@oldboy ~]# 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命令来搜集相关信息,为能看懂的人提供解决问题的根据。示例代码如下:
[root@oldboy log]# dmesg>oldboy.log [root@oldboy 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.5Linux(CentOS6)系统启动流程说明(重点)
系统管理员须要理解Linux系统的启动流程,这样就能对系统启动时出现的异常进行快速排查。在企业笔试时,常常会有笔试官让笔试者描述Linux的启动流程细节,基于此,下边笔者就为你们简略介绍下Linux系统的启动流程,读者把握本节的内容就够了,无须过多过细深陷无用知识的泥沼。
第一步:开启开机按键,计算机加载BIOS自检。
打开计算机电源,计算机首先会加载BIOS(显卡上的一块芯片,第0章早已讲解过了)信息,从而对CPU信息、设备启动次序信息、硬盘信息、内存信息、时钟信息等进行自检。当正确检测完所有硬件信息后,计算机都会按照BIOS里的设置去读取相应的启动系统里的硬件设备,假如预先设定了从硬碟启动加载系统,这么BIOS都会读取硬碟的MBR(即0扇区0柱面1磁道的前446字节),接出来才开始加载内核文件,之后交由Linux来控制系统运行。相关的图解如图6-10和图6-11所示。
图6-10计算机电源按键
图6-11计算机BIOS管理界面
第二步:读取MBR信息。
MBR全称为MasterBootRecord,英文的意思是主引导记录,它坐落c盘上的0柱面0扇区1磁道,整个大小是512字节,MBR上面储存了系统预启动信息、分区表信息及分区标志等。
在MBR的512字节中,第一部份为引导记录区,占有前446字节大小,其作用是找到标记为活动的分区,并将活动分区的引导记录读入显存。
第二部份为分区表,占有前面剩下全部的66字节大小,用于记录c盘的分区信息,这其中,前64字节是c盘分区表信息,后2字节是分区的结束标志(后文会解读c盘分区表)。
计算机读取BIOS所指定的c盘MBR信息然后,都会将其读入到显存中。被读入到显存中执行的虽然就是BootLoader(引导加载程序),对应于Linux系统,就是加载Grub信息。
第三步:加载Grub菜单(BootLoader,引导加载程序)。
引导加载程序(BootLoader)是计算机在加载操作系统内核之前运行的一段小程序。这段小程序可以初始化硬件设备、建立显存空间的映射图linux 系统文件目录,因而将系统的软硬件环境加载到一个适宜的状态,便于为最终调用操作系统内核做好打算。一般,引导加载的程序依赖于硬件实现,初期的Linux系统常见的引导加载程序包含2种,即Grub和Lilo,现现在Grub早已成为了主流(类似于Windows下的boot.ini引导文件)。
引导加载程序读取grub.conf文件的配置信息,之后按照对应的配置信息来启动不同的操作系统,grub.conf的配置信息及解读如下所示:
[root@oldboy 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区。
提示:grub.conf的知识显然在企业Linux运维中用途不是很大,这儿讲解Grub的目的是,希望能为读者了解Linux系统的整个启动流程做铺垫,RHCE认证课程会有修补grub.conf的试题,虽然没哪些大用,由于在IT网站的运维工作中,很少会在线处理问题,出了问题也是直接切换服务了,然后再来渐渐研究是修补还是重装。
在加载Grub菜单的过程中,假如按Esc键,即可停在原先处于隐藏状态下的Grub菜单中,如图6-12所示。
图6-12Grub启动菜单
菜单中只有一个选项,里边的篆字表示可以做一些特殊的设置提示,比如,设置内核参数、加载单用户模式等。随意设置加载Grub启动参数也是会存在安全隐患的,因而,工作中可以为Grub添加密码以将其锁定(见后文Linux系统基础优化部份)。
第四步:加载kernel内核以及驱动程序。
按照Grub设定的内核映像所在的路径,系统会读取显存映像,并进行解压缩操作。完成解压缩内核以后,屏幕会输出“OK,bootingthekernel”的信息。虽然就是按照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(挂载c盘设备等)、设置系统时钟、读取/etc/sysctl.conf设置内核参数、激活lvm及softwareraid设备、加载额外设备的驱动程序、各种清除操作(如清除日志)等。
有兴趣的读者可以浏览/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-13rc.sysinit脚本初始化硬件信息的执行过程
须要非常说明的是,在CentOS6之后的版本中,init进程不再读取inittab加载运行级别对应的脚本了,而是读取/etc/init/rc.conf加载指定运行级别下的脚本,对应运行级别的脚本目录如下所示:
[root@oldboy ~]# 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-14按照运行级别加载对应运行级别下脚本执行过程图
第十步:启动mingetty,步入登陆前的状态。
系统读取/etc/init/tty.conf(初期也是读取inittab进行设置的),设置对应运行级别的终端,启动mingetty,步入登陆前的状态,如图6-15所示。
图6-15登陆前的界面
此时,输入用户及密码即可登入Linux系统,整个启动过程中的完整图解如图6-16所示。
图6-16Linux启动流程图解(CentOS6.9)
6.6Linux(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-17CentOS7启动过程简图
6.7本章重点
1)表6-2中根下的目录结构知识。
2)本章介绍的/etc、/var/、/usr等目录下的文件功能和作用。
3)CentOS6和CentOS7的启动流程。