系统启动和内核
引导文件
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的配置文件,删除不需要的内核启动列表