1. 概述:
极客时间发表了 linux 知识体系的知识图谱,在参照其地图整理学习 linux 过程中,对原内容做了整理修改,并增加了容器篇等内容,图谱不少内容抄自原地图,分享一下:
2. 基础篇
2.1 Linux常见发行版本
- Red Hat
- Ubuntu
- CentOS
- Debian
- Fedora
2.2 目录结构
- /bin 最常用命令存放目录
- /boot linux 启动时核心文件,包括连接文件以及镜像文件
- /dev Linux 外部设备,linux 一切都是文件
- /etc 系统管理员需要配置的文件和子目录
- /home 所有用户的主目录,按照用户名建立子目录
- /lib 系统最基本的动态连接共享库
- /lost+found 非法关机时存放临时文件
- /media linux 系统自动识别的一些设备,比如 U 盘,光驱
- /mnt 用户临时挂载的文件系统,比如挂载光驱的光盘
- /opt 主机额外安装软件的目录,比如 oracle 安装
- /proc 虚拟目录,系统内存的映射,通过这个目录获取系统信息,比如进程信息等
- /root 系统管理员主目录
- /sbin 存放系统管理员使用的系统管理程序
- /selinux 安全机制 selinux 的目录(redhat/centos 特有)
- /srv 服务启动后需要提取的数据
- /sys linux2.6内核新目录,sysfs 文件
- /tmp 临时文件目录
- /usr 用户自身的程序与文件目录
- /usr/bin 系统用户使用的应用程序
- /usr/sbin 系统管理员的应用程序和守护程序
- /usr/src 内核源代码默认的放置目录
- /var 存放不断扩充的东西,包括日志文件等
- /run 临时文件系统,存储系统启动以来的信息
3.系统操作篇
3.1 使用终端
1. 命令提示符
$ 普通用户
# root 用户
2. 命令和路径补全: tab 键
3. 命令的分类(使用 type 查看某个命令的所属分类) type ls
3.2 帮助命令
1. man
man xxx: 获取 xxx 命令的帮助
man 1 man:查看 man 命令自身的帮助
2. help
help xxx: 获取内部命令的帮助
xxx --help: 获取外部命令的帮助
3. info
比 man 更丰富的帮助信息,格式:info xxx
3.3 文件与目录管理
1. 文件与目录查看命令:ls
-l 显示文件的详细信息
-a 显示隐藏文件
-r 逆序显示
-t 按时间排序
-R 递归显示
2. 建立和删除目录
mkdir 新建目录
rmdir 删除空目录
rm -r 递归删除目录与文件
3. 路径操作(绝对路径与相对路径)
cd 进入指定路径
pwd 显示当前路径
4. 通配符
* 匹配任意字符
? 匹配单个字符
[xyz] 匹配 xyz 任意一个字符
[a-z] 匹配字符串
[|xyz]或[^xyz] 匹配不在 xyz 中的任何字符
5. 复制文件cp
-r 复制目录
-p 保留用户权限时间
-a 尽可能保留原始文件的属性,等同于-dpr
6. 删除文件 rm
-r 递归删除
-f 不提示
7. 移动与重命名 MV
移动文件 mv file1 dir1/
重命名文件 mv file1 file2
3.4 文本查看
1. head
head -n 20 显示前20行
2. tail
tail -f -n 300 显示结尾300行并刷新
3. cat
cat filename |more
4. wc
cat filename|grep 'name' | wc -l 统计行数
3.5 打包和压缩
1. tar
命令
-c:创建新的tar文件
tar -zcvf /tmp/etc.tar.gz /etc 打包并以 gz 方式压缩文件
-x:解开tar文件
tar -zxvf /tmp/etc.tar.gz 解压以gzip压缩的文件
-t:列出tar文件中包含的文件的信息
tar -tvf /tmp/etc.tar
-r:附加新的文件到tar文件中
参数
-z:使用gzip进行解压缩
tar -zcvf /tmp/etc.tar.gz /etc
-j:使用bzip2进行解压缩
tar -jcvf /tmp/etc.tar.bz2 /etc
-Z:使用compress进行解压缩
tar -Zcvf /tmp/etc.tar.Z /etc
-v:显示解压缩执行过程
-f:指定要处理的文件名
2. gzip
gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ]
gzip -c file1 file2 > foo.gz
gzip -ld 1.c.gz //解压,并显示详细过程
3. bzip2
bzip2 [-cdfhkLstvVz][--repetitive-best][--repetitive-fast][- 压缩等级][要压缩的文件]
bzip2 -v temp.bz2 //解压文件显示详细处理信息
bzip2 -c a.c b.c c.c 压缩文件
3.6 vim 文本编辑器
3.6.1. 正常模式
浏览和修改文本内容
默认打开模式,其他模式按Esc 键就可以返回正常模式
3.6.2. 命令模式(底线)
- 保存操作命令
:q 退出程序
:w 保存文件
ZQ | :q! 强制退出并忽略所有更改
:e! 放弃所有修改,并打开原来文件
ZZ | :wq | :x 保存并退出
* 查找命令
/text:查找text,按n查找下一个,按N查找前一个
?text:查找text,反向查找,按n查找下一个,按N查找前一个
:set ignorecase/noignorecase 忽略/不忽略 大小写的查找
:set hlsearch/nohlsearch 高亮搜索结果/关闭高亮,所有结果都高亮显示,而不是只显示一个匹配。
:nohlsearch 关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮;
:set incsearch 逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。
:set wrapscan 重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。
- 其它
:set number/nu 显示行号
:!command 执行 shell 命令 command
:n,m w!command 将文件中 n 行到 m 行的内容作为 command 的输入并执行,若不指定 n,m,则代表整个文件内容作为 command 执行
:r!command 将命令 command 的输出结果放到当前行
:set nonu 取消行号
:r filename 把 filename 文件的内容插入到当前光标所在位置下
ctrl + g 当前行信息
g ctrl + g 字数统计
- 替换命令
:s/regexp/replacement 替换当前行第一个匹配
:S/regexp/replacement 替换当前行所有匹配
:n,\$s/regexp/replacement/ 替换n行到最后一行中第一个匹配
:n,$S/regexp/replacement/g 替换第 n 行到最后的每个匹配
- 多行拷贝移动
:n,m co p 将行 n 到 m 行之间的内容拷贝到第 p 行下
:n1,n2 m p 将 n1行到 n2行之间的内容移动到第 p 行下
3.6.3. 插入模式
- 进入插入模式
i 在光标所在字符前开始输入文字并进入插入模式
a 在光标所在字符后开始输入文字并进入插入模式
o (字母o) 在光标所在行的下面单独开一新行来输入文字并进入插入模式
s 删除光标所在的字符并进入插入模式
I 在行首开始输入文字并进入插入模式。此行首指第一个非空白字符处。如果行首有空格,则在空格之后输入文字并进入插入模式
A 在行尾开始输入文字并进入插入模式。这个好用,您不必管光标在此行的什麽地方,只要按 A 就会在行尾等着您输入文字。
O (大写字母O) 在光标所在行的上面单独开一新行来输入文字并进入插入模式。
S 删除光标所在行并进入插入模式
删除命令
行删除
D | d$ 删除光标到行尾
d^ 删除至行首
dd 删除行
dnG 删除第 n 行到当前行
dG 删除当前行到最后一行
S 删除当前行且处于可编辑状态
C 删除到行尾,并处于可编辑状态
:n,m d 将第 n 行到 m 行的内容删除
字符删除
x 向后删除一个字符
nx 向后删除 n 个字符
X 向前删除一个字符
nX 向前删除 n 个字符
s 删除光标所在字符,并处于可编辑状态
i 在光标前插入
a 在光标后插入
单词删除
diw 删除光标所在单词,不包括空白字符
daw 删除光标所在的单词,包括空白字符
dw 当前光标位置删除到下一个单词词首
ndw | ndW 删除光标处开始及最后的 n-1个词
- 复制粘贴命令
yy 复制当前行
nyy 复制从当前行开始的 n 行
ynw 复制 n 个单词
ynl 复制 n 个字符
y$ 复制当前光标至行尾处
p 粘贴到光标之后
P 粘贴到光标之前
- 移动命令
单词
w 下一个单词第一个字符
W 下一个长单词第一个字符
e 下一个单词最后字符
E 下一个长单词最后一个字符
b 前一个单词第一个字符
B 前一个长单词第一个字符
ge 前一个单词的最后一个字符
行
$ 行尾
0(数字) 行第一个字符
^ 第一个非空字符
gg 第一行
G 到最后一行
nG 到第 n 行
屏幕
ctrl+u 向上滚动半屏
ctrl+d 向下滚动半屏
Pgup | ctrl+b 向上滚动一屏
PgDn | ctrl + f 向下滚动一屏
句子
( 句首
) 句尾
段落
{ 段首
} 段尾
- 其它
撤销与重复
u 撤销前次操作
ctrl + r 重复前次操作
:e! 文档还原原始状态
3.6.4. 可视模式
3.7 用户管理
3.7.1 用户命令
- 用户主目录/home /root
- 常用用户命令
useradd -p 'PASSWORD' ${USERNAME} 添加用户
userdel 删除用户
passwd 设置用户密码
usermod 修改用户信息
groupadd 添加组
groupdel 删除用户组
- 以管理员身份运行
su 切换当前用户身份
sudo 用 root 身份执行某条命令
visudo 修改 sudo 命令配置文件
3.7.2 用户配置文件
/etc/passwd 用户信息配置文件
/etc/shadow 用户密码信息配置文件
3.8 权限管理
权限的表示方法
- 文件权限
r 读权限
w 写权限
x 执行权限
- 目录权限
rx 进入目录读取文件名
wx 修改目录内文件名
x 进入目录
- 特殊权限
/etc/passwd 用户信息配置文件
2.权限的相关命令
chmod 修改权限
chown 更改属主,属组
chgrp 修改属组
4.系统管理篇
4.1 正则表达式
- 正则表达式是什么
对字符串操作的一组逻辑公式
用于对符合规则的字符串进行查找和替换
- 初识元字符
^ 字符开始位置
$ 字符结束位置
. 单个换行之外所有字符
3.扩展元字符
- 匹配字符内容
\d 单个数字0-9
\D 单个非数字 a,-,'
\w 单个字母,数字,下划线 a,1,_
\W 非字母、数字、下划线 {,-,[
\s 空白字符 单个空格、回车(\n)、制表符(\t)
\S 非空白字符
. 换行以外的所有字符
- 匹配次数
* 0次及0次以上 \d* 匹配数字,123,02,空
+ 1次及1次以上 \d+ 匹配数字 123,02,3
? 0次或1次 \d? 匹配数字,2、空
{m,n} m次到n次 \d{1,3} 匹配数字,2、12、123
{n} n次 \d{2} 匹配数字,12
{n,} n次及n次以上 \d{2,} 匹配数字,12、123、1234
- 分组符号
() 分组匹配的内容可以在后续的正则中重复使用,只需要指定分组的序号即可。分组的序号是从左往右以此递
- 匹配位置
^ 字符串开始位置 (^)abc 匹配字符串开头位置,a前面的位置
$ 字符串结束位置 abc($) 匹配字符串结束位置,c后面的位置
\b 单词(\w)与非单词之间的位置 a(\b)= 匹配"a"与"="之间的位置
\B 字符与字符之间的位置 a(\B)b 匹配"a"与"b"之间的位置
- 其它元字符
[] 匹配范围 [a-zA-Z] 匹配单个英文字母
^ 在上面的匹配位置元字符中,仅仅介绍了匹配字符串开头位置的作用,这里另外一个作用就是放在范围元字符中,起到取反的作用 [^a-d] 匹配单个非a,b,c,d四个英文字母之外的字符
\ 转义元字符 1\+ 匹配"1+"
| 分支条件 ab|cd 匹配ab、cd
## 4.2 软件安装与更新
- RPM 安装
-i 安装
-q 查询
-U 升级
-e 卸载
2.移动与重命名
安装 yum install xxx
卸载 yum remove xxx
更新 yum update xxx
3.源代码编译安装
./configure
make
make install
4.3 文本与文件查找
- grep
-i 忽略大小写
-v 反转
-a 处理二进制文件
-R 递归方式
- find
-name 按照文件名搜索
-perm 按照权限搜索
-user 按照属主搜索
-type 按照文件类型搜索
4.4 网络配置
- 网络配置命令
ifconfig 查看和配置网络接口
ip 查看和配置网络,路由
netstat 查看进程监听端口和状态
network 与 NetworkManager 网络管理脚本
- 配置文件
ifcfg-eth0 etho 网卡配置文件
networking 主机名配置文件
resolv.conf 域名配置文件
## 4.5 防火墙
SELinux
- 访问控制方式分类
DAC 自主访问控制
MAC 强制访问控制
- 常用命令
getenforce 查看 selinux 状态
setenforce 修改访问状态
- 配置文件
/etc/selinux/config
enforcing 强制控制
permissive 通知但不强制控制
disable 禁用访问控制
iptables
- 表
filter 用于过滤
nat 用于地址转换
- 链
INPUT 进入本主机方向
OUTPUT 本主机发出方向
FORWARD 转发方向
PREROUTING 路由向前转换
POSTROUTING 路由后转换
- 选项
-i -o 接口
-s -d IP 地址/子网掩码
-p tcp/udp 指定协议
--sport 源端口
--dport 目标端口
-j 动作
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
tcpdump
- 保存和读取规则
-r filename 从文件读取已经抓取的数据包
-w filename 将抓取的数据包保存至文件
- 常用选项
-v 显示详细信息
-n 不将 IP 地址解析为主机名
-i 接口 例如 -i eth0
host 主机
port 端口
- 常用过滤
过滤主机 tcpdump -i eth1 src/dst host 192.168.1.1
过滤端口 tcpdump -i eth1 src/dst port 25
网络过滤 tcpdump -i eth1 src/dst net 192.168
协议过滤 tcpdump -i eth1 tcp
表达式过滤 tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
-i eth1 : 只抓经过接口eth1的包
-t : 不显示时间戳
-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
-c 100 : 只抓取100个数据包
dst port ! 22 : 不抓取目标端口是22的数据包
src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
4.6 服务与日志
1.服务状态的查看
service 用法: service 服务名称 start|stop|restart|status
systemctl: 用法: systemctl start|stop|restart|status 服务名称 service
service list: systemctl list-unit-files chkconfig --list
2.服务配置文件 /etc/systemd/system/*.service
3.常用系统日志
/var/log 系统日志默认目录
message 系统日志
dmesg 内核启动日志
secure 安全日志
- 应用程序日志
4.7 磁盘分区
- 链接文件
符号链接 ln -s 源文件 目标文件(目标文件不能事先存在)
硬链接 ln 源文件 目标文件
- mount 挂载命令
-t 文件系统类型
-o 挂载选项
ro 只读挂载
rw 读写挂载
remount 重挂载
3.配置文件 /etc/fstab 启动自动加载分区信息
fdisk 分区工具
-l 查看分区信息
fdisk /dev/sdx 为某一存储分区
mkfs 格式化 mkfs.ext4
parted -l 查看分区信息
## 4.8 文件系统
- 常用命令
df -l
查看分区所占磁盘空间信息
du -a
du -ah --max-depth=1 查看当前目录下每个目录所占磁盘大小
mkfs 格式化系统
mkfs.ext4 -i 1048576 -n /dev/sdc
列出系统打开文件 lsof
lsof -D /path 指定路径显示,-D 递归所有子目录和文件
lsof -c java 列出 java 程序打开的文件
lsof -u user 显示指定用户打开的文件
lsof -i 符合条件 lsof -i tcp:80
lsof -p 234 234进程打开的文件
lsof -g gid 显示用户组打开文件
- ext4
- XFS
4.9 Linux 系统启动过程与故障修复
4.9.1 系统启动过程
- Power on
BIOS
- 上电自检POST
- 初始化硬件: 显卡.内存.时间.磁盘
- 查找启动介质:CD-ROM,PXE,HDD
- 查找加载磁盘上的启动扇区 .
MBR(主引导记录)
- BootLoader 446bytes
- Partition Table 64bytes: 分区 ID,起始磁柱,数量,最多4个
- Magic Number 有效性验证 2bytes .
- GRUB(多系统引导)
stage_1 就是MBR,装载 stage_2
stage_1.5 识别文件系统,引导 stage_2
stage_2 /boot/grub/grub.conf,查找并装载Kernel到内存,将控制权从 GRUB 交给 Kernel . - Kernel 内核引导
核心程序 Kernel, 保留最基本模块,GRUB读取后解压 Kernel镜像
initrd 临时 rootfs,挂载驱动和 rootfs 后从内存清除 . sys init 系统初始化
/sbin/init
(1). /etc/inittab 初始化键盘,字体,网络,装载模块 (2)./etc/rc.d/rc.sysinit 执行初始化脚本 /etc/fstab /etc/rd.d/rc.local (3).初始化进行基本配置
1. 获取网络环境与主机类型:读取网络环境设置文件"/etc/sysconfig/network",获取主机名与默认网关等网络环境。
2.测试与载入内存设备/proc及usb设备/sys 除/proc外,主动检测是否有usb设备并加载usb驱动,载入usb文件系统
3.根据配置决定是否启动SELinux
4.接口设备的检测与即插即用(pnp)参数的测试
5.用户自定义模块的加载。用户"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中
6.加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能
7.设置系统时间(clock)
8.设置终端的控制台的字形
9.设置raid及LVM等硬盘功能
10.以方式查看检验磁盘文件系统。
11.进行磁盘配额quota的转换。
12.重新以读取模式载入系统磁盘。
13.启动quota功能
14.启动系统随机数设备(产生随机数功能)。
15.清除启动过程中的临时文件
16.将启动信息加载到"/var/log/dmesg"文件中
(4). 执行/etc/rc.d/rc*.d(*=0~6)脚本: Snn Script
b. /sbin/mingetty
/etc/login
- 启动完成 (使用控制台)
/etc/X11/prefdm
gdm 进入 Gnome 桌面环境
kdm 进入 KDE 桌面环境
xdm 进入 X window 桌面环境
Xinit
(gdm 进入 Gnome 桌面环境, kdm 进入 KDE 桌面环境, xdm 进入 X window 桌面环境)
~/.xinitrc
~/.xserverrc
4.9.2 更新内核版本
* RPM方式更新
* 源代码编译方式更新
## 4.10 逻辑卷与 LVM
- 分层管理磁盘Logical Volume Manager
- LVM 分为三层
PV(物理卷,最底层,物理硬盘或者分区)
PE,物理区域,用于分配的最小存储单元
VG:卷组,在 PV 之上,包含多个 PV
LV:逻辑卷,VG 之上,相当于分区概念,大小可以改变
- 常用命令
pvcreate /dev/sdb1 在分区上建立 PV
pvs 查看 pv 信息
pvdisplay 查看 pv 详细信息
vgcreate vg1 /dev/sdb1 将建立的 pv 加入 vg1组
vgs/vgdisplay 查看 vg 详细信息
lvcreate -L 200M -n lv1 vg1
lvs/lvdisplay 查看 lv 详细信息
5. Shell 篇
## 5.1 认识 BASH
- shell 是命令解析并在内核执行,返回结果
shell 脚本的用处
- 组合系统命令实现自动化功能
- 组成脚本的基本元素是命令,不用深入账务系统函数集
内建命令和外部命令
- 内部命令不会建立子进程,但是对子 shell 无效
- 外部命令会创建子进程
5.2 管道与重定向
- 管道符 |
- 重定向符
< 输入重定向
> 输出重定向,覆盖方式
>> 输出重定向,追加方式
- sort 对文本进行排序
- join 连接2个字符串
5.3 进程与内存查看调整
- 进程查看命令: ps top 对系统进程排序查看
内存查看命令
- free 查看系统的内存使用率
- sar 显示详细的系统运行状态,用于排查故障
- 流量监控工具: iftop 查看某一进程的网络流量
5.4 变量与环境变量
变量的定义
- shell 变量无需声明
- 销毁变量 unset 变量名
- 变量的赋值: 变量名=变量值
- 环境变量: path 变量解析路径
环境变量定义文件
- /etc/profile 系统环境变量默认保存文件
- /etc/bashrc shell 执行初始化配置新闻
5.5 转义与引用
- 特殊符号
- 转义符 /
引用符号
单引号 '' 双引号 ""
5.6 循环
while 循环
- while 循环根据 while 判断结果确定是否继续执行
- 判断结果为命令的返回值,0继续执行
- 如果判断结果为0,无法到达循环结束成为死循环
2.for 循环 - Shell 的 for 循环使用遍历方式 for ... in ...格式
- for 循环支持 c 语言写法,需要使用(())格式
- 支持使用 break,continue 对循环进行控制
- for 循环支持嵌套使用
5.7 函数
- 函数的定义
定义方法: 函数名(){}
2.函数的使用
直接使用函数名()
5.8 计划任务
一次性计划任务 at
2.周期性计划任务 cron- 查看 crontab -l
- 编辑 crontab -e
5.9 运算符
- 运算符号 + - * / 加减乘除
- 弊端 运算速度低,对浮点运算支持不好
5.10 测试与判断
test 测试
- 书写 if test $[num1] -eq $[num2]
- 数值测试 -eq -ne -gt -ge -lt -le
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"
返回结果:result 为:11
- 字符串测试 = != -z -n (字符串的长度为零)
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
= 等于为真
!= 不等于为真
-z 字符串 字符串长度为0 则真
-n 字符串 长度不为0则真
- 文件测试
-e 文件名 存在为真
-r 文件名 存在且可读为真
-w 文件名 存在且可写为真
-x 文件名 存在且可执行为真
-s 文件名 存在且至少一个字符为真
-d 文件名 存在且为目录为真
-f 文件名 存在且为普通文件为真
-c 文件名 存在且为字符型特殊文件为真
-b 文件名 存在且为块特殊文件为真
if 判断
- if : if condition command1 then command2 fi
- if else
- if else-if else
- case 分支
case 值 in
模式1)
command1
commandN
;;
模式2)
command1
commandN
;;
esac
6 文本操作篇
6.1 SED
6.1.1 sed 基础
1. 字符流编辑器
2. sed [options] [sed-commands] [input-file]
3. sed [查找条件] [操作命令] 文件
6.1.2 查找条件
1. 数字、正则表达式组合定位
2. 数字定位 删除第2行 sed '2d' file
3. 正则表达式 加/ 例如: 包含 john 的行 sed '/john/d' file 以 john 开头的行 sed '/^john/d' file
4. 逗号分割线 第1行与第3行之间的范围 sed '1,3d' file west 和 east 之间的所有行 sed '/west/,/east/d' file
5. 组合方式 第1行到 west 所有行 sed '1,/west/d' file
6. 特殊情况 $删除最后一行 sed '$d' file
6.1.3 选项
- -n 输出到屏幕,取消默认打印
sed -n '3p' file 显示第几行
查找1-3行 sed -n '1,3p' file
查找指定几行 sed -n '1p;3p;5p' file
显示 包含 'Thread-70' 到 'DiamondEnv'行之间的行 sed -n '/Thread-70/,/DiamondEnv/p' ./diamond-client.log
显示1-5行并显示行号
- -e 多重编辑
- -f 指定 sed 脚本文件
- -r 正则扩展使用
- i 插入 在当前行上添加一或者多行: sed -i 's/root/world/g' yum.log 用world 替换yum.log文件中的root真实写入
6.1.4 基础命令
- a 追加 在某一行追加内容
sed '$a106,wuxingge,UFOn107,lee,XO' file 最后一行 - d 删除
d 删除行 sed '2,50d' file 删除不显示2-50行内容 - s 替换
sed 's/west/north/g' file 将 west 替换为 north,g 表示全局替换 - c 更改
sed '2,5c replacechars' 替换2-5行内容为 replacechars - r 读取文件
sed '/root/ r /var/log/test.txt' yum.log yum.log 匹配root后读入text.txt的内容在匹配内容之下 - w 写文件
sed '/root/ w /home/omc/root.txt' yum.log 【yum.log匹配root后写入root.txt',真实写入】 - q 退出
- y 替换
- p 打印
6.1.5 高级命令
- 多行命令
N 将多行最佳到模式空间进行处理
D 删除多行模式空间的第一个字符至第一个换行符,并返回到脚本的开头执行
P 输出模式空间中的第一个字符至第一个换行符号 - 保持空间模式
h 将模式空间内存存储至保持空间,覆盖保持空间内容 sed -e '/John/h' -e '$G' file
H 将模式空间内存存储至保持空间,追加到保持空间内容
g 保持空间内容存储至模式空间,覆盖模式空间内容
G 保持空间内容存储至模式空间,追加模式空间内容
x 交换模式空间和保持空间的内容 - 条件分支
: 标签
b branch 命令用于脚本中将控制转移到另一行,没有指定标签就转移到结尾
t 测试命令
6.2 AWK
6.2.1 工作方式
- 流处理器: awk -F|-f|-v 'BEGIN{ commands } pattern{ commands } END{ commands }' file
- -F 指定分割符: awk -F: '{print $1,$3,$6}' OFS="t" /etc/passwd
- -f 调用脚本: awk -f script.awk file
- -v 定义变量 var=value
- '' 引用代码块
- BEGIN{Command} 语句块 awk 输入流中读取行之前被执行
- // 匹配代码块
- pattern{Command} 通用命令,默认执行{print}
- ; 多条命令使用分号间隔
- END{Command} 在执行结束后执行
6.2.2 运算符
- 算数运算符
- 逻辑运算符
6.2.3 循环
- while 循环
- for 循环
- break continue
6.2.4 系统变量
- FS 字段分割符
- OFS 输出字段分隔符
- RS 记录分隔符
- ORS 输出记录分隔符
6.2.5 条件
语法格式
if ... else ..
if嵌套
6.2.6 函数
算数函数
随机函数
字符串函数
7. 容器篇
7.1 容器原理
- KVM-ECS
- Namespace
- CGroup
- Rootfs
7.2 Docker
7.2.1 docker 命令
- 容器生命周期管理
docker run -it nginx:latest /bin/bash 创建新的容器并运行一个命令
docker start [OPTIONS] CONTAINER 启动/停止/重启容器
docker kill [OPTIONS] CONTAINER 杀掉运行中的容器
docker exec [OPTIONS] CONTAINER COMMAND 在运行的容器中执行命令
docker create --name con_name nginx:latest 创建容器不启动它
docker pause/unpause [OPTIONS] CONTAINER 暂停或者回复容器中的进程
docker rm [OPTIONS] CONTAINER 删除容器 - 容器操作
docker ps -a -q 列出容器
docker inspect [OPTIONS] NAME|ID 获取容器/镜像的元数据
docker top [OPTIONS] CONTAINER 查看容器中运行的进程信息,支持 ps 命令参数
docker attach [OPTIONS] CONTAINER 连接到正在运行中的容器
docker events [OPTIONS] 从服务器获取实时事件
docker logs [OPTIONS] CONTAINER 获取容器的日志
docker wait [OPTIONS] CONTAINER 阻塞运行直到容器停止,然后打印出它的退出代码
docker export [OPTIONS] CONTAINER 将文件系统作为一个tar归档文件导出到STDOUT
docker port [OPTIONS] CONTAINER 列出指定的容器的端口映射 - 容器rootfs命令
docker commit -a "alibaba.com" -m "mysql" CONTAINER [REPOSITORY[:TAG]] 从容器创建一个新的镜像
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH 容器主机之间的数据拷贝
docker diff [OPTIONS] CONTAINER 检查容器里文件结构的更改 - 镜像仓库
docker login/logout -u 用户名 -p 密码 登陆/登出到一个Docker镜像仓库
docker pull [OPTIONS] NAME[:TAG] 从镜像仓库中拉取或者更新指定镜像
docker push [OPTIONS] NAME[:TAG] 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker search [OPTIONS] TERM 从Docker Hub查找镜像 - 本地镜像管理
docker images [OPTIONS] [REPOSITORY[:TAG]] 列出本地镜像
docker rmi -f IMAGE 删除本地一个或多少镜像
docker tag [OPTIONS] IMAGE[:TAG] 标记本地镜像,将其归入某一仓库
docker build [OPTIONS] --build-arg -f -t PATH | URL | - 命令用于使用 Dockerfile 创建镜像
docker history [OPTIONS] IMAGE 查看指定镜像的创建历史
docker save -o filename IMAGE 将指定镜像保存成 tar 归档文件
docker load -i 导入使用 docker save 命令导出的镜像。
docker import [OPTIONS] file|URL 从归档文件中创建镜像 - info|version
docker info [OPTIONS] 显示 Docker 系统信息,包括镜像和容器数
docker version [OPTIONS] 显示 Docker 版本信息
7.2.2 dockerd
用于管理容器的守护进程,docker的引擎
7.2.3 docker-compose
用户定义和运行多个容器的 Docker 应用程序
7.3 kubernetes
7.3.1 etcdctl
etcdctl --endpoints=$ENDPOINTS member list
etcdctl --endpoints=$ENDPOINTS put foo "Hello World!" 增加数据
etcdctl --endpoints=$ENDPOINTS get web --prefix 根据前缀查数据
etcdctl --endpoints=$ENDPOINTS del k --prefix 根据前缀删除数据
etcdctl --write-out=table --endpoints=$ENDPOINTS endpoint status 集群状态查看
etcdctl --endpoints=$ENDPOINTS endpoint health
etcdctl --endpoints=$ENDPOINTS member list/add/remove/update 集群成员操作
7.3.2 kubectl
基础命令
- kubectl create
configmap
kubectl create configmap my-config --from-file=path/to/bar
deployment
kubectl create deployment my-dep --image=busybox
cronjob
kubectl create cronjob my-job --image=busybox
service
kubectl create service clusterip my-cs --tcp=5678:8080
serviceaccount
kubectl create serviceaccount my-service-account
secret
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
role
kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
rolebinding
kubectl create rolebinding admin --clusterrole=admin --user=user1 --user=user2 --group=group1
priorityclass
kubectl create priorityclass default-priority --value=1000 --global-default=true --description="default priority"
* kubectl get
kubectl get pods -namespace nsname
* kubectl run
kubectl run nginx --image=nginx --dry-run
* kubectl expose
kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000
* kubectl delete
kubectl delete pod,service baz foo
2. 应用管理
* kubectl apply
kubectl apply --prune -f manifest.yaml -l app=nginx
* kubectl annotate
kubectl annotate pods --all description='my frontend running nginx'
* kubectl autoscale
kubectl autoscale rc foo --max=5 --cpu-percent=80
* kubectl convert
kubectl convert -f . | kubectl create -f -
* kubectl diff
kubectl diff -f pod.json
* kubectl edit
kubectl edit job.v1.batch/myjob -o json
* kubectl label
kubectl label --overwrite pods foo status=unhealthy
* kubectl patch
kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}'
* kubectl replace
kubectl replace -f ./pod.json
* kubectl rollout
kubectl rollout status daemonset/foo
* kubectl scale
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
* kubectl set
kubectl set env deployment/registry STORAGE_DIR=/local
* kubectl wait
kubectl wait --for=condition=Ready pod/busybox1
3. 应用执行
* kubectl attach
kubectl attach podname -c ruby-container -i -t
* kubectl auth
kubectl auth can-i create pods --all-namespaces
* kubectl cp
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
* kubectl describe
kubectl describe nodes kubernetes-node-emt8.c.myproject.internal
kubectl describe po -l name=myLabel
* kubectl exec
kubectl exec -it mypod /bin/bash
* kubectl logs
kubectl logs -lapp=nginx --all-containers=true
* kubectl port-forward
kubectl port-forward service/myservice 5000 6000
* kubectl proxy
kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/
* kubectl top
kubectl top node
4. 集群管理
* kubectl api-versions
* kubectl approve (-f FILENAME | NAME)
* kubectl cluster-info
* kubectl cordon foo
* kubectl drain foo --force --grace-period=0
* kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule
* kubectl uncordon foo
5. 设置与用法
* kubectl api-resources -o wide
* kubectl completion bash
* kubectl config current-context
* kubectl explain pods
* kubectl kustomize /home/configuration/production
* kubectl version
* kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
### 7.3.3 kubeadm
* kubeadm init: 初始化master 节点
* kubeadm join: 初始化 worker 节点,并加入集群
* kubeadm upgrade: 更新集群到新版本
* kubeadm config: v1.7.x 或者更低版本 kubeadm 初始化集群,需要对集群做一些配置以使用 kubeadm upgrade
* kubeadm reset: 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改
* kubeadm token: 管理 kubeadm join 使用的令牌
* kubeadm version: 打印 kubeadm 版本
* kubeadm alpha: 预览一组可用的新功能以便从社区搜集反馈
### 7.3.4 helm
helm install 安装
helm search 查找包
helm list 列表已安装
### 7.3.5 CFSSL
cfssl sign
cfssl bundle
cfssl genkey
cfssl gencert
cfssl serve
## 7.4 istio
1. Galley
2. istio_ca
3. istioctl
istioctl auth
istioctl authn
istioctl dashboard
istioctl kube-inject
istioctl proxy-config
istioctl experimental
istioctl proxy-status
istioctl register
istioctl validate
istioctl verify-install
istioctl version
4. mixs
5. node_agent
6. operator
7. pilot-agent
8. pilot-discovery
9. sidecar-injector
## 7.4 KNative
Build 构建
Serving 服务