第八周知识总结

                      系统启动和内核管理

 

一.CentOS 6 的启动管理 

1. 加载BIOS的硬件信息,获取第一个启动设备

2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息

3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

4. 核心执行init程序,并获取默认的运行信息

5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统

6. 启动核心的外挂模块

7. init执行运行的各个批处理文件(scripts)

8. init执行/etc/rc.d/rc.local

9. 执行/bin/login程序,等待用户登录

10. 登录之后开始以Shell控制主机

 

Grub:分散在硬盘的不同空间:有的是以0101存在,有的是以文件形式

放在/boot/grub目录下以及MBR前446个字节

1.3.2.1 grub 功能和组成

Centos6 Grub的三次阶段:

第一阶段stage1:MBR前446个字节

Stage1.5阶段:加载第二阶段所在分区的文件系统 initramfs加载操作系统的根

提供根分区的驱动

第二阶段stage2:放在/boot/grub/grub.conf里,记录到内核的路径,

此文件不属于任何包。安装操作系统运行程序生成,grub实际上是联系内核和硬件之间的桥梁

通过记录的路径找到内核,通过安装anaconda(安装向导)生成

Default=0(0指的是第一个内核,系统里面可以允许多个内核存在,1是指第二个内核)

Timeout=5是在启动时有五秒钟选择用哪个内核  

splashimage=(hd0,0)/grub/splash.xpm.gz是个背景图片

hiddenmenu在启动时默认隐藏内核菜单,删掉则会显示

itle CentOS 6 (2.6.32-754.el6.x86_64内核版本

vmlinuz-2.6.32-754.el6.x86_64 内核路径

root (hd0,0)第一个硬盘的第一个分区grub特殊描述方式相当于sda1,grub认为boot所在分区为根

initrd /initramfs-2.6.32-754.el6.x86_64.img内核驱动文件放在这里,是个小型的linux系统的根

该文件是个gizp压缩文件

需要解包的话使用gunzip命令,先修改文件后缀,解开之后是cpio格式,使用cpio-iv解开

 

 

root=UUID=bf543639-6204-42d7-a73a-1bc51032b951硬盘真正操作系统的根

Grub.Conf文件无法修复,只能手动写

范例:误删除initramfs-2.6.32-754.el6.x86_64.img文件无法启动,故障恢复

[root@centos6 ~]#rm -f /boot/initramfs-2.6.32-754.el6.x86_64.img

[root@centos6 ~]#reboot

#进入rescue模式

#chroot /mnt/sysimage

#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

#sync

#exit

#exit

#reboot

 

范例:破坏内核

误删除内核文件/boot/vmlinuz-2.6.32-754.el6.x86_64无法启动,故障恢复

光盘里面就有内核包 ,可以重新装内核包,但是因为一个文件损坏重装有些麻烦

光盘里面isolinux文件下有vmlinuz内核包

 

[root@centos6 ~]#rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64

[root@centos6 ~]#reboot

#进入rescue模式

#chroot /mnt/sysimage

#mount /dev/sr0 /mnt/

#cp /mnt/isolinux/vmlinuz /boot/vmlinuz-2.6.32-754.el6.x86_64

#sync

#exit

#reboot

 

一阶段损坏 启动失败 系统认为硬盘不具有启动功能

修复方法1:重新安装

重启 快速按esc键 进入第三项CD-ROM Drive 光盘启动

进入rescue installd system 救援模式

语言默认

Setup netwoking NO

Rescue continue

Ok

硬盘的根实际上被挂到/mnt/sysimage下

chroot /mnt/sysimage 切根

grub-install /dev/sda 重新安装

Sync 进行同步

Reboot重启ctrl alt+delete

 

修复方法2:

使用grub修复所有阶段

root (hdo,0)表示第一个硬盘的第一个分区

root (hd0,0)

Set up(hd0)

修复完毕

实际上修复的所有阶段

 

 

 

 

1.5阶段损坏:破坏27个扇区,系统认为具有启动功能但是进去之后找不到驱动,界面闪烁

 

 

修复:

光盘启动,进入rescue模式

#chroot /mnt/sysimage

#grub-install /dev/sda

#sync

#按 ctrl+alt+delete 三个键重启动

 

 

加载init

关掉快捷键ctrl+delete+alt 重启:

vim /etc/init/control-alt-delete.conf

在这一行前面加上#注释掉exec /sbin/shutdown -r now "Control-Alt-Delete pressed"

 

 

 

 

1.3.4INIT初始化

 

Runlevel:即运行级别,可以定义在不同模式下服务是否启动,不同模式就是服务开启的不一样

 

/etc/rc.d/rc 控制服务脚本的开机自动运行的服务

/etc/rc.d放的是7种模式rc服务脚本以及服务软链接

说明:rc N --> 意味着读取/etc/rc.d/rcN.d/

K: K####运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S: S####运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

两个服务1 2 先开的是S1 后开的是S2 那么关的时候则是S2先关 变成K1 ,S1变成K2

如果两者有依赖关系 那么是S2依赖S1,先开的服务被依赖,先关的服务依赖于别人

 

范例:修改Satd95为关闭状态:S95atd实际上是文件/init.d/atd的软链接

删除S95atd,打开/etc/init.d/atd 查看chkconfig 95是S的编号,变成K则是5

然后ln -s ..init.d/K05atd

下次开机atd则不启动

结束

 

 

 

 

 

 

 

 

 

 

 

 

 

切换在centos6中想再次启动除了以上方法之外还以可以:

方法一:

也可以使用ntsysv命令进入界面,找到atd空格就可以,但是缺点在第三模式下只能改一种模式的atd,如果想改5模式的atd 需要使用ntsysv --level=5

方法二:

使用chkconfig命令

chkconfig --list 查看全部服务在0-6模式中是否开启一目连然

Chkconfig --level 34 atd off 直接把3和4模式下atd服务全部关闭

Chkconfig atd on 直接默认把2-5模式全部打开atd,即我们生产中主流模式

chkconfig --list [name]#查看单个服务在所有级别的启动或关闭设定情形

 

 

1.3.4.2 初始化脚本 sysinit 以及服务管理

这些服务真正的脚本在/etc/init.d中

如果我们开发一个软件希望下次开机启动或者自己写一个启动脚本

需要再这个目录下写一个启动脚本,格式如下:需要支持一些参数,如start, stop等

可以参考atd的脚本:

345是在什么模式启动,95是开机启动的序号S,5是开机不启动的编号k

Description是写的对脚本的描述

下面是支持的参数

 

 

 

自己编的服务开机启动一般依赖别人,所以应该用数字比较大的,比的顺序是从开头往后按大小比

但是不不能用100这样的反而会排在前面,应该用9开头的如:S99,964

建立一个自己的服务脚本:touch testservice  -是默认全是off 99是S 3是K,

编写一个这样的脚本:

 

要在 /etc/init.d目录下vim testservice

#!/bin/bash

# chkconfig :- 98 3 (:一定要有不然不符合格式)

# description: test service 脚本描述

.  /etc/init.d/functions 调用函数库

start (){

     touch /var/lock/subsys/testsrv建立起启动文件

action "Starting testservice:" 开机启动

}

stop (){

    rm  touch /var/lock/subsys/testsrv 删除启动文件

    action "Stopping testservice:"

}

status(){ 判断状态

if [ -f /var/lock/subsys/testsrv ] ;then

echo  "testservice is running..." 如果这个文件存在就认为服务启动打印测试服务在运行 加上-f即使这个文件不存在也不会报错

 

 

    else

       echo "testservice is stopped"此文件不存在就停止

    fi

}

 

case $1 in参数$1如果是这下面那个参数就执行哪个操作

start)

    start

    ;;

stop)

    stop

    ;;

restart)

    restart

    ;;

status)

    status

    ;;

*)

    echo "Usage : /etc/init.d/testservice {start|stop|status|restart}"

Esac 如果是其他的就打印这些

 

最后加到服务列表里开机自动启动:

实际上是在/etc/rc.d里面生成软链接

Chkconfig --add testservice加入到服务列表里

但是加进去之后再七种模式里面全都是off 因为在chkconfig里面我们写的是—

修改一下:

Chkconfig  testservice on(直接2-5模式下都开启)

软链接建立成功

 

 

 

 

1.3.服务管理:

service 命令:手动管理服务

service 服务 start|stop|restart

service --status-all

/etc/rc.d/rc 控制服务脚本的开机自动运行 :

for srv in /etc/rc.d/rcN.d/K*; do

$srv stop

done

for srv in /etc/rc.d/rcN.d/S*; do

$srv start

Done

说明:rc N --> 意味着读取/etc/rc.d/rcN.d/

K: K####运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S: S####运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

配置服务开机启动

chkconfifig命令

ntsysv命令

chkconfifig 命令管理服务

#查看服务在所有级别的启动或关闭设定情形:

chkconfig [--list] [name]

#添加服务

SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)

#!/bin/bash

chkconfig: LLLL nn nn  #LLLL 表示初始在哪个级别下启动,-表示都不启动

description : 描述信息

chkconfig --add name

 

#删除服务

chkconfig --del name

#修改指定的运行级别

chkconfig [--level levels] name <on|off|reset>

说明:--level LLLL: 指定要设置的级别;省略时表示2345

特殊故障:某个服务没起来  导致重启起不来

在启动界面输a 1进入单用户界面 将起不来的服务临时关闭

就可以进入3模式或者5模式了 ,进去之后再进去排错

完成要比完美更重要

 

1.3.4.4 非独立服务

服务分为独立服务和非独立服务

瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,

依赖于xinetd的服务也称为非独立服务

 

进入的请求首先被xinetd代理作为值班人员

 xinted可以帮我们监控服务,在有人访问的时候提醒开启,实际上工作的还是详细服务。可以节省资源。

想把有人访问的服务唤醒

要在配置文件中用交互式方法把off改成o把disable=yes改成no即可:

/etc/xinetd.conf

/etc/xinetd.d/<service>

或者用用chkconfifig控制非独立服务开机启动 (实际上也是把yes改成no)

示例:chkconfifig telent on

centos系列刚装上的服务不会立即启动,默认需要手动启动

Ubuntu上会默认把装上的服务启动

1.3.4.5 开机启动文件 rc.local

rc.local比较特殊,排在99以及别的服务都在init。d下,他就是单独的rc.Local,在他下面只有2-5模式,如果一个服务想开机就会启动

一是写配置文件格式

二是扔到rc.local里面,只要扔到这个文件里开机就会启动

只要扔到这个文件,让系统能找的到路径,加过执行权限 开机就会启动

脚本不需要写config以及描述 参数之类的 开机就可以启动

缺点是放在rc.local里面是不能用service控制的

默认找的路径是/etc/init.d目录下的脚本

centos6上rc。Local默认是有执行权限的,在7上没有

 

 

/etc/rc.d/rc.local

注意:正常级别下,最后启动一个服务S99loca l没有链接至/etc/rc.d/init.d一个服务脚本,而是指向 了/etc/rc.d/rc.local脚本

不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置 于/etc/rc.d/rc.local文件中

/etc/rc.d/rc.local在指定运行级别脚本后运行

 

 

 

 

 

私人订制linux

一个完整的linux从启动到用户登录用到的部件有:

加电自检

Grub (stage1,1.5,2三个阶段)

内核文件

辅助的rmdisk文件

加载系统中第一个进程,默认是init进程(读取etc的initab文件,rc sys初始化等等脚本)

或者准备个bash

实验具体步骤如下:

1)分区并创建文件系统

centos6上准备一块新硬盘,

分两个必要的分区#分两个必要的分区,

/dev/sdb1对应/boot   /dev/sdb2对应根 /

一个给boot 一个给根用

echo -e 'n\np\n1\n\n+1G\nw\n' | fdisk /dev/sdb (非交互式方法n创建分区\np回车加p接受默认的主分区\n1回车加1回车第一个分区默认值 \n回车然后回车加1G分1个g的空间,然后\nw回车w存盘退出)

 

[root@centos6 ~]#echo -e 'n\np\n2\n\n\n\nw\n' | fdisk /dev/sdb

 

ext4进行格式化

mkfs.ext4 /dev/sdb1

mkfs.ext4 /dev/sdb2 对文件系统进行格式化 之后准备数据

 

2)挂载boot

#子目录必须为boot

mkdir /mnt/boot

对应的是mount /dev/sdb1 /mnt/boot

3)安装grub

[root@centos6 ~]#grub-install --root-directory=/mnt/ /dev/sdb

(默认是放在/dev/sdb /boot,但是我们希望存到mnt/boot,所以需要加上--root-directory对应的是mnt/boot/grub)

4)准备内核和initramfs文件

cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz

cp /boot/initramfs-2.6.32-754.el6.x86_64.img  /mnt/boot/initramfs.img

建立grub.conf

[root@centos6 ~]#vim /mnt/boot/grub/grub.conf

default=0

timeout=6

title wang linux 自定义

root (hd0,0) 根的位置

kernel /vmlinuz  root=/dev/sda2(虽然放到sdb上但是内核路径路径要写到sda上,因为sdb将来要拆下来装到别的电脑上,在别的电脑上这块硬盘就是第一块硬盘,所以启动的时候需要写sda,为了以后用不对应当前)

 selinux=0 init=/bin/bash 启动的时候不是使用init,使用的是bash作为第一个进程,用这种方式把selinux禁用了

initrd /initramfs.img

[root@centos6 ~]#tree /mnt/boot

/mnt/boot

5)准备根下面相关程序和库

[root@centos6 ~]#mkdir /mnt/sysroot 建个文件夹

[root@centos6 ~]#mount /dev/sdb2   /mnt/sysroot 把分区挂上去

[root@centos6 ~]#mkdir –pv

/mnt/sysroot/{boot,dev,sys,proc,etc,lib,lib64,bin,sbin,tmp,var,usr,opt,home,root

,mnt,media}

#复制bash等命令和相关库文件,如:

bash,ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,tree,fdisk

[root@centos6 ~]#

mkdir /mnt/sysroot/{dev,proc,etc,sys,lib,home,root}

#准备网卡驱动

[root@centos6 ~]#ethtool -i eth0

driver: e1000

version: 7.3.21-k8-NAPI

firmware-version:

bus-info: 0000:02:01.0

supports-statistics: yes

supports-test: yes

supports-eeprom-access: yes

supports-register-dump: yes

supports-priv-flags: no

[root@centos6 ~]#modinfo -n e1000

/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko

#cp/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/

[root@centos6 ~]#chroot /mnt/sysroot

6)准备新的虚拟机

将前一虚拟机sdb硬盘对应的vmdk文件增加进去,删除原有磁盘,开机启动

 

 

 

 

 

 

2/proc 目录和内核参数管理

linux启动之后会做一些内核参数的优化,主要集中在/proc目录下,process进程

一些是跟进程有关一些是跟内核参数设置有关

/proc/sys sys是内存中的信息,目录下有和内核有关的诸多参数

存不住 临时生效 也可以使用sysctl -w path.to.parameter=VALUE

命令临时生效 但是这种写法就需要吧/换成.来写:两种方法

 

 

 

 如果想永久保存需要在这些配置文件中书写:

如果放在一个配置文件里比较臃肿,可以根据不同需要放在标红的两个文件中

/etc/sysctl.conf总配置文件

etc/sysctl.d/*.conf (比较推荐的写法)

/run/sysctl.d/*.conf

/

/usr/local/lib/sysctl.d/*.conf

/usr/lib/sysctl.d/*.conf

/lib/sysctl.d/*.conf

/etc/sysctl.conf

 

常用内核参数:可以放在上面的总配置文件或者conf里面写可以(注意/要写成.的形式)

一般情况下下次重启生效,需要立即生效 如果写到总配置文件里不用加文件名,如果写到子配置文件需要加上文件名

使用sysctl -p 加上该文件(指重读),如:

 

cat /proc/sys/net/ipv4/icmp_echo_ignore_all(控制让对方是否能ping通我)

0表示可以ping通 改成1 就不可以了

net.ipv4.ip_forward=1

net.ipv4.ip_nonlocal_bind = 0(socket即ip地址加tcp/udp的端口号,标识处网络中唯一的地址)默认为0没有打开,=1之后是打开

vm.drop_caches 释放缓冲区

fs.file-max = 1020000 系统中最大打开的个数(iPv4存在的个数2^32次方,每个ip有65536个端口,即如果不考虑带宽,服务器可以支持并发量2^32*65536个用户访问,

实际上单台主机远远达不到,需要进行优化

Apache可以接受10k

Nginx可以支持50k

Lvs百万

Haproxy10万)

net.ipv4.icmp_echo_ignore_all =0 代表能ping通 1代表不能

Ulimit -a可以查看记录了每个进程最多打开的文件个数,

以及内核TCP参数优化

net.ipv4.tcp_fin_timeout = 2

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_keepalive_time = 600

net.ipv4.ip_local_port_range = 2000 65000

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_max_tw_buckets = 36000

net.ipv4.route.gc_timeout = 100

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_max_orphans = 16384

net.core.somaxconn = 16384

net.core.netdev_max_backlog = 16384

使用sysctl  -a可以查看当前生效的各种内核参数

3 /sys 目录

/sys目录:

使用sysfs文件系统,为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内

核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性

udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序

专用工具:udevadmin, hotplug

udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d

/usr/lib/udev/rules.d目录下

 

4 内核模块管理和编译

kernel:内核核心,一般为bzImage,通常在/boot目录下

名称为 vmlinuz-VERSION-RELEASE

kernel object:内核对象,一般不是必须有必须用的文件一般放置于 子文件

/lib/modules/VERSION-RELEASE/ (内核版本号)

分门别类放到不同文件

 

 

 

 

 

4.1 内核版本

运行中的内核:

uname命令:

uname - print system information

uname [OPTION]...

-n: 显示节点名称

-r: 显示VERSION-RELEASE

-a:显示所有信息

4.2 内核模块命令

lsmod命令:

显示由核心已经装载的内核模块

显示的内容来自于: /proc/modules文件

[root@centos8 ~]#lsmod

模块名称               大小   使用次数 被哪些模块依赖

Module                Size Used by

uas                    28672  0

usb_storage            73728  1 uas

nls_utf8               16384  0

isofs                  45056  0

#

 

modinfo命令:

功能:管理内核模块

配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf

显示模块的详细描述信息

modinfo [ -k kernel ] [ modulename|filename... ]

常用选项

-n:只显示模块文件路径

-p:显示模块参数

-a:作者

-d:描述

 

装载或卸载内核模块

modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]

会自动解决依赖性,但是模块必须让modprobe找到

modprobe [ -r ] modulename…

Rmmod+模块 删除模块

Insmod +文件路径 需要先用modinfo - n +模块

 

加载模块

 

 

4.3.1.3 内核编译安装实现

使用别人编译安装好的(在课件9.4.3.3.2有升级最新内核,利用elrepo源在centos7安装新版内核)

想使用最新内核 需要手动编译安装,但是一般很少编译,因为最新的不一定能和生产环境匹配,需要做大量测试,升级新内核一般是当前版本出现重大bug或者需要用到一些新功能,比如旧版本没有容器功能docker

编译安装内核准备:

(1) 准备好开发环境

(2) 获取目标主机上硬件设备的相关信息

(3) 获取目标主机系统功能的相关信息,例如:需要启用相应的文件系统

(4) 获取内核源代码包, www.kernel.org

实验:编译安装最新内核版本,并且让新内核支持ntfs

windows里面可以用convert命令把fs系统转化为ntfs系统

 

借助于系统自带的编译参数:放在 ls /boot/下

有个config文件,定义了哪些参数启用,哪些不启用,启用的是放在vmlinuz内核文件中还是放在

/lib/modules中,我们用config文件作为模板在他的的基础上进行微调

 vim /boot/config-4.18.0-147.el8.x86_64

每一个都代表内核的一个功能

y代表集成在内核文件vmlinuz中

m代表集成在lib/modules模块文件中

Config  ACPI xxx is not set 代表不启用,比如ntfs

 

 

 

4.3.1.2 开发环境相关包

先装 依赖包:gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel

4.3.1.3 内核编译安装实现

下载源码文件

准备文本配置文件/boot/config-`uname -r`

  1. make menuconfig:配置内核选项 ,相当于传统编译的./configure 

内核的编译不需要指定路径,参数启用我们拿config文件进行配置

 

2.make [-j #] 合在一起编译或者用以下两步实现:

1)make -j  bzImage 编译内核文件vmlinuz

2)make -j modules 编译模块 /lib/modules

2.安装模块:需要分开安装make modules_install

3.安装内核相关文件:make install

安装bzImage为 /boot/vmlinuz-VERSION-RELEASE

编译安装内核实战案例:下载编译最新内核以及开启ntfs

[root@centos8 ~]#yum -y install gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel bc perl

[root@centos8 ~]#tar xvf linux-5.6.12.tar.xz -C /usr/local/src (习惯性解到src目录)

[root@centos8 ~]#cd /usr/local/src

[root@centos8 src]#cd linux-5.6.12/

[root@centos8 linux-5.6.12]#cp /boot/config- 4.18.0-147.el8.x86_64 .config (把文件复制到当前目录下)

[root@centos8 linux-5.6.12]#vim .config

#修改下面两行,CentOS7无需修改

# CONFIG_MODULE_SIG =y注释掉

CONFIG_SYSTEM_TRUSTED_KEYS="" 删掉引号里面的内容

[root@centos8 linux5.6.12]#make help

[root@centos8 linux5.6.12]#make menuconfig (加载界面进入菜单,找到FILE system 回车进入

找到DOS/FAT/NT 回车进入 找到NTFS file system 用空格选做M,生成一个文件想用加载不想用可以不加载,下面两项也可以选中,然后exit,再次exit回到第一个界面

找到General setup修改内核后面的后缀,进入Local version

手动添加想加的后缀 yanglinux-6.6.6

再次exit,然后yes保存)

[root@centos8 linux5.6.12]#time make -j 2 进入编译

#或者两步实现:make -j 2 bzImage ; make -j 2 modules

[root@centos8 linux]#pwd

/usr/local/src/linux

[root@centos8 linux]#du -sh .

15G .

[root@centos8 linux]#make modules_install

[root@centos8 linux]#ls /lib/modules

4.18.0-147.el8.x86_64  5.6.12-wanglinux-6.6.6

[root@centos8 linux]#du -sh /lib/modules/5.6.12-wanglinux-6.6.6/

3.5G /lib/modules/5.6.12-wanglinux-6.6.6/

[root@centos8 linux]#make install

[root@centos8 linux]#ls /boot

config-4.18.0-147.el8.x86_64

efi

grub2

initramfs-0-rescue-5b85fc7444b240a992c42ce2a9f65db5.img

initramfs-4.18.0-147.el8.x86_64.img

initramfs-4.18.0-147.el8.x86_64kdump.img

initramfs-5.6.12-wanglinux-6.6.6.img

loader

lost+found

System.map

System.map-4.18.0-147.el8.x86_64

System.map-5.6.12-wanglinux-6.6.6

[root@centos8 ~]#ls /boot/loader/entries/

5b85fc7444b240a992c42ce2a9f65db5-0-rescue.conf

5b85fc7444b240a992c42ce2a9f65db5-4.18.0-147.el8.x86_64.conf

5b85fc7444b240a992c42ce2a9f65db5-5.6.12-wanglinux-6.6.6.conf

[root@centos8~]#cat/boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-

5.6.12-wanglinux-6.6.6.conf

title CentOS Linux (5.6.12-wanglinux-6.6.6) 8 (Core)

version 5.6.12-wanglinux-6.6.6

linux /vmlinuz-5.6.12-wanglinux-6.6.6

initrd /initramfs-5.6.12-wanglinux-6.6.6.img $tuned_initrd

options $kernelopts $tuned_params

id centos-20200513060531-5.6.12-wanglinux-6.6.6

grub_users $grub_users

grub_arg --unrestricted

grub_class kernel

[root@centos8 ~]#reboot

[root@centos8 ~]#uname -r

5.6.12-wanglinux-6.6.6

 

......

 

编辑grub的配置文件

Centos6往后的版本grub信息放到/boot/grub2里面了,centos6的grub。Conf文件变成了grub。Cfg文件,而且内容很多有182行,已经不推荐大家手写,自动生成

 

4.3.1.4 内核编译说明

1. 配置内核选项

支持“更新”模式进行配置:make help

(a) make config:基于命令行以遍历的方式配置内核中可配置的每个选项,大量使用直接敲命令

(b) make menuconfig:基于curses图形的文本窗口界面,修改少量配置使用 搜索替代

(c) make gconfig:基于GTK (GNOME)环境窗口界面 默认带的是GNome库

(d) make xconfig:基于QT(KDE)环境的窗口界面

支持“全新配置”模式进行配置 (自定义)

(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置

(b) make allyesconfig: 所有选项均回答为“yes“

(c) make allnoconfifig: 所有选项均回答为“no‘’

2. 编译内核

全编译:

make [-j #]

编译内核的一部分功能:

(a) 只编译某子目录中的相关代码

cd /usr/src/linux; make dir/

 

 

交叉编译一般用不到

 

 

 

Busybox

定制小型的Linux操作系统:linux内核+busybox

Busy可以配个docker使用,在centos8上可以安装docker

实际上此处安装的docker是假docker 其实是padman

 

busybox的使用有三种写法:

1.busybox后直接跟命令,如 ./busybox ls

 

2.直接将busybox重命名,如 cp busybox tar,但是用一百个工具需要拷贝一百次,很麻烦

3.创建符号链接,如 ./ln -s busybox rm 需要写相对路径,推荐使用

但是也是很麻烦,

 

busybox的安装

3以上方法中,第三种方法最方便,但为busybox中每个命令都创建一个软链接,相当费事,但是busybox提供自动方法:busybox编译成功后,执行make install,则会产生一个_install目录,其中包含了busybox

及每个命令的软链接 ,可以把busybox拷贝到其他主机上,如果不妨到path变量里就需要写路径或者放进U盘携带

 

编译Busybox

5.3 busybox编译安装

busybox 的编译过程与Linux内核的编译类似

 

centos7上:

[root@centos7 ~]#yum -y install   gcc gcc-c++ glibc glibc-devel make pcre pcre

devel openssl openssl-devel systemd-devel zlib-devel glibc-static ncurses-devel

[root@centos7 ~]#wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2

[root@centos7 ~]#tar xvf busybox-1.31.1.tar.bz2

[root@centos7 ~]#cd busybox-1.31.1/

[root@centos7 busybox-1.31.1]#make menuconfig #按下面选择,把busybox编译也静态二进制,把程序和二进制文件放在一起、不用共享库:Settings -->Build Options -->[*] Build static binary (no shared

libs)

[root@centos7 busybox-1.31.1]#make #如果出错,执行make clean后,重新执行上面命令

[root@centos7 busybox-1.31.1]#ls

[root@centos7 busybox-1.31.1]#make install

[root@centos7 busybox-1.31.1]#pwd

/root/busybox-1.31.1

[root@centos7 busybox-1.31.1]#ls

applets                 debianutils loginutils             

qemu_multiarch_testing

applets_sh             docs         mailutils               README

arch                   e2fsprogs   Makefile               runit

archival               editors     Makefile.custom         scripts

AUTHORS                 examples     Makefile.flags         selinux

busybox                 findutils   Makefile.help           shellbusybox.links           include     make_single_applets.sh

size_single_applets.sh

busybox_unstripped     init         miscutils               sysklogd

busybox_unstripped.map _install     modutils               testsuite

busybox_unstripped.out INSTALL     networking             TODO

Config.in               klibc-utils NOFORK_NOEXEC.lst       TODO_unicode

configs                 libbb       NOFORK_NOEXEC.sh       util-linux

console-tools           libpwdgrp   printutils

coreutils               LICENSE     procps

[root@centos7 busybox-1.31.1]#ll busybox -h

-rwxr-xr-x 1 root root 2.6M May 13 14:46 busybox

[root@centos7 busybox-1.31.1]scp busybox 10.0.0.88:/data/

可以拷贝到其他主机上使用

 

 

 

[root@centos7 busybox-1.31.1]#ls _install/

bin linuxrc sbin usr

[root@centos7 busybox-1.31.1]#ls _install/bin

arch     dd             grep     login       netstat       rmdir         tar

ash       df             gunzip   ls         nice           rpm           

touch

base64   dmesg         gzip     lsattr     nuke           run-parts     true

busybox   dnsdomainname hostname lzop       pidof         scriptreplay

umount

cat       dumpkmap       hush     makemime   ping           sed           

uname

chattr   echo           ionice   mkdir       ping6         setarch       

usleep

chgrp     ed             iostat   mknod       pipe_progress setpriv       vi

chmod     egrep         ipcalc   mktemp     printenv       setserial     

watch

chown     false         kbd_mode more       ps             sh           zcat

conspy   fatattr       kill     mount       pwd           sleep

cp       fdflush       link     mountpoint reformime     stat

cpio     fgrep         linux32   mpstat     resume         stty

cttyhack fsync         linux64   mt         rev           su

date     getopt         ln       mv         rm             sync

[root@centos7 busybox-1.31.1]#find _install/ -type l |wc -l

396

[root@centos7 busybox-1.31.1]#du -sh _install/ 

2.6M _install/

[root@centos7 busybox-1.31.1]#mkdir /mnt/sysroot/

[root@centos7 busybox-1.31.1]#cp -a _install/* /mnt/sysroot/

 

 

 

 

 

 

 

6 systemd

6.1 systemd 特性

Centos5以前使用sysv 程序必须顺序启动

Centos6使用upstart 有依赖关系的顺序,没有依赖关系的可以顺序启动

Centos7使用systemd可以并行启动,表面上并行启动实际上可能没有启动,有需要才启动,centos6以后的版本都会自动解决依赖性,安装或者删除依赖包,自动启动依赖服务

使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务, systemctl无法与之通信和控制,可以替代xinted,监听端口的是systemd

系统引导时实现服务并行启动

按需启动守护进程

自动化的服务依赖关系管理

同时采用socket式与D-Bus总线式激活服务

socket与服务程序分离 service对应的是二进制进程,socket对应的是端口号ip地址

向后兼容sysv init脚本

使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,

systemctl无法与之通信和控制

系统状态快照

 

 

 

systemd核心概念:unit资源 :

unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听

socket、保存的系统快照以及其它与init相关的信息

#查看unit类型

[root@centos8 ~]#systemctl -t help

 

service unit: 文件扩展名为.service, 用于定义系统服务

Socket unit: .socket, 定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现 按需启动

Target unit: 文件扩展名为.target,用于模拟实现运行级别 红色表示常用

Device unit: .device, 用于定义内核识别的设备

Mount unit: .mount, 定义文件系统挂载点

Snapshot unit: .snapshot, 管理系统快照

Swap unit: .swap, 用于标识swap设备

Automount unit: .automount,文件系统的自动挂载点

Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激

活服务,如:spool 目录

 

Unit的配置文件:

/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/    centos7上/lib跟/usr/lib是同一个,是软链接的关系

/lib/systemd/system: ubutun的对应目录

/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行

一般不关注

/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行,也是命令自动生成的,不需要手动修改

 

 

systemctl管理系统服务service unit

centos6相比好处在于 命令是把服务service是放在后面的,可以同时启动多个服务,启动成功无提示,只有失败才会提示,且就算把ssh服务停了,但是处于连接中的ssh服务不会突然断掉

centos6是放在中间,启动成功有提示

systemctl COMMAND name.service

#启动:相当于service name start

systemctl start name.service   

#停止:相当于service name stop

systemctl stop name.service

#重启:相当于service name restart

systemctl restart name.service

#查看状态:相当于service name status

systemctl status name.service

#禁止自动和手动启动:

systemctl mask name.service 在centos7.8上新增的mask功能

手动无法启用,可以有效避免误启动,只有使用下面取消禁止的命令才可以启动

 

#取消禁止

systemctl unmask name.service

#查看某服务当前激活与否的状态:

systemctl is-active name.service

active,否inactive

查看所有已经激活的服务:

systemctl list-units --type|-t service

#查看所有服务:

systemctl list-units --type service --all|-a

#设定某服务开机自启,相当于chkconfig name on

systemctl enable name.service

 

#设定某服务开机禁止启动:相当于chkconfig name off

systemctl disable name.service

#查看所有服务的开机自启状态,相当于chkconfig --list

systemctl list-unit-files --type service

服务状态

 

#用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name

ls /etc/systemd/system/*.wants/name.service

#查看服务是否开机自启:

systemctl is-enabled name.service

enable。否disable

 

 

 

 

#列出失败的服务

systemctl --failed --type=service

 

#开机并立即启动或停止

systemctl enable --now postfix =systemctl enable postfix,加上start立即开启且开机开启

systemctl disable  --now postfix 立即关闭且开机不启动

#查看服务的依赖关系:

systemctl list-dependencies name.service

 

#杀掉进程:

systemctl kill unitname

 

 

6.3 service unit文件格式

 

centos7以及以后的版本,如果自己写个软件编译安装一个脚本,对应的服务是在service文件,而不是initab脚本,如果编译安装之后系统没有提供service文件需要我们自己去写

Service文件在cd /lib/systemd/system路径下

atd.service为例,里面就写了atd服务相关的文件一共三项文件格式如下:

1)Unit:单元,写的是unit描述信息

以及after依赖关系,在这些资源之后运行的,也就是说想使用atd。Service需要先准备好这些资源

修改配置文件之后需要使用systemctl daemon-reload命令同步,

2) Service或者socket和资源有关,EXECSTart这一项本质上就是我们执行systemctl start atd.service时执行的命令,$OPTS这个变量定义的路径就是在EnviomentFile这一项的路径里面,即/etc/sysconfig/atd里面

IGnoresigpipe是是否支持信号

3)Install是加载到系统中是否生效,如果没有install说明只是扔到磁盘里面不起作用

Wantby是弱依赖 ,即被这些服务所依赖,这些资源想启动就要先启动atd

 

 

 

 

 

unit 格式说明:

以 “#” 开头的行后面的内容会被认为是注释

相关布尔值,1、yes、on、true 都是开启,0、no、offff、false 都是关闭

时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

service unit fifile文件通常由三部分组成:

[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等

[Service]:与特定类型相关的专用选项;此处为Service类型

[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到

的一些选项

Unit段的常用选项:

Description:描述信息

After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反

Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活

Wants:依赖到的其它units,弱依赖

Conflflicts:定义units间的冲突关

Service段的常用选项:

Type:定义影响ExecStart及相关参数的功能的unit进程启动类型

simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中

forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服

务。原生父程序在启动结束后就会终止

oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中

dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.

此通常也要同时设定BusNname= 才行

notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消

idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这

类的daemon通常是开机到最后才执行即可的服务 

EnvironmentFile:环境配置文件

ExecStart:指明启动unit要运行命令或脚本的绝对路径

ExecStartPre: ExecStart前运行

ExecStartPost: ExecStart后运行

ExecStop:指明停止unit要运行的命令或脚本

Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务

PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/

目录

Install段的常用选项:

Alias:别名,可使用systemctl command Alias.service

RequiredBy:被哪些units所依赖,强依赖

WantedBy:被哪些units所依赖,弱依赖

Also:安装本服务的时候还要安装别的相关服务

注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择 重启

systemctl daemon-reload

 

 

而在Ubuntu上如果想开机自启的服务需要手动写service文件

或者自己创建类似于cenotsrc.local文件

/lib/systemd/system/rc.local.service路径里

虽然写了rc.local路径,但是在Ubuntu里是没有rc.local文件的

Ubuntu里面存在rc.local.service服务但是进行启动会失败

因为配置文件中缺少了INSTALL以及缺少了rc.local文件

可以vim编辑一个rc.Local文件以及加上执行权限

以及在配置文件中增加INTSALL

 

 

 

 

范例:Ubuntu实现程序进程开机程序自启

root@ubuntu1804 ~]#ll /lib/systemd/system/rc.local.service

lrwxrwxrwx 1 root root 16 Dec 12  2018 /lib/systemd/system/rc.local.service ->

rc-local.service

[root@ubuntu1804 ~]#grep -v "^#" /lib/systemd/system/rc.local.service

[Unit]

Description=/etc/rc.local Compatibility

Documentation=man:systemd-rc-local-generator(8)

 

ConditionFileIsExecutable=/etc/rc.local

After=network.target

[Service]

Type=forking

ExecStart=/etc/rc.local start

TimeoutSec=0

RemainAfterExit=yes

GuessMainPID=no

[root@ubuntu1804 ~]#vim /etc/rc.local

[root@ubuntu1804 ~]#cat /etc/rc.local

#!/bin/bash

echo -e '\E[31;1mstarting test service\E[0m'

sleep 10

[root@ubuntu1804 ~]#chmod +x /etc/rc.local

[root@ubuntu1804 ~]#reboot

 

6.4 运行级别

target units:相当于CentOS 6之前的runlevel ,unit配置文件:.target

某个target就代表某个资源的集合,某个服务是否启动时可以单独指定的

打破了以前runlevel之前七种模式的局限性

 

ls /usr/lib/systemd/system/*.target

systemctl list-unit-files --type target --all

和运行级别对应关系

0 ==> runlevel0.target, poweroff.target

1 ==> runlevel1.target, rescue.target

2 ==> runlevel2.target, multi-user.target

3 ==> runlevel3.target, multi-user.target

4 ==> runlevel4.target, multi-user.target

5 ==> runlevel5.target, graphical.target

6 ==> runlevel6.target, reboot.target

 

列出某个target涵盖的资源查看依赖性

systemctl list-dependencies graphical.target

 

级别切换:相当于 init N centos7上推荐用这个命令切换

systemctl isolate name.target

 

进入默认target

System default

注意:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl

daemon-reload才能生效)

获取默认运行级别: 相当于查看 /etc/inittab

systemctl set-default name.target

范例:

[root@centos8 ~]#systemctl set-default multi-user.target

[root@centos8 ~]#ls -l /etc/systemd/system/default.target

lrwxrwxrwx. 1 root root 37 Nov 7 19:32 /etc/systemd/system/default.target ->

/lib/systemd/system/multi-user.target

切换至紧急救援模式:

systemctl rescue

切换至emergency模式:

systemctl emergency

说明:rescue.target 比emergency 支持更多的功能,例如日志等

传统命令init,poweroffff,halt,reboot都成为 systemctl的软链接

#关机

systemctl halt、systemctl poweroff

#重启:

systemctl reboot

#挂起:

systemctl suspend

#休眠:

systemctl hibernate

#休眠并挂起:

systemctl hybrid-sleep

范例:禁用ctrl+alt+delete 重启快捷键

[root@centos8 ~]#ls -l /lib/systemd/system/ctrl-alt-del.target     

lrwxrwxrwx. 1 root root 13 May 23 2019 /lib/systemd/system/ctrl-alt-del.target

-> reboot.target

[root@centos8 ~]#systemctl mask ctrl-alt-del.target

Created symlink /etc/systemd/system/ctrl-alt-del.target → /dev/null.

[root@centos8 ~]#init q (等于sytemctl daemon-reload命令,重新加载)

[root@centos8 ~]#systemctl daemon-reload

 

 

 

 

 

6.5 CentOS 7之后版本引导顺序

1. UEFi或BIOS初始化,运行POST开机自检

2. 选择启动设备

3. 引导装载程序, centos7是grub2,加载装载程序的配置文件:

/etc/grub.d/

/etc/default/grub

/boot/grub2/grub.cfg

4. 加载initramfs驱动模块

5. 加载内核选项

6. 内核初始化,centos7使用systemd代替init

7. 执行initrd.target所有单元,包括挂载/etc/fstab

8. 从initramfs根文件系统切换到磁盘根目录

9. systemd执行默认target配置,配置文件/etc/systemd/system/default.target

10. systemd执行sysinit.target初始化系统及basic.target准备操作系统

11. systemd启动multi-user.target下的本机与服务器服务

12. systemd执行multi-user.target下的/etc/rc.d/rc.local

13. Systemd执行multi-user.target下的getty.target及登录服务

14. systemd执行graphical需要的服务

通过systemd-analyze 工具可以了解启动的详细过程

 

systemd-analyzeplot >boot.xml(随便起个文件名)传到windows里

systemd-analyze blame 字符界面,不是很直观

 

 

6.6 设置内核参数

设置内核参数,只影响当次启动

启动时,到启动菜单,按e键,找到在linux 开头的行后添加systemd.unit=desired.target

比如:systemd.unit=emergency.target 或 systemd.unit=rescue.target

 

6.7 破解 CentOS 78 root 密码

方法一:

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux 开始的行,添加内核参数rd.break

按ctrl-x启动

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行

touch /.autorelabel

exit

reboot

方法二:

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux 开始的行,改为rw init=/sysroot/bin/sh

按ctrl-x启动

chroot /sysroot

passwd root

#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行

touch /.autorelabel

exit

reboot

 

posted @ 2020-05-17 16:39  肖豪  阅读(432)  评论(0编辑  收藏  举报