老方的博客

在线工具

centos command not found

command not found 解决办法

当不知道某个命令是哪个包装时,可以在已经有这个命令的主机上用下面的命令确定是哪个安装包安装的

yum whatprovides 命令路径或者命令的绝对路径

[root@db14 ~]# yum whatprovides /usr/sbin/ss
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
iproute-4.11.0-14.el7.x86_64 : Advanced IP routing and network device configuration tools
源    :base
匹配来源:
文件名    :/usr/sbin/ss



iproute-4.11.0-14.el7_6.2.x86_64 : Advanced IP routing and network device configuration tools
源    :updates
匹配来源:
文件名    :/usr/sbin/ss

常见command not found

ss:bash:command not found

yum install iproute -y

ifconfig:bash:command not found

yum install net-tools -y

vim:bash:command not found

yum install vim -y

sar:bash:command not found

yum install sysstat

brctl: command not found

yum install bridge-utils -y

arp: command not found
net-tools-2.0-0.24.20131004git.el7.x86_64 : Basic networking tools

centos7 fdisk磁盘分区格式化挂载

以 /dev/sdb 分一个区为例

fdisk -l  #查看没有分区的硬盘

fdisk /dev/sdb
n, 建立分区
p, 建立主分区
回车(使用默认分区号)
回车(使用默认起始扇区)
回车(使用默认结束扇区,如需指定分区大小可输入如 +20G), 
w, 保存

partprobe #重读分区表

mkfs -t xfs /dev/sdb1  #格式化

#临时挂载
mkdir /mnt/data
mount  /dev/sdb1 /mnt/data  

#修改/etc/fstab, 使分区自动挂载
vim /etc/fstab 添加
/dev/sdb1 /mnt/data     xfs     defaults    0 0 

#也可以使用lsblk -f 或者 blkid /dev/sdb1 查看磁盘的uuid来挂载
UUID=f502fa32-96bf-48e8-bdf0-166c1e74f8fa   /mnt/data     xfs     defaults    0 0 

mount -a

git 学习

git安装

下载安装

#windows
https://git-scm.com/download/win
#mac
https://git-scm.com/download/mac
#linux
apt install git 或 yum -y install git

编译安装

https://github.com/git/git/releases

yum install curl-devel expat-devel  openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
yum  remove git
wget https://github.com/git/git/archive/v2.23.0.tar.gz
tar xf v2.23.0.tar.gz 
cd git-2.23.0/
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
source /etc/bashrc
git --version

安装zsh和oh-my-zsh

安装 zsh 的目的是为了安装 oh-my-zsh,因为 oh-my-zsh 是基于 zsh 的一个主题。

安装 oh-my-zsh 的目的是为了更快速的学习 Git 的命令行操作,它能够给我们在输入一些 Git 命令时候提供很大的方便。

#mac
brew install zsh 

#linux
apt install zsh 或 yum -y install zsh

#安装 oh-my-zsh 
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

常用命令

要将代码推送到服务器通常会经历五个步骤:更新、检查,提交暂存,正式提交,推送。 即 pull -> status -> add -> commit -> push

#初始化一个本地版本仓库
git init   

#查看配置信息
git config user.name
git config user.email

#设置配置
git config --global user.name Denis
git config --global user.email 87702755@qq.com

#命令行修改配置
git config --global --replace-all user.name Denis
git config --global --replace-all user.email 87702755@qq.com

#修改配置文件
vim ~/.gitconfig

#拉取代码
git clone  https://xxxx         #https方式, 需要输入用户名和密码
git clone  git@gitee.com:xxx    #ssh方式, 需要把本机公钥添加到服务器

#同步远程代码
git pull

#检查改动文件
git status

#撤销更改
git checkout 文件名

#添加文件到缓存
git add 文件名 或者  git add .

#提交代码
git commit . -m  "备注内容"  或者 git commit 文件名 -m  "备注内容"

#推送代码
git push

分支学习

#主分支:master,默认分支

#新建分支
git branch 分支名

#查看分支
git branch

#切换分支(实际项目中,每个人都要在自己的分支上工作,最后再合并到如果要在master上面合并分支,需要先切回到master
git checkout 分支名

#合并分支
git merge 分支名字

#删除分支(如果分支没有合并不能删除)
git branch -d 分支名

#强制删除(如果分支没有合并要删除可以使用)
git branch  -D 分支名字

开发步骤

一个master,一个dev

  1. 新建一个dev
  2. 切换到dev进行开发
  3. 在dev添加文件并且提交文件
  4. 切换到master分支
  5. 将dev分支合并到master分支 git merge dev
  6. 推送master到服务端
  7. 继续切换到dev进行开发

冲突解决

a和b同时修改同一个文件的同一行代码就会产生冲突,如果a先push,那么b在push的时候就会报错。所以,为了保险起见,只要想向服务端push内容,首先需要pull内容,pull下来之后就会将服务端的代码和本地的代码进行合并,如果有冲突,就会显示冲突(git diff),如果没有冲突,那就合并成功,然后再push上去即可,如果有冲突,商量解决冲突即可。

git pull    #下拉文件
git diff    #查看冲突

参考文章

https://blog.csdn.net/ZZQHELLO2018/article/details/82354900

kvm常用操作

创建虚拟机

cp swarm03.xml vm-denis-cmdb1.xml

#name修改为 ssd/vm-denis-cmdb1
#cpu内核调整, 内存格式改为GIB(2处), 容量调整, ssdname修改为 ssd/vm-denis-cmdb1
#如不需指定mac地址,则需去掉<mac address='52:54:00:4F:BB:CF'/>, 如需指定则设置成网络中唯一的地址

vi vm-denis-cmdb1.xml

rbd list ssd
rbd snap list ssd/CentOS7Templet
rbd clone ssd/CentOS7Templet@base ssd/vm-denis-cmdb1  #复制快照
rbd resize  ssd/vm-denis-cmdb1 --size 30G   或者  virsh blockresize --domian vm-denis-cmbd1 --path vda --size 30G #调整硬盘大小 
virsh define  vm-denis-cmdb1.xml #从XML文件定义(但不启动)一个虚拟机
virsh start vm-denis-cmdb1

virsh list
virsh dumpxml <id>  #查看用于vnc view连接的端口

用vnc viewer连接192.168.252.82:<端口>后查看ip, 即可用xshell连接

登录虚拟机后操作

更改默认密码

关闭防火墙

增加公钥

关闭sshd里dns

快照操作

virsh -list -all

 -     vm-denis-k8s1                  shut off

rbd snap create ssd/vm-denis-k8s1@snapshot1   #创建快照(首先关闭虚拟机)
rbd snap ls ssd/vm-denis-k8s1  
virsh start vm-denis-k8s1  #启动虚拟机


rbd snap rollback ssd/vm-denis-k8s1@snapshot1  #恢复快照(关闭虚拟机后操作)
rbd snap rm ssd/vm-denis-k8s1@snapshot1  #删除快照
rbd snap purge ssd/vm-denis-k8s1 #删除多个快照

其它操作

virsh destroy <id> #停止虚拟机
virsh undefine vm-denis-cmdb1 #取消虚拟机

virsh create vm-denis-cmdb1.xml #一次性启动

virsh blockresize分情况
- 如果虚拟机是开机状态下,不用调rbd resize,直接调virsh blockresize就行,它会帮忙自动执行rbd resize或qemu-img resize
- 如果虚拟机是关机状态,则不用调该命令,直接调底层的resize,比如rbd就调rbd resize,qcow2就调qemu-img resize

rbd rm  ssd/vm-denis-cmdb1  #删除镜像

调整虚拟机硬盘大小

# 虚拟机查看原大小
[root@test ~]# fdisk /dev/vda -l

Disk /dev/vda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000bc509

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    41943039    20970496   83  Linux


#在82上调整成30G
[root@rxserver3 ~]# rbd resize  ssd/vm-denis-cmdb1 --size 30G
Resizing image: 100% complete...done.

[root@rxserver3 ~]# rbd --image ssd/vm-denis-cmdb1 info
rbd image 'vm-denis-cmdb1':
	size 30 GiB in 7680 objects
	order 22 (4 MiB objects)
	id: 7650c6b8b4567
	block_name_prefix: rbd_data.7650c6b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Wed Sep  4 17:04:55 2019
	parent: ssd/CentOS7Templet@base
	overlap: 20 GiB


# 虚拟机poweroff后重启, 再次查看大小

[root@localhost ~]# fdisk -l

Disk /dev/vda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000bc509

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    41943039    20970496   83  Linux

#重新分区, 这是在只有一个分区的情况下 

[root@localhost ~]# fdisk /dev/vda 
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p  
Partition number (1-4, default 1): 1
First sector (2048-62914559, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-62914559, default 62914559): 
Using default value 62914559
Partition 1 of type Linux and of size 30 GiB is set

Command (m for help): p

Disk /dev/vda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000bc509

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1            2048    62914559    31456256   83  Linux

Command (m for help): w  
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


# 重启虚拟机后操作
[root@localhost ~]# reboot

[root@localhost ~]# resize2fs /dev/vda1 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/vda1 is now 7864064 blocks long.

[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G  1.1G   27G   4% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  8.3M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           380M     0  380M   0% /run/user/0

参考文章

https://blog.51cto.com/wutou/1782931

https://blog.51cto.com/speakingbaicai/1161964

https://www.cnblogs.com/chenjiahe/p/5919426.html

mysql 学习

mysql 表连接

创建表并插入测试数据

CREATE TABLE Person (
    id int primary key auto_increment,
    name varchar(32) unique not null default '',
    sex bool not null default 1,
    age int not null DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE Address  (
    id int primary key auto_increment,
    p_id int not null,
    province varchar(32) not null default '',
    city varchar(32)  not null default ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8

insert into Person(name,age,sex) value 
("张三",1,28),
("李四",1,21),
("王五",1,33),
("赵六",0,11),
("元七",1,64),
("冯八",1,56)


insert into Adress(p_id,province,city) value 
(1,'北京','北京'),
(2,'上海','上海'),
(3,'江苏','南京'),
(4,'安徽','蚌埠'),
(5,'江苏','徐州'),
(5,'河北','雄安'),
(8,'广州','惠州')

左连接 右连接 内连接

内连接: 组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

左连接: left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

右连接: right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。 左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

#内连接
SELECT name,sex,age, Address.province, Address.city FROM Person INNER JOIN Address on Person.id = Address.p_id

#左连接
SELECT name,sex,age, Address.province, Address.city FROM Person LEFT JOIN Address on Person.id = Address.p_id

#右连接
SELECT name,sex,age, Address.province, Address.city FROM Person RIGHT JOIN Address on Person.id = Address.p_id

#使用AS示例(效果同左连接)
SELECT name,sex,age, A.province, A.city FROM Person as P INNER JOIN Address as A on P.id = A.p_id

显示效果

内连接

https://blog-1251258764.cos.ap-shanghai.myqcloud.com/mysql%20%E8%A1%A8%E8%BF%9E%E6%8E%A51.jpg

左连接

https://blog-1251258764.cos.ap-shanghai.myqcloud.com/mysql%20%E8%A1%A8%E8%BF%9E%E6%8E%A52.jpg

右连接

https://blog-1251258764.cos.ap-shanghai.myqcloud.com/mysql%20%E8%A1%A8%E8%BF%9E%E6%8E%A53.jpg

shell 常用脚本

centos7新装设置IP

ifcfg-eno1根据自己的名称变化,$1第一个参数为ip地址最后一位

使用方法: sh xx.sh 12

#! /bin/bash

# I 不区分大小写
sed -i 's/DHCP/none/Ig' /etc/sysconfig/network-scripts/ifcfg-eno1
sed -i 's/ONBOOT=no/ONBOOT=yes/Ig' /etc/sysconfig/network-scripts/ifcfg-eno1

cat>> /etc/sysconfig/network-scripts/ifcfg-eno1 <<EOF
IPADDR="10.255.201.$1"
PREFIX="24"
GATEWAY="10.255.201.1"
DNS1="10.255.201.1"
EOF

网站性能压力测试之ab命令

ab是Apache自带的压力测试工具。ab非常实用,它不仅可以对Apache服务器进行网站访问压力测试,也可以对其它类型的服务器进行压力测试。比如Nginx、Tomcat、IIS等。

一 ab原理

ab是apachebench命令的缩写。

ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。

ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。

二 ab安装

yum install httpd-tools

命令执行完成后,就可以直接运行ab。

三 ab参数说明

-n:在测试会话中所执行的请求个数。默认时,仅执行一个请求。

-c:一次产生的请求个数。默认是一次一个。

-t:测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。

-p:包含了需要POST的数据的文件。

-P:对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即是否发送了401认证需求代码),此字符串都会被发送。

-T:POST数据所使用的Content-type头信息。

-v:设置显示信息的详细程度-4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。

-V:显示版本号并退出。

-w:以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。

-i:执行HEAD请求,而不是GET。

-x:设置

属性的字符串。

-X:对请求使用代理服务器。

-y:设置

属性的字符串。

-z:设置

属性的字符串。

-C:对请求附加一个Cookie:行。其典型形式是name=value的一个参数对,此参数可以重复。

-H:对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如,”Accept-Encoding:zip/zop;8bit”)。

-A:对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。

-h:显示使用方法。

-d:不显示”percentage served within XX [ms] table”的消息(为以前的版本提供支持)。

-e:产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比’gnuplot’格式更有用。

-g:把所有测试结果写入一个’gnuplot’或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。

-i:执行HEAD请求,而不是GET。

-k:启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。

-q:如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。

四 ab性能指标

在进行性能测试过程中有几个指标比较重要:

吞吐率(Requests per second) 概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 计算公式:总请求数 / 处理完成这些请求数所花费的时间,即 Request per second = Complete requests / Time taken for tests

并发连接数(The number of concurrent connections) 概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

并发用户数(The number of concurrent users,Concurrency Level) 概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。

用户平均请求等待时间(Time per request) 计算公式:处理完成所有请求数所花费的时间/总请求数,即 Time per request=Time taken for tests/(Complete requests/Concurrency Level)

服务器平均请求等待时间(Time per request: across all concurrent requests) 计算公式:处理完成所有请求数所花费的时间 / 总请求数,即 Time taken for / testsComplete requests 可以看到,它是吞吐率的倒数。 同时,它也=用户平均请求等待时间/并发用户数,即 Time per request / Concurrency Level

五 ab实际使用

ab的命令参数比较多,我们经常使用的是-c和-n参数。

-n 100表示请求总数为100
-c 10表示并发用户数为10

下面表示处理100个请求并每次同时运行10次请求。

ab -n 100 -c 10 http://www.163.com/index.html

This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.163.com (be patient).....done


Server Software:        nginx  # 被测试的Web服务器软件名称
Server Hostname:        www.163.com   # 请求的URL主机名
Server Port:            80  # 监听端口

Document Path:          /index.html  # URL中的根绝对路径
Document Length:        697909 bytes # HTTP响应数据的正文长度

Concurrency Level:      10  # 并发用户数,我们设置的参数之一
Time taken for tests:   3.717 seconds # 压力测试消耗的总时间
Complete requests:      100  # 总请求数量,即并发数, 我们设置的参数之一
Failed requests:        0   # 表示失败的请求数量,指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。含有2XX以外的状态码,则会在测试结果中显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。
Write errors:           0   # 写入错误数
Total transferred:      69833401 bytes # 表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。
HTML transferred:       69790900 bytes # 表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。
Requests per second:    26.90 [#/sec] (mean)   # 吞吐率29.91[#/sec](mean) ,也叫QPS或者每秒请求数, 主要指标一
Time per request:       371.720 [ms] (mean)  # 用户平均请求等待时间, 3710/100/10,  主要指标二
Time per request:       37.172 [ms] (mean, across all concurrent requests)  # 单个用户请求一次的平均时间, 3717/100,  主要指标三
Transfer rate:          18346.24 [Kbytes/sec] received # 表示网络传输速度,计算公式:Total trnasferred/ Time taken for tests,统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       11   33  14.5     32      75
Processing:   189  318  57.5    318     453
Waiting:       12   37  16.2     36     107
Total:        240  351  57.4    348     473

# 用于描述每个请求处理时间的分布情况,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。
Percentage of the requests served within a certain time (ms)
  50%    348
  66%    377
  75%    389
  80%    407
  90%    433
  95%    455
  98%    465
  99%    473
 100%    473 (longest request)

对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息。

显示结果:

https://blog-1251258764.cos.ap-shanghai.myqcloud.com/ab1.jpg

其它使用场景

#ab进行app接口的压测:
ab -n 400 -c20  "http://www.xxx.com/api.php?sig=......";

将需要压测的接口,用  " " ;

#ab进行post传参的压测
#将 parm.txt放在和ab.exe相同的文件夹中,parm.txt中存放的是需要post格式传递的参数。-T :post请求的head头
ab -n 400 -c20  -p  parm.txt  -T "application/x-www-form-urlencoded" http://localhost:3000/login

运维经典面试题合集

1. 如何查看HTTP的并发请求数与其TCP连接状态?

netstat -n | awk '/^tcp/ {++b[$NF]} END {for(a in b) print a,b[a]}'

http://pyf0sj2ji.bkt.clouddn.com/%E8%BF%90%E7%BB%B4%E7%BB%8F%E5%85%B8%E9%9D%A2%E8%AF%95%E9%A2%98%E5%90%88%E9%9B%862.png

Linux 服务器打开文件数也是影响并发的重要一环,具体可以查看该文件配置:/etc/security/limits.conf

当然同级目录下面的 limits.d 目录下的的配置文件也需要关注,也可以使用 ulimit -n 查看当前的配置数量。

2. 查看每个IP地址的连接数

netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn

http://pyf0sj2ji.bkt.clouddn.com/%E8%BF%90%E7%BB%B4%E7%BB%8F%E5%85%B8%E9%9D%A2%E8%AF%95%E9%A2%98%E5%90%88%E9%9B%861.png

3. 通过tcpdump查看80端口访问量排前10

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -10

注意自己机器的 网卡名称

4. 统计access.log中访问量前10的IP

cat access.log | awk '{print $1}' | sort | uniq -c | sort -n -r | head -10

https://blog-1251258764.cos.ap-shanghai.myqcloud.com/%E8%BF%90%E7%BB%B4%E7%BB%8F%E5%85%B8%E9%9D%A2%E8%AF%95%E9%A2%98%E5%90%88%E9%9B%863.png

可以通过这个操作判断有些 非人为操作

5. 只查看/var/log 这一级目录下面的文件

find /var/log -maxdepth 1 -type f

简单的find命令考察,有意思的就是 -maxdepth 参数,如果不加默认会把该目录下的其它目录下的子文件也显示

这个在用于我们按照时间点删除某个目录下面的文件的时候特别有用

6. 生成32位的随机码

cat /dev/urandom | head -1 | md5sum | head -c 32

7. 如何查看二进制文件的内容?

一般通过 hexdump 命令查看,用法:hexdump -C 文件名,没怎么用过!

-C 是比较规范的 十六进制和ASCII码显示

-c 是单字节字符显示

-b 单字节八进制显示

-o 是双字节八进制显示

-d 是双字节十进制显示

-x 是双字节十六进制显示

显示样式: https://blog-1251258764.cos.ap-shanghai.myqcloud.com/%E8%BF%90%E7%BB%B4%E7%BB%8F%E5%85%B8%E9%9D%A2%E8%AF%95%E9%A2%98%E5%90%88%E9%9B%864.png

8. ps aux 中的 VSZ 代表什么意思,RSS 代表什么意思?

VSZ:虚拟内存集,进程占用的虚拟内存空间

RSS:物理内存集,进程战用实际物理内存空间

9. 如何检测并修复 /dev/hda1?

fsck 命令

不应该用 fsck 检查已挂载的磁盘,这很可能会对磁盘造成永久性的伤害。因此在开始使用 fsck 之前,我们需要使用命令来卸载磁盘

umount /dev/hda1

#检查文件系统错误并自动修复
fsck -a /dev/hda1

10. Linux 系统的开机启动顺序:

加载 BIOS –> 读取 MBR –> Boot Loader –> 加载内核 –> 用户层 init (根据 inittab 设定系统运行的等级:一般 3 或 5)–> init 进程执行 rc.syninit –> 启动内核模块 –> 执行不同级别运行的脚本程序 –> 执行 /etc/rc.d/rc.local –> 执行 /bin/login

11. 软连接和硬链接的区别:

软连接(符号链接),类似 windows 系统里的快捷方式 硬链接,类似复制了一份,但是会跟着文件的改变而改变,但是不会因为删除而影响另一个

#软链接
ln -s  123.txt 456.txt  #可以理解给给123.txt创建了一个快捷方式456.txt

#硬连接
ln 123.txt 456.txt

12. FTP 的主动模式和被动模式:

FTP 有两种工作方式:PORT 方式和 PASV 方式

PORT(主动):

  1. 客户端向服务端的 FTP 端口(默认是 21)发送连接请求
  2. 服务端接受连接,建立一条命令链路
  3. 传送数据时,客户端在命令链路上用 PORT 命令告诉服务端自己打开的随机端口
  4. 服务端从 20 端口向收到的客户端的随机端口发送连接请求,建立一条数据链路来传送数据

PASV(被动):

  1. 客户端向服务端的 FTP 端口(默认是21)发送连接请求,服务器接受连接
  2. 建立一条命令链路,当传送数据时,服务端通过命令链路自己打开随机端口
  3. 客户端向服务端的随机端口发送连接请求,建立一条数据链路来传送数据

13. 显示 /etc/inittab 中以 # 开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空字符的行

grep "^\#[[:space:]]\{1,\}.\{1,\}" /etc/inittab

https://blog-1251258764.cos.ap-shanghai.myqcloud.com/%E8%BF%90%E7%BB%B4%E7%BB%8F%E5%85%B8%E9%9D%A2%E8%AF%95%E9%A2%98%E5%90%88%E9%9B%865.png

说明:这个一般用于剔除注释内容

14. 显示 /tmp/1.txt 中包含了 :一个数字: 的行

grep "^\([0-9]\).*\1$" /tmp/1.txt

15. 批量添加 10 个用户,用户名为 user01 - user10,密码为 user 后面跟 5 个随机字符

#!/bin/bash
#1 是产生 0 -10 的数并按照格式输出,2 是产生密码随机数并截取,3 是命令行添加密码 

for i in `seq -f "%02g" 1 10`;do
    useradd user$i
    echo "user$i`echo $RANDOM|md5sum|cut -c 1-5`" | passwd --stdin user$i >/dev/null 2>&1
done

16. 判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些,能 ping 通则认为在线

#!/bin/bash

for ip in `seq 1 255`;do
    ping -c 3 192.168.1.$ip > /dev/null 2>&1
    if [ $? -eq 0 ];then
        echo "192.168.1.$ip UP"
    else
        echo "192.168.1.$ip DOWN"
    fi
done
  1. 删除一个目录下的所有文件,但保留一个指定文件
假设这个目录是/xx/,里面有file1,file2,file3..file10 十个文件
[root@oldboy xx]# touch file{1..10}
[root@oldboy xx]# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9


#方法一:find
[root@oldboy xx]# find /xx -type f ! -name "file10"|xargs rm -f
[root@oldboy xx]# ls
file10

[root@oldboy xx]# find /xx -type f ! -name "file10" -exec rm -f {} \;
[root@oldboy xx]# ls
file10

这两种一个通过xargs传参,一个通过find的-exec执行命令参数来完成,都算作find吧

#方法二:rsync
[root@oldboy xx]# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
[root@oldboy xx]# rsync -az --delete --exclude "file10" /null/ /xx/
[root@oldboy xx]# ls
file10

#方法四
find ./ -type f|grep -v "\file10\b"|xargs rm -f
 

#方法五
rm -f `ls|grep -v "\file10\b"`

 

从运维角度,任何删除性的操作都应该事先备份后在执行或者确认有备份存在。

参考文章

本面试题合集主要来自众多运维博主的文章, 主要来自:

Linux 运维工程师经典面试题合集

linux运维面试题

Kubernetes权威指南 1.3案例部署

环境

[root@master1 ~]# kubectl get node -o wide
NAME      STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
master1   Ready    master   91m   v1.15.4   192.168.252.79   <none>        CentOS Linux 7 (Core)   4.4.195-1.el7.elrepo.x86_64   docker://19.3.2
node1     Ready    <none>   89m   v1.15.4   192.168.252.88   <none>        CentOS Linux 7 (Core)   4.4.196-1.el7.elrepo.x86_64   docker://19.3.2
node2     Ready    <none>   81m   v1.15.4   192.168.252.89   <none>        CentOS Linux 7 (Core)   4.4.196-1.el7.elrepo.x86_64   docker://19.3.2

创建mysql 服务

vim mysql-rc.yaml

apiVersion: v1
# 副本控制器RC
kind: ReplicationController
metadata:
  # rc的名称, 全局唯一
  name: mysql
spec:
  # 期待创建的pod个数
  replicas: 1
  selector:
    # 选择符合拥有此标签的pod
    app: mysql
  # 根据模板定义的信息创建pod  
  template:
    metadata:
      labels:
        # pod 拥有的标签,对应上边 RC 的 selector
        app: mysql
    # 定义 Pod 细则     
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        # 容器应用监听的端口号
        ports:
        - containerPort: 3306
        # 注入到容器中的环境变量
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

vim mysql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
   - port: 3306
  selector:
    app: mysql

开始创建服务

kubectl apply -f myql-rc.yaml 
kubectl apply -f myql-svc.yaml 

创建 Tomcat 服务

vim myweb-rc.yml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080
        env:
          - name: MYSQL_SERVICE_HOST
            value: 'mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'

上面文件中已用了 MYSQL_SERVICE_HOST、MYSQL_SERVICE_PORT 环境变量,mysql正是上文中定义的 MySQL 服务名。

vim myweb-svc.yml

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
   - port: 8080
     nodePort: 30001
  selector:
    app: myweb
~                

开始创建服务

kubectl apply -f myweb-rc.yaml 
kubectl apply -f myweb-svc.yaml 

验证

[root@master1 ~]# kubectl get pod,svc -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod/mysql-mpqwv   1/1     Running   0          19m   172.32.2.5   node2   <none>           <none>
pod/myweb-5fw65   1/1     Running   0          17m   172.32.2.6   node2   <none>           <none>
pod/myweb-jn5xv   1/1     Running   0          17m   172.32.1.6   node1   <none>           <none>

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE    SELECTOR
service/kubernetes   ClusterIP   172.16.0.1       <none>        443/TCP          102m   <none>
service/mysql        ClusterIP   172.21.225.229   <none>        3306/TCP         39m    app=mysql
service/myweb        NodePort    172.25.154.78    <none>        8080:30001/TCP   32m    app=myweb

浏览器访问 http://192.168.252.79:30001/demo/ 验证

参考文章

https://blog.csdn.net/wo18237095579/article/details/89376877

使用kubeadm工具快速安装k8s集群

机器配置

master 192.168.252.79 node1 192.168.252.88 node2 192.168.252.89

准备工作(三台机器执行)

# 关闭selinux

setenforce 0
sed --follow-symlinks -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭防火墙

systemctl stop iptables && systemctl disable iptables
systemctl stop firewalld  && systemctl disable firewalld


# 修改hostname

hostnamectl set-hostname 主机名

# 所有机器添加hosts

echo "192.168.252.79 master1" >> /etc/hosts
echo "192.168.252.88 node1" >> /etc/hosts
echo "192.168.252.89 node2" >> /etc/hosts

# 安装gcc开发工具等
yum install -y  gcc*   

yum install -y vim-enhanced wget  bash-completion  lrzsz ntpdate sysstat iftop htop dstat lsof chkconfig unzip telnet nmap net-tools git bzip2  bind-utils

yum install -y expat-devel  pcre-devel libxml2-devel  openssl openssl-devel  bzip2-devel  libjpeg-devel  libpng-devel   freetype-devel    libXpm-devel  libmcrypt-devel   libaio  libaio-devel  php-mysqlnd   mysql-devel gd-devel  gdbm-devel  glib2-devel  libdb4-devel    libdb4-devel  libicu-devel   libxslt-devel   readline-devel    xmlrpc-c   xmlrpc-c-devel curl-devel yum-utils device-mapper-persistent-data lvm2  conntrack-tools

# 时间同步

ntpdate 1.cn.pool.ntp.org

echo "*/15 * * * * /usr/sbin/ntpdate 1.cn.pool.ntp.org  >/dev/null 2>&1"  >>/var/spool/cron/root

# 升级/重启

yum update -y 
reboot

# 配置免密登录

把公钥传去其他每台机器,当然如果借助ansible或者脚本之类更方便

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.252.62
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.252.63
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.252.64

# 机器参数修改

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl -p /etc/sysctl.d/k8s.conf

升级最新稳定版内核(选做)

#!/bin/bash
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum history new
yum -y --disablerepo=* --enablerepo=elrepo-kernel install kernel-lt   #lt长期稳定版 ml最新版
grub2-set-default 0

reboot

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager –add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看最新的Docker版本

yum list docker-ce.x86_64 –showduplicates |sort -r

yum makecache fast yum install –setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y systemctl start docker && systemctl enable docker

卸载docker

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

安装kubeadm和相关工具

cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF

yum install -y kubelet kubeadm kubectl –disableexcludes=Kubernetes 或者 yum install kubelet-1.15.4 kubeadm-1.15.4 kubectl-1.15.4 –disableexcludes=kubernetes

systemctl enable kubelet.service && systemctl start kubelet.service

安装master

kubeadm config print init-defaults > init-config.yaml #获取默认的初始化参数文件

编辑 init-config.yaml , 定制镜像仓库地址,pod地址范围,service地址范围, 完整内容如下

apiVersion: kubeadm.k8s.io/v1beta2
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.15.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: "172.16.0.0/16"
  podSubnet: "172.32.0.0/16"
scheduler: {}
kubeadm config images pull  --config=init.config.yaml  #下载镜像
kubeadm init  --config=init.config.yaml #初始化安装

安装成功最后底下文字

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.252.79:6443 --token fu6k4l.5b4jspxqxajsd2la \
    --discovery-token-ca-cert-hash sha256:ee0836e5ac9db0780a190a19c46323d0a32909d758632703b3340a0c30b34228 
#执行操作
[root@master1 ~]# mkdir -p $HOME/.kube
[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

去除master上污点

kubectl taint nodes –all node-role.kubernetes.io/master-

安装node

kubeadm config print join-defaults > join-confog.yaml

编辑 join-confog.yaml, apiServerEndpoint值为master的ip, token和tlsBootstrapToken的值来自使用kubeadm init 安装master的最后一段信息

apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.252.79:6443
    token: fu6k4l.5b4jspxqxajsd2la
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: fu6k4l.5b4jspxqxajsd2la
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: node1
  taints: null
kubeadm join --config=join-defaults.yaml #将node加入集群

安装网络插件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

修改 kube-flannel.yml, pod范围要和之前init-config.yaml中匹配

  net-conf.json: |
    {
      "Network": "172.32.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
kubectl apply -f kube-flannel.yml 

验证

[root@master1 ~]# kubectl get -n kube-system configmap
NAME                                 DATA   AGE
coredns                              1      45m
extension-apiserver-authentication   6      45m
kube-flannel-cfg                     2      36m
kube-proxy                           2      45m
kubeadm-config                       2      45m
kubelet-config-1.15                  1      45m

[root@master1 ~]# kubectl get node
NAME      STATUS   ROLES    AGE   VERSION
master1   Ready    master   45m   v1.15.4
node1     Ready    <none>   43m   v1.15.4
node2     Ready    <none>   35m   v1.15.4

[root@master1 ~]# kubectl get -n kube-system pod
NAME                              READY   STATUS    RESTARTS   AGE
coredns-6967fb4995-dtjcj          1/1     Running   0          45m
coredns-6967fb4995-g27s2          1/1     Running   0          45m
etcd-master1                      1/1     Running   0          44m
kube-apiserver-master1            1/1     Running   0          44m
kube-controller-manager-master1   1/1     Running   0          44m
kube-flannel-ds-amd64-9245r       1/1     Running   0          35m
kube-flannel-ds-amd64-95gnl       1/1     Running   0          37m
kube-flannel-ds-amd64-r29pl       1/1     Running   0          37m
kube-proxy-6rls8                  1/1     Running   0          45m
kube-proxy-c5zs7                  1/1     Running   0          35m
kube-proxy-lhsxn                  1/1     Running   0          43m
kube-scheduler-master1            1/1     Running   0          44m

其它命令

kubeadm reset #重置
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

参考

https://blog.51cto.com/michaelkang/2432048

本博客仿照MING哥的博客完成,在此特别感谢MING哥的支持和帮助。

Read the Docs v: latest
Versions
latest
Downloads
pdf
html
epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.