CentOS系统启动流程、selinux、Systemd剖析

交互式登录配置文件读取顺序:

/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc

非交互式登录配置文件读取顺序:

~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh

 

profile类:为交互式登录的shell提供配置;功用:

1、定义环境变量

2、运行命令或脚本

bashrc类:为非交互式登录的shell提供配置;功用:

1、定义命令别名

2、定义本地变量

 

 

CentOS系统启动流程

Linux系统的组成部分:内核+根文件

内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能

运行中的系统环境可分为两层:内核空间、用户空间

用户空间:应用程序(进程或线程)

内核空间:内核代码(系统调用)

内核设计流派:

单内核设计:把所有功能集成于同一个程序;linux

微内核设计:每种功能使用一个单独的子系统实现;windows,solaris

 

Linux内核特点:

支持模块化;.ko

支持模块的动态装卸载;

 

组成部分:

核心文件:/boot/vmlinuz-VERSION-release

ramdisk:

CentOS5:/boot/initrd-VERSION-release.img

CentOS6-7:/boot/initramfs-VERSION-release.img

模块文件:/lib/modules/VERSION-release

 

CentOS系统启动流程:

POST:加电自检:

BOOT Sequence(引导序列):按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备;

bootloader:引导加载器,程序

windows:ntloader

Linux:

1、LILO:LInux LOader

2、GRUB:GRand Uniform Bootloader

MBR(512):主要引导扇区

446:bootloader

64:分区表

2:有效校验码;55AA

 

kernel:内核自身初始化:

探测可识别到的所有硬件设备;

加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)

以只读方式挂载根文件系统;

运行用户空间的第一个应用程序:/sbin/init

 

init程序的类型

1、SysV:init,CentOS 5

配置文件:/etc/inittab

2、Upstart:init,CentOS 6

配置文件:/etc/inittab、/etc/init/*.conf

3、Systemd:systemd,CentOS 7

配置文件:/usr/lib/systemd/system,/etc/systemd/system

 

ramdisk:

内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问;

ramdisk –》 ramfs

CentOS5:initrd,工具程序:mkinitrd

CentOS6、7:initramfs,工具程序:mkinitrd,dracut

 

系统初始化:

POST ==》  BootSequence(BIOS)  ==》  Bootloader(MBR) ==》  kernel(ramdisk)  ==》  rootfs(只读)  ==》  init(systemd)

 

/sbin/init

CentOS5:运行级别:为了系统的运行或维护等应用目的而设定:

0-6:7个级别

0:关机

1:单用户模式(root,无须登录),single,维护模式;

2:多用户模式,会启动网络功能,但不会启动NFS,维护模式;

3:多用户模式,正常模式,文本界面;

4:预留级别;可同3级别;

5:多用户模式,正常模式,图形界面;

6:重启

默认级别:3,5

切换级别:init #

查看级别:runlevel

who -r

 

配置文件:/etc/inittab

每一行定义一种action以及与之对应的process;

id:runlevel:action:process

action:

wait:切换至此级别运行一次;

respawn:此process终止,就重新运行;

initdefault:设定默认运行级别;process省略;

sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;

。。。

 

chkconfig命令

查看:–list

添加:–add

删除:–del

修改:–level NNN on|off

 

/etc/rc.d/rc.sysinit:系统初始化脚本

(1)设置主机名;

(2)设置欢迎信息;

(3)激活udev和selinux;

(4)挂载/etc/fstab文件中定义的文件系统;

(5)检测根文件系统,并以读写方式重新挂载根文件系统;

(6)设置系统时钟;

(7)激活swap设备;

(8)根据/etc/sysctl.conf文件设置内核参数;

(9)激活lvm及soft raid设备;

(10)加载设备的额外驱动程序;

(11)清理操作;

总结:/sbin/init ==>  (/etc/inittab)  ==>  设置默认运行级别 ==>  运行系统初始化脚本、完成系统初始化  ==>  关闭对应下需要关闭的服务,启动需要启动的服务  ==>  设置登录终端

 

CentOS 6:init程序为upstart,其配置文件:/etc/inittab,/etc/init/*.conf;注意语法遵循upstart配置文件语法格式;

 

启动系统时,设置其运行级别为1;

CentOS5、6:内核命令参数single或者S或者1;

CentOS7:内核命令参数添加init=/bin/sh,假如rootfs为ro,还需mount -o remount,rw /,且运行命令“touch / .autorelabel”,否则将无法正常启动系统,最后启动系统exec /sbin/init;

 

GRUB(Boot Loader):

grub 0.x:grub legacy(传统)

grub 1.x:grub2

 

grub legacy:

stage1:mbr

stage1_5:mbr之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统;

stage2:磁盘分区(/boot/grub/)

其配置文件:/boot/grub/grub.conf  <–  /etc/grub.conf

stage2及内核等通常放置于一个基本磁盘分区;

功用:(1)提供菜单、交互式接口;

e:编辑模式,用于编辑菜单;

c:命令模式,交互式接口;

(2)加载用户选择的内核或操作系统

允许传递参数给内核

可隐藏菜单

(3)为菜单提供了保护机制

为编辑菜单进行认证

为启用内核或操作系统进行认证

 

如何识别设备:

(hd#,#):

hd#:磁盘编号,用数字表示;从0开始编号;

#:分区编号,用数字表示;从0开始编号;

 

grub的命令行接口:

help:获取帮助列表;

help KEYWORD:详细帮助信息;

find (hd#,#)/PATH/TO/SOMEFILE:查找文件

root (hd#,#):设定根设备

kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;

initrd /PATH/TO/INITRAMFS_FILE:设定为选定内核提供额外文件的ramdisk;

boot:引导启动选定的内核;

 

配置文件:/boot/grub/grub.conf

配置项:

default=#:设定默认启动的菜单栏,菜单栏编号从0开始;

timeout=#:指定菜单项等待选项选择的时长;

splashimage=(hd#,#)//PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;

hiddenmenu:隐藏菜单;

password [–md5] STRING:菜单编辑认证;

title TITLE:定义菜单项的标题;可出现多次;

root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;

kernel /PATH/TO/VMLINUZ_FILE [选项] :启动的内核;

initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramdisk文件;

password [–md5] STRING:启动选定的内核或操作系统时进行认证;

 

grub-md5-crypt命令:生成md5的密码串;

 

安装grub:

grub-install –root-directory=/PATH/TO/SOMEFILE /DEVICE_NAME

 

uname命令:显示操作系统信息;

-n:显示节点名称;

-r:显示内核的VERSION-release;

 

lsmod命令:显示内核已装载的模块信息;显示内容来自于:/proc/modules文件;

 

modinfo命令:显示模块的详细描述信息;

-n:显示模块的存放路径;

 

modprobe命令:装、卸载模块;默认配置文件为/etc/modprobe.conf,/etc/modprobe.d/*.conf

modprobe [-C config-file] [modulename] [module parameters…]:装载模块;

modprobe [-r] [modulename…]:卸载模块;

 

depmod命令:内核模块依赖关系及系统信息映射文件的生成工具;

 

/proc目录:内核内部状态及统计信息,以及可配置参数通过proc伪文件系统加以输出;

参数:

只读:输出信息;

可写:可接受用户指定“新值”来实现对内核某功能或特性的配置;/proc/sys目录

sysctl命令:查看或设定内核的参数;

sysctl -w path.to.parameter=VALUE

echo命令通过重定向的方式也可以修改内核参数;

echo “VALUE” >  /proc/sys/path/to/parameter

 

sysctl命令:

默认配置文件:/etc/sysctl.conf

(1)设置某参数

sysctl -w path.to.parameter=VALUE

(2)通过读取配置文件来设定参数

sysctl -p [/path/to/conf_file]

 

内核中的路由转发参数:/proc/sys/net/ipv4/ip_forward;其值0为关闭,1为开启;

 

常用的几个参数:

net.ipv4.ip_forward:路由转发

vm.drop_caches:清除buff和cache

kernel.hostname:主机名

 

/sys目录:sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数可以修改的,用于调整硬件工作特性;

 

udev通过此路径下输出的信息动态为各设备创建所需要设备文件;udev是运行用户空间程序;专用工具:udevadmin、hotplug;

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

 

ramdisk文件的制作:

(1)mkinitrd命令:为当前正在使用的内核重新制作ramdisk文件

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

(2)dracut命令:

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

 

编译内核:

前提:

(1)准备好开发环境;

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

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

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

准备好开发环境:

包组(centos7):

# yum groupinstall “development tools”

目标主机硬件设备相关信息:

CPU:

1、# cat /proc/cpuinfo

2、x86info -a

3、lscpu

PCI设备:

lspci:显示所有PCI设备;

lsusb:显示USB设备;

lsblk:显示块设备;

 

了解全部硬件设备信息:hal-device

screen命令:剥离终端关联的命令行管理工具

screen -ls:显示正在运行的信息

screen -r #:#为信息号,恢复对应的命令行

Ctrl +a +d:逃逸出当前命令行

 

简单依据模板文件的内核编译制作过程:

1、下载内核源码包并解压;

# tar -xvf linux_kernel_file -C /usr/src

# ln -sv /usr/src/linux_kernel_file /usr/src/linux

#cd /usr/src/linux

#cp /boot/config-VERSION-RELEASE .config

#make menuconfig:按需定制内核参数

#make -j #:根据cpu核心数开启多线程

#make modules_install:安装模块

#make install

安装生成bzImage为/boot/vmlinuz-VERSION-RELEASE.img

生成initramfs文件

编辑grub的配置文件

重启系统,并测试使用新内核;

 

编译内核的步骤

1、配置内核选项

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

(a)make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;

(b)make menuconfig:基于curses的文本窗口界面;

(c)make gconfig:基于GTK开发环境的窗口界面;

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

支持“全新配置”模式进行配置

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

(b)make allnoconfig:所有选项均回答为“no”;

2、编辑

make [-j #]

make modules_install

make install

如何只编译内核中的一部分功能:

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

#cd /usr/src/linux

#make dir/

(b)只编译一个特定的模块:

#cd /usr/src/linux

#make dir/file.ko

如何交叉编译内核:编译的目标平台与当前平台不相同;

#make ARCH=arch_name

获取特定目标平台的使用帮助:

#make ARCH=arch_name help

 

如何在已经执行过编译操作的内核源码树做重新编译:

事先清理操作:

make clean:清理大多数编译生成的文件,但会保留config文件等;

make mrproper:清理所有编译生成的文件、config及某些备份文件;

make distclean:mrproper、patcher以及编辑器备份文件;

 

CentOS系统安装:

安装程序:anaconda

bootloader==》kernel(initrd(rootfs))==》anaconda

 

anaconda:

tui:基于cureses的文本窗口

gui:图形界面

 

CentOS的安装过程启动流程:

MBR:boot.cat

stage2:isolinux/isolinux.bin

配置文件:isolinux/isolinux.cfg

每个对应的菜单选项:

加载内核:isolinux/vmlinuz

向内核传递参数:append initrd=initrd.img …

装载根文件系统并启动anaconda

注意:上述内容一般应位于引导设备上;而后续的anaconda及其安装用到的程序包等有几种方式可用:

本地光盘

本地硬盘

ftp server:yum repository

http server:yum repository

nfs server:yum repository

如何想手动指定安装源:

boot:linux method

 

anaconda应用的工作过程:

1、安装前配置阶段:键盘类型、语言、时区、管理员密码、创建一个普通用户、设定分区方式及MBR的安装位置、选定要安装的程序包

2、安装阶段:在目标磁盘创建分区,执行格式化操作等、将选定的程序包安装至目标位置、安装bootloader

3、首次启动:iptables、selinux、core dump

 

anaconda的配置方式:

(1)交互式配置方式

(2)通过读取事先给定的配置文本自动完成配置;

按特定语法给出的配置选项;

kickstart文件;

 

安装引导选项:

boot:有如下常用选项

text:文本安装方式;

method:手动指定使用的安装方法;

与网络相关的引导选项:

ip=IPADDR

netmask=MASK

gateway=GW

dns=DNS_SERVER_IP

ifname=NAME:MAC_ADDR

与远程访问功能相关的引导选项:

vnc

vncpassword=’PASSWORD’

指明kickstart文件的位置:ks=

DVD driver:ks=cdrom:/PATH/TO/KICKSTART_FILE

Hard driver:ks=hd:/device/drectory/KICKSTART_FILE

HTTP server:ks=http://host:port//PATH/TO/KICKSTART_FILE

FTP server:ks=ftp://host:port//PATH/TO/KICKSTART_FILE

HTTPS server:ks=https://host:port//PATH/TO/KICKSTART_FILE

启动紧急救援模式:rescue

 

kickstart文件的格式:

命令段:指明各种安装前配置,如键盘类型等;

程序包段:指明要安装的程序包组或程序包,不安装的程序包等;

%packages:安装包起始

@group_name:包组安装

package:某包安装

-package:不安装某包

%end:安装包结束

 

脚本段:

%pre:安装前脚本;运行环境:运行于安装介质上的微型linux环境;

%post:安装后脚本;运行环境:安装完成的系统;

 

创建kickstart文件的方式:

(1)直接手动编译:依据某模板修改;

(2)可使用创建工具:system-config-kickstart;依据某模板修改生成

 

检查ks文件语法错误命令:ksvalidator

 

制作centos7 引导光盘镜像

# mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V “CentOS7-boot” -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/centos7-boot.iso /root/myiso/

 

SElinux:强制访问控制,工作于linux内核;

本身linux:DAC:自主访问控制

MAC:强制访问控制;

 

SELinux有两种工作级别:

strict:每个进程都受到selinux的控制;

targeted:仅有限个进程受到selinux的控制;只监控容易被入侵的进程;

 

selinux为每个文件提供了安全标签,也为进程提供了安全标签;

user:role:type

user:selinux的user;

role:角色;

type:类型;

 

selinux规则:

规则:哪种域能访问哪种或哪些种类型内的文件;

 

配置selinux的方式:配置文件:/etc/selinux/config、/etc/sysconfig/selinux

1、selinux是否启用;(enforcing|permissive|disabled)

2、给文件重新打签:

3、设定某些布尔型特性;

 

相关命令:getenforce、setenforce、

 

给文件重新打标:chcon

chcon [OPTION]… CONTEXT FILE…
chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…
chcon [OPTION]… –reference=RFILE FILE…

-R:递归

 

还原文件的默认标签:

restorecon [-R] pathname…

 

布尔型规则查看与设定:

getsebool:查看

-a:查看所有

setsebool:设定

-P:永久有效

 

systemd新特性:

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

按需激活进程;

系统状态快照;

基于依赖关系定义服务控制逻辑;

 

核心概念:unit

配置文件进行标识和配置:文件中主要包含了系统服务、监听socker、保存的系统快照以及其他与init相关的信息;其保存位置为:

/usr/lib/systemd/system

/run/systemd/system

/etc/systemd/system

 

unit的类型:

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

target unit:文件扩展名为.target,用于模拟实现“运行级别”;

device unit:文件扩展名为.device,用于定义内核识别的设备;

mount unit:文件扩展名为.mount,用于定义文件系统挂载点;

socker unit:文件扩展名为.socker,用于标识进程间通信用的socker文件;

snapshot unit:文件扩展名为.snapshot,管理系统快照;

swap unit:文件扩展名为.swap,用于标识swap设备;

automount unit:.automount,实现文件系统的自动挂载点;

path unit:.path,用于定义文件系统中的一个文件或目录;

 

管理系统服务:Centos 7:service unit;注意:兼容早期的服务脚本;

命令: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

条件时重启:service name condrestart ==》   systemctl try-restart name.service

重载或重启服务:systemctl reload-or-restart name.service

禁止设定为开机自启:systemctl mask name.service

取消禁止设定为开机自启:systemctl unmask name.service

 

查看某服务当前激活与否的状态:systemctl is-active name.service

查看所有已激活的服务状态:systemctl list-units –type service

查看所有服务状态:systemctl list-units –type service –all

 

设定某服务开机自动启动:

chkconfig name on  ==》   systemctl enable name.service

查看某服务开机自动启动:

chkconfig –list name   ==》   systemctl is-enabled name.service

查看所有服务的开机自动启动状态:

chkconfig –list   ==》  systemctl list-unti-files –type service

查看某服务的依赖关系:

systemctl list-dependencies name.service

 

target units:

unit配置文件:.target

运行级别:

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

级别切换:

init N   ==>   systemctl isolate name.target

查看级别:

runlevel   ==》   systemctl list-units –type target

获取默认运行级别:

/etc/inittab   ==》   systemctl get-default

修改默认运行级别:

/etc/inittab   ==》   systemctl set-default name.target

切换至紧急救援模式

systemctl rescue

切换至emergency模式:

systemctl emergency

其他常用命令:

关机:systemctl halt;systemctl poweroff

重启:systemctl reboot

挂起:systemctl suspend

快照:systemctl hibernate

快照并挂起:systemctl hybrid-sleep

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/91903

(0)
上一篇 2018-03-04 21:05
下一篇 2018-03-04 21:52

相关推荐

  • 文本工具

    本文将介绍Linux下使用Shell处理文本时最常用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;提供的例子和参数都是最常用和最为实用的

    2017-11-25
  • Linux磁盘管理

    面对一块硬盘,我们该如何使用它呢?本文从机械硬盘结构,分区,格式化,和挂载四个层次进行介绍。 一、机械硬盘结构 现在服务器使用机械式硬盘是主流,因为其造价低,容量大,和固态硬盘相比读写性能要差很多。机械硬盘主要由以下几个部件构成:转轴Spindle,盘片Platter,机械臂Boom,磁头Head。工作机制是马达带动盘片高速旋转,磁头对盘片进行擦写数据或读取…

    Linux干货 2016-09-01
  • 初学第一篇

    本菜鸡出现了。。。 第一次接触Linux,相对老司机要差远了,这几个月的辣眼睛,我就承包了,希望越来越好~~~ ————我是分割线,下面是正文————- 都是讲过的东西,不过里面内容都是11手打,作业也自己做后再比对答案 一、–第一天的课程暂时不写了,…

    Linux干货 2017-09-02
  • linux中文本处理工具cat 、less、more、head、tail、cut等使用

    文本内容查看工具:cat和less  cat 使用:查看文件内容          cat  选项      文件        …

    Linux干货 2016-08-08
  • Linux常用命令使用方法

    下面以一些常用的Linux命令为例讲解一下Linux命令的使用方法。 1.  ifconfig – 配置网络接口 | 对象 | 参数 | 含义 || —— | —— | —— |网卡名 | / | 查看指定网卡IP的地址,不指定默认查看所有网卡地址网卡名 | up …

    Linux干货 2017-09-01
  • 学习宣言

            学习计划:每天至少2个小时的学习,循序渐进,先通读再精读。         学习目标:成为运维的高手,走上人生巅峰。      &nb…

    Linux干货 2016-10-25