linux的组成:

 linux是单内核的系统,而windows是多个微内核的组成的操作系统 
 linux内核的作用:进程管理,内存管理,设备管理,网络管理,硬件驱动,安全机制

启动流程:

1,POST加电自检
	作用:对电脑的各种硬件进行检测,看是否正常
		ROM(主要):加载BIOS保存电脑的输出程序,但是它是保存在内存之中
		RAM:保存电脑的各种参数设置,不然BIOS设置存不住,比如时间。并且指定对应的启
		动项,如从光盘还是硬盘启动
		bootloader:引导加载器,负责引导程序。解压,展开内核,并且把控制权交给内核。如
		用GRUB启动,在6,7版本上不一样
2,MBR引导
	1,前446个字节放的是bootloader,中间64个字节存放磁盘的分区表,最后两个字节是55AA
3,grub
	1,加载grub文件夹中的内容
4,kernel进行初始化
	1,以只读的方式挂载根
	2,运行系统的第一个程序/sbin/init
	3,探测所有的硬件设备
	4,加载各种硬件的驱动程序

	在centos7中硬件的驱动程序是按照需求加载的,如果开机启动时没有检测到硬件,那么就
	不会加载相对应的驱动程序,用来节省启动时间,让启动的更加迅速

	vmlinuz放着最核心的驱动文件,这个文件在光盘中存在,是红帽公司出厂的时候打包到光
	盘中。如果丢失可以进行复制。在编译内核或内核文件丢失时候可以用到此文件,后缀要
	加上内核的版本号(name -r)

注:硬件的驱动程序存放在/lib/modules/kernel` uname -r `/中,如果需要则加载,不需要不
加载

辅助的文件系统存放在greb下的initramfs.img文件中

注:在6,7上放的虚拟的文件系统,在跟早的系统上放的是虚拟的光盘,然而光盘占用的磁盘
空间非常的大,从而导致启动的时长更加长

用modeinfo 可以看到驱动模块的详细信息,以及驱动模块的存放目录

	综上所述:在系统中特定的文件系统的根放在grub下的initramfs中,可以看到文件系统的驱
	动不是放在boot目录中,而是放在其他目录中。那么在系统启动时,并不会加载文件系统驱
	动所在的目录。但是如果不加载文件系统驱动,则无法挂载根目录,导致系统无法启动。
	因此在centos中,会在grub下这个文件中会做一个这个伪根目录,以便于启动的时候运行

	注:查看initramfs.img文件,不过要改文件名,改成GZ后缀的文件名,改成之后在进行解
	压缩。就可以看到操作系统的根的驱动。只有在启动过程中有这个驱动,那么才可以加载
	文件系统的根
	
	常见问题:
		1,没有initramfs.img文件
			解决:
				切换根目录
				用mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)来进行修复
		
		2,在centos7上没有boot目录的内容
			解决:
				拷贝光盘里的vmlinuz文件,加上版本号
				重启系统即可

内核的特点:

在官网下载内核,下载之后解压后的init目录下存放着内核的源码,可以查看,并修改源码,
并且修改启动的第一个进程

在centos6和7上对应的init文件不属于一个包,可以用rpm来查看,因为在这两个系统上并不
是由一个应用程序启动的

早期centos的加载是等待执行,可以理解成当一个进程启动完成之后,才会启动另一个进
程。这样很多缺点,如系统启动时间过长,或者某一个应用程序无法启动,从而导致整个系
统都无法启动。所以在centos后期的版本中进程之间是并行执行启动,这样可以大大的节省
启动时间,也可以在启动时排除一些进程不必要的干扰

	默认启动模式:在centos6上可以改动/etc/inittab中改开机启动的模式,在centos7也有此
	文件,但是centos7上无法再此文件中定义启动的模式,需要通过调用系统命令来修改系
	统的默认启动模式,且在centos7系统中定义的只有两种启动模式,分别是图形和命令行
		centos6:
			查看:runlevel
			修改:在配置文件中修改id:3:initdefault: 
			注:
				0,关机模式
				1,单用户模式(系统进行维护,破解root口令)
				3,多用户模式
				5,图形界面
				6,重启
				
				如在配置文件中误修改成重启模式,可在开机界面进入单用户模式修改


		centos7:
			查看:systemctl get-default
			修改:
				systemctl set-default graphical.target	
				systemctl set-default multi-user.target			

系统的启动流程:

系统启动的第一个程序:/sbin/init
init读取其初始化文件:
	centos6:/etc/inittab
	centos7:systemctl set-default name.target(只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换)

/etc/rc.d/rc.sysinit: 系统初始化脚本,其中定义了启动的模式
	(1) 设置主机名  
	(2) 设置欢迎信息  
	(3) 激活udev和selinux   
	(4) 挂载/etc/fstab文件中定义的文件系统  
	(5) 检测根文件系统,并以读写方式重新挂载根文件系统  
	(6) 设置系统时钟  
	(7) 激活swap设备  
	(8) 根据/etc/sysctl.conf文件设置内核参数  
	(9) 激活lvm及software raid设备  
	(10) 加载额外设备的驱动程序  
	(11) 清理操作 
rc N --> 意味着读取/etc/rc.d/rcN.d/(进行系统初始化)
	作用:在其中有很多的K开头的文件和S开头的文件,其中K代表是关闭,S代表是启动,其
	中的数字代表启动的顺序
	
	注:
		1,在切换模式的时候/etc/rc.d/rcN.d/里面的服务也会重新启动一遍
		2,自己编写的脚本在启动时尽量往后放,因为自己编写的脚本需要依赖很多其他程序才
		能够运行,当然关闭的时候要首先关闭自己编写的脚本

	
		调整服务的启动次序:
			chkconfig可以查看到当前的各个服务的启动级别,也可以进行设置

			例:chkconfig --level 345 atd off 改这个级别下的自启动,如果不带任何选项,那么则代
			表的是2-5模式之中关闭

		源码包安装的服务在书写启动脚本的格式(尽量用case语句):
			必须加上的行:
				chkconfig 2345(-) (S)96  (K)06 (设置启动的等级,启动和关闭的顺序)
				description: test service (在centos6上加不加都可以,在5版本上必须得加上这一行,才
				能启动对应的服务)
		美化启动脚本,引用相应的functions文件中的action函数:
			source /etc/init.d/function
			action "xxx is stop"

		将启动脚本通过chkconfig命令加入到启动项里,如果删除可以用这个命令删除,不然会有
		相应的缓存文件
		chkconfig add :添加服务
		chkconfig del :删除服务

		注:在linux运行的过程中可能一些服务由于种种原因导致无法启动,那么切换开机启动模式,然后在对相关进行改动即可

		如果不想用chkconfig加入到自启动中,可以加入到rc.local中,注意这个脚本中的服务是最
		后启动的服务
				
		xinetd(超级守护进程)管理的服务:
			作用:
				centos6系统中一些服务的代理服务,在centos7中交由systemd代理。在centos6中的某
				些服务会依赖于这个服务的启动而启动,从而来减少系统的压力比如已经淘汰的Telnet
				服务,就是依赖于xinted服务的启动而启动
			对象:
				一些访问量不多的服务,当有人访问这个服务时才会启动对应的服务,可以节约一些启
				动的资源
			启动:
				要修改要启动服务对应的配置文件,把disabled这一项改成no
	
	在生产中要注释掉的快捷键,避免误操作:ctrl alt delete 三键连按是重启
			centos6:
				注释/etc/init/control-alt-delete.conf的start on control-alt-delete这一行
			centos7:
				删除/usr/lib/systemd/system/ctrl-alt-del.target

grub:

配置文件:
	default=#: 设定默认启动的哪一个内核;落单项(title)编号从0开始, 
	timeout=#:指定菜单项等待选项选择的时长
	splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径(可以自定义启动图片,
	但是图片的像素是640*480,后缀是xpm.gz)
	title TITLE:定义菜单项“标题”
	hiddenmenu:隐藏菜单(如果没有,那么不按e就可以看到启动项)
	password [--md5] STRING: 可以为启动项增加密码
	kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核 
	initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件

	注: initrd必须在kernel下面,因为要先加载文件系统

grub分区启动的常见问题:
	1,缺少前446个字节的bookloader(一阶段,进入救援模式)
		解决:
			进入救援模式下
			1:
				grub-install --root-directory=DIR(挂载的目录) /dev/DISK(对应的分区)——————挂载对应的磁盘
			2(boot下的备份文件必须要存在):
				#] grub
				grub>root (hd0,0)—————挂载根分区 
				grub>setup (hd0)—————生成对应的MBR分区表
	2,没有grub配置文件(二阶段错误,出现grub提示符)
		解决:
			手动写grub.conf配置文件
	3,没有grub目录和前446个字节
		解决:
			1,切换根目录
			2,grub-install /dev/sda
			3,写grub.conf文件
				default=0
				timeout=3
				title my linux
				kernel /vmlinuz ro root=/dev/sda1 selinux=0
				initrd /initramfs.img
				注:root (hd0,0)可写可不写,默认根分区是第一个分区
			4,重启系统
	4,boot分区全部删除
		解决:
			1,进入救援模式,开启一个shell,切换根目录
			2,挂载光盘,拷贝内核文件(vmlinuz),mkinitrd /boot initramfs.img `uname -r`(可以直接装内核,不过要强制安装内核)
			3,grub-install /dev/sda(重做MBR分区)
			4,写grub.conf文件
			5,重启系统
	5,删除boot分区,删除fstab文件(基于逻辑卷安装的系统)
		解决:
			centos6:
				1,用fdisk命令先找到根分区的属于哪个分区,然后用blkid命令查看当前分区有没有逻
				辑卷,并找到对应的挂载目录
				2,用lvdisplay可以看到逻辑卷是否处于启用状态,如果没有启用,可以用vgchange -ay可以启用逻辑卷
				3,启用之后编辑/etc/fstab(要在对应的根目录下)
				4,重启系统
				5,切换根目录
				6,生成grub-install /dev/sda(重做MBR分区)
				7,写grub.conf文件
			centos7:
				1,进入BIOS界面,设置光盘启动,进入救援模式
				2,挂载光盘,并强制安装内核
				3,安装完成之后,制作grub配置文件grub2-install /dev/sda(重做MBR分区)
				4,用 grub2-mkconfig -o /boot/grub2/grub.cfg 生成grub.cfg文件
				5,重启电脑
grub加密(6,7上的加密方式不一样)
	6上加密:
		在grub.conf的配置文件中加入password这一行,后面跟上对应的密码
			明文:
				直接输入密码
			密文:
				grub-md5-crypt生成密码串
				加入配置文件password --md5 密码串(输入a进入单用户模式改密码)
	7上加密:
		明文:
			在/etc/grub.d/00_header中加入如下几行
			cat << EOF
			set superusers='admin'
			password admin qwe123
			E0F
		密文:
			用grub2-mkpasswd-pbkdf2生成密文
			把密文写入到配置文件之中
			g重新生成配置文件:grub2-mkconfig  -o  /boot/grub2/grub.cfg

制作小型的linux系统:

必须要有的分区:boot分区,根分区

拿到独立的磁盘,进行分区,分区之后创建文件系统

把创建分系统挂载到系统的目录上,并用相应的命令用grub-install生成boot下必须要的文
件(生成完成后需要检查一下boot下的文件是否存在)

书写grub.conf配置文件在centos6上要手动输入,在centos7上可以用grub2-mkconfig生成对
应的文件

把根目录挂载对应的目录下,并创建常用文件夹,并且复制一些常用命令对应的动态链接库
文件,并复制网卡的驱动模块(modeinfo查看驱动的位置,ethtool -i 查看网卡驱动insmod可
以加载网卡模块)

切换根目录,检查是否成功,成功后即可移植此磁盘到别的电脑中

创建一台新的虚拟机把对应的磁盘加入到虚拟机之中,然后开启虚拟机,并加载网卡驱动
	
注:
	使新制作的系统有网络功能:
	查看网卡的驱动模块:ethtool -i ech0
	查看网卡驱动模块的所在位置,并拷贝到新的磁盘中:modinfo e1000
	启动新的虚拟机,添加网卡驱动模块:insmod e1000
	添加成功后用ifconfig添加网址即可通讯

proc文件夹:

作用:内存中加载的文件吧·

配置文件:/etc/sysctl 配置文件的格式中.代表目录中的/(如路由转发等,以及禁止ping的
功能,在centos6上是写好的文件,在centos7上是空白,需要手动添加)
写完配置文件后,可以用sysctl -p选项可以让配置立即生效,可以用sysctl -a查看当前内存中
生效的配置文件(如果该文件中没有内容,那么需要手动添加)

清除缓存(man proc):
	echo 3 > /proc/sys/vm/drop_caches

内核编译(通常在/boot目录下):

编译方法:和大部分软件的源代码编译的方式差不多,但是内核中有很多的功能,要在生产
中判断有些功能是否启用(内核裁剪),从而加快系统的运行效率

编译过程:
	准备好安装编译环境,以及10G以上内存空间,查看主机的CPU架构,下载好对应的内核
	源码包(www.kernel.org)
	
	.config:准备文本配置文件
	
	make menuconfig:配置内核选项(看哪些功能需要,哪些功能不需要)
	
	make && make install (生成的内核在/lib/modules/生成对应的文件,名字就是内核的版本)	
查看当前生效的内核模块:
	
	lsmod显示由核心已经装载的内核模块(其实是查看/proc/modules文件)
	
	modinfo可以显示所有模块的信息,即使是没有装载的模块都会显示出来
	
	modprobe可以加载相应的模块(模块的配置文件在/etc/modprobe.d/中)
	
	注:insmod也可以加载和卸载模块,不过此命令会有依赖性,所有不常用类似于rpm装软件包。
	    modprobe在加载和卸载内核模块的时候,不会检查驱动的依赖性,类似于装软件的yum

Busybox:

作用:可以用来定制小型的Linux操作系统,比如手机系统,到各种智能的终端设备,它占用
的空间十分小,只需要一个小型的内核和Busybox就可以运行

原理:每个命令都有相应的动态链接库文件,但是这些库文件中有些库文件是相同的,所以
可以利用这个软件对一些启动的动态链接库进行优化,排除掉冗余的库文件,从而来简化系
统的各项功能

编译:
	装一些依赖的软件包
	装完之后下载busybox,解压后进入其中
	make menuconfig 选一些特定的功能
	make && make install   如果出错,执行make clean后,重新执行上面命令 
	mkdir /mnt/sysroot/ 
	cp -a _install/* /mnt/sysroot/ 

检查:切换根目录,看命令是否执行,如果制作小型的linux系统,那么则需要对应的boot分区,以及相应的文件

注:busybox仅支持sh,ash,不支持bash。如果想切换根目录致_install下,需要切换shell,或者把bash命令,以及相关的库文件拷贝到该目录下,即可切换

systemd:

管理启动的软件:可以并行启动一些程序(取出一些程序的依耐性,在Ubantu上也有使用)

systemd启动机制:
	基于socket的激活机制:socket与服务程序分离(有些程序是基于套接字文件启动的程序,
	比如mysql,这个服务启动的时候会打开相应的3306端口,在本地打开MySQL是按照套接
	字文件进行启动,而远程打开则是通过3306端口进行访问) 
	基于d-bus的激活机制
	基于device的激活机制  
	基于path的激活机制 

优点:可以同时启动多个应用服务,启动成功没有任何提示,启动不成功会报错
缺点:不止任何的扩展,但是在6上面可以支持定义的一些启动项