linux的启动流程?生活中难免会有各类各样的问题,假如你对这个不了解,一上去学习。
Linux中怎么让程序方便启动和开机自启,下边一上去瞧瞧本站小编只求无Bug给你们悉心整理的答案,希望对您有帮助
linux的启动流程1
对于非yum形式安装的软件来说,系统的时侯,我们只能先步入其对应的二补码文件目录下(通常为bin目录),之后运行对应的二补码文件进行启动。这些方法不仅比较冗长外,还未能实现开机自启。为了才能让程序使用systemctl命令方便启动和开机自启,就须要做一些配置。下边以Elasticsearch为例进行演示。
须要说明的是,怎样进行解压和安装Elasticsearch,你们可以自行在网上查找对应教程linux 程序开机自启动,我这儿就不再过多演示。
编撰XXX.service配置文件
首先使用如下命令来步入到/usr/lib/systemd/system目录下:
cd /usr/lib/systemd/system
接着创建elasticsearch.service配置文件,并输入如下所示的内容:
[Unit]
# 描述
Description=elasticsearch
# 表示在network.target启动之后启动
After=network.target
# 表示依赖关系,wants表示弱依赖,此外还有requires表示强依赖(也就是network.target启动失败时,elasticsearch一并退出)
Wants=network.target
[Service]
# 表示启动类型
Type=forking
# 指定启动用户
User=elasticsearch
# 指定启动的用户组
Group=elasticsearch
# 指定变量参数文件, 需要提前创建
EnvironmentFile=/etc/sysconfig/elasticsearch
# 启动时执行的命令
ExecStart=/opt/elasticsearch/elasticsearch-8.2.2/bin/elasticsearch -d
# 重新启动时执行命令
ExecReload=/bin/kill -s -HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
KillMode=process
[Install]
# 表示该服务所属的target
WantedBy=multi-user.target
对于自定义的服务端配置单元来说,大致分为三个模块linux环境变量,分别是:控制单元(Unit)、服务本体(Service)和安装服务(Install)
对于控制单元来说,Description为整个控制单元的描述,可依照须要进行编撰;Before/After用于指定启动的次序,这儿的network.target则代表网路,倘若是network-online.target则表示一个连通的网路。
对于前面的服务本体来说,Type表示服务类型,其类型有:
Simple:是默认也是最简单的数据类型,也就是启动的程序主体。forking:是标准UnixDaemon使用的启动方法,启动程序后会调用fork函数,将必要的通讯信道设置好以后父进程会退出,而子进程则以守护的形式继续运行。oneshot:适用于一次性执行的任务或命令,运行完成以后不会存在任何痕迹。也正由于这般,须要使用RemainAfterExit=yes,也就是说虽然没有进程存在,Systemd也觉得该服务启动成功了。dbus:这个程序启动前须要先获取一个DBUS空间,其须要和BusName一起使用,只有成功获取到DBus空间以后,其所依赖的程序能够正常启动。
而User和Group分别用于指定启动该服务端的特定用户和用户组;ExecStart、ExecReload和ExecStop则分别用于指定服务启动、服务重新加载和服务关掉的命令,须要说明的是命令的启动程序必须使用绝对路径。
对于KillMode来说,有如下几个值:
control-group:默认值,当前的控制组上面的所有进程就会被杀掉process:只杀主进mixed:主进程将收到SIGTERM讯号,子进程收到SIGKILL讯号
对于安装服务来说,WantedBy表示该服务被那个用户程序进行装载,通常设置为multi-user.target即可。
加载配置并验证
当配置文件编撰完毕后,就须要使用如下命令来重新加载:
systemctl daemon-reload
执行以后并不会有任何内容输出linux 程序开机自启动,因而须要使用如下命令来进行验证:
systemctl status elasticsearch
执行结果如下所示:
此时说明自定义服务早已成功,接着执行如下命令来启动elasticsearch服务:
systemctl start elasticsearch
执行后,再度使用systemctlstatuselasticearch命令查看,结果如下所示:
其实,假如须要开机自启,只须要如下命令:
systemctl enable elasticsearch
到此,怎么自定义系统服务就早已介绍完毕,希望对你们有所帮助。
linux的启动流程2
为何要了解系统启动流程?
主动让软件开机自启
笔记本不能正常启动,排查出错的环节
排查黑客植入木马程序,究竟将木马放在了那里
1开机自检(POST,PowerOnSelfTest)
笔记本通电以后,首先加载BIOS(basicinputoutputsystem,基本输入输出系统)。而BIOS程序首先检测计算机能够满足运行的基本条件,这个称作“硬件自检(PowerOnSelfTest)”。
主要检测:显卡,CPU,显存,c盘,网卡,声卡,主板,键盘,鼠标学linux有前途吗,显示器等
2启动次序
硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这是,BIOS须要晓得,“下一阶段的启动程序”具体储存在那个设备里(c盘,光碟,联通硬碟等)。也就是说,BIOS须要有一个外部储存设备的排序,排在后面的设备就是优先转交控制权的设备。这些排序称作“启动次序”(BootSequence)
3主引导记录MBR(masterbootrecord)
主引导记录只有512个字节,坐落0柱面,0扇区,1磁道,放不了太多东西。它的主要作用是,告诉计算机到硬碟的那一个位置去找操作系统
4启动管理器Grub
在这些情况下,计算机读取”主引导记录”前面446字节的机器码以后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(bootloader),由用户选择启动哪一个操作系统。
Linux环境中,目前最流行的启动管理器是Grub
在centos7中的启动管理是grub2
[root@fruit boot]# ll
总用量 112548
-rw-r--r--. 1 root root 153591 10月 20 2020 config-3.10.0-1160.el7.x86_64
drwxr-xr-x. 3 root root 17 5月 19 22:06 efi
drwxr-xr-x. 2 root root 27 5月 19 22:08 grub
drwx------. 5 root root 97 5月 19 22:11 grub2
-rw-------. 1 root root 62118628 5月 19 22:10 initramfs-0-rescue-dfc787c8ebab403c82f14b33d3c1b96c.img
-rw-------. 1 root root 21714935 5月 19 22:11 initramfs-3.10.0-1160.el7.x86_64.img
-rw-------. 1 root root 13773260 5月 19 22:13 initramfs-3.10.0-1160.el7.x86_64kdump.img
-rw-r--r--. 1 root root 320648 10月 20 2020 symvers-3.10.0-1160.el7.x86_64.gz
-rw-------. 1 root root 3616707 10月 20 2020 System.map-3.10.0-1160.el7.x86_64
-rwxr-xr-x. 1 root root 6769256 5月 19 22:10 vmlinuz-0-rescue-dfc787c8ebab403c82f14b33d3c1b96c
-rwxr-xr-x. 1 root root 6769256 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
[root@fruit boot]#
5操作系统
控制权转交给操作系统后,操作系统的内核首先被载入显存。开始运行第一个程序systemd,执行默认target配置文件/etc/systemd/system/default.target
# 可以看出systemd启动用户进程, kthreadd 启动内核进程
[root@fruit default.target.wants]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:31 ? 00:00:10 /usr/lib/systemd/systemd --switched-root --system --des
root 2 0 0 09:31 ? 00:00:00 [kthreadd]
root 4 2 0 09:31 ? 00:00:00 [kworker/0:0H]
root 6 2 0 09:31 ? 00:00:01 [ksoftirqd/0]
root 7 2 0 09:31 ? 00:00:00 [migration/0]
centos7/8里的第一个进程是systemd
centos6的第一个进程是init
6运行级别runlevel
[root@localhosttest]#runlevel#查看当前的运行级别
N3
N代表最开始步入的模式,倘若是N表示没有进行模式切换
35代表最开始步入运行级别3,前面切换到运行级别5
centos6中的别称
0 关机
1 单用户模式
2 多用户模式,不能使用 nfs
3 完全多用户模式
4 保留,没有使用
5 图形界面
6 重启
7用户登入
登陆shell
首先读取/etc/profile配置文件,加载/etc/profile.d/*.sh,再去用户的家目录,读取~/.bash_profile,之后去~/.bashrc,最后读取/etc/bashrc。进行初始环境变量
非登陆shell
首先读取~/.bashrc文件,再读取/etc/bashrc
三、自己做好的程序如何开机自启呢?
装入/etc/rc.local文件中
bash初始化的4个文件里
强烈建议整个服务器搭建Linux玩玩,还可以搭网站,我用的是3A的服务器
linux的启动流程3Linux内核加载过程
一般,Linux内核都是经过gzip加载过以后的映像文件。
编译完成的Linux内核储存在那里?压缩内核(zImage)的入口解压之前的并口输出开始真正的Linux内核
1、入口在arch/arm/kernel/head-armv.S
2、查找处理器类型
__lookup_processor_type
__lookup_architecture_type
3、初始化页表:__creat_page_tables
4、初始化C代码空间
5、跳转到C代码中,start_kernel
ARM的MMU单元
MMU:显存管理单元
作用:
通过MMU的访存ARM的MMU访存原理
ARM的MMU页表格式
MMU支持基于节或则页的储存器访问。
页表的级别
存在寻址储器内的转换页表有两个级别:
一级页表的地址
第一级表占用空间16KB,必须16KB对齐
第一级描述符
一级表每位入口描述了它所关联的1MB虚拟地址是怎样映射的。
节描述符Bits[1:0]描述符类型(10b表示节描述符)Bits[3:2]高速缓存(cache)和缓冲位(buffer)Bits[4]由具体实现定义Bits[8:5]控制的节的16种域之一Bits[9]现今没有使用,应当为零Bits[11:10]访问控制(AP)Bits[19:12]现今没有使用,应当为零Bits[31:20]节基址,产生化学地址的高12位节的转换过程
临时内核页表的创建__create_page_tables
__create_page_tables:
pgtbl r4 @ page table address 0x30008000-0x4000
mov r0, r4 @r0=0x30004000
mov r3, #0
add r2, r0, #0x4000
1: str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
teq r0, r2
bne 1b
把一级页表0x30004000-0xa0080000清空
krnladr r2, r4 @ start of kernel
r4=0xa0004000,r2=内核起始地址所在1MB对齐空间,0x30000000
add r3, r8, r2 @ flags + kernel base
r8为从处理器信息中得到的MMU页表标志,r8=0xc0e,r3=0x30000c0e
str r3, [r4, r2, lsr #18]@ identity mapping
地址:0x300068000,value:0x30000c0e
add r0, r4, #(TEXTADDR & 0xff000000) >> 18
@ start of kernel
bic r2, r3, #0x00f00000
str r2, [r0] @ PAGE_OFFSET + 0MB
add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
str r3, [r0], #4 @ KERNEL + 0MB
映射表内容
映射结果
步入C代码
init/main.c中的start_kernel函数,步入到了Linux内核代码中。
电子专业/计算机专业,常用软件/硬件电子书分享:
提取码:nn1h