民工哥

民工哥 查看完整档案

其它编辑  |  填写毕业院校不知名互联网企业  |  不知名程序员 编辑 github.com/mingongge 编辑
编辑

民工哥,10多年职场老司机的经验分享,坚持自学一路从技术小白成长为互联网企业信息技术部门的负责人。

我的新书:《Linux系统运维指南》

微信公众号:民工哥技术之路

民工哥:知乎专栏

欢迎关注,我们一同交流,相互学习,共同成长!!

个人动态

民工哥 发布了文章 · 4月13日

Kubernetes 之 YAML 语法

YAML 是一种非常简洁/强大/专门用来写配置文件的语言!

YAML 全称是 ”YAML Ain’t a Markup Language” 的递归缩写,该语言的设计参考了 JSON / XML 和 SDL 等语言,强调以数据为中心,简洁易读,编写简单。

image.png

YAML 语法特性

学过编程的人理解起来应该非常容易
image.png

语法特点

  • 大小写敏感
  • 通过缩进表示层级关系
  • 禁止使用tab缩进,只能使用空格键
  • 缩进的空格数目不重要,只要相同层级左对齐
  • 使用#表示注释
# yaml
languages:
    - Ruby
    - Perl
    - Python
websites:
    YAML: yaml.org
    Ruby: ruby-lang.org
    Python: python.org
    Perl: use.perl.org

# Json
{
    languages: [
        'Ruby',
        'Perl',
        'Python'
    ],
    websites: {
        YAML: 'yaml.org',
        Ruby: 'ruby-lang.org',
        Python: 'python.org',
        Perl: 'use.perl.org'
    }
}

数据结构

  • 对象: 键值对的字典 -数组: 一组按次序排列的列表 -纯量: 单个的且不可再分的值
# 纯量
hello

# 数组
- Cat
- Dog
- Goldfish

# 对象
animal: pets
  • 引号区别
  • 单引号(''): 特殊字符作为普通字符串处理
  • 双引号(""): 特殊字符作为本身想表示的意思

    # 单引号
    name: 'Hi,\nTom'

双引号

name: "Hi,\nTom"

## 内置类型列表
# YAML允许使用个感叹号(!)强制转换数据类型
# 单叹号通常是自定义类型,双叹号是内置类型
money: !!str
123

date: !Boolean
true

image.png

YAML 中的纯量

纯量是最基本的且不可再分的值

  • 字符串
# 不适用引号
name: Tom

# 使用单引号
name: 'Tom'

# 使用双引号
name: "Tom"
  • 布尔值
debug: true
debug: false
  • 数字
12       # 十进制整数
014      # 八进制整数
0xC      #十六进制整数
13.4     #浮点数
1.2e+34  #指数
.inf     #无穷大
  • Null
date: ~
date: null
  • 时间
# 使用iso-8601标准表示日期
date: 2018-01-01t16:59:43.10-05:00

YAML 特殊类型

日常使用中基本不会用到的类型

文本块

# 注意“|”与文本之间须另起一行
# 使用|标注的文本内容缩进表示的块,可以保留块中已有的回车换行
value: |
  hello
  world!

# 输出结果
# hello 换行 world!

# +表示保留文字块末尾的换行
# -表示删除字符串末尾的换行
value: |
hello

value: |-
hello

value: |+
hello

# 输出结果
# hello\n hello hello\n\n

# 注意“>”与文本之间的空格
# 使用>标注的文本内容缩进表示的块,将块中回车替换为空格最终连接成一行
value: > hello
world!

# 输出结果
# hello 空格 world!

锚点与引用

# 复制代码注意*引用部分不能追加内容
# 使用&定义数据锚点,即要复制的数据
# 使用*引用锚点数据,即数据的复制目的地
name: &a yaml
book: *a
books:
   - java
   - *a
   - python

# 输出结果
book: yaml
books:[java, yaml, python]

YAML 实例说明

光说不练假把式 => JS-Yaml 官网实例地址 https://nodeca.github.io/js-yaml

---
# Collection Types #############################################################
################################################################################

# http://yaml.org/type/map.html -----------------------------------------------#

map:
  # Unordered set of key: value pairs.
  Block style: !!map
    Clark: Evans
    Ingy: döt Net
    Oren: Ben-Kiki
  Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

# http://yaml.org/type/omap.html ----------------------------------------------#

omap:
  # Explicitly typed ordered map (dictionary).
  Bestiary: !!omap
    - aardvark: African pig-like ant eater. Ugly.
    - anteater: South-American ant eater. Two species.
    - anaconda: South-American constrictor snake. Scaly.
    # Etc.
  # Flow style
  Numbers: !!omap [one: 1, two: 2, three: 3]

# http://yaml.org/type/pairs.html ---------------------------------------------#

pairs:
  # Explicitly typed pairs.
  Block tasks: !!pairs
    - meeting: with team.
    - meeting: with boss.
    - break: lunch.
    - meeting: with client.
  Flow tasks: !!pairs [meeting: with team, meeting: with boss]

# http://yaml.org/type/set.html -----------------------------------------------#

set:
  # Explicitly typed set.
  baseball players: !!set
    ? Mark McGwire
    ? Sammy Sosa
    ? Ken Griffey
  # Flow style
  baseball teams: !!set { Boston Red Sox, Detroit Tigers, New York Yankees }

# http://yaml.org/type/seq.html -----------------------------------------------#

seq:
  # Ordered sequence of nodes
  Block style: !!seq
    - Mercury # Rotates - no light/dark sides.
    - Venus # Deadliest. Aptly named.
    - Earth # Mostly dirt.
    - Mars # Seems empty.
    - Jupiter # The king.
    - Saturn # Pretty.
    - Uranus # Where the sun hardly shines.
    - Neptune # Boring. No rings.
    - Pluto # You call this a planet?
  Flow style: !!seq [
      Mercury,
      Venus,
      Earth,
      Mars, # Rocks
      Jupiter,
      Saturn,
      Uranus,
      Neptune, # Gas
      Pluto,
    ] # Overrated

# Scalar Types #################################################################
################################################################################

# http://yaml.org/type/bool.html ----------------------------------------------#

bool:
  - true
  - True
  - TRUE
  - false
  - False
  - FALSE

# http://yaml.org/type/float.html ---------------------------------------------#

float:
  canonical: 6.8523015e+5
  exponentioal: 685.230_15e+03
  fixed: 685_230.15
  sexagesimal: 190:20:30.15
  negative infinity: -.inf
  not a number: .NaN

# http://yaml.org/type/int.html -----------------------------------------------#

int:
  canonical: 685230
  decimal: +685_230
  octal: 02472256
  hexadecimal: 0x_0A_74_AE
  binary: 0b1010_0111_0100_1010_1110
  sexagesimal: 190:20:30

# http://yaml.org/type/merge.html ---------------------------------------------#

merge:
  - &CENTER { x: 1, y: 2 }
  - &LEFT { x: 0, y: 2 }
  - &BIG { r: 10 }
  - &SMALL { r: 1 }

  # All the following maps are equal:

  - # Explicit keys
    x: 1
    y: 2
    r: 10
    label: nothing

  - # Merge one map
    <<: *CENTER
    r: 10
    label: center

  - # Merge multiple maps
    <<: [*CENTER, *BIG]
    label: center/big

  - # Override
    <<: [*BIG, *LEFT, *SMALL]
    x: 1
    label: big/left/small

# http://yaml.org/type/null.html ----------------------------------------------#

null:
  # This mapping has four keys,
  # one has a value.
  empty:
  canonical: ~
  english: null
  ~: null key
  # This sequence has five
  # entries, two have values.
  sparse:
    - ~
    - 2nd entry
    -
    - 4th entry
    - Null

# http://yaml.org/type/str.html -----------------------------------------------#

string: abcd

# http://yaml.org/type/timestamp.html -----------------------------------------#

timestamp:
  canonical: 2001-12-15T02:59:43.1Z
  valid iso8601: 2001-12-14t21:59:43.10-05:00
  space separated: 2001-12-14 21:59:43.10 -5
  no time zone (Z): 2001-12-15 2:59:43.10
  date (00:00:00Z): 2002-12-14

# JavaScript Specific Types ####################################################
################################################################################

# https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

regexp:
  simple: !!js/regexp foobar
  modifiers: !!js/regexp /foobar/mi

# https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined

undefined: !!js/undefined ~

# https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

function: !!js/function >
  function foobar() {
    return 'Wow! JS-YAML Rocks!';
  }

# Custom types #################################################################
################################################################################

# JS-YAML allows you to specify a custom YAML types for your structures.
# This is a simple example of custom constructor defined in `js/demo.js` for
# custom `!sexy` type:
#
# var SexyYamlType = new jsyaml.Type('!sexy', {
#   kind: 'sequence',
#   construct: function (data) {
#     return data.map(function (string) { return 'sexy ' + string; });
#   }
# });
#
# var SEXY_SCHEMA = jsyaml.Schema.create([ SexyYamlType ]);
#
# result = jsyaml.load(yourData, { schema: SEXY_SCHEMA });

foobar: !sexy
  - bunny
  - chocolate

作者: Escape
链接: https://www.escapelife.site/p...

查看原文

赞 1 收藏 1 评论 0

民工哥 发布了文章 · 4月13日

每天学一个 Linux 命令(112):vmstat

命令简介

vmstat 命令用于虚拟内存统计。vmstat 报告有关进程,内存,分页,块IO,陷阱,磁盘和CPU活动的信息。

语法格式

vmstat [options] [delay [count]]

选项说明

-a  #显示活动内页
-f  #显示启动后创建的进程总数
-m  #显示slab信息
-h  #显示帮助并退出
-n  #头信息仅显示一次
-s  #以表格方式显示事件计数器和内存状态
-d  #报告磁盘状态
-p  #显示指定的硬盘分区状态
-S  #输出信息的单位
-V  #显示版本信息并退出

应用举例

显示所有信息

[root@centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 568632   2108 311348    0    0     7     1   50   38  2  1 98  0  0
#1秒刷新一次
[root@centos7 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 568780   2108 311380    0    0     7     1   50   38  2  1 98  0  0
 0  0      0 568756   2108 311380    0    0     0     0   20   20  0  0 100  0  0
 0  0      0 568756   2108 311380    0    0     0     0   25   25  0  1 99  0  0
 0  0      0 568756   2108 311380    0    0     0     0   17   14  0  0 100  0  0
 0  0      0 568756   2108 311380    0    0     0     0   20   18  0  0 100  0  0
 0  0      0 568756   2108 311380    0    0     0     0   16   12  0  0 100  0  0
 0  0      0 568756   2108 311380    0    0     0     0   25   25  0  1 99  0  0

结果的字段说明

#Procs(进程)
r: 运行队列中进程数量
b: 等待IO的进程数量

#Memory(内存)
swpd: 使用虚拟内存大小
free: 空闲物理内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小

#Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存
so: 每秒写入交换区的内存大小,由内存调入磁盘
 
#IO(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数
 
#system(系统)
in: 每秒中断数,包括时钟中断
cs: 每秒上下文切换数
 
#CPU(以百分比表示)
 
us: 用户进程执行时间百分比(user time),us的值比较高时,说明用户进程消耗的CPU时间多。
sy: 内核系统进程执行时间百分比(system time),sy的值高时,说明系统内核消耗的CPU资源多。
wa: IO等待时间百分比,wa的值高时,说明IO等待比较严重。
 
#id: 空闲时间百分比

显示系统启动后创建的进程数

[root@centos7 ~]# vmstat -f
         5303 forks

查看磁盘状态

[root@centos7 ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
fd0        0      0       0       0      0      0       0       0      0      0
sda     8001     12  603239   68687   1841    278   64871  192251      0     91
sdb       92      0    5184     563      0      0       0       0      0      0
sr0       18      0    2056     245      0      0       0       0      0      0
dm-0    5949      0  579134   67305   2115      0   60775  227833      0     91
dm-1      88      0    4408     154      0      0       0       0      0      0

显示指定磁盘分区的状态

[root@centos7 ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                1864      12369          4       4096
[root@centos7 ~]# vmstat -p /dev/sda2
sda2          reads   read sectors  writes    requested writes
                6107     587782       1846      60879
[root@centos7 ~]# vmstat -p /dev/sdb
partition was not found

到今天为止,《每天学习一个Linux系统命令》推送了112篇文章了,希望能对大家有所帮助,系统命令也是系统入门后的第一步,也是非常重要的一步,多练、多操作、多总结,写文不易,如有帮助,请大家点赞与转发分享支持一下民工哥。

查看原文

赞 2 收藏 1 评论 0

民工哥 发布了文章 · 4月13日

每天学一个 Linux 命令(111):mpstat

命令简介

mpstat(Multi-Processor Statistics) 命令用于显示各个可用CPU的状态统计。是一个实时监控工具,与vmstat类似,但只能监控CPU的整体性能状态。

[root@centos7 ~]# mpstat
-bash: mpstat: command not found
[root@centos7 ~]# yum install sysstat -y

语法格式

mpstat [ options ]

选项说明

-P  #指定CPU编号

应用举例

列出端口

[root@centos7 ~]# mpstat
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)     03/28/2021     _x86_64_    (1 CPU)

11:14:29 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:14:29 AM  all    1.61    0.00    0.48    0.05    0.00    0.07    0.00    0.00    0.00   97.79

字段说明

%user      
#在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程  (usr/total)*100
%nice      
#在internal时间段里,nice值为负进程的CPU时间(%)(nice/total)*100
%sys       
#在internal时间段里,内核时间(%)(system/total)*100
%iowait    
#在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq         
#在internal时间段里,硬中断时间(%)(irq/total)*100
%soft       
#在internal时间段里,软中断时间(%)(softirq/total)*100
%idle       
#在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

查看原文

赞 1 收藏 1 评论 0

民工哥 发布了文章 · 4月12日

每天学一个 Linux 命令(99):nohup

命令简介

nohup 命令用于将进程放后台运行(不挂断)。

命令语法

nohup Command [ Arg … ] [ & ]

选项说明

--help    #打印帮助信息并退出
--version  #打印版本信息并退出

应用举例

后台运行

[root@centos7 ~]# nohup java -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -jar test.jar $1 $2 $3 &

执行test.sh 脚本,并重定向输入到 test.log 文件

[root@centos7 ~]# nohup /scripts/test.sh > test.log 2>&1 &

2>&1 解释
#将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 test.log 文件中。
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)

查看原文

赞 2 收藏 2 评论 0

民工哥 发布了文章 · 4月12日

每天学一个 Linux 命令(107):sar

命令简介

sar命令用于全面地获取系统的CPU、运行队列、磁盘 I/O、分页(交换区)、内存、 CPU中断和网络等性能数据。

语法格式

sar -[ options ] time_interval number_of_tines_to_display

选项说明

-A  #汇总所有的报告
-a  #查看文件读写使用情况
-B  #查看附加的缓存的使用情况
-b  #查看缓存的使用情况
-c  #查看系统调用的使用情况
-d  #查看磁盘的使用情况
-g  #查看串口的使用情况
-h  #查看关于buffer使用的统计数据
-m  #查看IPC消息队列和信号量的使用情况
-n  #查看命名cache的使用情况
-p  #查看调页活动的使用情况
-q  #查看平均负载
-R  #查看进程的活动情况
-r  #查看没有使用的内存页面和硬盘块
-u  #查看CPU的利用率
-v  #查看进程、i节点、文件和锁表状态
-w  #查看系统交换活动状况
-y  #查看TTY设备活动状况

应用举例

查看内存交换空间的使用率信息

[root@centos7 ~]# sar -r
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
11:10:02 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
11:20:01 AM    532544    463140     46.51      2108    313176    232184      7.51    216412    134456         0
11:30:01 AM    532504    463180     46.52      2108    313180    232184      7.51    216436    134412         0
Average:       532524    463160     46.52      2108    313178    232184      7.51    216424    134434         0

输出的结果字段说明

kbmemfree  #空闲物理内存量
kbmemused  #使用中的物理内存量
%memused   #物理内存量使用率
kbbuffers  #内核中作为缓冲区使用的物理内存容量
kbcacheed  #内核中作为缓存使用的物理内存容量
kbswpfree  #交换区的空闲容量
kbswpused  #使用中的交换区容量

查看CPU使用率

[root@centos7 ~]# sar -u
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
11:10:02 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:20:01 AM     all      0.03      0.00      0.18      0.02      0.00     99.77
11:30:01 AM     all      0.03      0.00      0.17      0.02      0.00     99.78
Average:        all      0.03      0.00      0.18      0.02      0.00     99.77

查看平均负载

[root@centos7 ~]# sar -q
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
11:10:02 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
11:20:01 AM         1       108      0.00      0.01      0.05         0
11:30:01 AM         1       108      0.00      0.01      0.05         0
Average:            1       108      0.00      0.01      0.05         0

查看页面交换发生状况

[root@centos7 ~]# sar -w
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
11:10:02 AM    proc/s   cswch/s
11:20:01 AM      0.02     19.10
11:30:01 AM      0.03     19.92
11:40:01 AM      0.02     19.45
Average:         0.02     19.49

查看I/O和传送速率的统计信息

[root@centos7 ~]# sar -b
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
11:10:02 AM       tps      rtps      wtps   bread/s   bwrtn/s
11:20:01 AM      0.06      0.00      0.06      0.00      0.74
11:30:01 AM      0.03      0.00      0.03      0.00      0.40
Average:         0.05      0.00      0.05      0.00      0.57

输出字段说明

tps       #每秒钟物理设备的 I/O 传输总量 
rtps      #每秒钟从物理设备读入的数据总量 
wtps      #每秒钟向物理设备写入的数据总量 
bread/s   #每秒钟从物理设备读入的数据量,单位为 块/s 
bwrtn/s   #每秒钟向物理设备写入的数据量,单位为 块/s

查看网络状态信息

[root@centos7 ~]# sar -n DEV
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
11:10:02 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
11:20:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:20:01 AM     ens33      0.83      0.54      0.06      0.05      0.00      0.00      0.00
11:30:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:30:01 AM     ens33      1.07      0.69      0.08      0.06      0.00      0.00      0.00
11:40:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:40:01 AM     ens33      0.91      0.60      0.07      0.05      0.00      0.00      0.00
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        ens33      0.94      0.61      0.07      0.05      0.00      0.00 

image

查看原文

赞 1 收藏 1 评论 0

民工哥 发布了文章 · 4月12日

每天学一个 Linux 命令(109):iostat

命令简介

iostat 命令用于统计系统IO状态信息。

语法格式

iostat [options]

选项说明

-c  #仅显示CPU使用情况
-d  #仅显示设备利用率
-k  #显示状态以千字节每秒为单位,而不使用块每秒
-m  #显示状态以兆字节每秒为单位
-p  #仅显示块设备和所有被使用的其他分区的状态
-t  #显示每个报告产生时的时间
-V  #显示版号并退出
-x  #显示扩展状态

应用举例

查看指定设备的IO状态信息

[root@centos7 ~]# iostat -x /dev/sda1
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.59    0.00    0.55    0.05    0.00   97.81
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda1              0.00     0.00    0.04    0.00     0.15     0.05     8.82     0.00    1.07    0.73   63.50   1.02   0.00

结果字段说明

Device  #监测设备名称
rrqm/s  #每秒需要读取需求的数量
wrqm/s  #每秒需要写入需求的数量
r/s     #每秒实际读取需求的数量
w/s     #每秒实际写入需求的数量
rsec/s  #每秒读取区段的数量
wsec/s  #每秒写入区段的数量
rkB/s   #每秒实际读取的大小,单位为KB
wkB/s   #每秒实际写入的大小,单位为KB
avgrq-sz  #需求的平均大小区段
avgqu-sz  #需求的平均队列长度
await     #等待I/O平均的时间(milliseconds)
svctm     #I/O需求完成的平均时间
%util     #被I/O需求消耗的CPU百分比

系统整体IO状态信息

[root@centos7 ~]# iostat
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.58    0.00    0.55    0.05    0.00   97.82
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.25         7.39         1.84     316339      78930
sdb               0.00         0.06         0.00       2592          0
scd0              0.00         0.02         0.00       1028          0
dm-0              0.21         7.11         1.80     304267      76862
dm-1              0.00         0.05         0.00       2204          0

其它实例

#只显示CPU的IO状态
[root@centos7 ~]# iostat -c
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.58    0.00    0.55    0.05    0.00   97.82
#只显示设备的使用率状态
[root@centos7 ~]# iostat -d
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.25         7.38         1.84     316339      78930
sdb               0.00         0.06         0.00       2592          0
scd0              0.00         0.02         0.00       1028          0
dm-0              0.21         7.09         1.79     304267      76862
dm-1              0.00         0.05         0.00       2204          0
#以千字节每秒为单位显示
[root@centos7 ~]# iostat -k
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.58    0.00    0.55    0.05    0.00   97.82
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.25         7.37         1.84     316339      78930
sdb               0.00         0.06         0.00       2592          0
scd0              0.00         0.02         0.00       1028          0
dm-0              0.21         7.09         1.79     304267      76862
dm-1              0.00         0.05         0.00       2204          0
#以兆字节每秒为单位
[root@centos7 ~]# iostat -m
Linux 3.10.0-1127.18.2.el7.x86_64 (centos7)  03/28/2021  _x86_64_ (1 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.58    0.00    0.55    0.05    0.00   97.82
Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               0.25         0.01         0.00        308         77
sdb               0.00         0.00         0.00          2          0
scd0              0.00         0.00         0.00          1          0
dm-0              0.21         0.01         0.00        297         75
dm-1              0.00         0.00         0.00          2          0

每天学一个 Linux 命令(106):openssl

每天学一个 Linux 命令(107):sar

每天学一个 Linux 命令(108):iptraf

查看原文

赞 1 收藏 1 评论 0

民工哥 发布了文章 · 4月12日

每天学一个 Linux 命令(110):ifstat

命令简介

ifstat 命令用于统计网络接口流量状态,能比较简单看网络流量。ifstat 可以整齐地打印出网络接口统计信息,还可以用来禁用指定的网络接口。

语法格式

ifstat [OPTIONS]

选项说明

-a  #监测能检测到的所有网络接口的状态信息
-z  #隐藏流量是无的接口
-h  #显示帮助信息
-j  #用JSON格式输出信息
-n  #关闭显示周期性出现的头部信息
-t  #在每一行的开头加一个时间戳
-T  #报告所有监测接口的全部带宽
-w  #用指定的列宽
-W  #如果内容比终端窗口的宽度还要宽就自动换行
-S  #在同一行保持状态更新(不滚动不换行)
-q  #安静模式
-v  #显示版本信息
-d  #指定一个驱动来收集状态信息

应用举例

常见应用

[root@centos7 ~]# ifstat
#kernel
Interface        RX Pkts/Rate    TX Pkts/Rate    RX Data/Rate    TX Data/Rate  
                 RX Errs/Drop    TX Errs/Drop    RX Over/Rate    TX Coll/Rate  
lo                 40261 0         40261 0         2014K 0         2014K 0      
                       0 0             0 0             0 0             0 0      
ens33             385230 0        283301 0        44144K 0        77585K 0      
                       0 14            0 0             0 0             0 0 

监控指定接口

[root@centos7 ~]# ifstat   ens33
#kernel
Interface        RX Pkts/Rate    TX Pkts/Rate    RX Data/Rate    TX Data/Rate  
                 RX Errs/Drop    TX Errs/Drop    RX Over/Rate    TX Coll/Rate  
ens33                118 0            44 0          8712 0          5414 0      
                       0 0             0 0             0 0             0 0 

每天学一个 Linux 命令(106):openssl

每天学一个 Linux 命令(107):sar

每天学一个 Linux 命令(108):iptraf

查看原文

赞 0 收藏 1 评论 0

民工哥 发布了文章 · 4月11日

Kubernetes 之 Pod 实现原理

Pod 就是最小并且最简单的 Kubernetes 对象

图片

Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用、工作负载、网络和磁盘资源,共同定义了集群的状态。Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合。

  • Pod -> 集群中的基本单元

  • Service -> 解决如何访问 Pod 里面服务的问题

  • Volume -> 集群中的存储卷

  • Namespace -> 命名空间为集群提供虚拟的隔离作用

图片

Kubernetes 有许许多多的技术概念,同时对应很多 API 对象,其中最重要的也是最基础的是 Pod 对象。Pod 是在 Kubernetes 集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  restartPolicy: Always
    - name: busybox
      image: busybox
      command:
        - sleep
        - "3600"
      imagePullPolicy: IfNotPresent

Pod 的内部结构

Pod 代表着集群中运行的进程:共享网络、共享存储

在同一个 Pod 中,有几个概念特别值得关注,首先就是容器,在 Pod 中其实可以同时运行一个或者多个容器,这些容器能够共享网络、存储以及 CPU/内存等资源。

首先,我们需要知道的是,每个 Pod 都有一个特殊的被称为 “根容器” 的 Pause 容器。Pause 容器对应的镜像属于 Kubernetes 平台的一部分,通过 Pause 容器使工作在对应 Pod 的容器之间可以共享网络、共享存储。

图片

Pod 共享资源

为什么 Kubernetes 会设计出一个全新的 Pod 概念,并且有这样特殊的结构?主要是因为,使用 Pause 容器作为 Pod 根容器,以它的状态代表整个容器组的状态;其次,Pod 里的多个业务容器共享 Pause 容器的 IP 地址,共享 Pause 容器挂接的 Volume 资源。

  • 共享存储资源

可以为一个 Pod 指定多个共享的 Volume 资源。Pod 中的所有容器都可以访问共享的 volume 资源。Volume 也可以用来持久化 Pod 中的存储资源,以防容器重启后文件丢失。

  • 共享网络资源

每个 Pod 都会被分配一个唯一的 IP 地址。Pod 中的所有容器共享网络空间,包括 IP 地址和端口。Pod 内部的容器可以使用 localhost 互相通信。Pod 中的容器与外界通信时,必须分配共享网络资源,例如使用宿主机的端口映射。

图片

veth 设备的特点

一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去

  • veth 和其它的网络设备都一样,一端连接的是内核协议栈

  • veth 设备是成对出现的,另一端两个设备彼此相连

# 物理网卡eth0配置的IP为192.168.1.11
# 而veth0和veth1的IP分别是192.168.2.11和192.168.2.10
+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|              ↑               ↑               ↑                 |
|..............|...............|...............|.................|
|              ↓               ↓               ↓                 |
|        +----------+    +-----------+   +-----------+           |
|        |   eth0   |    |   veth0   |   |   veth1   |           |
|        +----------+    +-----------+   +-----------+           |
|192.168.1.11  ↑               ↑               ↑                 |
|              |               +---------------+                 |
|              |         192.168.2.11     192.168.2.10           |
+--------------|-------------------------------------------------+
               ↓
         Physical Network

Pod 的网络通信

集群网络解决方案: Kubernetes + Flannel

Kubernetes 的网络模型假定了所有 Pod 都在一个直接连通的扁平的网络空间中,这在 GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes 假定这个网络已经存在了。而在私有云搭建 Kubernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的 Docker 容器之间的互相访问先打通,然后才能正常运行 Kubernetes 集群。

  • 同一个 Pod 内多个容器之前通过回环网络(lo - 127.0.0.1)进行通信

  • 各 Pod 之间的通讯,则是通过 Overlay Network 网络进行通信

  • 而 Pod 与 Service 之间的通讯,则是各节点的 iptables 或 lvs 规则

Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,简单来说,它的功能就是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。而且它还能在这些 IP 地址之间建立一个覆盖的网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递给目标容器内。

图片

图片

不同情况下的网络通信方式

  • 同一个 Pod 内部通讯:

  • 同一个 Pod 共享同一个网络命名空间,共享同一个 Linux 协议栈。

  • 不同 Pod 之间通讯:

  • Pod1 和 Pod2 在同一台 Node 主机,由 docker0 网桥直接转发请求到 Pod2 上面,- 不经过 Flannel 的转发。

  • Pod1 和 Pod2 不在同一台 Node 主机,Pod 的地址是与 docker0 在同一个网段的,但 docker0 网络与宿主机网卡是两个完全不同的 IP 网段,并且不同的 Node 之间的通讯只能通过宿主机的物理网卡进行。将 Pod 的 IP 地址和所在 Node 的 IP 地址关联起来,通过这个关联让 Pod 可以互相访问。

  • Pod 至 Service 的网络

  • 目前基于性能考虑,全部为 iptables 或 lvs 维护和转发。

  • Pod 到外网

  • Pod 想外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主机网卡完成路由选择之后,iptables 或 lvs 执行 Masquerade,把源 IP 地址更改为宿主机的网卡的 IP 地址,然后向外网服务器发送请求。

  • 外网访问 Pod

  • 通过 Service 服务来向外部提供 Pod 服务。

ETCD 之于 Flannel 提供说明:

  • 存储管理 Flannel 可分配的 IP 地址段资源

  • 监控 ETCD 中每一个 Pod 的实际 IP 地址,并在内存中建立维护 Pod 节点的路由表

图片

Pod 的多种类型

Pod 存在多种不同的创建类型来满足不一样的用途

图片

ReplicationController

ReplicationController 用来确保容器应用的副本数量始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来代替,而如果异常多出现的容器会自动回收。

ReplicaSet

在新版本(相对而言的较优方式)的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationController 来管理 Pod。虽然 ReplicaSet 和 ReplicationController 并没有本质上的不同,只是名字不一样而已,唯一的区别就是 ReplicaSet 支持集合式的 selector,可供标签筛选。

虽然 ReplicaSet 可以独立使用,但一般还是建议使用 Deployment 来自动管理 ReplicaSet 创建的 Pod,这样就无需担心跟其他机制的不兼容问题。比如 ReplicaSet 自身并不支持滚动更新(rolling-update),但是使用 Deployment 来部署就原生支持。

Deployment

Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义方法,用来替代以前使用 ReplicationController 来方便且便捷的管理应用。主要的应用场景,包括:滚动升级和回滚应用、扩容和缩容、暂停和继续。

HPA

HPA 仅仅适用于 Deployment 和 ReplicaSet,在 V1 版本中仅支持根据 Pod 的 CPU 利用率扩缩容,在新版本中,支持根据内存和用户自定义的 metric 动态扩缩容。

StatefulSet

StatefulSet 是为了解决有状态服务的问题,相对于 Deployment 和 ReplicaSet 而已。其主要的使用场景,包括:稳定的持久化存储、稳定的网络标识、有序部署、有序收缩。

DaemonSet

DaemonSet 确保全部或者一些 Node 上面运行一个 Pod 副本。当有 Node 加入集群的时候,也会为它们新加一个 Pod。当有 Node 从集群中移除的时候,这些 Pod 也会被回收。删除 DaemonSet 将会删除它所创建的所有 Pod。

使用 DaemonSet 的典型场景就是,在每个节点运行日志收集、运行监控系统、运行集群存储等服务,只要新加进来的节点都需要运行该服务。

Job

Job 负责批处理任务,仅执行一次的任务,它保证批处理任务的一个或者多个 Pod 成功结束,才会返回成功。

Cront Job

Cront Job 管理是基于时间的 Job,即在给定时间点只运行一次,且周期行的在给定时间点运行特定任务。

作者: Escape
链接: https://www.escapelife.site/p...

image

查看原文

赞 3 收藏 3 评论 0

民工哥 发布了文章 · 4月11日

每天学一个 Linux 命令(108):iptraf

命令简介

ptraf 命令是基于 ncurses 的 IP LAN 监视器,它生成各种网络统计信息,包括 TCP 信息、UDP 计数、ICMP 和 OSPF 信息,以太网负载信息,节点统计信息,IP 校验和错误等。

[root@centos7 ~]# iptraf
-bash: iptraf: command not found
[root@centos7 ~]# yum install iptraf -y

iptraf 命令是一款交互式、色彩鲜艳的 IP 局域网监控工具。它可以显示每个连接以及主机之间传输的数据量。

若在 CentOS Linux 中,其采用的版本是 IPTraf 的衍生版本 iptraf-ng(没有iptrsf这个命令)。

图片

语法格式

iptraf { [ -f ] [ -q ] [ { -i iface | -g | -d iface | -s iface | -z iface | -l iface } [ -t timeout ] [ -B [ -L logfile ] ] ] | [ -h ] }

选项说明

-d  #允许您立即启动指定接口上的详细信息(iface)
-z  #显示指定接口上的数据包计数大小
-i  #立即在指定接口启动IP流量监视器
-u  #允许使用不受支持的接口作为以太网设备
-g  #立即启动常规接口统计

应用举例

先看一个动图展示

图片

图片

立即启动指定接口上的详细信息

[root@centos7 ~]# iptraf-ng -d ens33

图片

查看数据包大小

[root@centos7 ~]# iptraf-ng -z ens33

图片

以上都是用的截图方式展示,其实实际使用过程中都是动态更新的。

每天学一个 Linux 命令(104):zcat

每天学一个 Linux 命令(105):tee

每天学一个 Linux 命令(106):openssl

每天学一个 Linux 命令(107):sar

查看原文

赞 2 收藏 1 评论 0

民工哥 发布了文章 · 4月10日

每天学一个 Linux 命令(106):openssl

命令简介

openssl 命令是强大的安全套接字层密码库。OpenSSL 是一种开源命令行工具,通常用于生成私钥,创建 CSR,安装 SSL / TLS 证书以及标识证书信息。

OpenSSL 运行模式
  • 交互模式

  • 批处理模式

直接输入 openssl 回车进入交互模式,输入带命令选项的 openssl 进入批处理模式。

[root@centos7 ~]# openssl
OpenSSL> version
OpenSSL 1.0.2k-fips  26 Jan 2017

OpenSSL 整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL 协议库以及应用程序。

openssl 命令主要用途
  • 创建和管理私钥,公钥和参数

  • 公钥加密操作

  • 创建 X.509 证书,CSR 和 CRL

  • 消息摘要的计算

  • 使用密码进行加密和解密

  • SSL/TLS 客户端和服务器测试

  • 处理 S/MIME 签名或加密的邮件

  • 时间戳请求,生成和验证

语法格式

openssl command [ command_opts ] [ command_args ]
 
openssl [ list-standard-commands | list-message-digest-commands | list-cipher-commands | list-cipher-algorithms | list-message-digest-algorithms | list-public-key-algorithms]
 
openssl no-XXX [ arbitrary options ]

选项说明

图片读者可自行参考帮助文档 https://www.digicert.com/kb/s...

应用举例

版本信息

[root@centos7 ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@centos7 ~]# openssl version -a
OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic 
#版本号和版本发布日期(OpenSSL 1.0.2k,2017年1月26日)
#使用库构建的选项(options)
#存储证书和私钥的目录(OPENSSLDIR)

生成密码功能

[root@centos7 ~]# openssl rand -base64 15
DYmkj+RY9QUcb4m5aoNV
[root@centos7 ~]# openssl rand -base64 10
RpyTN5W7BLznjA==
[root@centos7 ~]# openssl rand -base64 5
AeQaaBE=

消息摘要算法应用

#用SHA1算法计算文件openssl1.txt的哈西值
[root@centos7 ~]# openssl dgst -sha1 openssl1.txt
openssl1.txt: No such file or directory
[root@centos7 ~]# touch openssl1.txt
[root@centos7 ~]# openssl dgst -sha1 openssl1.txt
SHA1(openssl1.txt)= da39a3ee5e6b4b0d3255bfef95601890afd80709
#用SHA1算法计算文件openssl1.txt的哈西值,输出到文件sha1.txt
[root@centos7 ~]# openssl sha1 -out sha1.txt openssl1.txt
[root@centos7 ~]# cat sha1.txt
SHA1(openssl1.txt)= da39a3ee5e6b4b0d3255bfef95601890afd80709

对称加密应用

#给文件openssl1.txt用base64编码,输出到文件jiami.txt
[root@centos7 ~]# cat openssl1.txt 
openssl
[root@centos7 ~]# openssl base64 -in openssl1.txt -out jiami.txt
[root@centos7 ~]# cat jiami.txt 
b3BlbnNzbAo=

DSA 应用

#生成1024位DSA参数集,并输出到文件jm.pem
[root@centos7 ~]# openssl dsaparam -out jm.pem 1024
Generating DSA parameters, 1024 bit long prime
This could take some time
........+...........+..................+.....+..............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
.+...+..........+......+.....+..+......+.........+.........+.................+............+...........+..................+...........+........+............+....+.+......+....+...............................+.................+.................+.+......+.......+..........+........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
[root@centos7 ~]# cat jm.pem 
-----BEGIN DSA PARAMETERS-----
MIIBHgKBgQCR+2rHHnotQERnaw1i3PaeeGyhZHP7Mjih9RAnNRv3oe+HO2AgiLgr
vWLbT/oRNZhdnvuW8u8b1dmm9xPwwAfkNt0cPyH+28HNJ6ImoO9qQCBVlgPnwmah
WPtA9TXIw7kJVOCUImKKXkbQvKOvlXsTgFHhhQ9GAt9gbHxmWVhqjwIVANzDXsuC
hXZDNAR6O0Dke4p/4H1XAoGAHzT3cByKaD0IN0zCXA0yXMNlyDtE8w7dlv37LcaR
7u0ZV1r4zof/g7Pf+GCHbkVUVPzTrrlkn1Wfqtl2QsmT73jMBwPl+z3Oj7DyFb8J
Nm66epCO1uLaXoIubTZa4QFCuuTarWouizo4qDYQg/vYRDBQK8N5nIh8Wfnte9gq
zTY=
-----END DSA PARAMETERS-----

RSA 应用

#产生1024位RSA私匙,用3DES加密它,口令为mingongge,输出到文件rsa.pem
[root@centos7 ~]# openssl genrsa -out rsa.pem -passout pass:mingongge -des3 1024
Generating RSA private key, 1024 bit long modulus
....................++++++
...............++++++
e is 65537 (0x10001)
[root@centos7 ~]# cat rsa.pem 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,34B51F9BE30A3448
uvI8+9g2NGBS+t6VoxUW9JvjiSSnXAHVgJXFsiPtQRIQq3tUEv48QVXOXrLMSTei
DOmScLCrU0X+il+Kl2HtTEqmqzxmP+HlbiahSMthTbXUEcqSnKt/80UxzsKFWsag
lYj5yl+skQoMYLHt0JSc2MlWA6tAHPdEb4/BoEN0zerhgVcXDlLeFXm7ni1tUmVj
mbHmM1TV03kxxzd8KQhFsQkwT/aDtm143rxVrD3NpSS4eXbzm8D4B2A3L0DMaUzk
cAql+iggvH4vS3BCKOX6h5Zr9Vyo4CGjvYSyvkASbc+fVKgvmPM9KP0+hedUH2Hc
55K1ND5S0TWa2qFWk511tKbpBT9RM5P7ipcnr3tyya/RSpVZT7EpEUm+EokOrvHg
SY6AgPSojYdDL3/WrQvJAkMQmuckpEW1lNYGSgFsQmRN8gFb8LXhr+uUf8psT3D9
+Cvo5ynkocW1P1sHpJHuA7WtW7SaRbBGwEoPKjzAfKaV41oz9Sknn1PE5LXpvtIA
zn/vVbKVQvD3ho2I2RuX5vtI7Jvy/TeKDOO9fAuNKqlR7/MmqE7OiKZovuh2xHRk
3d3qif8uH6dCe7l6rElqgONNkYYJ/dBgJ+ZV15ahJFNK10JoBqFgF9dj+vFumWGt
7FuN2kk7Qe1YSn13ZZ7M10EWDPxaMXSnjynazC8MLnokRwf1SwqsZW250J9/dbvt
BEE00IQWC+RmaRgJV+H+3gvCHyMZBRGaxUKiOftrM9Ir3w28wk2jwgSm6v6p/WUg
4JUMPAqjft82lv+MwfKn4OHnuIyfgrZGB6+oR52BToQ=
-----END RSA PRIVATE KEY-----

每天学一个 Linux 命令(103):dstat

每天学一个 Linux 命令(104):zcat

每天学一个 Linux 命令(105):tee

查看原文

赞 2 收藏 2 评论 0

认证与成就

  • 获得 6479 次点赞
  • 获得 12 枚徽章 获得 2 枚金徽章, 获得 4 枚银徽章, 获得 6 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

  • 《Linux系统运维指南》

    本书系统全面、由浅入深地介绍了Linux系统运维的知识,以及在企业实际环境中用到的各类服务、架构和运维管理。本书分基础篇、LAMP/LNMP架构篇、应用服务篇和架构运用篇。基础篇详细介绍Linux系统的基础知识,LAMP/LNMP架构篇介绍时下企业中最常见的两种架构的部署与配置,应用服务篇以企业实际运维环境为出发点详细介绍当下企业用到的各类开源软件服务,架构运用篇对前三篇的知识进行总结,并结合企业的实际场景加以实践。

  • 运维工程师打怪升级进阶之路

    内容由浅入深,从最基础的网络基础开始,逐渐深入系统的学习Linux系统运维知识。然后引入企业项目实战内容,从而让更多学习Linux系统运维的读者朋友们「无论前端、后端、测试还是运维,底层系统是必备技术点」,都能够快速入门、并且在一程度上掌握当下企业所需要的技术储备。再穿插企业面试题、面试经验等,同时也能帮助运维工程师们在求职的路上能更加顺畅,少踩坑。

  • 《每天学一个 Linux 命令》

    为了方便大家更好的学习Linux命令,民工哥技术之路公众号自2020年12月21日起,推出 《每天一个Linux命令》系列文章。 民工哥将所有文章统一整理成这个集合,方便大家后续的查找与学习。

注册于 2019-02-21
个人主页被 95.9k 人浏览