centos启动流程及实现service管理apache服务

Cenots6如何启动,它的启动流程是怎样?

  1. 系统加电,Power ---up /Reset

  2. system startup --- BIOS/bootmonitor

  3. stage 1 bootloader --- Master Boot Record

  4. stage 2 bootloader --- Grub,LILO,etc.(其中Grub将stage2分为1.5和2)

  5. kernel --- linux 内核空间

  6. init --- user-sapce 用户空间
    Operation

简单过程:

  1. 系统首次引导或重启时加电的瞬间处理器(cpu)执行存在于BIOS中的一段已知代码,而后选择一个可引导设备,pc可用来做引导的设备多样(灵活),BIOS需确定使用哪个设备来引导

  2. 将stage 1 的引导加载程序(bootloader)加载至RAM执行.bootloader大小小于512Bytes(一个扇区sector),主要工作是加载stage 2 的引导加载程序

  3. stage2第二阶bootloader加载至RAM执行,通常屏幕有显示动画,将linux内核压缩形态映像和一个可选的初始RAM磁盘(initramfs临时根文件系统)加载至内存.stage2 bootloader控制权交给内核映像,解压和初始化,此阶段stage2 bootloader会检测系统硬件,枚举 系统链接的硬件设备,挂载根设备,加载内核必要的modules内核模块.

  4. 启动第一个用户空间程序(init).执行高级系统初始化工作.

细化理解:

1. BIOS/Bootmonitor

cpu加电瞬间自动寻找BISO存放位置,在此之前不依靠任何软件纯硬件执行,开始执行BISO的第一步加电自检(POST):POST对硬件检测,BIOS第二步本地设备枚举和初始化.

BIOS有两部分组成:POST代码和运行时服务.
POST完成后从内存清理出来;运行时服务依然存在于内存,目标操作系统能够继续使用BIOS运行时服务所提供的服务.

要引导一个操作系统,BIOS运行时会依据CMOS的设置定义的顺序来搜索处于激活状态并可以引导的设备.可引导设备可以是软盘、硬盘、CD-ROM、硬盘上的分区、网络上的设备.
搜索到可引导的硬盘(通常是硬盘)后,主引导记录(MBR)中包含主引导加载程序.(MBR是512Btyes的一个扇区(sector),位于磁盘的第一个扇区(0磁道0柱面1扇区))将MBR加载至RAM(Random Access Memory,随机存储器,与cpu直接交互数据,速度快),BIOS将控制权交给MBR.

2. stage 1 bootloader:

MBR中的主引导加载程序(bootloader)是512Bytes的映像,其中包含bootloader程序代码和一个分区表.前446Bytes是主引导加载程序--其中包含可执行bootloader代码和错误消息文本.接下来64Bytes是分区表,共包含4个分区记录(每个分区64/4=16Bytes).MBR以2Bytes特殊字节(0xAA55)(magic number,魔数,多用来检测完整性)结束.用来检测MBR的有效性.

centos6备份MBR的信息的方法:
ddif=/dev/sdaof=MBR.bakbs=1conut=512
od-xaMBR.bak查看以十六进制和ASCII码打印二进制文件

MBR中的主引导加载程序主要的工作是查找并加载次引导加载程序(即stage 2 bootloader),通过在分区表中查找一个激活分区后,扫描分区中的其他分区确保其他都是非活动的,此后将激活分区中的引导记录从设备中加载至RAM并执行.

3.stage 2 bootloader:

次引导加载程序可形象的称为内核加载程序.主要任务是加载linux kernel和可选的初始RAM磁盘.
一般的pc机中,stage 1 bootloader和stage 2 bootloader统称为GRand Unified Bootloader(GRUB)或Linux Loader(LILO).
GRUB阶段的引导加载程序:
/boot/grub中包含了stage1,stage1.5,stage2引导加载程序,和其他引导加载程序及kernel,initramfs.

GRUB通过将两个阶段转化为三个阶段的引导加载程序实现的.

stage 1:MBR引导了一个1.5阶段的引导加载程序加载并运行(而不是直接将stage2中的次引导加载程序引导过来)
stage 1.5:引导加载程序,可以理解包含Linux内核映像的特殊文件系统.(比如/boot/grub/e2fs_stage1_5要从ext2或ext3中加载)
stage 2:等待stage1.5引导加载完成后stage2次引导加载器开始加载,完成之后,GRUB可以在接受请求的显示内核列表(在/etc/grub.conf中定义,软符号链接/etc/grub/menu.lst和/etc/grub.conf),可以选择内核和修改内核参数.甚至可是使用Grub命令行提供的命令对引导过程进行手工定义启动.

grub手工自定义:可以用initrd的映像引导一个kernel

grub>root(hd0,0)#定义可启动的设备
grub>kernel/vmlinuz#定义启动时的内核
grub>initrd/initramfs.img#定义initramfs镜像
grub>boot#按照手工定义的方式启动

将stage2的bootloader加载至内存后,就可以对文件系统进行查询,将默认的内核映像和initrd映像加载至内存中.当映像文件准备好之后,stage 2 bootloader调用内核映像.

4.kernerl --- Linux

内核映像被加载至内存中,stage2 bootloader控制权释放后,kernel 阶段开始.内核映像不是可执行的内核,是被压缩的kernel映像,通常是vmlinuz.在这个内核映像的前面是一个例程,实现少量的硬件设置,并从包含内核的映像中将kernel解压缩出来,而后将内核加载至高端内存中,如果有初始RAM磁盘映像,则将其一起加载至内存,并标明供以后使用.此后,该例程会调用内核,并开始启动内核引导的过程.
启动init.即第一个用户空间进程(user-sapce process).通过启用中断,抢占式的调度器就可以周期性的接管控制权,从而提供多任务能力.
在内核引导的过程中,初始RAM磁盘(initrd)是由stage 2 bootloader加载至内存中,被复制到RAM中并挂载到系统上.initrd会作为RAM中的临时根文件系统使用,允许内核在没有挂载任何物理磁盘的情况下完整的实现引导,由于与外围设备交互的模块可能是initrd的一部分,所以内核可以很小,但仍需要支持大量的可能的硬件配置,内核引导完成之后就可以将initrd根文件系统卸载掉,并挂载真正的文件系统.

5.init阶段

当内核引导并初始化之后,内核就可以启动自己的第一个用户空间应用程序了,这是第一个调用标准函数库编译的程序.桌面系统中第一个启动的程序通常是/sbin/init进程.到这里系统准备就绪了.

init在centos不同版本程序的类型:
centos5:SysVinit
配置文件:/etc/inittab
centos6:upstart
配置文件:/etc/inittab
/etc/init/*.conf
centos7:systemd
配置文件:/usr/lib/systemd/system,/etc/systemd/system

init相关的配置文件:/etc/inittab

每行定义一种action以及对应的process
id:runlevel:action:process
id:一个任务的标志符
runlevel:运行级别,空则标识所有的进程
action:定义任务的启动条件
process:任务
action:
wait:等待切换至此级别是执行一次
respawn:一旦此任务终止,就自动重新启动
initdefualt:设定默认启动级别
sysinit:设定系统初始化的方式,此处一般指定/etc/rc.d/rc.sysinit

/etc/rc.d/rc 接受数字为参数

K##string:开机停止(先KILL后start)数字越小越优先,依赖的服务先关闭,被依赖的后关闭
S##string:开机启动

/etc/init.d/

让程序接受chkconfig的管理
chkconfig--addservices_name
不再接受chkconfig管理
chkconfig--delservices_name
能被cokconfig所识别
#chkconfig:运行级别启动级别关闭级别
chkconfig:
--listname显示单个的服务情况
修改控制的级别:
--levelLEVELS默认2345
注:正常情况下,最后一个服务S99local没有连接至/etc/init.d下,而是直接指向了/etc/rc.local下,因此自定义的开机启动脚本直接放到/etc/rc.local中即可
/sbin/mingetty会调用login程序;
打开基于vga的虚拟终端的还有getty等也可以.

那么如何实现讲一个自定义的程序或服务为chkconfig及service的支配.

以上次shell程序自动化编译的apache service为例(脚本实现apache批量自动化编译移步http://www.jb51.cc/article/p-yaggqjig-ke.html):
按照系统启动的流程及chkconfig的特性实现:

  1. 开机系统会运行/etc/init.d/下的脚本或程序,那么将自定义的脚本或程序放入该目录下就可以开机时被执行,当然将脚本的路径加入到rc.local下开机时也会被执行一般情况下值执行一次,我们的需求是作为可控的服务.

  2. 符合被chkconfig管理的服务脚本要求

    #chkconfig:23451188#脚本中需存在的格式
    #description:ThisstartstheApacheDaemon#centos6可省
    按照上面的思路:

    下面是我httpd服务(程序名为httpd)的脚本:将此脚本放入/etc/init.d下即可,留作下步用.

    #!/bin/bash
    #
    #chkconfig:3459801
    #
    httpdir=/app/apache/httpd
    pidfile()
    {
    pgrephttpd>/app/apache/httpd/httpd.pid
    }
    VarVerification()
    {
    if[-z$httpdir];then
    httpdir=/app/apache/httpd
    fi
    }
    case$1in
    start)
    VarVerification
    $httpdir/bin/apachectlstart1>/dev/null2>$httpdir/start.log
    if[$?-eq0];then
    if[-d/app/apache/httpd];then
    pidfile
    else
    echo"Thefile'httpd.pid'isnotexist!"
    exit10
    fi
    else
    exit11
    fi
    ;;
    stop)
    VarVerification
    if[-f$httpdir/httpd.pid];then
    $httpdir/bin/apachectlstop
    if[$?-eq0];then
    mv$httpdir/httpd.pid/tmp&>/dev/null
    fi
    else
    pgrephttpd&>/dev/null
    if[$?-eq0];then
    $httpdir/bin/apachectlstop
    fi
    fi
    ;;
    restart)
    VarVerification
    $httpdir/bin/apachectlrestart
    if[$?-eq0];then
    pidfile
    else
    mv$httpdir/httpd.pid/tmp
    fi
    ;;
    status)
    VarVerification
    if[-f$httpdir/httpd.pid];then
    echo"Apacheserviceisrunning..."
    else
    echo"ApacheserviceisDOWN!"
    fi
    esac
    有了上面的脚本,�辗胖糜�/etc/init.d下,执行:
    [rootinit.d]#chkconfig--addhttpd#接受chkconfig的支配
    chkconfig--delhttpd#不再接受chkconfig的支配
    chkconifg--level2345httpdon#指定2345模式下开机自启动
    [rootinit.d]#servicehttpdstart#启动apache服务
    验证一下效果80端口已启动:
    [rootinit.d]#netstat-ntl
    ActiveInternetconnections(onlyservers)
    ProtoRecv-QSend-QLocalAddressForeignAddressstate
    tcp00:::80:::*LISTEN
    [rootinit.d]#servicehttpd{stop|start|restart|status}停止,启动,重启,状态

centos启动流程及实现service管理apache服务的更多相关文章

  1. 响应iOS中的RAM可用性

    退后一步,还有其他一些适用于OpenGL纹理内存的自适应技术吗?

  2. IOs Cordova长按显示文本选择放大镜即使禁用文本选择,如何删除?

    是否有任何可能导致此问题的插件?任何帮助深表感谢.Cordova插件:>com.mbppower.camerapreview>cordova-plugin-statusbar>cordova-plugin-whitelist>离子插件键盘>org.apache.cordova.camera>org.apache.cordova.console>org.apache.cordova.device>org.apache.cordova.dialogs>org.apache.cordova.file>org.a

  3. android – org.apache.cordova.api不存在. PhoneGap 3.0

    我正在尝试将VideoPlayer插件(https://github.com/macdonst/VideoPlayer)添加到我的phonegapAndroid应用程序中.在编译时遇到问题:第25行:解决方法将您的导入更改为:

  4. 如何将android客户端连接到我的笔记本电脑内的Apache服务器(php)的localhost?

    我的笔记本电脑中的localhost-127.0.0.1或android10.0.0.1中的localhost?>那么,如果我想从android访问localhost来调用PHP来运行?哪个ip地址/url我需要放在Android应用程序?我需要在httpconfig中为XAMPP修改任何内容吗?解决方法使用ipconfig在笔记本电脑中找到您的IP地址.在手机中使用该地址而不是127.0.0.1.

  5. 如何从命令行更改android模拟器RAM大小?

    我想在命令行创建android模拟器时编辑或更改ram大小.EX:在创建模拟器时,它采用默认的ram大小(AndroidSDK4.0.3)512MB但我想将其增加到768MB或减少到256MB.我想改变只有拉姆尺寸.因为有一个选项可以改变Ram的大小.如果你输入了yes,我们需要提供很多东西.解决方法您需要找到已创建的AVD的配置文件.在我的情况下,我在Ubuntu上运行AVD,所以这是我找到配置

  6. android – 在android工作室中的proguard错误

    我想在我的应用程序中使用proguard,我启用它但是当我想生成apk文件时,它给了我这个错误:我正在使用最新版本的sdk23,这是我的gradle文件:怎么了?我在这段代码中做错了什么?谢谢解决方法只需在proguard上添加:

  7. 无法修复Android Proguard返回错误代码1错误

    当我尝试在我的Android应用程序中使用proguard时只需添加到我的project.properties文件,APK导出失败并显示消息Proguard返回错误代码1这是我的project.properties文件这是错误堆栈:解决方法将这些行添加到proguard配置文件(proguard-android.txt)见ProguardTroubleshooting请注意,如果您使用您的配置文件

  8. Phonegap 2.4 Android Proguard配置

    有人有主意吗???

  9. android – 如何在sharedPreferences中分析ANR

    在sharedPreferences中遇到ANR,不知道如何定位问题.以下是trace的三个部分,其他大多数线程都是“WAIT”或“TIMED_WAIT”.由于countdownlatch.await(),“主”线程被阻止.第二个线程“pool-1-thread-1”等待fsync.最后一个是试图读一些东西.我认为第二个线程已经阻塞了主线程,因为如果这个无法完成,它将不会调用countdownla

  10. Android无法访问org.apache.http.client.HttpClient

    我正在使用androidstudio创建一个向服务器发出GET请求的应用程序.我的代码是这样的:问题是AndroidStudio标记了这一行有错误:说“无法访问org.apache.http.client.HttpClient”这是我的gradle文件:解决方法在AndroidSDK23中不推荐使用HttpClient,因为它推断,您可以在HttpURLConnection中迁移代码https:/

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部