第六周知识重点总结

多网卡绑定

ss 和 netstat 用来查看已启动的进程和端口的对应关系
lsof -i :80 查看80端口被谁占用


4多网卡集成的企业级应用.avi_20190818_092211.246.jpg

把多块物理网卡绑定在一起 ,在逻辑上被当做一块网卡向外提供服务,既能
提高带宽,加速传输效率 同时也能实现容错
多网卡的绑定有个前提:多块网卡应该连接在同一个交换机上

在centos6上做绑定可以有多种模式 不同模式工作特性不一样,有些模式需要交换机做一些配置

image.png

mode0:多块网卡轮流处理,每块网卡都分担一部分流量
mode1:主备 其中一块工作,其他做备用
mode2:广播 所有网卡都传输一样的数据

主备模式的配置

image.png

其中 ifcfg-bond0 是新建的文件
BONDING_OPTS='miimon=100 mode=0'
mode=1用来指定是主备模式 miimon=100是指备用网卡每100毫秒查看主网卡一次 ,如果主网卡故障了,启动备用网卡
然后在自己的物理网卡添加两行
MASTER=bond0 SLAVE=yes
相当于物理网卡不是独立使用,而是由bond0来管理

当做实验的时候,要求主机的两块网卡连接到同一交换机(如果是虚拟机,都设置成NAT)

通过查看/proc/net/bonding/bondx
可以查看哪个网卡在工作

对于centos系列 更改网卡名字
在/etc/default/grub文件里面找到
grub_cmdline_linux 这行 ,在后面添加net.ifnames=0

在centos7 里面要借助 grub2-mkconfig -o /boot/grub2/grub.cfg来生成 /boot/grub2/grub.cfg 使网卡改名成功

在ubuntu 上更改网卡名字与centos系列大体一致 主要是把 grub2-mkconfig 换成 grub-mkconfig,前面操作是一致的

centos6 更改主机名的配置文件是
/etc/sysconfig/network
centos7 主机名的配置文件是
/etc/hostname
centos7 更改主机名 更加便捷
systemctl set-hostname xxx

在centos7 上面 推荐使用nmcli 来设置网络
主要使用nmcli device / connection
nmcli device 查看各个设备的网络情况
nmcli device show eth0 查看网卡eth0 的详细信息

nmcli connection 查看各网卡的网络连接状态
当我们需要多套网络环境的时候,我们可以在/etc/sysconfig/network-scripts里面 配置多个网卡文件,应对不同的网络环境

nmcli connection add con-name xx ifname xxx type xxx ipv4.method manual ipv4.address xxxx/xxx

这样就相当于创建了一个新的网卡配置文件,但是没生效,
nmcli connection up xxx 即生效了
当对网卡配置文件修改之后, 通过nmcli connection 看不到时,可以
nmcli connection reload 重新加载,在nmcli connection up xx 可生效
nmcli connection delete xxx

image.png

centos7 使用nmcli 实现多网卡绑定

image.png

创建一个逻辑上的绑定网卡
nmcli connection add con-name xxx type bond ifname bondx mode active-backup ipv4.method manual ipv4.address xxxxx/xxx

往绑定网卡里面添加物理网卡
nmcli connection add con-name xxx type bond-slave ifname xx master bondx

nmcli connection up xxx(逻辑上绑定网卡的名称)

网络组

image.png

示例

image.png

网桥

image.png

网桥( 交换机)不同网段的主机连接到网桥以后,能够实现通信
其实做网桥的这个实验,就相当于把两台主机插到网桥(交换机)上 。

网桥(交换机)在实现多台主机通讯的时候,是不需要配置ip的,只有
在管理连接到交换机的主机时,才需要设置ip

临时清理ip地址 : ifconfig 网卡名字 0.0.0.0


image.png

ubuntu 网络配置

image.png
image.png
image.png
image.png

search 那行是表示 域名后缀补全

写完之后,netplan apply 使其生效

进程

image.png

守护进程 :随着计算机启动而进行,随着计算机关闭而结束

image.png

进程和线程的执行管理都是由os来操作的
线程是os来调度 ,协程有程序员通过代码来调度
在linux进程眼里,它拥有的内存空间被称作虚拟内存空间(线性内存)

MMU 负责虚拟内存和物理内存之间的转换,cpu最终是从物理内存读取数据 MMU 在 cpu里面 TLB 是 虚拟内存和物理内存的缓存

image.png

用户空间和内核空间

image.png

进程状态切换

image.png

LRU

image.png

当某个数据再次被访问 ,调到最上面

ipc(进程间通信)

进程之间的资源是互相独立的 (例如,内存)

image.png

消息队列 : 有一个公共的消息队列服务器,然后多个进程中,当某个进程往消息队列里面写东西时,其他进程可以从消息队列里面读取内容,进而实现不同主机的进程之间通讯

实时优先级

实时进程优先级高的会抢占优先级低的cpu资源
当优先级相同的时候,有两种方式处理,一种是等先运行的进程结束之后,在运行等待的进程 即按顺序来 还有一种是轮流(各自执行一会,轮流交替执行)

非实时进程 100-139 可以通过nice来调整他们的优先级,但是在nice里面用的不是100-139 而是用-20-19 来对应 100 -139 (也是数字越小,优先级越高)

DMA :直接内存访问 当需要从硬盘读取数据到内存的时候,cpu直接给DMA发送指令 ,DMA会直接把数据从硬盘读取到内存,读取过程不需要cpu参与。从内存把数据写入磁盘 DMA也采取上述工作方式,cpu值负责发送一个指令,传输过程不需要cpu参与

pstree -p 显示进程树 加-p 显示进
程编号
pgrep -lt pts/1
查看运行在pts/1 上的进程和pid
pgrep -P 1
查看pid为1的进程的子进程的pid
ps 当前进程的快照(默认只显示当前终端的进程)
常见选项 ps aux
在显示的字段里面 vsz 表示os承诺分配的内存 rss是真正分配的内存

ps axo pid,%cpu,%mem,tty k %cpu
只显示 pid cpu mem tty 且按照cpu正序排序
pidof 进程 查看进程的pid

ps axo pid,%cpu,%mem,tty,cmd k
-%mem 只显示cpu mem tty cmd 按内存倒序排序 加psr 查看 进程运行在哪个cpu上
由于cpu里面有缓存,当某个进程在某个cpu里面运行的时候,进程的数据被存储在cpu缓存里,如果频繁切换不同的cpu来执行此进程 效率大幅下降(缓存无法得到高效利用) ,如果把某个进程绑定到指定的cpu,会大幅提高效率 ,如果绑定不合理,会造成某个cpu负载过大

pgrep -lt pts/1 查看运行在pts/1上的进程
pgrep -lu wang 表示以wang的身份(生效)运行的进程
pgrep -lU wang 表示以wang的身份发起的进程 (不一定生效)
比如 以wang身份运行passwd ,生效身份其实是root
发起passwd进程的身份是wang
pgrep -l '^ba.*' 搜索以ba开头的进程
加 -l 显示更加详细
uptime 显示开机时长 以及负载

top 实时监控进程的状态
在top运行过程当中,
敲击M 内存倒序排序
敲击P cpu倒序排序
累计占据cpu时长 T
当一个进程运行一段时间之后,内存应该是稳定的 如果占用内存一直不断增加,会导致内存泄漏(内部用光了)
在top字段里面有hi(硬中断) si (软中断)
硬件之上是内核,内核之上是app,
当app想要使用硬件完成某个功能,通过系统调用请求内核来管理硬件,硬件是通过中断来和内核通讯的

free 查看内存
buffer 字段的功能当内存里的数据要写入磁盘的时候,并不是有一点数据都往磁盘写 ,可以利用buffer 做容器
等存储了一定数量的数据在一次性的写入 ,减少了写入次数,提高效率,而cache是从磁盘读入数据到内存的时候,如果把经常读入的数据放在cache里面,下次读取的时候,就不必从磁盘读取了,可以直接从cache里面读取,同样也能提高效率。

vmstat 查看虚拟内存的状态

si so bi bo i或者o都是针对内存而言的 例如 si 从swap出 进内存
bo 出内存 进块设备(磁盘)
in 中断 cs 进程切换率 us 用户空间 sy 内核空间
iostat 显示io信息
显示io信心,每隔2秒显示一次,
pmap 查看一个进程pid的内存映射
pmap -x 1471
pid为1471的进程的内存映射

image.png

iftop(需要yum 安装) 显示网卡接口的流量情况
TX 是发送
RX 是接收
栈 : 后进先出
堆:存放大量数据
iotop 可以用来查看某个进程的磁盘读写利用情况

nload 实时查看网卡的流量情况
lsof 查看哪些文件正在被占用
lsof -a /etc/passwd
查看哪个进程在使用/etc/passwd文件
kill -l 查看信号的种类
ss -nlt 查看处于监听状态 ip和port

之所以重启某项服务之后,服务生效了,是因为重启服务之后,会读取服务的配置文件
lsof -c xx xx进程所打开的文件
kill 向进程发送控制信号

kill -2 10411 把pid为10411 的进程中断 (相当于ctrl +c )kill命令的参数是pid
kill -15 10411 -15 这个信号是杀死
上面的命令和 kill 10411 功能相同
kill -19 $(pidof ping)
此命令相当于 ctrl + z
把 ping 放入后台休眠

在linux里面正在使用的文件可以被删除
lsof -i :port 查看port在被哪个进程占用

pgrep -lt pts/1 看运行在pts/1上的进程
pkill -t pts/1 杀死pts/1的所有进程

kill -l 查看信号列表
kill + sig + pid
pkill 同kill 功能一致 (但支持正则)

常用信号

image.png

15 是正常杀死
killall + sig + processName
在后台运行的程序,如果终端挂掉了,还是会导致程序无法运行。
nohup 剥离进程和终端的关系
nohup cmd 当关闭终端,cmd进程不会终止,会作为pid为1的子进程
kill %x 杀死后台的进程
-9 强力杀

前后台转换

4进程信号和前后台管理.avi_20190820_205457.834.jpg

xxx & 后台执行
jobs 查看后台运行的程序编号
fg xx 后台进程转前台执行
正在运行的程序 敲击ctrl + z 转后台 并且 停止运行
bg 后台停止的进程恢复运行
kill -19 pid / killall -19 processName 后台运行转休眠
kill -0 pid / killall -0 processName 查看进程是否运行正常
killall -0 httpd &> /dev/null || service httpd restart httpd服务出现故障,重启服务

并行执行脚本
cmd1;cmd2;cmd3
等待cmd1结束,运行cmd2,依次类推
第一种
在脚本里面
cmd1 &
cmd2 &
cmd3 &
第二种
(a.sh &);(b.sh &);(c.sh &)
第三种
{ a.sh & b.sh & c.sh & }
注意:花括号这种 前后有空格

计划任务

at 一次性任务
cron 周期性任务
at 计划执行依赖 atd服务 确保atd服务启动才能使用at
计划任务中的标准输出以邮件方式发送给用户(通过mail查看)
at 计划任务是放在 /var/spool/at目录里面
at time
以ctrl +d 结束
at -l 查看计划任务列表
at -d 任务编号 删除xx编号任务

在计划任务脚本中,尽量避免出现标准输出 (一旦有输出 ,会不断发邮件)

image.png
image.png

如果白名单和黑名单同时存在,那么生效的只有白名单(即黑名单无效),当白名单不存在时,黑名单里面的用户没有权限执行,黑名单之外的用户可以执行,两个文件都不存在,所有用户都被拒绝执行,除了root

crontab 设置周期计划任务 (依赖 crond 服务的启动)
创建好的计划任务存放在/var/spool/cron里面
时间格式: 分 时 日 月 周
系统周期任务计划 写入/etc/crontab
用户自定义的任务计划 通过crontab 创建

天 和 周几 是或的关系,其他都是且的关系
crontab -e
进入编辑模式
0 8 * * 1,3,5 /usr/bin/wall "good morning!'
周一,三,五 早8点 执行wall good morning
查看crontab 计划列表
crontab -l
crontab -r -u xx 删除指定用户的计划任务
crontab -l -u 查看指定用户的计划任务
/usr/bin/run-parts 会运行指定目录下的所有脚本

          • /usr/bin/run-parts /data/scripts 是指每分钟都会运行/data/scripts里面的所有脚本
            01 * * * * 是指每个小时的第一分钟(例如 12:01)
            @reboot xxx 下次重启自动运行 xxx
            30 21 * * * /usr/sbin/poweroff
            每天晚上九点半关机
            sleep 1 休眠1秒
            usleep 1 休眠1微秒
            1秒=1000毫秒
            1毫秒=1000微秒
            在计划任务中,最好把要执行的任务写在脚本里面,避免出现各种符号问题

*/10 15-17 1 * * /usr/bin/echo 'hello'
每月一日的15点到17点 每隔10分钟,执行一次echo 'hello'

shell 脚本
for 循环
for xx in 类似列表形式的内容都可以 ; do cmd ; done
for i in *.txt (表示文件的时候,不要加双引号) ; do cmd; done

@ 获取脚本的所有参数(每个参数是单独的个体)
{1,100,3} 1,4,7,11....

declare -i sum=0
for i in {1..100};do
  if [ $[i%2] -eq 1 ];then
    let sum+=i
  fi
done

tr -dc '[:alnum:]' < /dev/urandom | head -8
从/dev/urandom的标准输入中 把数字和字母的补集删除 (即留下数字和字母)可以用来制作 随机密码
echo sum=$sum

for  i in {1..10};do
  useradd user\$i
  password=\`tr -dc '[:alnum:]' < /dev/urandom | head -8`
  echo user\$i:\$password | tee -a (追加的含义)  pass.txt | chpasswd
  passwd  -e user\$i(直接设置用户密码过期,以便让用户登录改口令) user\$i &> /dev/null
  echo 'User:user\$i is created'
done

sed '/^alice/,$' /etc/passwd
把/etc/passwd 里面过滤出 以alice开头的行一直到最后一行

NETID=172.16.128
for HOSTID in {1..254}; do
  { if ping -c1 -W1 \$NETID\.\$HOSTID &> /dev/null ;then 
        echo  \$NETID.$HOSTID is up | tee -a  hostlist.txt 
    fi } &  
done 
wait

{ xxxx } & 是指 大括号里的内容被看作一个整体 放在后台执行 能够实现并行的效果(取决于cpu的核数)并行执行 不按顺序执行

wait 等待脚本执行结束以后,自动显示提示符
99乘法表

for i in {1..9};do 
  for j in \`seq \$i`;do
    echo -e "\${i}x\${i}=$[i*j] \t"
  done
  echo
done 

while 循环

while : ; do 
xx 
done  死循环
SLEEPTIME=10
while :; do 
!  xxx  是取反
 if !  killall -0 php-fpm &> /dev/null ;then
    systemctl restart php-fpm &> /dev/null
    echo "AT \`data +'%F %T'` php-fpm is restarted "
fi
sleep SLEEPTIME
done
 for ((i=0;i<10:i++));do
       if [ $i -eq 5 ] ; then 
         continue 
       fi
       echo i=$i
    done
跳过5 
for ((i=0;i<10;i++));do
  if [ $i -eq 5 ]; then 
    break
  fi
  echo i=$i
done 
碰到break 整个循环结束
for ((i=0;i<10;i++);do
  for (j=0;j<10;j++);do
    if  [ $j -eq 5  ] ; then 
      continue 2 
      continue 2  是 连着跳2次  第一次跳过内层循环,第二次跳过外层循环
    fi
    echo j=$j
  done
  echo i=$i
done
echo finish

for ((i=0;i<10;i++);do
  for ((j=0;j<10;j++);do
    if [ $j -e1 5 ]; then
      break 2   接连退出两次 退出整个大循环
    fi
    echo  j=$j
done
echo finish 
如果 $1  非空 则为真 ,否则为假
if [ "$1" ] ; do 
  useradd $1 
  echo $1 is created 
  shift  默认把参数向左移动一位
done
N=[$RANDOM%10+1]
while read -p 'input a number(1-10):' NUM ;do
  if [[ $NUM =~ ^[[:digit:]]+$]] ;then
    if [ $NUM -eq $N ];then
      echo ok 
      break

    elif  [ $NUM -gt $N ];then
       echo too large 
    else 
      echo too small 
    fi
  else 
    echo 'please input a number '
  fi
done
while  read xxx  接收标准输入  逐行读入  
lastb  查看某个用户的失败登陆信息(例如密码错误)

##  select循环与菜单
PS2  是多行输入重定向的提示符
![image.png](https://upload-images.jianshu.io/upload_images/18840398-8b24d9789d4e9cee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
PS3='please input a number :'
select menu in gongbaojidan kaoya haishen baoyu;do
  case $REPLY in
  1)
      echo $menu price is 30
      ;;
  2)
      echo $menu price is 10
      ;;
  3)
      echo  $menu price is 50
      ;;
  4)
      echo $menu price is 60
      ;;
  5)  
      echo $menu price is 90  
  6)
      break 
      ;;
  *)
      echo 'please input again'
  esac 
done

函数

declare -f 查看已定义的函数和内容
declare -F 只查看已定义的函数名
在当前窗口定义的函数只在当前窗口生效
unset funcname 删除在窗口定义的函数

echo os version is `func_os_version`
func_os_version() {
  sed -nr 's/.* ([0-9]+)\..*/\1/p' /etc/redhat-release

上面的写法会报错 ,函数要先定义,后使用
当其他脚本想要使用此函数的时候,可以在脚本中重新定义一次,不过很麻烦 ,所以比较好的做法是把定义好的函数统一放到一个文件里面,需要的时候读取此文件即可
函数里面的return xxx 可以用echo $?查看 xxx 的值

在 /etc/init.d/functions 里面存放很多已经定义好的函数,可以直接在脚本里面引用

num=200; func_test() { local num=100; echo $sum ; } 

local xx 是定义局部变量 只在函数内部有效 ,如果不加local 会影响函数之外的与之同名变量的值

定义普通变量 n=xxx
定义环境变量 export n=xxx 或者
declare -f xxx
定义局部变量 local n=xxx
{ xxx; xxx;} 可以理解为匿名函数
递归: 函数自己调用自己
:(){:|:&}; fork 炸弹 管道会开启大量子进程导致内存耗尽
其中:是函数名

trap 捕获

image.png
trap 'echo press ctrl+c ' int 
trap -p 
for ((i=0;i<10;i++));do
  echo $i
  sleep 1 
done 

发送信号2 或者 ctrl+c 打印 ctrl+c

finish() {
  echo finish is excuted 
}
trap finish exit 
for ((i=0;i<5;i++));do
  echo  $i
  sleep 1
done

发生退出 触发finish 函数

数组

image.png

数组赋值


image.png

引用数组


image.png

数组切片


image.png

NUM=({1..10})
echo ${NUM[@]} 全部元素
echo ${NUM[@]:2} 跳过前两个
echo ${NUM[@]:2:3} 跳过前两个,取三个

字符串切片
${#var} 字符串的长度
${var:3} 取跳过前3个字符的其他字符串
${var:2:3} 跳过前两个字符,取3个字符
echo ${var: -3} 注意 中间有一个空格
取后三个
echo ${var:2:-3} 跳过前两个和后三个,取中间
echo ${var: -6:-4}在后6个里面 去掉后4个
echo ${var#root} 在var里面从左一直删到第一个root
echo ${var##
root} 在var里面从最左侧一直删到 最后一个root (贪婪模式)
echo ${var%root} 在var里面从最右侧删到碰到的第一个root
echo ${var%%root
} 从右侧往左删 一直删到最左侧的root(贪婪模式)

url=http://www.magedu.com:80
echo ${url##:} 从最左侧一直到: 删除(包含:) --> 80
echo ${url%%:
} 从最右侧一直到:删除 (包含:) --> http

echo ${var/root/admin} 替换var里面第一个root为admin
echo ${var//root/admin} 替换所有root为admin
echo ${var/#pattern/substr }
替换pattern 开头的--> substr
echo ${var/%pattern/substr}
替换pattern 结尾的-->substr
echo ${var/root} 删除var里面第一个root
echo ${var//root} 删除var里面所有root
echo ${var^^} var里面所有小写转大写
echo ${var,,} 大写转小写
大小写转换并没有修改原来的值

name=${title-mage}
title 空 值为空
title不存在 值为mage
title=a 值为a

declare 声明


image.png

eval 两次扫描
n=10
eval echo {1..$n} --> 1,2,3,4,5,...10

title=name
name=mage
eval echo \ $$title --> mage
echo ${! title} --> mage
mktemp xxxfile ---> 三位随机数file

install 集 cp chgrp chmod chown 功能于一身
expect 交互转脚本

image.png
spawn scp /etc/fstab 192.168.8.100:/app
expect {
  'yes/no" {send     
  'yes/no';exp_continue}
  'password' {send 'magedu\n'}
}
expect eof

用spawn激活scp进程
用expect 监听 如果出现yes/no 代替手工输入 yes\n exp_continue 继续判断 出现password 会输入magedu\n 直到进程运行结束

spawn ssh 192.168.8.100
expect {
  'yes/no' {send     
  'yes/no';exp_continue}
  'password' {send 'magedu\n'}
} 
interact (登陆之后再转交互模式)
set ip 192.168.8.100
set user root
set password magedu
set timeout 10  (设置超时时长)
spawn ssh $user@$ip
expect {
     'yes/no' { send 'yes\n' ;exp_continue }
      'password' { send '$password\n' }
}
interact
lindex $argv 0 代表第一个位置参数
set ip [lindex $argv 0 ]
set user [lindex $argv 1] 
set password [lindex $argv 2]
spawn ssh $user@$ip
expect {
  'yes/no' { send 'yes\n' ;exp_continue}
  'password' { send "$password\n' }
}
interact
set ip [lindex $argv 0] 
set user [lindex $argv 1 ]
set password [lindex $argv 2]
set timeout  10
spawn ssh $user@$ip
expect {
  'yes/no' { send 'yes\n' ;exp_continue}
  'password' { send '$password\n' }
}
登陆之后继续执行其他命令
expect ']#' { send 'useradd haha\n' }
expect ']#' { send 'echo magedu | passwd  --stdin haha \n' }
send  'exit \n' 
expect eof 

工作中常用的是在shell中调用expect

#! /bin/bash 
ip =$1
user=$2
password=$3
expect << EOF
set timeout 20
spawn ssh $user@$ip
expect {
  'yes/no' { send 'yes\n';exp_continue }
  'password' { send '$password\n' }
}
expect ']#' { send 'useradd hehe\n' }
expect ']#' { send 'echo magedu | passwd --stdin hehe \n' }
expect ']#' { send 'exit\n ' }
expect eof
EOF

系统启动

image.png

centeos 6启动流程


image.png

加电自检主要就是在开机时做硬件检查


image.png

image.png

mbr 存放在某块磁盘的第一个扇区,而其中的前446个字节存放的是bootloader ,比较常见的bootloader 例如grub grub文件分几个部分,第一部分放在mbr的前446字节里面 ,其他的存放在/boot/grub 里面,而其中grub.conf 记录了kernel 存放的位置

kernel 里面只存放最核心的内容,其他非核心的(例如 文件系统驱动是以模块的方式存放在其他地方)
驱动文件一般以.ko结尾
以模块方式存放非核心的内容的好处是可以按需加载
可以通过lsmod 查看已加载的模块
initramfs xxxxx 模拟了根文件系统 ,内核通过此文件找到必须的驱动,进而启动
缺少initramfs xxx 启动无法启动
1 可以重新安装 kernel 包
2 mkinitrd /boot/initramfs-`uname -r`.img `uname -r ` 来恢复此文件
删除initramfsxxx重启之后修复
故障描述:针对centos 6
重启之后,出现菜单倒计时,之后黑屏 有个短横杠一直闪烁
虚拟机在重新开机启动时,按f2进入光盘引导 ---> 救援光盘模式--->进入shell 后 chroot /mnt/sysimage
cd /boot/ mkinitrd initramfs-`uname -r`.img `uname -r`
第二种方法 :
mount /dev/sr0 /mnt
rpm -ivh /mnt/Packagexxx --force

你可能感兴趣的:(第六周知识重点总结)