shell 脚本进阶 ,启动流程和故障排错

shell 脚本进阶 ,启动流程和故障排错

1.条件选择if语句 

单分支

if 判断条件;

then 条件为真的分支代码

fi 

双分支

if 判断条件;  (命令可自行判断是否为真不用查看echo $?的值来进行判断)

then 条件为真的分支代码   (命令可以不用加反向单引号也能执行命令)

else 条件为假的分支代码

fi

多分支

if 判断条件1;then

条件为真的分支代码  (如果为真则结束)

elif 判断条件2; then

条件为真的分支代码  (如果为真则结束执行)

elif 判断条件3; then

条件为真的分支代码  (如果为真则结束执行)

else

以上条件都为假的分支代码  (以上都为假则执行此命令)

fi 

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

for语句

for 变量名 in 列表;do

循环体

done

可多层嵌套for语句实现组和

例题:(循环体里面执行一遍里面执行5遍总共执行10×5=50次)

for  i  in  {1..10};do

foe j in {1..5};do

sum=

done

done

执行机制:

依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直 到列表中的元素耗尽,循环结束

 

条件判断:case语句

case 变量引用 in

对变量进行匹配满足变量)  (里面写匹配变量的内容,一旦匹配则后续的匹配命令则不进行执行了)

echo ”    ”

; ;

对变量进行匹配满足变量则)

echo ”   ”

; ;

esac  (结束)

循环控制语句break

break [N]:提前结束第N层循环,最内层为第1层

循环控制shift命令

用于将参量列表 list 左移指定次数,缺省为左移一次。 

参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍 历位置参量列表时,常用到 shift

创建无限循环体

while true; do

循环体 

done

until false; do

循环体

Done

while语法的运用

while 条件判断(i <4) ;do                  (当条件判断值i>=4时则循环结束)   条件判断不满足时退出

循环体

i++ (每次执行完循环体后条件判断变量+1)

done

unit语法的运用

unit  条件判断 (i>4);do   (当条件判断值i>4时则循环结束) 条件判断满足时退出

循环体

i++(每次执行完循环体后条件判断变量+1)

done

select循环与菜单

select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在 标准错误上,并显示 PS3 提示符,等待用户输入

例题:

捕获22222222222

上图简单的小实验,写入脚本如下;

select menu in  yu xia rou ji ya  do                 menu为变量,in后面跟的时列表 do 结束

echo   $menu

done

其中最后一行显示#? 是由变量PS3来控制的,可以更改变量PS3来去掉#?只要在脚本里的最上头添加

PS3=”please chose :”即可。下图可实现简单的select用法,每个命令后面添加break可实现选择执行此命令结束后退出脚本。

捕获21

运用此命令可创建菜单然后再每个选项后跟不同的命令来实现选择则要执行的命令选项

elect 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。

也可以按 ctrl+c 退出循环

select 经常和 case 联合使用 与 for 循环类似,可以省略 in list,此时使用位置参量

信号捕捉trap

trap ‘触发指令’ 信号 自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操 作

在脚本中捕获信号可以让其不受外界信号的干扰继续执行脚本。

trap ‘   ‘ 信号 忽略信号的操作 。什么也不做

trap ‘-‘ 信号 恢复原信号的操作 

trap -p 列出自定义信号操作 

小例子: trap   ‘echo  ctrl+c ‘  int

for i in {1..10};do

sum=sum+$i

done

echo sum=$sum

当脚本再运行时,捕捉到ctrl+c也不会停止程序而继续执行。

 

函数介绍 与应用

函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程

定义函数

语法: f_name () { 执行的命令即所谓的函数体;}

简单小例子;f_name () {  echo lv;   (此为定义函数,其中函数名可以不用加f_可自定义 ,但通常都加上)

}                              ({  }里命令的前后必须有空格,)

    f_name   (此为调用函数) 结果就会输出  lv

如果要删除函数:unset  f_name   (  unset  +定义的函数名即可)

函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次发现它 后才能使用 

调用函数仅使用其函数名即可 (如果函数体有定义的变量则需要加反向单引号,切函数里定义的变量只能够在函数里调用,出了函数体就不行了)

例如:f_use () { dd=df | grep "/dev/sda" | tr -s ' ' % | cut -d% -f5

if [  $dd  -eq  80 ];then

echo ” your disk  full ”

}

如果不是定义变量则无需加反向单引号,{} 可自动执行里面的命令

例如:f_use (){ df | grep “/dev/sda” | tr -s ‘ ‘ % | cut -d% -f5

}

f_use   即可调用函数

函数使用

函数的定义和使用: 

可在交互式环境下定义函数 

可将函数放在脚本文件中作为它的一部分 

函数的返回值,可自定义然后用echo $? 来查看返回值应当与自己定义的一样。

11

如果函数体执行失败则不会显示自己设定的返回值;只有执行成功才可以。

函数在脚本前面定义好了,在下面的程序中调用,需不需要加反向单引号视情况来决定,有时需要有时不需要,函数定义好了以后就相当与命令使用

231

函数的跨脚本的调用:

一般都把多个自定义的函数,写到一个文件里,如果需要使用调用即可,可供多个脚本使用,大大提高使用的效率不必再每个脚本里重新定义函数了。

在脚本里调用函数库里的函数:

例如:fun为存储函数的文件

在编写脚本的最上面添加一行:.  fun或者 source fun 即可调用函数了

系统里的函数库在/etc/init.d/functions里面。(也可调用来使用)如果要调用使用则在脚本的前面添加一行   . /etc/init.d/functions 就行了。

环境函数

使子进程也可使用

声明:export -f function_name

查看:export -f 或 declare -xf

函数递归示例

函数直接或间接调用自身

fork炸弹

fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,实质是 一个简单的递归程序。由于程序是递归的,如果没有任何限制,这会导致这个 简单的程序迅速耗尽系统里面的所有资源 

函数实现

:(){ :|:& };:

bomb() { bomb | bomb & }; bomb

脚本实现

cat Bomb.sh

#!/bin/bash

./$0|./$0&

数组

bash的数组支持稀疏格式(可自定义索引不连续的

声明数组:

declare -a ARRAY_NAME :普通数组(及系统自定义的序列号从0开始向后编号)

declare -A ARRAY_NAME: 关联数组   (自己定义数组的)
关联数组必须先声明后使用,普通数组则不是必须的,但一般建议声明以便查看。

关联数组:一个自定义编号对应一个元素,只要不是以数字为编号,

例如:  ceo——>mage

coo——>zhangsir

cto ——->wang

数组的使用:

1

上图中两种数组的复制(都是普通数组);可以一次赋值一个也可以一次赋值多个。如果是普通数组,

可以将后面小括号里的生成列表例如:(元素可命令生成也可组和生成如{1..5}{1..6}等)

交互式数组值对赋值 read -a  name    —–> lv li ch dd 

file  =(/etc/*)   及将/etc/的所有文件作为元素赋值给file数组里

name=(cat /etc/passwd)  可以将文件里的内容赋值给数组

echo ${file[1] }   查看file数组里的第二个元素的文件

echo ${file[*]} 查看所有元素

echo  ${#file[*]} 查看数组file里的元素个数

显示所有数组:declare -a

引用数组 :

引用数组所有元素:

${NAME[*]}

${NAME[@]}

查看数组的长度(数组中元素的个数):

${# NAME[*]}

${# NAME[@]}

删除数组中的某元素:导致稀疏格式

unset  name[数组里元素的编号]

删除整个数组:

unset name

数组数据处理

数组切片:${name[*]:offset:number}

offset: 要跳过的元素个数

number: 要取出的元素个数

取要跳过元素个数之后的所有元素 ${name[*]:offset}

向数组中追加元素;name[${#name[*]}]=value (新的元素)

字符串切片:(字符串取出指定长度的内容)

(将变量定义var=123456789)

${#var}:查看字符串变量var的长度

${var:3}  :”456789″ 跳过前三个后面的都取出来

${var:3:4}:”45678″ 跳过前三个取紧接的后四个

${var:  -3}: “789”   取倒数三个-3前面必须要加空格

${var:3:-4}: “456”抛头去尾留中间

${var:    -4:-2}: “67”取后四个之后再去掉后两个  (此代码再7上可以执行在6上不可以执行)

基于模式来取字符串

${var#*:word}:在变量var中从左到右一直找,直到找到word这个单词开始停止,删除找到word之前的内容

${var##*:word}:在变量var中从左到右一直找,直到找到word这个单词最后一个开始停止,删除找到word之前的内容  (为贪婪模式)

${var%word*}:在变量var中从右向左找,直到出现第一个word这个单词后开始停止,删除找到word前的

${var%%word*}:在变量var中从右向左找,直到出现最后一个word这个单词后开始停止,删除找到word前的。(为贪婪模式)

具体看下面的案例:

 

file=“var/log/messages”

${file#*/}: log/messages  (从前向后取丢弃以/为分界的第一段:非贪婪模式)

${file##*/}: messages         (从前向后丢弃以/为分界的前n段只留下最后一段:此为贪婪模式)

${file%/*}: var/log (从后向前取丢弃以/为分界的第一段:非贪婪模式)
${file%%/*}: var (从后向前丢弃以/为分界的后n段只留下最后一段:此为贪婪模式)

下面为数组和字符串切片组和的案例

name=(cat /etc/passwd) (将/etc/passwd里的内容赋值到name组里)
echo ${name[*]%%:*} | tr ‘ ‘ “\n” (将变量name 查看组里的所有元素然后将元素切片取出最前面一段)

字符串的查找替换

${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹 配到的字符串,以substr替换之 ${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹 配到的字符串,以substr替换之 ${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹 配到的字符串,以substr替换之 ${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹 配到的字符串,以substr替换之

查找并删除

${var/pattern}:删除var所表示的字符串中第一次被pattern所匹配到的字符串

${var//pattern}:删除var所表示的字符串中所有被pattern所匹配到的字符串

${var/#pattern}:删除var所表示的字符串中所有以pattern为行首所匹配到的 字符串

${var/%pattern}:删除var所表示的字符串中所有以pattern为行尾所匹配到的 字符串 

字符大小写转换

${var^^}:把var中的所有小写字母转换为大写

${var,,}:把var中的所有大写字母转换为小写

创建临时文件

mktemp   /data/XXXXX   (在/data/下生成临时的随机文件XXX为大写的来指定随机文件名长度的大小)

mktemp  /data/msXXX     (也可指定字符和随机字符组和来创建文件名,但指定字符后最少要添加3个随机的字符)

mktemp   -d   /data/XXXXX   (此时创建的是目录)

tmpdir=mktemp –d /tmp/testdirXXX  (生成的临时文件或目录最好放到一个变量里面,以便查找

安装复制文件

选项:

-m MODE,默认755

-o OWNER

-g GROUP

示例:

install -m 700 -o wang -g admins   /etc/passwd /  /data/passwd.txt   (文件复制并且设定权限及属性)

install –m 770 –d /testdir/installdir (-d  创建文件夹并且设定好权限)

 

expect

主要应用于自动化交互式操作的场景,借助Expect处理交互的命令

expect 语法

新建一个expect 文件

vim  scp.exp

#!/usr/bin/expect   (以expect为机制来编写)

spawn   scp /etc/fstab    wang@192.168.8.100:/app

expect {

“yes/no” { send “yes\n”;exp_continue }   (捕捉是否有“yes/no”然后输入yes并换行)

“password” { send “magedu\n” }        (捕捉是否有“passwd”的提示,然后输入密码并换行)

}

expect eof   (以此为结尾)

此脚本加上执行权限后,自动执行远程复制任务 ,执行时不能用bash来运行,因为不是基于bash的脚本

加上执行权限后,使用./scp.exp来执行 做实验时传送文件只能传送单个文件

Linux的启动与内核管理

具体的内部启动细节流程

1  POST:Power-On-Self-Test,加电自检,负责完成对CPU、主 板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测.(bootloader: 启动操作系统专门的引导程序,给下面启动操作系统时使用  bootloader :现在版 GRUB和GRUB2两种 ,此软件包安装的时候并不是单一的存放某个目录下,一部分就存放到了MBR里了)

MBR: 446: bootloader, 64: 分区表, 2: 55AA 

GRUB: primary boot loader : 1 步骤,1.5  步骤

secondary boot loader :2 步骤,分区文件

2  446个字节启动完成后开始试图去找/boot分区,/boot分区里面存放了和内核相关的文件,其中还有GRUB的第二部分的文件,想要进入到/boot/GRUB的前提是要进入/boot的分区里。而/boot分区里存放内容是基于文件系统来存放的的,想要识别文件系统里的内容必须要加载文件系统的驱动,而文件系统的驱动又存放于/目录下,446个字节存放不了系统驱动所以再进入/boot分区前要加载/boot分区的文件系统,他存放再MBR后面几个扇区里 ,此为1.5的步骤。再执行第二步前要做的。(1步骤就是加载446个字节,他的作用就是告诉二步骤要加载的/boot下的内容再磁盘的什么位置)

kernel: (内核在完成前面的加载驱动成功之后开始下面的操作)

自身初始化:

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

加载各种硬件驱动程序(借助于ramdisk加载驱动) (如网卡驱动,硬盘驱动)

以只读方式挂载根文件系统 (这里要找根,要挂载根 ,则必须要识别根的文件系统,根的文件系统可能和boot的文件系统不一样,因为他们再两个不同的分区里面。而文件系统的驱动放在根下,则又有一个问题,无法查看根,则无法加载文件系统的一个死循环里面了。再boot里存放了根的文件系统驱动来解决了这个问题,此文件为虚拟文件系统,是安装系统时临时生成的,此文件为对应你所安装时的环境及你所选择的文件系统如果损坏不能复制一个,可用命令生成一个虚拟文件即可)

运行用户空间的第一个应用程序:在centos6 中 运行第一个程序/sbin/init ,  读取配置文件/ etc/inittab       决定启用的模式 initial(1-6)之后  进行某些程序的初始化操作。(主机名,网络设置),然后查看配置文件/etc/rc5.d 来决定启动时那些程序需要自动加载的(5代表你所选择的启动模式里的配置文件所在的名称如果选择3模式其配置文件就会在/etc/rc3.d里面),此文件里只是程序脚本的名称的软连接,此文件里以K打头的文件名为启动时停止的脚本S打头的为启动时自动加载的脚本程序的名称;在此/etc/init.d文件里真正加载上面软链接名字的脚本程序。(/etc/rc3.d(软连接列表)—–> /etc/init.d(真实脚本文件)

下图中为决定启用的模式,默认为5(图形)模式,可以更改的,如果改为3则启动时默认为字符界面

Inked捕获1_LI

下图为判断所需要加载程序脚本的软连接名称K和S打头的文件,其中S序号越靠后的,最后加载  K序号靠前的最先停止。如果一个脚本启用时靠后则停用时要靠前。

命令ntsysv可以查看下图列表中那些服务是停止的还是启动的。(*号的代表启动时要加载的项。选中按空格键可以改变为不启动)

chkconfig –list ate        (此命令也可以查看单个程序在1-6的各种模式下处于什么状态)

chkconfig  –list       (查看所有启动项在加载时的各种状态)

chkconfig  –level   35  ate  off/on  (此命令代表在3和5模式下将ate设置为开机不加载启动项/开机加载启动项)

service  atd  start /stop    (临时启用并使之生效)

service   –status-all   (查看当前启动加载项的状态)

如果从3模式切换到5模式,在切换的过程中自动将5模式下的开机动和不启动项重新加载一遍。

再此类表中各种模式下都会有一个文件再开机后最后启动/etc/rc5.d/S99local  .此文件并不是一个脚本程序,如果把我们想要执行的命令放如此脚本里,开机就会自动执行。(再centos7中此脚本文件需要添加执行权才能够运行)

捕获3

下图为具体加载运行的脚本程序;如果需要添加开机自启动项时,需要将脚本文件加入到此目录下,然后添加软链接的名称到上图的文件中;用此命令来实现。

首先用vim  .testservise创建一个服务脚本

#!/bin/bash

#chkconfig    35  96  3   (35代表在3和5模式下,95为他的启动序列编号  3为他的停止序列编号)

将此脚本加上执行权限,然后添加到/etc/init.d/列表里面   chkconfig  –add   testservise  删除列表里的启动加载项   chkconfig  –del  testservise 

如果此脚本存在错误可能会造成系统起不起来,这是我们需要进入到单用户模式将此脚本在1-6模式下全部设置为off,正常启动则会绕过此脚本,等待系统起来后再重新更改脚本文件。

捕获2

瞬态服务 (也叫超级守护进程)

瞬态(Transient)服务被xinetd进程所管理, 进入的请求首先被xinetd代理 ,平时不启动处于休眠状态则不需要占用系统资源,只要添加进xinetd里,需要此服务时则会被xinetd服务唤醒。(此服务适用于一些不常用的启动加载项但偶尔需要使用)

配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service

xinetd服务默认没有安装,需要安装一下。

打开启动加载列表chkconfig  –list  会发现多了xinetd服务列表如下图

捕获23

chkconfig rsync on/off  (启用或停用,xinetd对rsync加载项的监控服务。)

再centos7中许多启动加载项都由类似于xinetd的systemd来管理大大提高启动速度。(反之带来的问题时依赖性太高了,如果systemd起不起来则会造成系统的其他加载项都无法启动的结果)

systemd的使用查看百度帮助

CentOS 6 init程序为: upstart, 其配置文件: /etc/inittab, /etc/init/*.conf,配置文件的语法 遵循 upstart配置文件语 法格式,和CentOS5不同

grub legacy

grub-install  /dev/sda  (可修复磁盘前512个字节及启动的1和1.5阶段)

在/boot/grub 里面的文件除了grub.conf和splash.xpm.gz 都可以删除,也不影响正常启动。再用grub-install  /dev/sda 来修复

再次生成文件  如果时删除以后修复生成的文件,再次删除后则会影响正常启动。

在单用户下无需密码即可登陆,如果需要添加密码需要编辑/boot/grub/grub.conf 添加密码;并生成加密的密码如下图所示

生成加密的密码:grub-md5-crypt 之后输入两边密码然后生成加密密码。

passwd   –md5  +加密的密码即可  (在进入单用户模式也需要密码才能进入)

捕获

系统启动的过程及各个阶段所出现的问题的解决应对方法:

centos6 启动流程
1 post 硬件环境  (加电自检
2 mbr 446 grub stage1  (读取磁盘的446个字节的驱动引导程序为第一阶段
3 grub stage1.5 加载/boot 分区文件系统  (1.5阶段加载/boot的文件系统驱动,在第一个扇区之后的27个扇区里面)
4 grub stage2 /boot/grub/grub.conf    (2阶段加载/boot分区下的内核文件和驱动根的虚拟文件要通过grub.conf文件来执行加载内核和驱动
5 vmlinuz 加载/ /boot/initramfs.xxx.img (同上一阶段在一起加载内核文件和文件系统的驱动
6 /sbin/init   /etc/inittab id:3:  (开始执行根下第一个程序init并运行初始化脚本,和决定启用那种用户模式开启的后面的加载项的内容)
7 /etc/rc.sysinit 运行初始化脚本的名字
8 /etc/rc3.d/S,Kxxx –> /etc/init.d/xxx   (开始根据rc3.d的菜单所需要启动的项,来运行init.d里的脚本
chkconfig –level N service on|off     (通过此命令来查看和 更改加载项是启动或者是关闭
9 /etc/rc.local   (无论那种模式最后会运行的兜底文件,把想要执行的命令加入此文件里开机就会运行)
10 login   (最后到登陆界面

 

案例:如果把上述的虚拟文件不小心删掉后,造成系统无法无法读取根里的内容而造成系统起不来;(第四项出现问题)

1 进入救援模式

2.用光盘启动根目录在,/mnt/sysimage 下需要切根 :chroot  /mnt/sysimage

3 .重新生成虚拟文件  mkinitrd /boot/initramfs-uname -r.img  uname -r

(其中uname -r 为用命令生成内核版本号 ,如果手工添加的话容易出错)

4.查看文件生成后重启即可  (reboot 命令失效。需要exit 退两次 退到图形界面来重启)

如果把/boot下的内核文件删除造成系统起不来;(第四项启动出问题)

思路;在救援模式下将光盘里的相同地方的文件复制一份过来即可。

找到光盘的sr0的路径  ,在/光盘路径/iolinux目录下,有个vmlinuz的文件,复制到自己的/boot下即可。

如果把/boot下的文件全部都删除的话: (第四项启动时出的问题)

还需要进入救援模式下来操作:

第一步:切根 chroot /mnt/sysimage

第二部:复制光盘里的内核文件到/boot下    cp /mnt/isolinux/vmlinuz  /boot/

第三部:生成文件系统启动的文件               mkinitrd   /boot/initramfs-uname -r.img ‘uname -r’

第四部: 生成grub文件                 grub-install /dev/sda

第五部:   编辑无法生成的文件/boot/grub/grub.conf  (此处的两个文件编辑要和grub里的文件名称一样 “内核文件和虚拟文件两个不然会造成无法找到grub里对应的内核真实文件”)

vim  grub.conf

default=0

timeout=5

title  lvchengyanglinux

kernel    /vmlinuz –版本号写全   root=/dev/sda2  (指明根的路径)

initrd    /initramfs-版本号写全.img

两次退出重启便可以。

第二种方法:
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
rpm -ivh /mnt/cdrom/Packages//Packages/kernel-2.6.32-696.el6.x86_64.rpm –root=/mnt/sysimage/ –forc (将内核安装包强制安装一下)

切根chroot  /mnt/sysimages

用grub-install /dev/sda安装一下

再次编辑grub.conf文件就可以了。

如果/etc/rc3.d启动项的脚本出现问题造成系统无法启动:(第八项启动时出的问题)

chkconfig –level 35 ate off/on (此命令代表在3和5模式下将ate设置为开机不加载启动项/开机加载启动项)

用上述命令在单用户/救援模式下将出现问题的启动加载项先暂停开机加载,等待系统起来时在解决问题。

如果把磁盘的446个驱动引导删除出现的问题:(第二项启动出现的问题)

在救援模式下;grub-install /dev/sda (可修复磁盘前512个字节及启动的1和1.5阶段)

如果将/etc/fstab和/boot的文件删除,系统无法识别分区的文件系统类型造成的无法开机:

在救援模式下:无法判断那个分区是根的分区

需要建一个文件夹/mnt/roots,然后分别挂载各个分区上来查看里面的内容来判断那个是根分区,/boot分区以及其他的分区。找到根分区之后用vi编辑文件

vi  /mnt/roots/etc/fstab

/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

(各个分区对应的名称要具体看机器的实际对应结果此为示例)

文件系统创建完成之后退出重新启动 ,即可 再次进入救援模式来修改即可。

如果将/sbin/init二进制文件删除造成的无法启动  (第六项启动时出错)

进入救援模式,此次救援模式联网 .切根,然后

将别的机器上的二进制文件 拷贝 过来即可。 (或者拷贝一份相同的文件的/sbin/下也行)

chroot  /mnt/sysimage

scp 192.168.27.2 :/sbin/init    /sbin

还有一种方法;/sbin/init文件来自于upstart安装包

可以将upstart包解压也行

rpm2cpio /media/CentOS_6.9_Final/Packages/upstart-0.6.5-16.el6.x86_64.rpm | cpio -idv ./sbin/init

centos7的启动管理

systemd

配置文件:

/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/(6上的脚本)

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

/etc/systemd/system:管理员建立的执行脚本,类似于 /etc/rc.d/rcN.d/S**K**文件的功能,比上面目录优先运行

Systemctl –t help   查看unit类型

管理服务

启动:service name start(6和7都可用) ==> systemctl start name (仅7上用,后面跟多个程序)

停止:service name stop(6和7都可用) ==> systemctl stop name(仅7上用,后面跟多个程序)

重启:service name restart(6和7都可用) ==> systemctl restart name(仅7上用,后面跟多个程序)

状态:service name status(6和7都可用) ==> systemctl status name (仅7上用,后面跟多个程序)

条件式重启:已启动才重启,如果是关闭的不做操作

service name condrestart ==> systemctl try-restart name

重载或重启服务:先加载,再启动

systemctl reload-or-restart name

重载或条件式重启服务:

systemctl reload-or-try-restart name 

禁止自动和手动启动:

systemctl mask name 

取消禁止:

systemctl unmask name

服务查看

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

systemctl is-active name 

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

systemctl list-units 

查看所有服务: (包含已激活和未激活的所有程序)

systemctl list-units –all

chkconfig命令的对应关系:

设定某服务开机自启:

chkconfig name on ==> systemctl enable name

设定某服务开机禁止启动:

chkconfig name off ==> systemctl disable name

查看服务是否开机自启:

systemctl is-enabled name

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

chkconfig –list ==> systemctl list-unit-files –type

用来列出该服务在哪些运行级别下启用和禁用

chkconfig sshd –list ==> ls /etc/systemd/system/*.wants/sshd

CentOS7引导顺序

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

选择启动设备 

引导装载程序, centos7是grub2 

加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg 

加载initramfs驱动模块 

加载内核选项 

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

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

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

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

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

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

ystemd执行multi-user.target下的/etc/rc.d/rc.local 

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

systemd执行graphical需要的服务

破解CentOS7的root口令方法一

启动时任意键暂停启动 

按e键进入编辑模式 

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

按ctrl   + x启动 

mount –o remount  rw /sysroot (重新以读写的方式挂载根通过查找/dev/sda2来看到/所在的路径,原根文件只是只读的方式,要加权限才能修改密码)

chroot /sysroot (切根)

passwd root  (重设密码)

touch /.autorelabel (新建文件此步骤为必须要的)

exit  (退出)

reboot

破解CentOS7的root口令方法二

启动时任意键暂停启动 

按e键进入编辑模式 

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

按ctrl-x启动 

chroot /sysroot 

passwd root 

touch /.autorelabel 

exit 

reboot

在centos7中修复GRUB2文件被删除

先修复grub2文件:grub2-install /dev/sda

在修复grub2下的主要配置文件grub.cfg :grub2-mkconfig > /boot/grub2/grub.cfg   (在centos6当中需要手动生成grub.conf文件)

这样就修复了整个grub2文件及里面的内容(相当与cent0s6中的grub文件夹)

centos7下删除/boot文件的修复方法

进入救援模式下:chroot  /mnt/sysimage  (切根)

1 首先修复/boot里的文件用rpm重新将内核安装一遍即可(需要进入/boot目录下强制安装–force)

rpm -ivh /run/media/root/CentOS\ 7\ x86_64/(可以写上要挂载光盘的目录来安装)Packages/kernel-3.10.0-693.el7.x86_64.rpm –force

(需要将光盘挂载到新建的一个空目录下来完成内核安装完成后将生成/boot下的主要文件,除了grub2文件要单独生成)

2 .生成grub2下的文件和grub2/grub.cfg文件,两个文件需要两步操作才可完成。

grub2-install  /dev/sda   (生成grub2/下的文件,但不能生成grub.cfg文件)

grub2-mkconfig > /boot/grub2/grub.cfg  (生成主配置文件grub.cfg文件 ,如果不重定向默认输出到界面所以要重定向到文件里才可以。)

调整默认启动内核 (如果有多个内核选项可以设置默认启动的内核为哪个通过更改以下配置文件)

vim /etc/default/grub

GRUB_DEFAULT=0   (从0开始在启动时看到的第几项,选第几项就改为第几项,此文件不能直接生效的)

再用grub2-mkconfig > /boot/grub2/grub.cfg 命令生成新的文件将原本的文件覆盖掉,同时会更改grub.cfg

文件里关于默认启动内核的设置(在这一行:else ;set   default=”…”

或者直接更改/boot/grub2/grub.cfg 里的文件中的 set  default=”  …” 也可以 (一般不建议修改配置文件)

 

 

 

 

 

 

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

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班