系统的 引导 和 初始化 是操作系统实现控制的第一步。
Linux系统的初始化主要包括 内核 和 init程序 两部分:
Linux启动流程图(画的有点丑将就下):
下面介绍下各部分:
(1) BIOS(Basic Input/Output System):基本输入输出系统,存储于主板的ROM芯片上
BIOS主要功能是存储了磁盘的启动顺序,BIOS会按照顺序查找第一个磁盘头的MBR信息。
(2)MBR(Master Boot Record):主引导记录,存于磁盘头部,分别存储了BootLoader程序,分区表信息 以及用于有效性检查的工具。
(3)GRUB(Grand Unified BootLoader):多系统启动程序,用于查找并加载Kernel,其执行过程分为三步:
== stage1==:查找并加载stage2(BootLoader程序)。
stage1.5:但若系统未启动,MBR找不到文件系统(stage2所存放位置),就得先引导位于文件系统中的stage2 。
stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
Note:此时/boot 还未被挂载,GRUB直接识别grub所在磁盘的文件系统,应该是/grub/grub.conf
(4)Kernel :内核,操作系统核心,软硬件的交互通道。
initrd(Initial RAM Disk):stage2时拷贝到内存上 ,是一个临时的根文件系统(rootfs),该文件装载了必要的驱动模块,直到真正的rootfs被挂载后,initrd将从内存中移除。
(5)init:OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,简单讲下这个脚本的任务(可以去看看实际脚本,看看都做了什么):
执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。
CentOS Linux7中,每个运行级别都有属于自己的target文件,都是链接文件,运行级别的设置由/etc/system/system/default.target文件控制。
在运行级别对应的目录中,所有文件的命名都是Knn… 和 Snn…
S开头的文件是系统启动时调用的服务进程,K相对的就是终止时balabla.
系统图形界面的运行级别是5,文本界面是3
使用Systemctl set-default name.target来修改默认的运行级别。
//将系统的默认运行级别修改为图形界面
system set-default graphical.target
reboot
如何关闭Ctrl + Alt + Del 重启系统的组合件呢?
vim编辑这个文件,全部注释/usr/lib/systemd/system/ctrl-alt-del.target 文件的内容,保存退出,执行init q重新加载配置文件。
简单来说就是执行某系统功能的程序来支持其他更加底层的程序。例如:打印服务,HTTP服务,FTP服务。一般的服务管理有启动、查询、停止等操作。
Linux系统的服务分为独立运行的服务和受xinetd管理的服务两大类。
独立运行的服务一般与运行级别有关,在系统启动后就直接运行和管理;
xinetd本身就是一个独立运行的服务,负责管理一些不常用的服务,其启动和停止都由xinetd控制。
在管理服务时,Linux中的每个服务都由相应的启动脚本,用于设置启动、停止、重启和查询服务等功能。所有服务的脚本都放在 /etc/rc.d/init.d 目录中,可用less命令查看。
NFS (Network FileSystem ) ,主要功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。可以简单看做是一个文件服务器 (file server) 。
NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)
Linux中对服务的管理可以通过systemctl命令来实现。
(1)服务的启动与停止
systemctl start(启动)/stop(停止)/status(查看运行)/restart(重启)/reload(重载) XXX.service
例如:管理network服务
注:服务一般以 “ .service ” 结尾。
(2)设置服务自启动
ntsysv --back --level
例如:查看network服务的开机自启动状态,并设置为开机不启动。
(3)查看所有的服务
systemctl //列出所有的系统服务
systemctl list-units //列出所有启动unit
systemctl list-unit-files //列出所有启动文件
systemctl list-units -type=service -all //列出所有service类型的unit
systemctl list-units -type=service -all grep cpu //列出CPU电源管理机制的服务
systemctl list-units -type=target -all //列出所有目标单元target
首先来看一下程序是怎么定义的:程序是为了完成某种任务二设计的软件,包含可执行的代码和数据,而进程是指开始执行但是还没有结束的程序的实例。
一个运行的程序可能有多个进程。
进程一般分为交互进程、批处理进程和守护进程3类。
交互进程:shell下通过执行程序产生的进程,可在前台和后台运行。
批处理进程:进程的序列,执行时不需要人机交互。
守护进程:一直运行,一般在后台运行。
Linux下的进程调度一般用 at 和 crontab .
(1)延迟性调度:at
at 命令在指定时刻执行指定的命令,实际是一组命令的集合。使用前需要确保atd服务是开启的,使用 #systemctl start atd.service 开启,并用 #systemctl enable atd.service 确认一下。atq命令可用于查询已设定的命令序列,atrm命令用于删除已设定的命令序列。
//基本格式就是:
at time
at> 动作
at>ctrl +d
其他at的命令
at -l #查看任务的编号(任务已完成则没有显示)
at -c 任务编号 #查看这个任务的内容
at -r 任务编号 #删掉这个任务
下面就来举个栗子啦~
//两天后的17:30执行文件data中指定的作业
# at -f data 17:30+2 days
//一分钟后再tty1中提示"hello!"
# at now+1 minutes
at>echo"hello!">/dev/tty1
at>ctrl+D
//明天凌晨2点将正在登陆的用户写入/tmp/users.log
# at 2:00 tomorrow
at> w>/tmp/users.log
//一分钟后在主目录中建立目录at
# at now+1 minutes
at>mkdir at
at>ctrl+D
(2)周期性调度:crontab
crontab命令可以在指定的日期和时间周期执行。
//基本格式
#crontab
minute hour day month dayofweek command
ctrl+D
举例:
//每周四早上8:30,提醒用户10:00开会
# crontab
30 8 * * 4 echo "meeting at 10:00 am">/dev/tty1
ctrl+D
可以#crontab -e进入vim修改调度任务。
ps是最基本的进程查看命令。可以确定哪些进程在运行、挂起、运行了多久、在使用的资源、进程相对优先级及进程的标识号(PID)。
ps aux //查看终端上所有用户进程的所有信息
ps aux|less //分页查看
ps aux|grep glenda //查看用户glenda所有进程信息
pstree还可以以树状结构显示系统进程的继承关系。
终止前台运行的进程一般用:Ctrl + C;
终止后台进程,必须用 kill、killall 之类的进程终止命令。
(1)kill
一般和ps、grep结合使用
ps -A|grep sshd //查询sshd服务进程的pid是1097
kill 1097
对于僵尸进程,用信号代码-9强行终止。
(2)killall:通过进程的名字,直接终止。
killall sshd //终止所有sshd进程
正在执行的一个或多个相关进程称为一个作业,作业控制是指控制当前正在运行的进程的行为,用户可以同时运行多个作业。