[关闭]
@mrz1 2017-12-24T09:19:12.000000Z 字数 9187 阅读 754

2017-12-20课程笔记(while until 系统启动和内核管理)

笔记


while循环

  1. while CONDITION; do
  2. 循环体
  3. done

如果最后一个计算值为0,则返回1;否则返回0

  1. [root@centos7 ~]#i=0
  2. [root@centos7 ~]#let i++
  3. [root@centos7 ~]#echo $?
  4. 1
  5. [root@centos7 ~]#i=0
  6. [root@centos7 ~]#let ++i
  7. [root@centos7 ~]#echo $?
  8. 0

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件:CONDITION为true
退出条件:CONDITION为false

练习:用while实现

1、编写脚本,求100以内所有正奇数之和

2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少

  1. read -p "Please input the network(eg:192.168.1.0): " network
  2. [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "please input a legal IP" ; exit 1; }
  3. net=`echo $network |cut -d. -f1-3`
  4. i=1
  5. up=0
  6. down=0
  7. while [ "$i" -le 254 ];do
  8. ping -c1 -W1 $net.$i &> /dev/null && { echo $net.$i is up ; let ++up; } || { echo $net.$i is down ; let down++; }
  9. let i++
  10. done
  11. wait
  12. echo ip Up host is $up
  13. echo ip Down host is $down

3、编写脚本,打印九九乘法表

4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值

  1. i=1
  2. while [ "$i" -le 10 ];do
  3. num=`echo $RANDOM`
  4. echo $num
  5. if [ "$i" = 1 ];then
  6. max=$num
  7. min=$num
  8. else
  9. if [ "$num" -gt "$max" ];then
  10. max=$num
  11. elif [ "$num" -lt "$min" ];then
  12. min=$num
  13. fi
  14. fi
  15. let i++
  16. done
  17. echo "the max is $max"
  18. echo "the min is $min"

5、编写脚本,实现打印国际象棋棋盘

6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo $RANDOM|md5sum|cut -c1-10 后的结果,请破解这些字符串对应的RANDOM值

  1. i=0
  2. while [ $i -le 32767 ];do
  3. rand=`echo $i | md5sum|cut -c1-10`
  4. case $rand in
  5. efbaf275cd)
  6. echo $i md5 is efbaf275cd
  7. ;;
  8. 4be9c40b8b)
  9. echo $i md5 is 4be9c40b8b
  10. ;;
  11. 44b2395c46)
  12. echo $i md5 is 44b2395c46
  13. ;;
  14. f8c8873ce0)
  15. echo $i md5 is f8c8873ce0
  16. ;;
  17. b902c16c8b)
  18. echo $i md5 is b902c16c8b
  19. ;;
  20. ad865d2f63)
  21. echo $i md5 is ad865d2f63
  22. ;;
  23. esac
  24. let i++
  25. done

7、自动启动httpd服务

  1. sleeptime=30
  2. while true;do
  3. if killall -0 httpd >& /dev/null;then
  4. true
  5. else
  6. systemctl restart httpd
  7. time=`date +%F %T`
  8. echo "AT $time httpd is restarted " >> /app/httpd.log
  9. fi
  10. sleep $sleeptime
  11. done
  12. nohup 脚本 //断网也会执行此脚本

8、删除ss -nt 中最大连接数的ip地址,加入防火墙

  1. sleeptime=60
  2. max_num=3
  3. while sleep $sleeptime ;do
  4. ss -nt| grep ESTAB |tr -s " " :|cut -d: -f6|uniq -c |while read num ip
  5. ;do
  6. if [ ! $num -le $max_num ];then
  7. iptables -A INPUT -s "$ip" -j REJECT
  8. fi
  9. done
  10. done
  11. lastb //查看失败连接的信息

9、lastb 中最近100条记录中拒绝失败次数超过5次的IP连接(如果此IP已经被拒绝,就不要再重复拒绝)(未完成:把加入防火墙中的ip 不再加入没意义)

  1. sleeptime=10
  2. max_num=3
  3. while sleep $sleeptime ;do
  4. cat /app/wang/lastb.log |grep ssh:notty |tr -s " " :|cut -d: -f4|uniq -c|sort -nr|while read num ip ;do
  5. if [ ! $num -le $max_num ];then
  6. iptables -A INPUT -s "$ip" -j REJECT
  7. fi
  8. done
  9. done

until循环

  1. until CONDITION;do
  2. 循环体
  3. done

进入条件:CONDITION 为false
退出条件:CONDITION 为true

循环控制语句continue

用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

  1. while CONDTIITON1; do
  2. CMD1...
  3. if CONDITION2; then
  4. continue
  5. fi
  6. CMDn
  7. ...
  8. done

循环控制语句break

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

  1. while CONDTIITON1; do
  2. CMD1...
  3. if CONDITION2; then
  4. break
  5. fi
  6. CMDn
  7. ...
  8. done

循环控制shift命令

shift [n]
用于将参量列表list 左移指定次数,缺省为左移一次。
参量列表list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到shift
./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h

shift命令示例:

  1. #!/bin/bash
  2. while [ $# -gt 0 ] # or (( $# > 0 ));do
  3. echo $*
  4. shift
  5. done

创建无限循环

  1. while true; do
  2. 循环体
  3. done
  1. until false; do
  2. 循环体
  3. Done

练习

1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/app/cracker.log中,并退出脚本

  1. until false ;do
  2. sleep 1
  3. pkill -u hacker -9 && echo "at `date +'%F %T'` cracker is killed" >> /app/cracker.log
  4. done

2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出

  1. ram=`echo $[$RANDOM%10]`
  2. read -p "猜数字游戏(0-9): " num
  3. until [[ $num -eq $ram ]];do
  4. if [ $num -lt $ram ];then
  5. read -p "数字有点小: " num
  6. else
  7. read -p " 数字有点大: " num
  8. fi
  9. done
  1. ram=`echo $[$RANDOM%10]`
  2. read -p "猜数字游戏(0-9):" num
  3. weile [[ $num -ne $ram ]];do
  4. if [ $num -lt $ram ];then
  5. read -p "数字有点小: " num
  6. else
  7. read -p " 数字有点大: " num
  8. fi
  9. done

3、用文件名做为参数,统计所有参数文件的总行数

4、用二个以上的数字为参数,显示其中的最大值和最小值

特殊用法

while循环的特殊用法(遍历文件的每一行):

  1. while read line;do
  2. 循环体
  3. done < /PATH/FROM/SOMEFILE

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

练习read:

扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。

  1. while read line ;do
  2. comment=`echo $line | cut -d: -f5`
  3. username=`echo $line | cut -d: -f1`
  4. [ -z "$comment" ] && chfn -f "$username" -p 62985600 $username&> /dev/null && echo "$username is modified"
  5. done < /etc/passwd

双小括号方法,即((...))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作I=10((I++))

for循环的特殊格式:

  1. for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
  2. 循环体
  3. done

控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

系统启动和内核管理

Linux组成

  1. Linux: kernel+rootfs
  2. kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
  3. rootfs:程序和glibc
  4. 库:函数集合, function, 调用接口(头文件负责描述)
  5. 过程调用:procedure,无返回值
  6. 函数调用:function
  7. 程序:二进制执行文件
  8. 内核设计流派:
  9. 单内核(monolithic kernel):Linux
  10. 把所有功能集成于同一个程序
  11. ll /boot/vmlinuz-3.10.0-693.el7.x86_64
  12. 微内核(micro kernel):Windows, Solaris
  13. 每种功能使用一个单独子系统实现

内核

Linux内核特点:
支持模块化:.ko(内核对象)
在这个文件tree /lib/modules/3.10.0-693.el7.x86_64/
如:文件系统,硬件驱动,网络协议等
支持内核模块的动态装载和卸载
组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img

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

lsmod | grep e1000 //网卡模块
modprobe -r e1000 //卸载网卡模块

CentOS6 启动流程

CentOS6 启动流程

  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(如果希望计算机启动时有一个服务自动运行放到这里就行;只能输入命令控制当前服务 优先级最差99)
  9. 执行/bin/login程序,等待用户登录
  10. 登录之后开始以Shell控制主机

1、POST加电自检

  1. POSTPower-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
  2. ROMBIOSBasic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
  3. RAMCMOS互补金属氧化物半导体,保存各项参数的设定
  4. 按次序查找引导设备,第一个有引导程序的设备为本次启动设备
  5. bootloader: 引导加载器,引导程序
  6. windows: ntloader,仅是启动OS
  7. Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
  8. LILOLInuxLOader(很早以前centos5淘汰)
  9. GRUB: GRand Unified Bootloader(翻译:大统一引导)
  10. GRUB 0.X: GRUB LegacyGRUB2
  11. rpm -qi grub //这个包 centos5,6 是0.9版本 centos7 2.2版本

2、MBR引导

  1. MBR:
  2. 446: bootloader,64: 分区表, 2: 55AA(标记位)

3、GRUB

  1. GRUB:
  2. primary boot loader : 1st stage1.5 stage
  3. secondary boot loader 2nd stage,分区文件
  4. 1st stage ---> 446: bootloader //二进制
  5. 1.5 stage ---> /boot/brub //二进制
  6. hexdump -C -n 512 /dev/sda //查看前512字节
  7. 2nd stage --->

4、加载内核

  1. kernel:自身初始化:
  2. 探测可识别到的所有硬件设备
  3. 加载硬件驱动程序(借助于ramdisk加载驱动)
  4. 以只读方式挂载根文件系统
  5. 运行用户空间的第一个应用程序:/sbin/init

ramdisk特性及管理

  1. ramdisk
  2. 内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动
  3. ramdisk--> ramfs提高速度
  4. CentOS 5: initrdramdisk 访问磁盘)
  5. 工具程序:mkinitrd
  6. CentOS 67: initramfsfilesystem 文件系统)
  7. 工具程序:mkinitrd, dracut
  8. 系统初始化:POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> initsystemd
  9. ramdisk文件的制作:
  10. (1) mkinitrd命令
  11. 为当前正在使用的内核重新制作ramdisk文件
  12. mkinitrd initramfs-`uname -r`.img `uname -r`
  13. (2) dracut命令
  14. 为当前正在使用的内核重新制作ramdisk文件
  15. dracut /boot/initramfs-`uname -r`.img `uname -r`
  16. /usr/bin/mkinitrd //这个文件

实验误删除 initramfs

光盘启动 CD-ROM Drive
救援模式 Rescue installed system

语言之类的 一直ok

网络

continue

ok

..... 一直ok

回车

chroot /mnt/sysimage/ 切换跟
执行:mkinitrd initramfs-uname -r.img uname -r
exit
重启完成

系统启动流程

  1. init程序的类型:
  2. SysV: init, CentOS 5之前
  3. 配置文件:/etc/inittab
  4. [root@centos6 ~]#rpm -qf /sbin/init
  5. SysVinit-2.86-15.e15(红帽开发)
  6. 按顺序执行
  1. Upstart: init,CentOS6
  2. 配置文件:/etc/inittab, /etc/init/*.conf
  3. [root@centos6 ~]#ll /sbin/init
  4. -rwxr-xr-x. 1 root root 150352 May 11 2016 /sbin/init
  5. [root@centos6 ~]#rpm -qf /sbin/init
  6. upstart-0.6.5-16.el6.x86_64(ubuntu)
  7. 没有依赖关系 可以同时并行启动
  1. Systemdsystemd, CentOS 7
  2. 配置文件:/usr/lib/systemd/system
  3. /etc/systemd/system
  4. /etc/inittab //全部是注释濒临淘汰
  5. [root@centos7 ~]#ll /usr/sbin/init
  6. lrwxrwxrwx. 1 root root 22 Nov 9 13:20 /usr/sbin/init -> ../lib/systemd/systemd
  7. 全部并行启动

启动流程

  1. /sbin/initCentOS6之前
  2. 运行级别:为系统运行或维护等目的而设定;0-67个级别
  3. 0:关机
  4. 1:单用户模式(root自动登录), single, 维护模式
  5. 2:多用户模式,启动网络功能,但不会启动NFS;维护模式
  6. 3:多用户模式,正常模式;文本界面
  7. 4:预留级别;可同3级别
  8. 5:多用户模式,正常模式;图形界面
  9. 6:重启
  10. 默认级别:3, 5
  11. 切换级别:init#
  12. 查看级别:runlevel; who -r

centos6如果 设置init为6 一直重启 解决

1

2

init初始化

init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X

CentOS 5的inittab文件

  1. 配置文件:/etc/inittab
  2. 每一行定义一种action以及与之对应的process
  3. id:runlevel:action:process
  4. action:
  5. wait: 切换至此级别运行一次
  6. respawn:此process终止,就重新启动之
  7. initdefault:设定默认运行级别;process省略
  8. sysinit:设定系统初始化方式,此处一般为指定
  9. /etc/rc.d/rc.sysinit
  10. ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  11. id:3:initdefault: //这里是几模式
  12. si::sysinit:/etc/rc.d/rc.sysinit
  13. l0:0:wait:/etc/rc.d/rc 0
  14. l1:1:wait:/etc/rc.d/rc 1
  15. l2:2:wait:/etc/rc.d/rc 2
  16. l3:3:wait:/etc/rc.d/rc 3 //就执行这里那个文件脚本
  17. l6:6:wait:/etc/rc.d/rc 6
  18. centos6 /etc/rc.d/ 目录下

CentOS 6 /etc/inittab和相关文件

  1. /etc/inittab
  2. 设置系统默认的运行级别
  3. id:3:initdefault:
  4. 示例:破解CentOS56root口令
  5. /etc/init/control-alt-delete.conf
  6. /etc/init/tty.conf
  7. /etc/init/start-ttys.conf
  8. /etc/init/rc.conf
  9. /etc/init/prefdm.conf

启动流程

/etc/rc.d/rc.sysinit: 系统初始化脚本
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作

  1. 说明:rcN --> 意味着读取/etc/rc.d/rcN.d
  2. /K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
  3. S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
  4. for srvin /etc/rc.d/rcN.d/K*; do
  5. $srv stop
  6. done
  7. for srvin /etc/rc.d/rcN.d/S*; do
  8. $srv start
  9. done

chkconfig命令

  1. chkconfig命令
  2. 查看服务在所有级别的启动或关闭设定情形:
  3. chkconfig[--list] [name]
  4. 添加:
  5. SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
  6. chkconfig--add name
  7. #!/bin/bash
  8. #LLLL 表示初始在哪个级别下启动,-表示都不启动
  9. # chkconfig: LLLL nnnn
  10. 删除:chkconfig--del name
  11. 修改指定的链接类型
  12. chkconfig[--level levels] name <on|off|reset>
  13. --level LLLL: 指定要设置的级别;省略时表示2345
  14. ntsysv 命令查看当前模式是否启动
  15. ntsysv --level=3 查看3模式的
  16. chkconfig --list atd 查看所有模式对这个模式开还是关
  17. chkconfig --level 35 atd off 35模式atd模式关掉
  18. chkconfig atd off 默认是改的2 3 4 5
  19. chkconfig --list 所有的服务

编写自动启动服务

  1. #! /bin/bash
  2. # chkconfig: 35 99 00 //3和5模式是on 99编号最后打开服务 00优先关闭服务
  3. # description: this is a test service
  4. case $1 in
  5. start)
  6. touch /app/testsrv
  7. echo testsrv is starting
  8. sleep 5 // 开机时为了能看到这个服务
  9. ;;
  10. stop)
  11. rm -f /app/testsrv
  12. echo testsrv is stopped
  13. ;;
  14. restart)
  15. echo testsrv is stopped
  16. echo testsrv is starting
  17. ;;
  18. status)
  19. [ -f /app/testsrv ] && echo testsrv is running || echo testsrv is stopped
  20. ;;
  21. esac
  22. chmod +x testsrc 添加执行权限
  23. chkconfig --add testsrv 添加到服务列表中
  24. chkconfig --list testsrv 查看所有模式对这个模式开还是关

xinetd管理的服务

  1. service 命令:手动管理服务
  2. service 服务start|stop|restart
  3. service --status-all
  4. 瞬态(Transient)服务被xinetd进程所管理
  5. 进入的请求首先被xinetd代理
  6. 配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
  7. libwrap.so文件链接
  8. chkconfig控制的服务:chkconfigtftpon
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注