前提:pc主机,MBR架构

  • 第一步:post(power on system test)加电自检。

    pc机的主板上有个rom芯片(CMOS),加电后,cpu去找这个raw,然后读取里面的指令,检测机器上是否有:内存,硬盘,显示设备等。

    CMOS里有个bios(basic input output system)程序

  • 第二步:boot sequence(bios里设置是用光盘启动,还是硬盘启动等)

    按次序查找引导设备,第一个有引导程序(bootloader)的设备即为本次启动要用到的设备。

    bootloader:

    • 功能:

      • 找到磁盘上的grub程序,并加载运行之。
      • grub提供一个可以让用户选择的菜单,上面写着,可以选择运行的内核列表
      • 把用户选定的内核程序从磁盘加载到内存的特定空间中,然后解压,展开,此后,内核就开始真正运行起来了,然后bootloader退出,由内核接管一切。

      注意:由于bootloader仅有446字节,它无法读取LVM,软RAID的逻辑分区,只能读取物理分区,所以内核程序只能存放在物理分区上。

    • 种类:

      • LILO:linux loader。它有个致命弱点,如果内核在磁盘的1024以后的柱面上存储着的话,它无法加载内核。安卓手机用的是LILO。

      • GRUB:Grand Uniform Bootloader

        centos5,6用的版本是:grub 0.x(别名:grub legacy)

        cengtos7用的版本是:grub 1.x(别名:grub2)

    bootloader程序放在哪里了?

    如果是MBR架构,则放在了在0号track(磁道),0号sector(扇区)里 的前446bytes 。

    由于只有446字节,空间太小了,能写的程序实在有限,所以linux使用GRUB机制。

    GRUB机制:不让bootloader直接加载内核,而是让bootloader加载磁盘上的另外一个程序/boot/grub。由于/boot/grub是放在磁盘上的,所以突破了446字节的约束。

    • 第一阶段:bootloader加载/boot/grub程序

    • 第1.5阶段:filesystem driver?

    • 第二阶段:

      • centos5,6:加载/boot/grub下的配置文件

      • centos7:加载/etc/grub.d/, /etc/default/grub, /boot/grub2/grub.cfg

        # ll /etc/grub.d/
        -rwxr-xr-x. 1 root root 8702 Nov 9 2018 00_header
        -rwxr-xr-x. 1 root root 1043 Jul 5 2018 00_tuned
        -rwxr-xr-x. 1 root root 232 Nov 9 2018 01_users
        -rwxr-xr-x. 1 root root 10781 Nov 9 2018 10_linux
        -rwxr-xr-x. 1 root root 10275 Nov 9 2018 20_linux_xen
        -rwxr-xr-x. 1 root root 2559 Nov 9 2018 20_ppc_terminfo
        -rwxr-xr-x. 1 root root 11169 Nov 9 2018 30_os-prober
        -rwxr-xr-x. 1 root root 214 Nov 9 2018 40_custom
        -rwxr-xr-x. 1 root root 216 Nov 9 2018 41_custom
        -rw-r--r--. 1 root root 483 Nov 9 2018 README
        # ll /etc/default/grub
        -rw-r--r--. 1 root root 279 Nov 29 16:53 /etc/default/grub
        # ll /boot/grub2/grub.cfg
        -rw-r--r--. 1 root root 4287 Nov 29 16:53 /boot/grub2/grub.cfg
  • 第三步:kernel自身初始化

    • 探测所以硬件设备

    • 为了加载磁盘上的根文件系统,所以先加载ramdisk上的文件系统,找到里面的磁盘驱动程序。

      注意:也有可能不使用ramdisk。当自己在自己的机器上编译内核时,编译程序就探测到了本地磁盘类型,所以在编译的时候,就可以把磁盘的驱动,编译到内核里,所以内核就不需要再去找ramdisk了。

    • 使用磁盘驱动,以只读方式,加载根文件系统。只读的目的:防止内核有bug,把根文件系统里面的东西删除了。没问题后,再改为读写方式。

    • 运行用户空间的第一个应用程序:/sbin/init

      centos5之前的init程序:SysV init

      ​ 使用的配置文件:/etc/inittab

      centos6的init程序:Upstart(ubuntu贡献的,redhat参考ubuntu又修改了一下)

      ​ 使用的配置文件:/etc/init/*.conf

      centos7的init程序:Systemd(redhat参考macOS做的)

      ​ 使用的配置文件: /usr/lib/systemd/system目录下的文件,和/etc/systemd/system目录下的文件

      • 执行/usr/lib/systemd/system/initrd.target所有单元,挂载/etc/fstab里的分区
      • 从ramdisk根文件系统切换到磁盘根目录
      • 执行/etc/systemd/system/default.target
      • 执行/usr/lib/systemd/system/sysinit.target,及/usr/lib/systemd/system/basic.target
      • systemd启动/usr/lib/systemd/system/multi-user.target里的本机的服务和服务器的服务
      • systemd执行/usr/lib/systemd/system/multi-user.target里的/etc/rc.d/rc.local
      • systemd执行/usr/lib/systemd/system/multi-user.target里的getty.target及登录服务
      • 如果命令systemctl get-default的执行结果是graphical,则执行/usr/lib/systemd/system/graphical.target
  • 第四步:/sbin/init会启动/sbin/mingetty程序,显示可以登录的文本界面。

Systemd的新特性:

  • 并行启动无依赖关系的服务
  • 按需激活服务,不是全启动起来,放在那里浪费资源,用户真正用的时候才启动
  • 可以提供用户空间进程的快照
  • 可以基于依赖关系定义服务控制逻辑

Systemd的核心概念:unit

unit是一个抽象的东西,它由其相关的配置文件进行标识,识别和配置。

配置文件中,主要包含了系统服务,监听的socket,保存的快照,以及其他与init相关的信息。

查看有哪些unit file:

# systemctl list-unit-files -a
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
brandbot.path disabled
cups.path enabled
...

unit配置文件的放置目录:

  • /usr/lib/systemd/system

    每个服务最主要的启动脚本设置,类似于centos5,6里的/ect/init.d/*.conf

  • /run/systemd/system/

    系统执行过程中所产生的服务脚本,比上面目录优先运行

  • /etc/systemd/system

    管理员建立的执行脚本,类似于centos5,6里的/etc/rc.d/rc#.d/S##脚本的功能,比上面目录优先运行。

unit的常见类型:

  • service:文件扩展名为service,用于定义系统服务的

    兼容cenos5,6的命令:service NAME start|stop|status|restart

  • target:文件扩展名为target,模拟centos5,6里运行级别(rc0.d,rc1.d,rc2.d,rc3.d,rc4.d,rc5.d,rc6.d目录 里的K*和S*的所有脚本 ).

    centos7里没有运行级别的概念,centos5,6是靠运行级别控制的。

  • device:文件扩展名为device,用于定义内核识别的设备

    centos5,6的设备文件是由udev识别的,centos7的设备文件是由udev和systemd识别的。

  • mount:文件扩展名为mount,用于定义文件系统的挂载点

    在centos7直接输入mount命令,会发现很多cgroup的挂载点。cgroup是控制资源分配的,docker就是利用cgroup分配资源,用namespace隔离网络等空间。

  • socket:文件扩展名为socket,用于标识进程间通信所使用的socket文件。

  • snapshot:文件扩展名为snapshot,用于管理系统快照的

  • swap:文件扩展名为swap,用于管理swap设备

  • automount:文件扩展名为automount,文件系统自动挂载点设置。比如插入U盘,自动识别

  • path:文件扩展名为path,用于定义文件系统中的文件或目录。

关键特性:

  • 基于socket的激活机制:socket与程序分离。

    只是启动socket,来监听端口,但程序并不启动,当监听到请求过来 了,则激活程序。

  • 基于bus(总线)的激活机制,如果总线上存在对某个服务的访问,则激活之

  • 基于device(设别)的激活机制,当设备接入后,会自动激活mount,device,automount的unit,这些unit发现设备来了,则创建设备文件,并挂载,如果挂载点不存在,则自动创建挂载点。

  • 基于path的激活机制。用例:当某个服务意外终止后,假如它会创建个文件或目。此path机制就是监视系统里是否生成了这个文件或目录,如果有,则激活某个服务(告诉公司的人,你的服务挂了等)。

  • 系统快照:保存各unit的当前状态于持久设备设备存储中。用于恢复unit到指定时间点。让unit在过去和未来间游走。

  • 向后兼容sysv init脚本:放在/etc/init.d/下的脚本,也可以通过systemd激活。

不兼容的:

  • systemctl命令是固定不变的,不能像service那样,随意定义命令。
  • 非由systemld启动的服务,systemctl命令则无法与之通信,所以就无法管理之。

管理系统服务:service类型的unit负责管理服务的

systemctl - Control the systemd system and service manager

systemctl [OPTIONS...] COMMAND [NAME...]

COMMANDS
Unit Commands
list-units [PATTERN...]
list-sockets [PATTERN...]
list-timers [PATTERN...]
start PATTERN...
stop PATTERN...
restart PATTERN...
try-restart PATTERN...
reload-or-restart PATTERN...
reload-or-try-restart PATTERN...
kill PATTERN...
is-active PATTERN...
is-failed PATTERN...
status [PATTERN...|PID...]]
show [PATTERN...|JOB...]
cat PATTERN...
reset-failed [PATTERN...]
list-dependencies [NAME]

对服务的各种操作:service units

  • 启动,停止,重启,查看状态:start|stop|restart|status

    centos5,6:service NAME start|stop|restart|status

    centos7:systemctl start|stop|restart|status NAME[.service]后面的.service可以省略

    # systemctl status crond
    ● crond.service - Command Scheduler
    Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
    Active: active (running) since Wed 2020-02-26 09:28:20 CST; 5h 49min ago

    Loaded:已经装载了。centos5,6则是用chkconfig 命令装载。

    enabled:开机自动启动

    disabled:开机不会自动启动

    InActive/Active:没有启动或启动了。

    active(running):一次或多次持续处理的运行

    active(exited):成功完成了一次性的配置

    active(waiting):运行中,在等待一个事件

    static:开机不启动,但可被另一个启动的服务激活。

    例子:telnet-server。

    安装它后,发现它有2个unit file。其中的telnet@.service就是static的,

    尝试启动telnet@.service,发现不能启动,就说明了static的不能直接启动。

    那它怎么启动呢,启动telnet.socket就行,telnet.socket启动后,就变成active (listening)状态了。

    使用lsof -i :端口号,可以看到telnet服务是被systemd管理(监管了)。

    lsof:list open files

    # rpm -ql telnet-server
    /usr/lib/systemd/system/telnet.socket
    /usr/lib/systemd/system/telnet@.service
    # systemctl list-unit-files -a | grep telnet
    telnet@.service static
    telnet.socket disabled
    # systemctl start telnet@.service
    Failed to start telnet@.service: Unit name telnet@.service is missing the instance name.
    See system logs and 'systemctl status telnet@.service' for details
    # systemctl is-active telnet.socket
    unknown
    # systemctl start telnet.socket
    # systemctl status telnet.socket
    ● telnet.socket - Telnet Server Activation Socket
    Loaded: loaded (/usr/lib/systemd/system/telnet.socket; disabled; vendor preset: disabled)
    Active: active (listening) since Fri 2020-02-28 10:21:26 CST; 8min ago
    Docs: man:telnetd(8)
    Listen: [::]:23 (Stream)
    Accepted: 0; Connected: 0
    # lsof -i :23
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    systemd 1 root 24u IPv6 64689 0t0 TCP *:telnet (LISTEN)
  • 尝试重启:try-restart PATTERN...:如果服务不是运行状态,则说明也不做。

    centos7:

    # systemctl try-restart httpd

    centos5,6:一般的服务脚本里都不支持,此功能,但也有支持的

    # service NAME condrestart
  • 重载配置文件或尝试重启:reload-or-try-restart PATTERN...

    # systemctl reload-or-try-restart httpd
  • 重载配置文件或重启:reload-or-restart PATTERN...

    # systemctl reload-or-restart httpd
  • 查看服务是否是激活:

    # systemctl is-active httpd
    active
    # systemctl stop httpd
    # systemctl is-active httpd
    unknown
  • 列出所有active的service:

    # systemctl list-units -t service
    UNIT LOAD ACTIVE SUB DESCRIPTION
    abrt-ccpp.service loaded active exited Install ABRT coredump hook
    abrt-oops.service loaded active running ABRT kernel log watcher
  • 列出所有识别的service:

    centos5,6:chkconfig --list

    # systemctl list-units -t service -a
  • 常用的选项:-t和-a

    -t:指定unit file的类型

    -a:查看全部

  • 禁止手动启动和开机自动启动某service:

    centos5,6:chkconfig mySer.sh on

  • 取消禁止手动启动和开机自动启动某service

    目的是防止误操作,启动了不应该启动的service

    原理就是创建一个符号链接,所以也可以手动创建符号链接实现相同的功能。

    # systemctl mask httpd.service
    Created symlink from /etc/systemd/system/httpd.service to /dev/null.
    # ll /etc/systemd/system/httpd.service
    lrwxrwxrwx. 1 root root 9 Feb 27 11:40 /etc/systemd/system/httpd.service -> /dev/null
    # systemctl start httpd.service
    Failed to start httpd.service: Unit is masked.
    # systemctl status httpd.service
    ● httpd.service
    Loaded: masked (/dev/null; bad)
    Active: inactive (dead)
    # systemctl unmask httpd.service
    Removed symlink /etc/systemd/system/httpd.service.
    # ll /etc/systemd/system/httpd.service
    ls: cannot access /etc/systemd/system/httpd.service: No such file or directory
  • 设置开机自动启动:

  • 查看某个服务是否是开机自动启动:systemctl is-enabled httpd.service

    centos5,6:chkconfig --list NAME

    原理就是创建一个符号链接,所以也可以手动创建符号链接实现相同的功能。

    # ll /etc/systemd/system/multi-user.target.wants/ | grep httpd
    # systemctl is-enabled httpd.service
    disabled
    # systemctl enable httpd.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
    # ll /etc/systemd/system/multi-user.target.wants/ | grep httpd
    lrwxrwxrwx. 1 root root 37 Feb 27 11:54 httpd.service -> /usr/lib/systemd/system/httpd.service
    # systemctl is-enabled httpd.service
    enabled

    目录/etc/systemd/system/multi-user.target.wants/下的服务就是开机自动启动的。

  • 查看某个服务依赖了哪些服务:

    # systemctl list-dependencies httpd
    httpd.service
    ● ├─-.mount
    ● ├─system.slice
    ● └─basic.target
    ● ├─microcode.service
    ● ├─rhel-dmesg.service
  • 杀死服务,后面是进程的名字,而不是pid,类似,killall命令。

    # systemctl kill httpd

对运行级别的各种操作:target units

unit配置文件:

# ls /usr/lib/systemd/system/*.target
lrwxrwxrwx. 1 root root 15 Nov 29 16:46 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 Nov 29 16:46 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 Nov 29 16:46 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 Nov 29 16:46 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 Nov 29 16:46 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 Nov 29 16:46 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 Nov 29 16:46 /usr/lib/systemd/system/runlevel6.target -> reboot.target
# systemctl list-unit-files -t target -a
UNIT FILE STATE
anaconda.target static
basic.target static
bluetooth.target static
cryptsetup-pre.target static
cryptsetup.target static
ctrl-alt-del.target disabled
default.target enabled
...

centos5,6里的运行级别是符号链接,指向了别的unit

centos5,6里的运行级别 centos7里的unit file
0 runlevel0.target ->poweroff.target
1 runlevel1.target ->rescue.target
2 runlevel2.target ->multi-user.target
3 runlevel3.target ->multi-user.target
4 runlevel4.target ->multi-user.target
5 runlevel5.target ->graphical.target
6 runlevel6.target ->reboot.target

centos5,6里的运行级别是各管各的,centos7里的target可以使用别的target

# systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target

发现graphical.target是依赖multi-user.target的,也就是graphical.target复用了multi-user.target。

centos5,6要想复用就很麻烦,要手动把脚本拷贝到别的运行级别的目录里。

  • 切换运行级别:

    centos5,6:init N

    centos7:systemctl isolate NAME.target

    who -rrunlevelinit N命令依然在centos7里可以使用。

    # who -r
    run-level 5 2020-02-28 09:07
    # runlevel
    N 5
    # systemctl isolate multi-user.target
    # who -r
    run-level 3 2020-02-28 11:18 last=5
    # runlevel
    5 3
    # systemctl isolate graphical.target
    # runlevel
    3 5
    # who -r
    run-level 5 2020-02-28 11:18 last=3

    可以切换的前提条件:NAME.target文件里的AllowIsolate的值必须是yes才可以。

    [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

    修改unit file后,必须使用systemctl daemon-reload命令后,才能生效。

    修改成AllowIsolate=no
    # emacs /usr/lib/systemd/system/multi-user.target
    # tail -1 /usr/lib/systemd/system/multi-user.target
    AllowIsolate=no
    由于没有运行systemctl daemon-reload命令,所以运行systemctl isolate multi-user.target没有效果,但是会提示你要运行systemctl daemon-reload命令
    # systemctl isolate multi-user.target
    Warning: multi-user.target changed on disk. Run 'systemctl daemon-reload' to reload units.
    让修改生效
    # systemctl daemon-reload
    修改已经生效了,所以切换就不成功了。原因是AllowIsolate=no
    # systemctl isolate multi-user.target
    Failed to start multi-user.target: Operation refused, unit may not be isolated.
    See system logs and 'systemctl status multi-user.target' for details.
  • 查看开机时使用的什么target

    # systemctl get-default
    graphical.target

    centos5,6是查看/etc/inittab,centos5里有很多行,centos6只有一行id:3:initdefault:

  • 设置开机时使用什么target

    原理:创建符号链接指向要使用的target

    /etc/systemd/system/default.target符号链接,指向的是哪个,就使用哪个。所以每次都是先删除它,再建立一个新的。

    # systemctl set-default multi-user.target
    Removed symlink /etc/systemd/system/default.target.
    Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
    # systemctl set-default graphical.target
    Removed symlink /etc/systemd/system/default.target.
    Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
  • 切换到救援模式:systemctl rescue

    centos7在启动时,就可以进入救援模式。加载设备驱动。

    centos5,6必须借助光盘才能进入救援模式。

  • 切换到更底层的救援模式:systemctl emergency

    设备驱动都不加载 。如果因为设备驱动坏了导致不能开机,则不许使用此模式修复。

  • 其他常用命令:

    原理centos6里的init,poweroff,halt,reboot都成为了systemctl的符号链接

    # ll /usr/sbin/reboot
    lrwxrwxrwx. 1 root root 16 Nov 29 16:46 /usr/sbin/reboot -> ../bin/systemctl
    # ll /usr/sbin/poweroff
    lrwxrwxrwx. 1 root root 16 Nov 29 16:46 /usr/sbin/poweroff -> ../bin/systemctl
    • 关机:systemctl haltsystemctl poweroff
    • 重启:systemctl reboot
    • 挂起:systemctl suspend
    • 快照:systemctl hibernate
    • 快照并挂起:systemctl hybrid-sleep

通过内核参数,临时修改内核启动选项

开机时,在选择的内核上按e键,进入grub2的配置,然后在linux16行的最后,添加内核启动选择:

  • systemd.unit=rescue.target(直接进入救援模式)
  • systemd.unit=emergency.target(直接进入救援模式)
  • systemd.unit=multi-user.target(直接进入多用户的文本模式)

编写unit file

/usr/lib/systemd/system/httpd.service内容如下:

# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8) [Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true [Install]
WantedBy=multi-user.target
  • unit file 通常由3部分组成

    • [Unit]:通用选项。

      • Description:提供描述信息(在systemctl status里显示的信息)
      • After:在此服务启动后,本服务启动
    • [Name]:与特定类型相关的专用选项,如果是.service则此处是Service
    • [Install]:定义由systemctl enablesystemctl disable命令,在服务启用或禁用时用到的一些选项。
  • 以#开头的行是注释

  • 相关布尔值

    1,yes,on,true都是开启

    2,0,off,no,false都是关闭

  • 时间默认单位是秒,毫秒:ms,分钟:m等必须显示加上单位

  • 详细信息参考阮一峰的日志:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854

centos7系统启动流程的更多相关文章

  1. 20190411RAID磁盘阵列及CentOS7系统启动流程

    RAID磁盘阵列及CentOS7系统启动流程(week2_day3)   RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构 ...

  2. RAID磁盘阵列及CentOS7系统启动流程(week2_day3)--技术流ken

    RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 磁盘阵列是由很多价格较便宜的磁盘,以硬件( ...

  3. RAID磁盘阵列及CentOS7系统启动流程

    磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意,,数据读取无影响.将数据切割成许多区段,分别存放在各个硬盘 ...

  4. centos5,6 系统启动流程

    linux内核特点: 支持模块化:模块文件的名字以.ko(kernel object)结尾 支持内核运行时,动态加载和卸载模块文件. linux内核组成部分: 核心文件:/boot/vmlinuz-V ...

  5. Linux操作系统-CentOS7启动流程和服务管理

    Linux操作系统-CentOS7启动流程和服务管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.systemd POST --> Boot Sequence --&g ...

  6. Centos7启动流程及systemd中Nginx启动配置

    Centos7启动流程: 1.post(Power-On-Self-Test) 加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主 ...

  7. Linux操作系统启动流程梳理

    接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下 ...

  8. CentOS系统启动流程

    CentOS系统启动流程 POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> kernel(ramdisk) --> r ...

  9. CentOS系统启动流程你懂否

    一.Linux内核的组成 相关概念: Linux系统的组成部分:内核+根文件系统 内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序. IPC(Inter-Process Communicati ...

随机推荐

  1. java自定义注解学习(注解处理器)

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  2. ContractPattern 面向面向契约模式

  3. NOI2.5 8783:单词接龙

    描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中 ...

  4. c#数字图像处理(七)直方图匹配

    直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...

  5. Doxygen -- part 2

    Documenting the code 这个章节涵盖两个主题: 如何在你的代码中放置注释, 一遍doxygen可以在生成的文档中囊括它们. 如何组织一个注释块的内容, 以使得输出美观. 特殊注释块 ...

  6. laravel 初学路由简单介绍

    文档中的路由详细演示[初学laravel]对应laravel 的框架目录:routes/web.php 路由的格式一:Route::get($uri,$callback); 1.简单的浏览器输出 Ro ...

  7. 使用Gradle构建springboot多模块项目,并混合groovy开发

    idea设置本地gradle 打包: build.gradle //声明gradle脚本自身需要使用的资源,优先执行 buildscript { ext { springBootVersion = ' ...

  8. SpringBoot学习(2) - 自定义starter

    自己开发一个spring boot starter的步骤1.新建一个项目(全部都基于maven),比如新建一个spring-boot-starter-redis的maven项目 pom.xml: &l ...

  9. 使用nginx构建一个具备缓存功能的反向代理服务器

    上游服务一般不提供公网访问. upstream模块,名字叫local 这个时候访问,都是由反向代理服务处理返回的. 有了反向代理服务后,拿变量和值会出错,tcp是有对端地址的,反向代理与客户端是一个t ...

  10. Actix-web Rust连接Postgres数据库

    Actix-web Rust连接Postgres数据库 ​ Rust1.39支持了异步async,await,Actix-web在2.0.0-alpha支持了原生异步写法,所以本文中使用的Actix- ...