系统启动和内核

系统启动和内核

引导文件

bootloader: 加载引导器,引导程序
Linux中的bootloader: grub,Centos7以后使用grub2

引导文件:
   /boot/grub/grub.conf
	  centos6 : grub  
         
	  centos7以后 :grub2

Linux启动流程

1.开机BIOS加电自检,加载硬盘
2.读取MBR,MBR引导加载程序(grub)启动信息
3.grub引导菜单(Boot Loader)
4.加载内核kernel
5.启动init进程,依据inittab文件设定运行级别
6.init进程,执行rc.sysinit文件
7.启动内核模块,执行不同级别的脚本程序
8.执行/etc/rc.d/rc.local
9.启动mingetty,进入系统登陆界面

linux系统安装时,如果要想设置开启启动项,可以:
开机到BIOS提醒界面,按键F11(Dell服务器的做法)进入BIOS设置BOOT MENU,继而设置启动项:硬盘HD启动,光盘CD/DVD启动,还是U盘USB启动。

Centos6启动与init进程

init配置文件 /etc/inittab
init运行级别:
	0 关机 1 单用户(维护系统使用) 3 最小化模式 5 图形界面 6 重新启动
	
who -r 查看当前级别

#手动启动服务:
service httpd start 
              stop 
              restart

#开机自动启动服务:
chkconfig
	       --list 查看所有开机自启服务
	       --list httpd 查看httpd服务状态
	       --add httpd  添加httpd服务
	       --del httpd  删除httpd服务	

删除centos6 破坏硬盘前446个字节(第1、1.5阶段)并恢复

#hexdump -C -n 512 /dev/sda  查看硬盘512字节
#dd if=/dev/zero of=/dev/sda bs=1 count=446    破坏
	光盘启动
	1, Rescue installed system 开机时按ESC进入救援模式,选择语言
网卡(no)、继续、ok、等
    2,chroot /mnt/sysimage/  切换到硬盘的根
    3,grub-install /dev/sda
    4,sync 同步
    5,hexdump -C -n 512 /dev/sda  查看硬盘512字节
    6,exit
    按ctrl+alt+delete 三个键重新启动

删除centos6 /etc/fstab和/boot下所有文件,破坏硬盘前446个字节。并恢复

#hexdump -C -n 512/dev/sda  查看硬盘512字节
rm -rf /boot/* && rm -rf /etc/fstab         #破坏
dd if=/dev/zero of=/dev/sda bs=1 count=446  #破坏

	1, Rescure installed system 开机时按ESC进入救援模式,选择语言
网卡(no)、继续、ok、等
	2, df -Th && blkid 查看分区
	3, mkdir /mnt/d{1..4} 创建多个挂载文件夹
	4, mount /dev/sda* /mnt/d* 将多个分区分别对应挂载
	5, ls /mnt/d2 确定d2是否为根分区
	6, df -Th && blkid 查看分区和对应的文件系统
	7, cat > /mnt/d2/etc/fstab <<EOF 写入对应的自动挂载
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /data ext4 defaults 0 0
/dev/sda5 swap swap defaults 0 0
EOF
	8, sync 同步
	9, exit 退出 再次进入救援模式
	10, chroot /mnt/sysimage/ 切换至根目录
	11, mount /dev/sr0 /mnt 挂载光盘
	12, df -Th 查看是否成功挂载
	13, rpm -ivh /mnt/Packages/kernel-... --force 生成/boot下内核程序
	14, grub-install /dev/sda 生成grub启动程序并且修复被破坏的硬盘文件
	15, vi /boot/grub/grub.conf 写入启动菜单引导
timeout=10
title linux
kernel /vmlinuz-2.6.32-754.el6.x86_64 root=/dev/sda2
initrd /initramfs-2.6.32-754.el6.x86_64.img
	16, exit 退出 选择reboot重启即可

自制linux系统

1,echo ' - - - ' > /sys/class/scsi_host/host{0..*}/scan #扫描出硬盘
2,fdisk /dev/sdb  #分区sdb1对应/boot sdb2对应/
3,mkfs.ext4 /dev/sdb1
4,mkfs.ext4 /dev/sdb2
5,mkdir /mnt/boot
6,mount /dev/sdb1 /mnt/boot
7,grub-install /dev/sdb
8,mkdir /mnt/cdrom
9,mount /dev/sr0 /mnt/cdrom
10,rpm -ivh /mnt/cdrom/Packages/kernel-... --force #生成/boot下内核程序
11, vim /mnt/boot/grub/grub.conf
	title linux
	root (hd0,0)
	kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sdb2 selinux=0 init=/bin/bash
	initrd /initramfs-2.6.32-642.el6.x86_64.img
	chroot /mnt/sysroot
12, mkdir /mnt/sysroot
13, mount /dev/sdb2 /mnt/sysroot

**busybox **

集成了多个命令的小工具包

使用:
busybox ls
编译安装成功后,会创建一个install文件,文件中包括生成了所有命令的软链
接
#编译安装busybox
1,yum install gcc gcc-c++ glibc glibc-devel make pcre pcredevel
openssl openssl-devel systemd-devel zlib-devel glibc-static ncurses-devel -y
2,wget https://busybox.net/downloads/busybox-1.30.1.tar.bz2
3,tar xvf busybox-1.31.0.tar.bz2
4,cd busybox-1.31.0/
5,make menuconfig    #按下面选择,把busybox编译也静态二进制、不用共享库:Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs)
6,make && make install  # 如果出错,执行make clean后,重新执行上面命令
7,mkdir /mnt/sysroot/
8,cp -a _install/* /mnt/sysroot/

centos7启动

centos7以后版本,不在使用init进程,而是使用systemd进程
负责在系统启动或运行时,激活服务器进程和其它进程

#systemd新特性
 1,系统启动和服务器进程管理器
 2,系统引导时实现服务并行启动
 3,按需启动进程
 4,自动化的服务依赖管理
 5,socket和service相分离

systemd核心概念:unit

unit类型

systemctl –t help 查看
类型:
	service 对外提供服务程序
	socket 负责监听端口,按需启动
	target 开机运行级别

systemctl 服务管理命令

启动:     systemctl start httpd.service(service可以省略不写)
停止:     systemctl stop httpd
重新启动: systemctl restart httpd
重新生效文件: systemctl reload httpd
查看状态:    systemctl status httpd
设置开机启动: systemctl enable httpd
设置开机禁止启动: systemctl disable httpd

**运行级别 **

target 相当于centos6之前的runlevel

级别配置文件:ll /usr/lib/systemd/system/*.target
级别切换: systemctl isolate *.target
		 init *
查看默认运行级别: systemctl get-default
修改默认运行级别: systemctl set-default *.target
切换至救援模式: systemctl rescue

破解centos7的root密码

#方法一:
1,开机选择中按e键找到linux的行 加上内核参数rd.break
2,Ctrl -x 键进入救援模式
3,mount 查看硬盘根挂载,是否为只读,如果是执行下一步
4,mount -o remount,rw /dev/sda2 /sysroot
5,chroot /sysroot
6,passwd root
7,touch /.autorelabel #selinux打开时必须执行这一步,没有打开不需要执行
8,exit
9,reboot

#方法二:
启动时任意键暂停启动
按e键进入编辑模式
将光标移动1inux开始的行,改为rw ini t=/sysroot/bin/sh
按ctr1 -x启动
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /. autorelabel

exit
reboot

centos7、8删除/boot/grub2/*所有内容,并恢复

#hexdump -C -n 512 /dev/sda  查看硬盘512字节
#dd if=/dev/zero of=/dev/sda bs=1 count=446    破坏
	光盘启动
	1, Rescue installed system 开机时按ESC进入救援模式,选择语言
网卡(no)、继续、ok、等
    2,chroot /mnt/sysimage/  切换到硬盘的根
    3,grub2-install /dev/sda
    4,grub2-mkconfig -o /boot/grub2/grub.cfg
    5,sync 同步
    6,exit
    按ctrl+alt+delete 三个键重新启动

删除centos7 /boot下所有文件,并恢复

1, 进入光盘启动模式安装grub2,选择:Troubleshooting,进入救援模式
#特别说明: Centos8 必须先grub,再安装kernel,否则安装kerne1-core时会提示grub出错
2,chroot /mnt/sysimage
3, grub2-install /dev/sda
4, mount /dev/sr0 /mnt
5, 安装kernel
    #centos7
 rpm -ivh /mnt/Packges/kernel-3.10.0-1062.e17.x86_64.rpm --force
 
   #centos8
 rpm -ivh /mnt/Baseos/Packges/kernel-core-4.18.0-147.e18.x86_64.rpm --force 
6,grub2-mkconfig -o  /boot/grub2/grub.cfg   #生成grub2.cfg文件
7,sync
8,exit #退出重启

Linux内核与优化

kernel 内核核心 vmlinuz文件
proc 内核参数文件
不占用磁盘空间,存在于内存中,重启后失效
uname 命令
	  -a 查看内核所有信息
	  -r 显示版本
	  -n 即主机名
lscpu 查看CPU状态
lsusb 查看usb设备
lspci 查看pci设备
内核启动启用或禁用特性的文件: /boot/config...
	y:特性集成于内核文件vmlinuz中
	m:特性以驱动模块方式集成于/lib/modules中
	not set 禁用此特性

内核参数优化

内核参数配置文件: /etc/sysctl.conf 实现永久生效
  格式: net.ipv4.ip_forward = 1
net.ipv4.ip_forward  =  /proc/sys/net/ipv4/ip_forward

sysctl   命令用于查看和修改内核参数
	  -a 查看所有生效参数,/proc/sys下的所有设置
	  -w 临时修改参数
	  -p 参数生效
	  
/proc/sys/
vm.swappiness         #内存剩下多少时启用swap分区
net.ipv4.ip_forward   #1实现转发数据报文功能
net.ipv4.tcp_max_syn_backlog   #未完成连接队列大小,等待连接的网络连接数,建议16384
net.core.somaxconn         #已完成连接队列大小,同时发起的tcp的最大连接数,建议16384
net.ipv4.tcp_retries1      #TCP最少执行的重传次数,默认值是3
net.ipv4.tcp_retries2      #TCP最多可以执行的重传次数,默认值15
net.ipv4.tcp_fin_timeout  #本端要求关闭,保持在FIN-WAIT-2状态的时间,默认60,建议2
net.ipv4.tcp_tw_reuse     #1实现允许将tcp连接关闭后 socket重新用于新的TCP连接
net.ipv4.tcp_tw_recycle   #1实现开启TCP连接中TIME-WAITsockets的快速回收。
net.ipv4.tcp_keepalive_time #当keepalive启用时,TCP发送keepalive的频度,建议600
net.ipv4.ip_local_port_range  #允许打开的端口范围,建议200065000
net.ipv4.tcp_syncookies       #1开启可防范少量SYN洪水攻击
net.ipv4.tcp_syn_retries      #内核放弃建立连接之前发送SYN包的数量,默认6,建议1
net.ipv4.tcp_synack_retries   #内核放弃连接之前发送SYN+ACK包的数量,默认5,建议1

内核驱动模块

驱动模块是动态加载,也称为按需加载
lsmod 		目前加载的内核驱动模块
modinfo 	查看模块详细信息
modprobe 	加载内核模块
rmmod 		卸载内核模块

编译安装内核

1,yum install gcc make ncurses-devel flex bison openssl-devel elfutils- libelf-devel -y   编译安装准备
2,cd /usr/src/
3,wget ... 下载内核文件 (kernel.org网站中)
4,tar xf linux... 解包
5,cd linux...进入目录
6,cp /boot/config... ./.config 复制config文件
7,vim .config 修改文件并启用特性
#CONFIG_MODULE_SIG is not set
	CONFIG_SYSTEM_TRUSTED_KEYS=""
#CONFIG_DEBUG_INFO is not set

8,make -j 4
9,make modules_install
10,make install
11,reboot

卸载内核

删除/lib/modules/目录下不需要的内核库文件
删除/usr/src/linux/目录下不需要的内核源码
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表
上一篇:a^b快速幂


下一篇:[转载][新手教程] 【小白教程】第一期:谁动了我的Grub?——Grub 修复