linux虚根怎么切换到真根,Linux系统的启动流程以及做个小小的Linux

本文主要是介绍linux虚根怎么切换到真根,Linux系统的启动流程以及做个小小的Linux,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内核的作用    进程管理:进程间切换

内存管理:内存空间分割为内核空间和用户空间

IO管理:对底层硬件的使用必须由内来实现,不能由用户空间进程来实现

文件系统管理

驱动程序管理

安全管理:包括netfilter模块和selinux模块等

内核的设计模式    单内核:模块都是集成在内核内部(Linux是单内核)

微内核:模块都是独立的,随用随加载(Windows是微内核)

Ps:1.linux是单内核,但是广泛采用了微内核的设计思想

2.内核模块是和内核紧密相关的,一旦换了内核,所有的模块都不能再使用

单线程:只有一个执行流

多线程:有多个执行流

提升程序的执行速度    1、必须寻多线程开发模式

2、运行的主机必须有多个或者多核CPU

启动流程

1、POST(Power On and Self Test):加电自检

检查硬件是否工作正常

将CMOS中的BIOS程序加载到CPU中,依此来检测硬件工作,然后根据设定的启动次序去指定的设备上找 系统内核

BIOS的基本功能(很重要)

1、检查硬件

2、获取硬件信息

3、指定启动次序(bootsquence)

2、查找内核

【此时因为没有内核,所无法直接使用文件系统,因此就找不到文件系统删的内核文件】

MBR

446:bootloader,在文件系统上找内核【bootloader指定了加载内核的方式】

64:分区表

2:幻数

加载内核步骤(重要)

1)找指定设备的上的MBR(bootloader)

2)根据bootloader的指引去加载内核文件(vmlinuz-xxx)

3)然后会将boot分区当做根分区来使用,来获取系统的基本信息(硬件、软件)

PS:因为bootloader可以执行系统加载内核,因此,内核所在的分区的一定是一个特殊分区,此分区没有文件系统也可以访问,分区名称是:/boot

系统中的分区(第一个分区必须是boot)

/:根分区 (5G以上)

/boot:开机引导分区

【在手动分区的时候,第一个分必须是boot分区】

/proc:

/sys:伪文件系统分区

/swap:交换分区

内核(kernel)

源码:kernel.org

二进制:/boot/vmlinuz-xxx(压缩存放,支持自解压)

二进制的好处:

节省内存和存储空间

提高IO

3、启动用户空间进程

启动用户空间进程:/sbin/init

1)由内核中的文件系统功能找到并执行/sbin/init,会产生一个ID为1的进程,进程名就是init

2)init生成用户空间

加载驱动

【不可能就将全部的驱动都加载到内核中】

在安装linux的时候,最后一步会执行一个脚本,此脚本会收集系统的基本信息,硬件,软件,驱动,将这些信息打包压缩成一个文件,此文件在centos5.x 叫做initrd-版本号.img;Centos6.x 叫做 initramfs-版本号.img

因此在加载内核到内存的是,会连同initrd/initramfs一起加载到内存中,而且initrd会在内存中展开,将内存中的内核空间当做根分区来使用,在这个根分区中就有了当前系统索要使用的驱动程序。

由initrd所展开生成的根也是一个虚根,在启动完成用户空间以后,会切换到真实根

chroot命令

作用:切换根

PS:总结启动流程POST-->BIOS(BootSequence)-->MBR(Bootlader)-->vmlnuz,initrd(initramfs)-->/sbin/init(/etc/inittab)

关于/etc/inittab的相关介绍

程序:/sbin/init

配置文件:/etc/inittab(vim /etc/inittab)

linux的运行级别(模式)

0 - halt (Do NOT set initdefault to this)(关机)

1 - Single user mode(通常用来修复系统)

2 - Multiuser, without NFS (The same as 3, if you do not have networking)  (为了解决网络不通导致系统启动异常)

3 - Full multiuser mode(字符级别的多用户模式)

4 - unused(系统保留功能)

5 - X11(图形界面,前提必须安装图形界面)

6 - reboot (Do NOT set initdefault to this)   (重启)

*查看级别

# runlevel

返回: N 3

N:表示没有切换过级别

切换级别

# init N

inittab详解

格式:

id:level:action:process

action的相关介绍

initdefault: 设置默认级别

sysinit:指定系统初始化过程中,要执行的脚本

wait:等待,监控一旦处于指定级别就执行的操作

ctrlaltdel:设置当用户按下 ctrl + alt + del时候所触发的操作

powerfail:设置当发生断电的情况下,所执行的操作

respawn:指定终端

linux系统启动过程中,会将指定级别下的程序启动或关闭

程序的存放位置:/etc/init.d

程序加入到系统服务以后,会自动生成连接文件

# chkconfig --add 脚本名

程序的链接文件位置: /etc/rc.d/rcN.d

/etc/rc0.d

/etc/rc1.d

/etc/rc2.d

/etc/rc3.d

/etc/rc6.d

分别对应系统的七个运行级别

239b9100afe3e666e5cb3aa4604ac71d.png            

系统启动的时候,会首先判断级别(假设判断级别为3)

判断级别以后,会在/etc/rcN.d下,将所有S开头的程序启动,所有K开头的程序关闭

注意:

一旦将一个程序添加到系统服务,那么会自动在/etc/rcN.d下创建链接文件

grub引导系统启动,分为三个阶段

stage1:其实就是使用MBR中的bootloader完成内核检索

stage1.5:在boot分区中,用来识别文件系统,此阶段只有在分区的时候才有用

stage2:使用 /boot/grub/grub.conf 中的程序完成系统的最终启动

grub.conf详解(vim /boot/grub/grub.conf)

default=0  #指定默认使用哪个内核文件,零表示第一个

timeout=5 #设置开机等待时间(可以自己改了玩着试试)

splashimage=(hd0,0)/grub/splash.xpm.gz  #开机背景图片,也可修改但是照片的格式必须和系 统相同

hiddenmenu #隐藏菜单

title CentOS (2.6.32-431.el6.x86_64)   #开机提示信息

root (hd0,0)     #指定内核文件所在分区,这里表示第一个磁盘第一个分区

kernel /vmlinuz-2.6.32-431.el6.x86_64(指定内核) ro root=/dev/mapper/vg_chenxiaoxu-lv_root rd_LVM_LV=vg_chenxiaoxu/lv_swap rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 (指定语言)rd_LVM_LV=vg_chenxiaoxu/lv_root(指定根分区位置)  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-431.el6.x86_64.img

Grub的基本使用(忘了Linux密码可以修改)    1、进入grub界面:在等待时间内按回车键

可用的命令

e:进入编辑界面(其实编辑/boot/grub/grub.conf)

a:编辑内核功能

c:进入命令行模式

2、进入编辑模式

e:进入编辑模式

c:同上

b:引导开始进入系统

o:新添加一行

d:删除

3、编辑kernel行

【修改此行可以设置系统的运行模式】

在原有内容后写上一个 1 ,进入单用户模式,然后回车,返回到grub.conf的编辑界面

按 b 开始引导进入系统

4、给grub设置密码

修改grub.conf,添加一个字段passwd

方式是:

在title 上面添加一行内容

password 123

注意:添加是的明文密码,不安全,所以看下边啦

5、给grub设置加密的密码

1)生成加密密码

b477aa95a9477d8430e1a09076787447.png

2)将密码添加到/boot/grub/grub.conf中

password --md5 $1$4ixMm$UXtaHOHwyyQtdtDlk/9no/

--md5:是指定的加密方式大名叫MD5加密

在新的磁盘上安装grub

(前提:添加一个新的磁盘大小为1G,必须使用单个文件作为磁盘文件,将此文件存到一个容易找到的地方,

1)这个新磁盘必须提前进行分区

2)这个新磁盘必须挂载到系统的某个目录之上

)

有两种安装方式

第一种方式:grub-install 进行安装

第二种方式:进入grub模式进行安装

方式二:grub模式安装

# grub

grub >

破坏grub的第一阶段

bootloader(MBR-446)

# dd if=/dev/zero of=/dev/sda bs=1 count=1(泡泡机)

修复grub的第一阶段

1)进入grub模式

# grub

2)测试根分区的编号

# root  (hd#,#)  PS:这里的hd#是磁盘编号,#是分区编号

出现信息:filesystem type unkown 表示不是boot所在分区

3)在根分区所在的磁盘上安装grub(bootloader)

安装grub的格式:

grub > setup (hd#)  PS:hd# 表示在指定的磁盘上来安装grub

方式一:grub-install方式安装

格式:grub-install --root-directory=路径

注意:这个路径指的是boot所在分区

1)分区操作

分区

格式化

挂载

# mount /dev/sdb1 /media

2)安装grub

# gurb-install --root-directory=/media /dev/sdb

模块相关的命令    lsmod

已经加载的模块名称以及依赖的模块

modinfo

格式:modinfo 模块名称

作用:显示一个莫得详细信息

depends:该模块所依赖的模块

filename:模块的保存位置

description:模块的描述信息

modprobe

格式:modprobe 模块名称

作用:动态加载模块

modprobe -r 模块名称:卸载模块

insmod

格式:insmod /patt/to/模块名称

作用: 加载模块

rmmod

格式:rmmod 模块名称

作用:卸载模块

例子:查看显示floppy模块信息

查看模块的相信信息

# modinfo floppy

查看该模块是否已经被加载

# lsmod | grep floppy

floppy                 61447  0

卸载此模块

# modprobe -r floppy

# lsmod | grep floppy

重新加载此模块

# modprobe floppy

# lsmod | grep floppy

floppy                 61447  0

准备一个新磁盘

安装grub

编写一个grub.conf

向这个磁盘移植几个常用命令ls cd mkdir。。。

制作简单的linux

1、添加硬盘,创建两个分区

1)创建分区

/dev/sdb1->200M

/deb/sdb2->xx

2)挂载分区

sdb1 --> /media/boot

sdb2 --> /media/sysroot

2、在该硬盘上安装grub

# grub-install --root-directory=/media/boot /dev/sdb

3、移植kernel和initrd

4、创建系统的必要目录

bin

sbin

etc/rc.d

var

usr

tmp

home

root

proc

sys

meida

mnt

lib

lib64

5、移植系统命令

bash

mount

cd

ls

cp

mkdir

rm

touch

6、给bash创建软件链接sh

7、生成grub的配置文件

default=0

timeout=10

title my mini linux

root (hd0,0)

kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash

initrd /initramfs.img

8、创建一个init程序,来完成系统初始化

1)创建init

#!/bin/bash

echo -e "wellcome to linux \033[32m zxhk \033[0m"

# mount -n -t proc proc /proc

mount -n -t sysfs sysfs /sys

mount -n -o remount,rw /dev/sda2 /

/bin/bash

2)赋予执行权限

3)修改grub.conf

9、导入网络功能模块

1)导入命令

2)移植网卡模块

# cp `modinfo e1000 | head -n1 | awk '{print $2}'` /media/sysroot/lib/

3)修改init,加载网卡模块

#!/bin/bash

echo -e "wellcome to linux \033[32m zxhk \033[0m"

# mount -n -t proc proc /proc

mount -n -t sysfs sysfs /sys

insmod /lib/e1000.ko

ifconfig eth0 10.100.0.112 netmask 255.255.0.0

ifconfig lo 127.0.0.1 netmask 255.0.0.0

mount -n -o remount,rw /dev/sda2 /

/bin/bash

Author:潇湘雨错

这篇关于linux虚根怎么切换到真根,Linux系统的启动流程以及做个小小的Linux的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664711

相关文章

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶