linux菜鸟入门之系统启动流程_linux系统启动流程-程序员宅基地

技术标签: 运维  kernel  linux  内核  

1.启动过程

POST

加电自检

BIOS

以普通的操作系统为例。cpu 要执行指令需要从内存中取,而刚开机的时候,内存里什么都没有,所以刚开机的时候。必须将某个的特定的硬件中的指令加入内存中。刚开机时将ROM中的指令映射到RAM的低地址空间。这下,CPU就可以读取到这些指令。CPU会先对硬件的健康状况进行检查。

BIOS(Boot Sequence),决定了会找操作系统的启动顺序(可以光盘,硬盘)。


MBR

硬盘的格式。MBR中有一段程序(bootload,占446字节)。这段程序会根据MBR中的分区表查找活动分区。找到操作系统的所在的分区,并加载操作系统的内核。bootload若损坏就无法启动操作系统了,他不会再返回去找第二个启动地方。当bootload获得控制权,就没BIOS什么事了。


Kernel

内核取得整个系统的控制权,bootload退出,内存完成解压缩后会探测每个硬件。访问根所在的分区。
文件系统,进程管理,内存管理,网络管理,安全功能,驱动程序。

启动systemd原始进程(CentOS7 ,7以前是init进程)

systemd是用户空间的进程。

在一块磁盘上, 前446bytes是主引导分区,接下来的64bytes是分区表(正因为分区表只有64bytes,所以主分区最多只有4个,当然还可以有扩展分区和逻辑分区。)
bootloader有提供菜单,载入内核文件,转交其他的loader的功能(正因如此才可以双系统)。引导加载程序除了放在MBR中还可以放在每个分区的引导扇区里。
假设一块硬盘其中第一,二分区分别安装了windows和linux。假设MBR可以同时识别两个操作系统的引导加载程序。
就会发现MBR提供了2个菜单。


2.文件系统

分区要挂载文件系统,文件系统的最高级/。下面还有/etc   /boot    /home
/    根文件系统。


3.kernel

文件系统,进程管理,内存管理,网络管理,安全功能,驱动程序。

单内核:把所有功能都放一个系统中      如:linux(把线程叫做LWP。轻量级进程)
linux为了支持不同的CPU、硬盘。所以很庞大。
微内核:将外围作为子系统                    如:windows,Solaris(支持多线程)        


RedHat,Suse,CentOS 为了支持不同平台,核心动态加载 内核模块
核心:(ko kernel object)
内核: /lib/modules/“内核版本号命名的目录”/“做成模块的文件系统,驱动程序。。。。”
vmlinuz-2.6.32
[root@localhost wjx]# cd /lib/mod
modprobe.d/     modules/        modules-load.d/ 
[root@localhost wjx]# cd /lib/modules
[root@localhost modules]# ls
3.10.0-327.36.1.el7.x86_64  3.10.0-327.el7.x86_64

里面有很多关于解决依赖性(dep)的文件,map是映射表 
[root@localhost net]# ls ./../..
build              modules.builtin      modules.modesetting  source
extra              modules.builtin.bin  modules.networking   updates
kernel             modules.dep          modules.order        vdso
modules.alias      modules.dep.bin      modules.softdep      weak-updates
modules.alias.bin  modules.devname      modules.symbols
modules.block      modules.drm          modules.symbols.bin

这里有一个kernel的目录,进入。。。
[root@localhost kernel]# ls
arch  crypto  drivers  fs  kernel  lib  mm  net  sound

arch :和平台相关,cpu。
crypto:加密相关。
drivers:驱动
fs:文件系统
kernel:内核相关
lib:库
mm:内存管理
net:网络(tcp/ip协议栈)
sound:声

[root@localhost net]# ls
802        bridge  dns_resolver  key       mac802154    packet  sunrpc     xfrm
8021q      ceph    ieee802154    l2tp      netfilter    rfkill  unix
atm        core    ipv4          llc       netlink      sched   vmw_vsock
bluetooth  dccp    ipv6          mac80211  openvswitch  sctp    wireless


这里什么都有以适应各个平台,各种硬件设备。所以这个/lib/modules 很庞大
自己电脑的操作系统都用的什么内核在/boot/vmlinuz-* ,我的是第二个。
[root@localhost modules]# ls
3.10.0-327.36.1.el7.x86_64  3.10.0-327.el7.x86_64
[root@localhost modules]# ll /boot/vmlinuz-*
-rwxr-xr-x. 1 root root 5156528 Sep 20 22:29 /boot/vmlinuz-0-rescue-6096c81e6fcc48c0a0fe9e5fba473a43
-rwxr-xr-x. 1 root root 5157296 Sep 18 21:14 /boot/vmlinuz-3.10.0-327.36.1.el7.x86_64
-rwxr-xr-x. 1 root root 5156528 Nov 20  2015 /boot/vmlinuz-3.10.0-327.el7.x86_64

内核所需要的模块在/lib/modules中,但想要进/lib/modules必须先进/,但进/必须要先加载/lib/modules这就是鸡生蛋。蛋生鸡的问题了。就加一个中间人。虚根。将临时的/proc./sys./dev搬到




4.init(CentOS7是systemd)

以CentOS6为例,其有7个运行级别。
0: 关机
6:级别
1:单用户模式(single user mode)类似于windows的安全模式,直接以管理员身份切入。不需要密码。(维护模式,可以进去改root密码)
2:多用户模式(multi user mode)可以上网,不挂载NFS
3:正常多用户模式(multi user mode)只是文本,无图形界面。我们就经常使用这个
4:保留级别(reseved) 
5:正常多用户模式      。这里有图形界面


centos6 可以修改自己的默认运行级别。而7就没有了,但是7还是保留这个文件。因为我对systemd不太了解。所以就以6为例子说了,先看一下7的inittable文件。
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

Centos7在这里写的很清楚。当使用systemd的时候。inittable就不在用了。在这里添加配置将不会影响你的系统。7改成了使用目标。而不是用运行级别。以multi-user.target代替运行级别3。graphical.target代表运行级别5  。这里还讲了在systemd下的查看和更改默认运行级别的方法。


5.详细启动过程

bootloader(MBR)选择启动哪个系统。微软只引导自己,先装linux,再装win的话,win会覆盖MBR。win8更邪恶,还会锁定MBR,装win8的话会锁死MBR,就是不能装linux了。

LILO:Linux Loader  (但不支持大硬盘,8g就不行,一般是嵌入式)

grub:grand unified bootloader (需要装在bootloader上来引导操作系统,因为bootloader太小了所以分3部分)
stage1:MBR
stage1.5:来识别不同的文件系统
stage2:/boot/grub/

(由于Centos7与centos6的不同,centos6里面是在 /boot/grub/中看到有1.5有2,是文件系统,而7中,在/boot/grub2 中  i386-pc中有很多mod文件。如ntfs.mod)


在/boot/grub2/grub.cfg中可以看到启动哪些操作系统
menuentry 'CentOS Linux (0-rescue-6096c81e6fcc48c0a0fe9e5fba473a43) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-6096c81e6fcc48c0a0fe9e5fba473a43-advanced-f35003eb-898a-4681-8342-f8f6de03e541' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs 
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then

xfs 文件系统。 不知道gzio是不是启动背景图片。。。
set root='hd0,msdos1'    这句话说的是内核所在的设备。对grub而言。所有硬盘都是hd。格式为(hd#,N);hd#,#代表的是第几个磁盘。最后的N表示对应磁盘的分区。
在centos7 里面有个/boot/grub/下有个splash.xpm.gz 我猜这个文件是系统启动时的背景图片。图片类型是xpm的,用gzip压缩过。我试着用convert -resize 640x480 -colors 14 picture.png splash.xpm。再压缩了一下,然后放在这个目录下,没成功!我觉得我应该没猜错,我用od -c 打开过原先的图片,里面全是些点。

grub

在开机的时候可以进入编辑模式 e去编辑。a去修改内核参数。c命令行界面。下面是CentOS7的编辑界面。


按e进入编辑后,还e去继续编辑。编辑完可以按b去boot,这下进去后是以单用户模式进去。(Centos6)然后可以修改root密码。
亦可以给grub加密码。还是在/boot/grub2/grub.cfg中加密码, 可以加明文,亦可以加加密后的密码。

在CentOS7里面,将光标下移找到其中一个叫rhgb quiet的一个单词(在下图的倒数第二段),将其删掉并制定一个shell。在后面加上init=/bin/bash  。.完了之后按Ctrl+x


这里面还能看到一些initrd,这就是虚拟文件系统,进去看一下。
在前面的菜鸟入门归档里已经说了img是cpio归档的。
[root@localhost mnt]# !cpio
cpio -ivcdu < initramfs-3.10.0-327.36.1.el7.x86_64.img 
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
early_cpio


发现里面就是些这东西


这就进入了单用户模式,可以用passwd将root的密码改掉。
在我改完密码后发现。只能使用一些简单的命令,向ls,passwd等,像shutdown,reboot就不能使用。



查看内核的版本号 uname -r,查看运行级别 who -r
[root@localhost mnt]# uname -r
3.10.0-327.36.1.el7.x86_64
[root@localhost mnt]# who -r
         运行级别 5 2016-10-11 16:22
[root@localhost mnt]# systemctl get-default 
graphical.target
[root@localhost mnt]# 

MBR坏了怎么办呢?


那么如果MBR坏了怎么办。下面我故意破坏掉bootloader来演示一下。
首先看一下分区表。
[root@localhost ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00079f53

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     4810751     2097152   82  Linux swap / Solaris
/dev/sda3         4810752    41943039    18566144   83  Linux
这下可以看出boot在sda的1分区里。由于知道MBR在前446B中,所以我们可以删除它
[root@localhost ~]# dd if=/dev/zero of=/dev/sda count=1 bs=400
1+0 records in
1+0 records out
400 bytes (400 B) copied, 0.000658637 s, 607 kB/s
[root@localhost ~]# sync              #同步到磁盘
这下就会重启不了 。但可以用命令去修复。或者在紧急模式里去修复。
鄙人对CentOS7 的命令行修复不会。。。。 这能在在网上按教程进入紧急模式去修复。
重启后会发现Centos7 起不来了,进入 troubleshooting中再选择rescue CentOS system。

选第一个continue。

这下系统就进入到救援模式下了。再输入一下命令。



然后就可以正常重启了。这下MBR就修复好了,但有点慢。

安装grub2-install这个命令  grub2-install --root-directory=/mnt/sysimage  /dev/sda     /打算把grub放在哪个分区上。





kernel初始化过程:(CentOS6)

1.设备初始化
2.驱动初始化(从initramfs文件里装载驱动模块)
3.以只读方式挂载根文件系统:
4.装载第一个进程init(PID:1)



/sbin/init: (/etc/inittab)
upstart:  (ubuntu团队)d-bus
systemd:并行启动服务。CentOS7就用的这个

id:runlevel:action:process

id:标示符
runlevels:在哪个下面运行
action:在什么情况下运行
process:要运行的程序

ACTION:
initdefault:设定默认运行级别
sysinit:系统初始化
wait:等级级别切换至此级别时执行
respawn:一旦程序终止,会重新启动

/etc/rc.d/rc.sysinit完成的任务
1、激活udev和selinux
2、根据/etc/sysctl.conf文件,来设定内核参数
3、设定适中始终;
4、装载键盘映射
5、启用交换目录
6、设置主机名
7、根文件系统检测
8、激活RAID和LVM
9、启用磁盘配额
10、根据/etc/fstab,检查并挂载其他文件系统
11、清理过期的锁和PID文件:

CentOS7的rc.d
[root@localhost rc3.d]# ls
K50netconsole  S10network
[root@localhost rc3.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Sep 20 22:05 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Sep 20 22:05 S10network -> ../init.d/network

将以K开头的网络文件关闭,将S开头的网络文件开启









版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Ghost_leader/article/details/52778589

智能推荐

JSX的基本使用_jsx 在什么环境中运行-程序员宅基地

文章浏览阅读577次。简介JSX是JavaScript XML的简写,表示在JavaScript代码中写XML格式的代码优点:声明式语法更加直观、与HTML结构相同,降低了学习成本,提升开发效率。为什么脚手架中可以使用JSX语法?1.JSX不是标准的ECMAScript语法,它是ECMASeript的语法拓展。2.需要使用babel编译处理后,才能在浏览器环境中使用3.create-react-app 脚手架中已经默认有该配置使用步骤1.使用JSX语法创建react元素const title_jsx 在什么环境中运行

Spring中Bean的生命周期详解_spring bean加载过程(简述bean的生命周期)-程序员宅基地

文章浏览阅读135次。Spring中Bean的生命周期详解Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的?..._spring bean加载过程(简述bean的生命周期)

ps新手秒变大师必备的Ps插件全在这!(mac版本)_delicious retouch 5 mac-程序员宅基地

文章浏览阅读3k次。作为设计师Photoshop可谓神器,不论你是何种设计师多多少少都会用到它。随着时代的发展,对效率越来越注重,ps虽功能强大,但不是大神级别的炉火纯青,用起来还是比较浪费时间的,这是设计公司永远不会说的秘密。 今天专为使用Mac的同学们带来的是10款必备常用ps扩展插件合集!美工修图必备!1.Delicious Retouch 5.0 (DR5)白金版Delicious Retouch5 白金版 for mac(PS磨皮插件DR5)立即下载Delicious Retouch5 白金版 for mac_delicious retouch 5 mac

如何将图像从 React Native 上传到 Laravel API_react native launchimagelibrary 如何上传图片-程序员宅基地

文章浏览阅读410次。聚优影视TV双播盒子,内置多个资源接口,开源TVBOX制作!如今,开发人员同时处理前端和后端项目是很常见的。根据最近的一项开发人员调查,React Native 是全球最流行的用于构建跨平台移动应用程序的框架之一。Laravel 是一个 PHP Web 框架,具有优雅的代码结构,开发人员可以使用它来创建 REST API。Laravel 目前有71k 的 GitHub 星数,证明了它在开发者社区中的受欢迎程度。_react native launchimagelibrary 如何上传图片

sql函数--05---SQL----coalesce函数详解_sql coalesce-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏5次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录coalesce函数背景:语法:COALESCE ( expression,value1,value2……,valuen)流程:举例:应用 1 :进行空值处理查询学生成绩,如果查不到,则赋值为0应用 2 :进行默认处理返回人员的“重要日期”if( , ,)函数也可以coalesce函数背景:主流数据库系统都支持COALESCE()函数, MYSQL、MSSQLServer、DB2、Oracle:这个函数主要用来进行空值处_sql coalesce

vue项目中 实现复制功能_vue 复制dom元素-程序员宅基地

文章浏览阅读1.5k次。vue使用插件vue 可使用 vue-clipboard 插件npm i vue-clipboard2 -S 安装插件在main.js 中引入import VueClipboard from ‘vue-clipboard2’Vue.use(VueClipboard)<el-input v-model="input" size="mini" placeholder="请输入内容"></el-input><el-button type="text" icon="_vue 复制dom元素

随便推点

轻轻松松制作与众不同的黑白照片_黑白照片自动生成-程序员宅基地

文章浏览阅读279次。无论摄影技术如何发展,黑白照片都能保持它独特的吸引力,但如果你亲手试过把彩色照片直接调成黑白照片,那你想必会发现,转换后的效果好像就是差了一点。不用担心,今天小编给大家推荐三款好用的黑白照片处理软件,操作简单,功能实用,让你轻轻松松就制作与众不同的黑白照片,快跟着小编一起来看看吧~1.PhotosRevive for mac(黑白照着色工具)PhotosRevive for mac(黑白照着色工具)立即下载PhotosRevive for mac(黑白照着色工具)Mac哪款黑白照着色工具好用呢?_黑白照片自动生成

LeetCode刷题Python Day1 Q35:搜索插入位置-程序员宅基地

文章浏览阅读96次。题目如下:35. 搜索插入位置难度简单1029收藏分享切换为英文接收动态反馈给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(log n)的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3...

oracle 存储过程 带游标作为OUT参数输出_oracle存储过程 行变量入参-程序员宅基地

文章浏览阅读9.2k次。包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 procedure AAA(变量名 out [cur_name])如此申明OUT变量 存储过程 用系统默认的 sys_refcursor 游标类型 定义变量就OK了 Sql代码 --PL/SQL Code (包中带过程) 过程带游标的OUT参数,返回游标(ref curs_oracle存储过程 行变量入参

AES-NI指令集-程序员宅基地

文章浏览阅读1.6k次。对于intel的AES-NI新指令集,需要i5处理器及以上的相关硬件支持.在编译时,可能会出现/usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin.h:34:3: error: #error "AES/PCLMUL instructions not enabled"很显然,可以通过查其头文件,定位到#if !defined (__AES..._aes-ni指令集的下载与使用

Bug基础-程序员宅基地

文章浏览阅读131次。1.缺陷报告的定义软件不正常的错误或者是代码行错误等均衡成为缺陷2.缺陷的种类:功能不正常软件在使用上感觉不方便软件的结构未做良好规划提供的功能不充分与软件操作者的互动不良使用性能不佳未做好错误处理边界错误计算错误使用一段时间所产生的错误控制流程的错误在大数据量压力下所产生的错误在不同硬件环境下产生的错误版本控制不良导致的错误软件文档的错误3.将缺陷按照严重程度划分系统崩溃,严重,一般,次要,建议4.解决bug的优先级高,中,低5.按照测试种类分:逻辑功能类性_bug基础

macOS高端使用技巧_mac指标高级运用?-程序员宅基地

文章浏览阅读185次。Macos 的占有量不如 Windows,两者之间当操作方式也有很大的不同,当很多人熱悉 Windows 的操作之后,再接触 macos,觉得难上手,其实是习惯问题。如果你学习一些技巧,会觉得 macos 其实也不错,某些方面,甚至远远优于 Windows。很多人说 macos 这效率上会优于 Windows,这点必须承认,毕竟 macos 包括其平台下的软件,有很多的快捷键,并且感觉苹果也有意让大家多多利用快捷键。那么多的快捷键,并且 control 和 command 在使用上,没有一定的规律可循,导_mac指标高级运用?

推荐文章

热门文章

相关标签