十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
创新互联建站不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的成都网站设计、成都网站建设质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式营销型网站建设需求,让再小的品牌网站建设也能产生价值!
GNU GRUB 和GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。用来引导不同系统,如windows,linux。
GNU GRUB的前身为Grand Unified Bootloader。它主要用于类Unix系统;同大多Linux发行版一样,GNU系统也采用GNU GRUB作为它的启动器。Solaris从10 1/06版开始在x86系统上也采用GNU GRUB作为启动器。
注意:目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy ,从 1.x 开始的就称为 GRUB 2。
在X86架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。
计算机在启动的时候,首先由BIOS中的程序执行自检,自检通过后,就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序(一般在启动盘的第一个物理扇区,占416字节),并把控制权交给Boot Loader,由Boot Loader进一步完成操作系统内核的加载。当Boot Loader找到内核之后,就把控制权交给操作系统内核,由内核继续完成系统的启动。
可以看出,Boot Loader是计算机启动中第二个要执行的程序,它是引导操作系统的关键程序。可以引导操作系统的Boot Loader主要有LiLo、GRUB以及Windows下的MBR程序。其中,GRUB是目前使用最为广泛,并且非常优秀的一款启动引导程序。
GRUB对设备的命名
首先,GRUB对设备的命名必须包含在小括号( )内;其次,GRUB不区分IDE硬盘和SCSI硬盘,统一使用hdx,其中x指定BIOS中硬盘的编号,并从0开始计数,而且IDE硬盘编号小于SCSI硬盘;第三,GRUB用fdx指定软盘设备,x是软盘驱动器号。下面是一些GRUB对设备命名的举例:
q(fd0)表示第1个软盘
q(hd0,1)表示第1个硬盘的第2个分区
q(hd0,0)/boot/vmlinuz表示第1个硬盘的第一个分区下的boot/目录下的vmlinuz文件。如果没有指定某个分区,则表示使用整个设备,否则只使用指定的分区
q(hd0,2,a)专用于FreeBSD,FreeBSD有一个slice概念,把一个分区进一步分为几个slice,此处指明是第1块硬盘的第3个分区中的slice a。
GRUB的执行流程
当系统加电后,固化在BIOS中的程序首先对系统硬件进行自检,自检通过后,就加载启动磁盘上的MBR,并将控制权交给MBR中的程序(stage1),stage1执行,判断自己是否GRUB,如果是且配置了stage1_5,则加载stage1_5,否则就转去加载启动扇区,接着,stage2被加载并执行,由stage2借助stage1_5驱动文件系统,并查找grub.conf,显示启动菜单供用户选择,然后根据用户的选择或默认配置加载操作系统内核,并将控制权交给操作系统内核,由内核完成操作系统的启动。
GRUB涉及到几个重要的文件:
第一个就是stage1。它被安装在MBR扇区(0面0磁道的第1扇区),大小为512字节(446字节代码+64字节分区表+2字节标志55AA),它负责加载存放于0面0道第2扇区的start程序。
第二个是stage1_5。stage1_5负责识别文件系统和加载stage2,所以stage1_5往往有多个,以支持不同文件系统的读取。在安装GRUB的时候,GRUB会根据当前/boot/分区类型,加载相应的stage1_5到0面0磁道的第3扇区。stage1_5是由start加载的。
第三个是stage2。它负责显示启动菜单和提供用户交互接口,并根据用户选择或默认配置加载操作系统内核。同前两个文件不同,stage2是存放在磁盘上/boot/grub下。
第四个是menu.lst(/boot/grub/grub.conf的链接)。grub.conf是一个基于脚本的文本文件,其中包含菜单显示的配置和各个操作系统的内核加载配置。GRUB根据grub.conf显示启动菜单,提供同用户交互界面。GRUB正是根据用户选择或默认配置和grub.conf的内核配置加载相应的内核程序,并把控制权交给内核程序,使得内核程序完成真正的操作系统的启动。
其它重要文件,GRUB除了上面叙述的主要文件之外,还包括支持交互功能的一些磁盘程序。主要包括/sbin/下的grub、grub-install、grub-md5-crypt和grub-terminfo和/usr/bin/mbchk,以及/boot/grub下的设备映像文件(device.map)和菜单背景图像文件(splash.xpm.gz)。
通过上面的分析总结,可以很容易地看出,GRUB实际上包含两部分,一部分被安装在磁盘的特殊扇区,另外一部分则以文件的形式存在。要让GRUB启动操作系统,就必须首先把GRUB的stage1和stage1_5(根据文件系统自动选择是否安装)安装到磁盘的特殊扇区,另外,在磁盘的/boot/grub下存在有grub.conf、device.map等文件和支持交互的程序,而且这些程序必须在PATH环境变量指定的路径中。具备了这些知识,相信不管是安装、配置、备份或修复GRUB都不是件很难的是情。
安装GRUB到MBR
GRUB的工作目录是在/boot/grub下,而make install并没将其安装到/boot/grub。所以,安装完成后要执行如下一些操作:
a)把/usr/local/share/grub/i386-pc/目录下的所有文件统统拷贝到/boot/grub/目录下(要先下载源码包进行./configure,make, make install)
#cp /usr/local/share/grub/i386-pc/* /boot/grub/
b)在/boot/grub下创建grub.conf文件,并建立一个到grub.conf的软链接menu.lst
#cd /boot/grub
#touch grub.conf
#ln -s grub.conf menu.lst
注意!如果已经存在grub.conf,就最好不要再次创建,需要时直接修改即可。
c)确认/usr/local/sbin和/usr/local/bin在PATH变量的值中,执行如下命令检查
#env |grep PATH
如果发现/usr/local/sbin和/usr/local/bin不在PATH变量中,可以通过如下命令修改:
#export PATH=$PATH /usr/local/sbin:/usr/local/bin
d)安装GRUB到MBR
GRUB在启动中,被BIOS调用,只有放在MBR中才可以被调用,所以,GRUB要让BIOS调用,就必须安装在MBR中。实际上是将stage1安装到MBR中,也可能根据文件系统选择安装了stage1_5。下面,提供几个安装GRUB的例子:
#grub-install /dev/hda //将GRUB安装到第1块IDE硬盘的MBR
#grub-install /dev/sda//将GRUB安装到第1块SCSI硬盘的MBR
#grub-install /dev/fd0//将GRUB安装到软盘
#grub-install /dev/hda1//将GRUB安装到第1快硬盘的0扇区,当用其它引导程序引导系统时,往往选择这种方式,以免覆盖其它引导程序。
e)在GRUB的命令行模式下安装GRUB
关于GRUB命令行模式及其操作方法请参考3小节的内容。在系统显示启动菜单时候按下c键,或者系统启动后在命令行执行/usr/sbin/grub程序,都可以进入GRUB的命令行模式。命令行模式下安装GRUB的基本过程如下:
----指定启动设备
grub>root (hd0,0)#除了root后必须有空格,别的位置均不能有空格!
此处(hd0,0)是指第1块硬盘的第1个分区。如果不能确定包含GRUB的stage1文件的分区,可以通过find指令查找确定:
grub>find /boot/grub/stage1#查找stage1
GRUB将会查找文件/boot/grub/stage1并显示包含这个文件的设备名,这个设备就是上面要用到的设备。
----安装GRUB
grub>setup (hd0)#除了setup后必须有空格,别的位置均不能有空格!
这条命令将会在第1块硬盘的MBR安装GRUB,如果不想在MBR安装GRUB,而是希望将GRUB安装在某分区的引导扇区的话,可以用下面的命令安装:
grub>setup (hd0,0)#除了setup后必须有空格,别的位置均不能有空格!
这将会在第1块硬盘的第1个分区的引导扇区安装GRUB。
----退出GRUB
grub>quit
f)重启机器,新安装的GRUB生效
GRUB配置文件示例
grub.conf是GRUB的配置文件,其结构比较简单,可以分为两部分,第一步分是全局配置,另外一部分就是每个操作系统的启动配置。其中可以有多个操作系统的菜单配置。下面就是一个具体的例子。
#=================/boot/grub/grub.conf文件范例==================
timeout 30 #等待用户选择菜单项的时间(以秒计),超时则引导默认的选项
default 0 #默认选项,第一项
fallback 1 #如果第一项出错,则启动下面的后备选项
splashimage=(hd0,0)/grub/splash.xpm.gz #GRUB启动画面
#以下是启动Linux的配置
titleRed Hat Linux Enterprise AS3 for syd168 #启动项的菜单标题
root (hd0,0) #指定根文件系统,第1块硬盘第1个扇区中的/boot。
kernel /vmlinuz-2.4.18 ro root=LABEL=/ #内核在/boot中
initrd /initrd-2.4.18-14.img #启动RAM盘在/boot下
#以下是启动Windows的配置,如果只有Linux就不需要
title Windows2003 Enterprise for syd168 #Windows启动菜单标题
root noverify(hd0,1) #该操作系统在hd0的第二分区,不mount
chainloader +1 #从第一个硬盘的第二个分区引导Windows
#=================/boot/grub/grub.conf文件范例
上面的例子,只是简单说明了GRUB中启动Linux和Windows的配置方法。更多的启动配置请参考下面内容。
5.引导多系统配置
GRUB支持多操作系统引导。用GRUB引导后可以进入命令行模式或者菜单模式,可以通过灵活的命令行模式选择引导各个分区的操作系统,指定引导参数。GRUB支持三种引导方法,一种是直接引导操作系统内核,另一种是通过chainload进行间接引导,第三种就是通过网络引导操作系统。
对于GRUB能够支持的Linux,FreeBSD,OpenBSD,NetBSD,GUN Mach等可以通过直接引导完成,但是对于GRUB不支持的操作系统(如Windows),需要用第二种方法chainload来完成。下面就分别来看看这几种引导方法:
(1) 直接引导
配置过程通常如下:
a) 用root命令设置包含操作系统内核的根设备
b) 用kernel命令装载内核映象文件,如果这个内核引导的时有参数的话,可以直接将参数加在内核文件名的后面
c) 用module或modulenounzip装载内核模块
d) boot开始引导
(2) chainload引导
a) 设置GRUB的根设备,用rootnoverify (hdx,y)指定
b) 开始引导,用chainloader +1指定,此处“+1”是指示GRUB读入分区的第一个扇区的引导记录。
c) 执行boot开始引导
以上是一般的chainloader方式,对于DOS和WINDOWS,可以简单地用两条指令进行引导:chainloader (hdx,y)+1,然后boot,其中x,y用来指明所在分区号。
(3) 从网络引导:
为了使GRUB能够支持从网络引导,需要在编译时打开网络支持选项(请参考源文件中的netboot/README.netboot)。另外,要在网络中设置两个服务:动态IP服务(BOOTP、DHCP或RARP)和FTP服务。然后,分别针对不同的服务器BOOTP,DHCP或RARP运行bootp,dhcp或rarp。如果一切设置无误的话GRUB就会给出IP,IP netmask和TFTP服务器的IP和网关的IP地址。最后,从网上得到操作系统的映象文件。下面是一个例子:
grub> bootp
Probing…[NE*000]
NE2000 base …
Address: 192.168.110.23 Netmask: 255.255.255.0
Server: 192.168.110.14 Gateway: 192.168.110.1
grub> root (nd)
grub> kernel /tftproot/gnumach.gz root=sd0s1
==================================================
下面就是各个玩家对这个问题分析讨论的总结。
首先让我们看看传统的启动流程:加载并运行Master Boot Record(MBR)主引导区内容(如lilo等)。然后扫描分区表,定位活动分区,并将活动分区上的引导扇区内容加载到内存中执行。
系统引导过程主要由以下几个步骤组成(以硬盘启动为例)
1、 开机;
2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;
3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;
5、 跳转到0000:7c00处执行MBR中的程序;
6、 MBR先将自己复制到0000:0600处,然后继续执行;
7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;
8、 将活动分区的第一个扇区读入内存地址0000:7c00处;
9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
10、 跳转到0000:7c00处继续执行特定系统的启动程序;
11、 启动系统。
装grub到逻辑分区,那么就一定把grub装入的逻辑分区设为活动的。不过,这时候,grub接管了11步以后的动作:从stage 1.5读出grub.conf。再由配置和用户选择决定下一步的引导行为。
一般安装grub都有两种情况,对于安装到MBR这种情况而言,GRUB直接覆盖了原来的MBR引导程序。这也是为什么要换回“原来的 windows的引导方式”,只要用dos引导fdisk /mbr一下就可以的原因。为什么可以这样做,请注意,1-11步中有两个地方出现了0000:7c00。不管是dos boot sector还是nt loader它本身也是从0000:7c00运行的。其实ms当年开发分区管理的这个小程序相当于是在bios引导boot sector中插进去的。grub因为也是写的从0000:7c00这个内存开始的子程序,那么既可以被BIOS加载又可以被dos的MBR加载应该好理 解了吧。
开机自检后,引导权交给了硬盘的MBR,此时grub就启动了。由grub来引导windows /linux都可以。注意:linux不一定要安装在活动分区,因为引导程序在MBR!但是windows一定要安装在活动分区(可引导的 windows),第二个windows可以不安装在活动分区,但它的引导文件一定在活动分区。
大体顺序是:
grub—->windows–>查找引导文件—引导加载—启动windows
grub—->linux—>查找引导文件(/boot)–>引导加载—启动linux
那么,如果把grub安装到了其它的分区上,不是MBR呢?这是grub所装在的那个主分区必须被设为活动分区。因为MBR(物理主引导分 区)中其实并没有 OS相关的引导程序的,通常MBR只是扫描并读取随后的分区表,找到相应的活动分区,读取相应活动分区的第一个扇区的512字节程序并运行,该程序负责进 一步引导相应分区的相应系统。因此,大概的运行次序是
BIOS—>MBR—->GRUB—->菜单。
这样,大体的真实流程就可以总结如下了:
1、 开机;
2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;
3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;
5、 跳转到0000:7c00处执行MBR中的程序;
6、 MBR先将自己复制到0000:0600处,然后继续执行;假如先装XP后装LINUX,并且LINUX没有装在MBR,那这个MBR中的数据还是WIN 写的数据,它的作用都是下步中所说的作用,就是搜索主分区表中标志为活动的分区,那么这个时候就必须把GRUB所在的主分区设置为活动的分区,这个时候才 能正常的启动GRUB,然后GRUB的STAGE1在调STAGE1.5和其他的,从而来引导整个系统。假如说先装XP后装LINUX,但是GRUB装在 了MBR,那样STAGE1直接调入内存,STAGE1在调STAGE1.5和STAGE2等,从而来引导系统。那这个时候是不需要将GRUB其他文件所 在的主分区设为活动分区的,它直接调STAGE1.5等,然后再调STAGE2等,来识别文件系统,从而实现可多启动。
7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;
8、 将活动分区的第一个扇区读入内存地址0000:7c00处;
9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
10、 跳转到0000:7c00处继续执行特定系统的启动程序;
11、 启动系统。
一点资料:
能正常工作的grub应该包括一下文件:stage1、stage2、*stage1_5、menu.lst。
其中stage1的大小一定是512字节,它要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要用fdisk标记 成可启动的)的启动扇区。stage1的主要的也是唯一的作用就是找到你存放在硬盘上某个地方的stage2文件,来完成后续的工作。
stage2 文件可以存在在某个特定的文件系统中,比如你分了一个linux分区,在上面创建一个ext2文件系统,然后把这个文件拷贝到这个分区的某个目录下。也可 以把stage2直接存放在硬盘的某个位置,也就是未分区的某个地方。不过,好像没有多少人会这么做吧。
因为stage1的容量有限(主引导记录MBR和启动扇区的大小只能够是512字节),所以它对文件系统是无法识别的,那如果你把 stage2存放 在 ext2或者fat格式的文件系统上,它如何来找到这个文件呢?这就要用到上面提到的那些stage1_5的文件了,它们负责解释文件系统。你的 stage2放在什么格式的文件系统上,就要调用对应的那个stage1_5文件。比如,你把stage2存放在ext2格式的文件系统上,就需要 e2fs_stage1_5;stage2存放在fat格式的文件系统上,就需要fat_stage1_5了。
Linux的启动其实和windows的启动过程很类似,不过windows我们是无法看到启动信息的,而Linux启动时我们会看到许多启动信息,例如某个服务是否启动。Linux系统的启动过程大体上可分为五部分:内核的引导、运行init、系统初始化、建立终端、用户登录系统。
1. 内核引导
当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。紧接着由启动设备上的grub程序开始引导Linux,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。也就是所谓的内核引导开始了,在内核引导过程中其实是很复杂的,我们就当它是一个黑匣子,反正是Linux内核做了一系列工作,最后内核调用加载了init程序,至此内核引导的工作就完成了。交给了下一个主角init.
2. 运行init
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。 而所有的动作都会通过 init的配置文件/etc/inittab来规划,而inittab 内还有一个很重要的设定内容,那就是默认的 runlevel (开机运行级别)。先来看看运行级别Run level,Linux就是通过设定run level来规定系统使用不同的服务来启动,让Linux的使用环境不同。我们来看看这个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
#
# Individual runlevels are started by /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:
inittab配置文件格式和之前老版本CentOS5或者更老版本比有很大改动。Runlevels共七个级别,0表示关机,1表示单用户,2表示没有网络的命令行级别,3命令行级别(大多服务器都用这个级别),4为保留级别,5为图形化级别,6为重启。这个文件中除了最后一行外,其他都为注释行,也就是说最后一行才是关键,它用来指定服务器跑哪个级别,这里除了可以设置2,3,5外其他级别都不能设置。在该文件的前面部分,可以看到很多行都提及到某个配置文件,而所有配置文件都是在/etc/init/目录下。
3. 系统初始化
系统初始化,就是去执行/etc/init/下的各个配置文件。inittab配置文件中有这么一行 “System initialization is started by /etc/init/rcS.conf” 也就是说系统初始化会先执行/etc/init/rcS.conf 而该配置文件中又有一行 “exec /etc/rc.d/rc.sysinit” 所以,重心又转移到了这个rc.sysinit文件上,它会做如下工作:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。当rc.sysinit程序执行完毕后,将返回init继续下一步,又到了/etc/init/rc.conf, 在这个配置文件里,最关键的一行为 “exec /etc/rc.d/rc $RUNLEVEL” 而$RUNLEVEL是在/etc/inittab中定义的(最下面的那一行),以咱们的/etc/inittab为例,表示$RUNLEVE=3, 所以此时会执行 “/etc/rc.d/rc 3” 此时实际上是把/etc/rc.d/rc3.d/ 下的脚本都给执行了,随后/etc/rc.d/rc.local也会被执行,通常我们会把开机启动执行的命令放到这个脚本下。服务执行完,系统初始化也就完成了。接下来该建立终端了。
4. 建立终端
建立终端是由配置文件/etc/init/tty.conf, /etc/init/serial.conf和/etc/sysconfig/init等配置文件来完成的。在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户身份。
5. 用户登陆系统
对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。
Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在 “/etc/nologin” 文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有 “/etc/securetty” 中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。”/etc/usertty” 文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login将搜索 “/etc/passwd” 以及 “/etc/shadow” 来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种Shell。如果没有指定主目录,将默认为根目录;如果没有指定Shell,将默认为 “/bin/bash”。
login程序成功后,会向对应的终端在输出最近一次登录的信息(在 “/var/log/lastlog” 中有记录),并检查用户是否有新邮件(在 “/usr/spool/mail/” 的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找 “/etc/profile” 脚本文件,并执行它;然后如果用户的主目录中存在 .bash_profile 文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。
图形界面与命令行界面切换
Linux预设提供了六个命令窗口终端机让我们来登录。默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。
init程序的类型:
SysV: init, CentOS 5之前, 配置文件: /etc/inittab。
Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
Systemd: systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。
最后是总结CentOS系统启动流程:
post(加电自检) –> BootSequence(启动顺序选择BIOS中实现)–> bootloder(引导加载器,MBR中实现 –> Kernel(加载内核,会生成ramdisk –> rootfs(以readonly方式加载根文件系统)–> /sbin/init(运行第一个应用程序(相当于小管家)) –> 设置默认允许级别 –> 允许系统初始化脚本,完成系统初始化 –> 关闭对应级别下要停止的服务,启动对应级别下需要开启的服务 –> 设置登陆终端 –> [启动图形终端]
systemd与Upstart(Centos6)的区别以及作用
System V init运行级别 | systemd目标名称 | 作用 |
0 | runlevel0.target, poweroff.target | 关机 |
1 | runlevel1.target, rescue.target | 单用户模式 |
2 | runlevel2.target, multi-user.target | 等同于级别3 |
3 | runlevel3.target, multi-user.target | 多用户的文本界面 |
4 | runlevel4.target, multi-user.target | 等同于级别3 |
5 | runlevel5.target, graphical.target | 多用户的图形界面 |
6 | runlevel6.target, reboot.target | 重启 |
emergency | emergency.target | 紧急Shell |
如果想要将系统默认的运行目标修改为“多用户,无图形”模式,可直接用ln命令把多用户模式目标文件连接到/etc/systemd/system/目录:
[root@localhost~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
1、 什么是CentOs系统启动流程
CentOs系统启动流程是CentOs主机从开机加电自检到整个系统(包括应用程序)都处于一个正常工作的状态;
整个流程从宏观可分为硬件与系统两个层面,而系统又可以分为内核空间和用户空间的启动,每一块都是按照某些规则自动运行。
2、 了解CentOS系统启动流程对我们有什么帮助
在实际工作中,CentOs主机难免会出现无法启动或启动异常,而在了解了CentOs系统启动流程后,可以针对问题对症下药,而且通过学习CentOs系统启动流程后,可掌握部分的Linux工作机制,为以后的解决Linux故障打下扎实的基础。
3、 CentOs系统启动流程详解
在讲解CentOs系统启动流程前,先讲一下Linux系统的组成与运行中的系统环境分层,有助于掌握启动流程的原理。
Linux系统的组成:内核 + 根文件系统
内核可实现以下功能:进程管理、内存管理、网络协议栈、文件系统、安全功能、驱动程序。
内核是linux的整个核心,确切的说内核即是Linux,其他程序都是通过调度内核来实现其功能。
运行中的系统环境分层:内核空间bootfs + 用户空间rootfs
内核空间: 由内核代码组成,拥有系统级别权限,可直接更改硬件;
用户空间: 由各种应用程序组成,通过调用内核来完成各种复杂的任务。
Centos7系统的启动流程:
1、uefi或BIOS初始化,开始开机自检
这个过程是开机后,BIOS或UEFI进行硬件检查的阶段。
2、加载mbr到内存
自检硬件没有问题时候,这里以BIOS为例,BIOS将会直接找硬盘的第一个扇区,找到前446字节,将MBR加载到内存中,MBR将告诉程序下一阶段去哪里找系统的grub引导。此阶段属于grub第一阶段。grub还有1.5阶段和2阶段。
3、加载GRUB程序的阶段
引导装载程序, centos7是grub2
加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub
/boot/grub2/grub.cfg,选择多操作系统启动,加载Linux内核
4、加载Linux内核和inintamfs模块
加载内核,核心开始解压,启动一些最核心的程序。
可见在 kernel 挂载根文件系统完成后,启动 init 进程。init 进程是 linux 系统启动的第一个进程,那么 CentOS7 中的第一个进程是什么?
# 解压 查看CentOS7 内核文件:
mkdir -p /data/img
# 不通版本内核版本号可能不同。
cp /boot/initramfs-3.10.0-693.11.6.el7.x86_64.img /data/img
cd /data/img
/usr/lib/dracut/skipcpio initramfs-3.10.0-693.11.6.el7.x86_64.img | zcat | cpio -id --no-absolute-filenames
解压后的目录如下
lrwxrwxrwx. 1 root root 7 Jan 24 10:27 bin -> usr/bin
drwxr-xr-x. 2 root root 42 Jan 24 10:27 dev
drwxr-xr-x. 12 root root 4096 Jan 24 10:27 etc
lrwxrwxrwx. 1 root root 23 Jan 24 10:27 init -> usr/lib/systemd/systemd
lrwxrwxrwx. 1 root root 7 Jan 24 10:27 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jan 24 10:27 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Jan 24 10:27 proc
drwxr-xr-x. 2 root root 6 Jan 24 10:27 root
drwxr-xr-x. 2 root root 6 Jan 24 10:27 run
lrwxrwxrwx. 1 root root 8 Jan 24 10:27 sbin -> usr/sbin
-rwxr-xr-x. 1 root root 3117 Jan 24 10:27 shutdown
drwxr-xr-x. 2 root root 6 Jan 24 10:27 sys
drwxr-xr-x. 2 root root 6 Jan 24 10:27 sysroot
drwxr-xr-x. 2 root root 6 Jan 24 10:27 tmp
drwxr-xr-x. 7 root root 61 Jan 24 10:27 usr
drwxr-xr-x. 2 root root 27 Jan 24 10:27 var
可见 init 进程软链到了 systemd。此时 systemd 成为linux第一个进程(PID=1),接管系统启动。
为了让内核足够的轻小,硬件驱动并没放在内核文件里面。
kernel内核开始初始化,用systemd来代替centos6以前的init程序
先执行initrd.target(/usr/lib/systemd/system/initrd.target)所有单元,包括挂载/etc/fstab文件中系统,挂载之后,就可以切换到根目录了。
从initramfs根文件系统切换到磁盘的根目录
5、systemd执行默认target配置
centos7表面有“运行级别”这个概念,实际是为了兼容以前的系统,每个所谓“运行级别”都有对应的软连接指向,默认的启动级别/etc/systemd/system/default.target,根据它的指向可以找到系统要进入到哪个模式。
[root@localhost img]# ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 10月 21 05:33 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
可以看到在多用户字符界面,指向到了multi-user.target,
[root@localhost img]# cat /lib/systemd/system/multi-user.target
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
文件中配置项 Requires=multi-user.target 将控制权交给 multi-user.target (相当于旧概念的运行级别)。
Centos6模式和7对应关系:
init 0 ==> runlevel0.target, poweroff.target
init 1 ==> runlevel1.target, rescue.target
init 2 ==> runlevel2.target, multi-user.target
init 3 ==> runlevel3.target, multi-user.target
init 4 ==> runlevel4.target, multi-user.target
init 5 ==> runlevel5.target, graphical.target
init 6 ==> runlevel6.target, reboot.target
systemd执行sysinit.target(/usr/lib/systemd/system/sysinit.target)初始化系统及basic.target(/usr/lib/systemd/system/basic.target.wants/)准备操作系统。
systemd启动multi-user.target下的本机与服务器服务(/etc/systemd/system/multi-user.target.wants)
systemd执行multi-user.target下面的/etc/rc.d/rc.local
Systemd执行multi-user.target(/usr/lib/systemd/system/multi-user.target.wants/)下的getty.target及登录服务
getty.target,它是启动终端的systemd对象。如果到此步骤,系统没有指定启动图形桌面,到此就可以结束了.
-----------------------------------------------------
如果需要启动图形界面,要在此基础上启动桌面程序。
systemd执行graphical图形化需要的服务
至此系统启动完成,可以正常使用。
官方给出启动流程图
Centos 7 操作系统启动流程
POST --> BIOS(boot) --> Bootloader(MBR(446)) --> kernel(initrd) --> init(systemd) à (systemd内启动流程:/usr/lib/systemd/system/default.target —>multi-user.target—>basic.targetàsysinit.target-àlocal-fs.target-à getty.target)
虽然systemd的引用target的顺序如上,但是真正的启动顺序为从下到上,其中管理单元可以并行启动,从而使效率大大提高。
要查看具体的启动顺序可以通过如下命令输入到文件,然后通过浏览器打开查看。
systemd-analyze plot > boot.html
列出所有正在运行的单元,按从初始化开始到启动所花的时间排序。
systemd-analyze blame
一、systemd的由来
Linux一直以来采用init进程但是init有两个缺点:
1、启动时间长。Init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。(这也是CentOS5的主要特征)
2、启动脚本复杂。Init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这使得脚本变得很长而且复杂。
Init:
Centos 5 Sys init 是启动速度最慢的,串行启动过程,无论进程相互之间有无依赖关系。
Centos6 Upstart init 相对启动速度快一点有所改进。有依赖的进程之间依次启动而其他与之没有依赖关系的则并行同步启动。
Centos7 Systemd 与以上都不同。所有进程无论有无依赖关系则都是并行启动(当然很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动。)
二、systemd
Systemd为了解决上文的问题而诞生。它的目标是,为系统的启动和管理提供一套完整的解决方案。根据linux惯例,字母d是守护进程(daemon) 的缩写。Systemd名字的含义就是 守护整个系统。
Centos 7里systemd代替了init,成为了系统的第一个进程。PID为1.其他所有的进程都是它的子进程。Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学。
Systemd 架构图
三、服务管理
1、systemctl
Systemctl是systemd的主要命令,用于管理系统。
Centos 7 :service unit
注意:能兼容早期的服务脚本
命令格式
#systemctl COMMAND name.service
重启系统
# systemctl reboot
关闭系统,切断电源
# systemctl poweroff
CPU停止工作
# systemctl halt
暂停系统
# systemctl suspend
让系统进入冬眠状态
# systemctl hibernate
让系统进入交互式休眠状态
# systemctl hybrid-sleep
启动进入救援状态(单用户状态)
# systemctl rescue
启动服务
#service name start ==> systemctl start name.service
停止服务
#service name stop ==> systemctl stop name.service
重启服务
#service name restart ==> systemctl restart name.service
查看服务状态
#service name status ==> systemctl status name.service
条件式重启:已启动才重启,否则不做操作
#service name condrestart ==> systemctl tryrestart name.service
重载或重启服务:先加载,再启动
#systemctl reload-or-restart name.service
重载或条件式重启服务:
#systemctl reload-or-try-restart name.service
禁止自动和手动启动:
#systemctl mask name.service
取消禁止:
#systemctl unmask name.service
2、服务查看:
查看所有服务的开机自启状态:
chkconfig --list ==> systemctl list-unit-files --type service
用来列出该服务在哪些运行级别下启用和禁用
chkconfig sshd –list ==>ls /etc/systemd/system/*.wants/sshd.service
查看服务是否开机自启:
systemctl is-enabled name.service
其它命令:
查看服务的依赖关系:
systemctl list-dependencies name.service
杀掉进程:
systemctl kill 进程名
显示某个 Unit 的所有底层参数
# systemctl show httpd.service
显示某个 Unit 的指定属性的值
# systemctl show -p CPUShares httpd.service
设置某个 Unit 的指定属性
# sudo systemctl set-property httpd.service CPUShares=500
3、服务状态:
显示状态
systemctl list-unit-files --type service –all
loaded:Unit 配置文件已处理
active(running)一次或多次持续处理的运行
active(exited)成功完成一次性的配置
active(waiting)运行中,等待一个事件
inactive不运行
enabled开机启动
disabled开机不启动
static开机不启动,但可被另一个启用的服务激活
4、hostnamectl
hostnamectl命令用于查看当前主机的信息。
显示当前主机的信息
# hostnamectl
设置主机名。
# hostnamectl set-hostname Centos7
5、localectl
localectl命令用于查看本地化设置。
查看本地化设置
# localectl
# 设置本地化参数。
# localectl set-locale LANG=en_GB.utf8
# localectl set-keymap en_GB
6、 timedatectl
123456789 timedatectl
timedatectl命令用于查看当前时区设置。
查看当前时区设置
显示所有可用的时区
# timedatectl list-timezones
# 设置当前时区
$# timedatectl set-timezone America/New_York
# timedatectl set-time YYYY-MM-DD
# timedatectl set-time HH:MM:SS
7、loginctl
loginctl命令用于查看当前登录的用户。
# 列出当前session
# loginctl list-sessions
# 列出当前登录用户
# loginctl list-users
# 列出显示指定用户的信息
# loginctl show-user (ruanyf) 用户
四、unit
Systemd可以管理系统中所有资源。不同的资源统称为unit(单位)。Unit表示不同类型的systemd对象,通过配置文件进程标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息。
1、Unit类型
Unit一共分为12种。
Sysstemctl –t help 查看unit类型
Service unit:文件扩展名为.Service,用于定义系统服务
Target unit : 文件名扩展为.target,用于模拟实现“运行级别”
Device unit :.device ,用于定义文件内核识别设备
Mount unit: .mount 定义文件系统挂载点。
Socket unit: .socket, 用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
Snapshot unit: .snapshot, 管理系统快照
Swap unit: .swap, 用于标识swap设备
Automount unit: .automount,文件系统的自动挂载点
Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool目录
Scope unit :不是由systemd启动的外部进程
Slice unit :进程组
Timer unit :定时器
2、systemctl list-units命令可以查看当前系统的所有 Unit 。
列出正在运行的 Unit
# systemctl list-units
列出所有Unit,包括没有找到配置文件的或者启动失败的
# systemctl list-units --all
列出所有没有运行的 Unit
# systemctl list-units --all --state=inactive
列出所有加载失败的 Unit
# systemctl list-units --failed
列出所有正在运行的、类型为 service 的 Unit
# systemctl list-units --type=service
3、unit状态
systemctl status命令用于查看系统状态和单个 Unit 的状态。
显示系统状态
#systemctl status
显示单个 Unit 的状态
# sysystemctl status bluetooth.service
显示远程主机的某个 Unit 的状态
# systemctl -H root@Centos7.example.com status httpd.service
除了status命令,systemctl还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。
显示某个 Unit 是否正在运行
# systemctl is-active application.service
显示某个 Unit 是否处于启动失败状态
# systemctl is-failed application.service
显示某个 Unit 服务是否建立了启动链接
# systemctl is-enabled application.service
4、依赖关系
Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。
#systemctl list-dependencies命令列出一个 Unit 的所有依赖。
# systemctl list-dependencies nginx.service
上面命令的输出结果之中,有些依赖是 Target 类型(详见下文),默认不会展开显示。如果要展开 Target,就需要使用--all参数。
# systemctl list-dependencies --all nginx.service
五、unit配置文件
1、概述
每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
systemctl enable httpd.service命令用于在上面两个目录之间,建立符号链接关系。(Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.)等同于 ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service。当然systemdctl diable httpd.service 则相当于删除这个软连接。
/usr/lib/system/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/run/system/system:系统执行过程中所产生的服务脚本,与上面目录优先运行。
/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx的功能,比上面目录优先运行。
2、配置文件状态
systemctl list-unit-files命令用于列出所有配置文件。
列出所有配置文件
#systemctl list-unit-files
列出指定类型的配置文件
#systemctl list-unit-files --type=service
systemctl list-unit-files该命令会输出一个列表,从中可以看到每个配置文件的状态。
Unit config filestatus
lvm2-lvmetad.service disabled
lvm2-lvmetad.socket enabled
lvm2-lvmpolld.service disabled
lvm2-lvmpolld.socket enabled
这个列表显示每个配置文件的状态,一共有四种。
enabled:已建立启动链接
disabled:没建立启动链接
static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
masked:该配置文件被禁止建立启动链接
注意,从配置文件的状态无法看出,该 Unit 是否正在运行。这必须执行前面提到的systemctl status命令。
# systemctl status httpd.service
3、配置文件格式
1)unit配置文件格式
[Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
[Install]
WantedBy=multi-user.target
[unit] :定义与Unit类型无关的通用选项;用于提供unit的描述信息、 unit行为及依赖关系等
[Service]:与特定类型相关的专用选项;此处为Service类型
[Install]:定义由“ systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
2、Unit段的常用选项:Description:简短描述
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些
unit启动,其功能与Before相反
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其它units,弱依赖
Conflicts:定义units间的冲突关系
BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
Condition...:当前 Unit 运行必须满足的条件,否则不会运行
Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
3、service常用的选项
Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止。
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess 来让 Systemd 接收消息
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通
常是开机到最后才执行即可的服务。
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行命令或脚本的绝对路径
ExecStartPre: ExecStart前运行
ExecStartPost: ExecStart后运行
ExecRsload: 重启当前服务时执行的命令
ExecStopPost:停止当前服务之后执行的命令
ExecStartSec:自动重启当前服务间隔的秒数
ExecStop:指明停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务。
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数。
Environment:指定环境变量。
4、install 常用选项
Install段的常用选项:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务
注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启。
# systemctl daemon-reload
# systemctl daemon-reload
#systemctl restart httpd.service
更加详细的unit配置文件格式 请参考官方文档
https://www.freedesktop.org/software/systemd/man/systemd.unit.html
六、Target
启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。
1、Target命令
查看当前系统的所有 Target
# systemctl list-unit-files --type=target
查看一个 Target 包含的所有 Unit
# systemctl list-dependencies multi-user.target
查看启动时的默认 Target
# systemctl get-default
设置启动时的默认 Target
# systemctl set-default multi-user.target
切换 Target 时,默认不关闭前一个 Target 启动的进程, systemctl isolate 命令改变这种行为,
关闭前一个 Target 里面所有不属于后一个 Target 的进程 systemctl isolate multi-user.target
2、Target与传统 RunLevel 的对应关系如下。
Traditional runlevel New target name Symbolically linked to...
Runlevel 0 | runlevel0.target -> poweroff.target
Runlevel 1 | runlevel1.target -> rescue.target
Runlevel 2 | runlevel2.target -> multi-user.target
Runlevel 3 | runlevel3.target -> multi-user.target
Runlevel 4 | runlevel4.target -> multi-user.target
Runlevel 5 | runlevel5.target -> graphical.target
Runlevel 6 | runlevel6.target -> reboot.target
3、它与init进程的主要差别如下。
(1)默认的 RunLevel(在/etc/inittab文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。
(2)启动脚本的位置,以前是/etc/init.d目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d、/etc/rc5.d等),现在则存放在/lib/systemd/system和/etc/systemd/system目录。
(3)配置文件的位置,以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。
七、日志管理
Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。
1、journalctl功能强大,用法非常多。
查看所有日志(默认情况下 ,只保存本次启动的日志)
# journalctl
查看内核日志(不显示应用日志)
# journalctl -k
查看系统本次启动的日志
# journalctl -b
# journalctl -b -0
查看上一次启动的日志(需更改设置)
# journalctl -b -1
查看指定时间的日志
# journalctl --since="2012-10-30 18:17:16"
# journalctl --since "20 min ago"
# journalctl --since yesterday
# journalctl --since "2015-01-10" --until "2015-01-11 03:00"
# journalctl --since 09:00 --until "1 hour ago"
显示尾部的最新10行日志
# journalctl -n
显示尾部指定行数的日志
# journalctl -n 20
实时滚动显示最新日志
# journalctl -f
查看指定服务的日志
# journalctl /usr/lib/systemd/systemd
查看指定进程的日志
# journalctl _PID=1
查看某个路径的脚本的日志
# journalctl /usr/bin/bash
查看指定用户的日志
# journalctl _UID=33 --since today
查看某个 Unit 的日志
# journalctl -u nginx.service
# journalctl -u nginx.service --since today
实时滚动显示某个 Unit 的最新日志
# journalctl -u nginx.service -f
合并显示多个 Unit 的日志
# journalctl -u nginx.service -u php-fpm.service --since today
2、查看指定优先级(及其以上级别)的日志,共有8级
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
# journalctl -p err -b
日志默认分页输出,--no-pager 改为正常的标准输出
# journalctl --no-pager
以 JSON 格式(单行)输出
# journalctl -b -u nginx.service -o json
以 JSON 格式(多行)输出,可读性更好
# journalctl -b -u nginx.serviceqq
-o json-pretty
显示日志占据的硬盘空间
# journalctl --disk-usage
指定日志文件占据的最大空间
# journalctl --vacuum-size=1G
指定日志文件保存多久
# journalctl --vacuum-time=1years