一、Linux简介
相关概念
- OS是管理和控制计算机硬件与软件资源的程序。运行在系统硬件上的软件,也是其他软件赖以运行的基础环境。
- Linux由芬兰的Linus Torvalds开发,开源且免费。主要运行在Intel x86系列CPU上,支持32位和64位存储器寻址宽度。
- Linux系统版本号格式:主版本号.次版本号.修订次数号。此版本号为奇数时为测试版,偶数时为稳定版。
- Linux继承UNIX,以网络为核心思想,采用模块化的结构,内核主要由5个子系统组成:进程调度,内存管理,文件系统,网络接口和进程通信。其中以对CPU的进程调度为核心。
- Linux整体层次结构,最底层是硬件层,依次为操作系统层,系统调用层,shell接口,应用程序层和用户层。
- 尽量有台自己的Linux环境,可以买个云主机,也可以是kvm、Xen、virtualbox、vmware等虚拟机。
- Linux有众多发行版本,比如红帽系的RHEL、CentOS、Fedora,Debian系的Debian、Ubuntu,其他包括SuSE、FreeBSD等。
- 硬件,主要由中央处理器CPU,随机存取存储器RAM,硬盘Hard Disk,输入输出设备I/O组成。其中内存有以下几类:
层次 | 访问时间 | 容量 | 说明 |
---|---|---|---|
CPU寄存器 | 1ns | <1KB | cpu中,1个cpu周期 |
CPU高速缓存 | 2ns | 4MB | L1,L2,L3 cache,3-40个周期 |
内存 | 10ns | 1-16GB | RAM |
磁盘 | 10ms | 1-4TB | 一种机械装置,比内存慢100万倍 |
CentOS
- CentOS基于Red Hat Enterprise Linux内核重新编译而成。
- CentOS目前也有桌面图形系统,但是作为一个独立的应用程序存在。主要有X-Window、GNOME和KDE这3种。
CentOS目录如下:
目录名称 | 功能描述 | 分类 |
---|---|---|
/bin | 常用命令 | 指令集合 |
/boot | 启动文件 | 系统运行 |
/dev | 外部设备 | 外部文件 |
/etc | 系统管理配置文件和目录 | 系统运行 |
/home | 用户目录 | 账户 |
/lib | 动态连接共享库 | 系统运行 |
/media | U盘光驱等外部设备 | 外部文件 |
/mnt | 临时挂载目录 | 外部文件 |
/opt | 安装软件目录 | 拓展 |
/proc | 系统内存映射的虚拟目录 | 运行时 |
/root | 系统管理员目录 | 账户 |
/run | 系统启动后的信息,临时文件系统 | 临时文件 |
/sbin | 超级用户常用命令 | 指令集合 |
/srv | 服务启动后提取数据 | 拓展 |
/sys | 安装2.6内核的文件系统sysfs | 系统运行 |
/tmp | 临时文件 | 临时文件 |
/usr | 用户应用程序和文件 | 账户 |
/usr/bin | 用户使用程序 | 账户 |
/usr/sbin | 超级用户使用程序 | 账户 |
/usr/src | 内核源码 | 账户 |
/var | 经常修改的目录,如日志 | 运行时 |
CentOS内核代码位于/usr/src/kernels/。相关目录如下:
目录名称 | 功能描述 |
---|---|
arch | 硬件相关 |
block | 块设备 |
crypto | 加密函数库 |
drivers | 设备驱动程序 |
fs | 文件系统 |
ipc | 进程通信 |
init | 内核初始化 |
kernel | 内核核心 |
lib | 通用内核函数 |
net | 网络通信 |
mm | 内寸管理 |
samples | 内核例子 |
scripts | 配置脚本 |
security | 系统安全 |
sound | 音频体系 |
usr | 用户代码 |
系统启动初始化
1、BIOS加电自检
2、grup2引导程序
3、内核映像加载
4、INIT进程初始化,分为:
- 初始化系统运行级别的文件
- 相关设备初始化
- systemd启动系统后台进程
- 启动用户自定义服务
- 执行/bin/login登录程序
- 执行/etc/profile文件初始化用户环境
- 启动~/.bash_profile脚本
二、基础环境配置
防火墙
CentOS7使用firewalld(第4代)作为系统默认的防火墙,但原有的iptables(第3代)依然存在。
1 | $ service firewalld status #防火墙状态 |
SELinux
1 | $ sestatus #查看SELinux状态 |
系统网络状态
1 | $ ifconfig |
本地YUM服务配置
YUM是一个基于RedHat系Linux的RPM管理的后台程序,解决软件包的依赖问题。对应Debian系的apt。
新一代的RPM软件包管理器是DNF工具,后续会取代YUM。
1 | $ rpm -qa | grep yum # 查看是否安装YUM |
远程访问配置
1 | # ssh服务 |
三、shell
- shell介于系统内核和用户之间,负责解析输入的命令和输出二进制码。
- shell是命令语言,命令解释程序及程序设计语言的统称。
- shell可独立自由开发,CentOS可支持多种shell。
- shell命令有内部命令和外部命令之分,内部命令多数在/usr/bin目录下的可执行二进制文件。
- shell的命令格式如下: command [options] [arguments]
1 | $ cat /etc/shells # 查看支持的shell |
符号
- 通配符,用*代表全部,?代表一个字符,[a-z]匹配a-z的字符,[^a-z]不匹配a-z的字符。
- 单引号,阻止空格和特殊字符被解释,在单引号内的字符串会一成不变的输出。
- 双引号,和单引号类似,单对于$ \ `这三种特殊字符先进行解释后输出。
- 反引号,反引号里的字符视为命令来执行
1 | $ kernal=4 18 #报错 |
文件管理命令
1 |
|
文件操作
1 | $ vim a.log |
磁盘管理命令
1 | $ dd /dev/temp of=dist.img #将分区的数据复制到dist.img文件中 |
压缩和解压缩命令
1 | # 格式为.bz2 |
软件包管理命令
1、RPM格式安装包:
- RPM(RedHat Package Manager)是RedHat系Linux的一种开放式的软件包管理程序,可安装、卸载、升级、发布软件包,以及查询验证软件包GPG和MD5数字签名。
- 系统中存在一个与RPM有关的数据库,记录包之间的依赖关系。
- RPM命名方式,软件包名称-版本号-修正版.硬件平台.rpm(rpm-4.8.0-27.el6.i686.rpm)。
1 | $ rpm -ivh dialog-1.2-4.el7.x86_64.rpm |
2、源代码软件安装包
由配置(configure)、编译(make)、安装(make install)3个步骤组成。
1 | $ tar vzxf nagois-plugins-1.5.tar.gz # tar.gz文件解压 |
系统管理命令
1 | $ kill -l # 显示共64种信号。默认为SIGTERM(15)。SIGKILL(9)为不可忽略。 |
日志相关命令
1 | $ tail -f xxx.log |
其他命令
1 | $ man crontab # man为命令在线帮助手册(manual pages),获取任何命令的使用方式 |
shell脚本编程
- shell的变量分为局部变量、环境变量和特殊变量,局部变量通过set命令设置,环境变量通过env命令获取,特殊变量有$*(所有参数)和$@(某个参数),@可以是数字,代表第几个参数。
hello.sh内容如下:
1 |
|
1 | # 执行方式1 |
1 | # 赋值 |
1 | # 循环,包括for、while和until语句。 |
服务管理命令
service和systemctl
1 | > systemctl enable xxx |
https://www.jianshu.com/p/a0ab0ccb8051 Linux查看CPU详细信息
五、用户和用户组
用户管理
1 | $ cat /etc/passwd # 用户信息 |
用户组管理
1 | $ cat /etc/group # 用户组信息 |
用户环境配置管理
用户成功登录后,会依次读取配置文件来初始化工作环境。
- /etc/profile文件
- 然后读取 ~/.bash_profile、 ~/.bash_login、 ~/.profile中第一个存在的文件
- 如果 ~/.bash_profile存在,还会执行 ~/.bashrc
六、文件系统和数据存储空间
文件系统的组成
- 普通文件
- 目录
- 链接文件:分为软链接和硬链接。硬链接实现不复制的情况下实现文件共享,减少磁盘的浪费。软链接采用不同的文件名引用同一数据,好处是确保目录文件结构的兼容性。
- 特殊文件:包括块设备文件b、套接字文件s、字符设备c和命名管道文件p。不包含任何数据,用于建立一个物理设备和文件名之间的映射。特殊的是/dev/null,黑洞的空设备文件。
1 | $ ll |
磁盘分区
- 系统的磁盘分区,由主引导分区、主分区和拓展分区组成。
- 主引导分区是系统自动保留的512字节大小的分区,用于保存磁盘启动的引导信息,磁盘分区等。
- 主分区可直接使用,主分区不多于4个。
- 拓展分区需要划分成逻辑分区后才可以使用。
1 | $ df -h |
七、系统性能监控
常用系统性能监控工具
监测工具 | 作用说明 |
---|---|
dstat | 综合的信息采集统计工具 |
iostat | I/O负载监控 |
iptraf | 网络状况 |
mpstat | CPU利用率 |
netstat | 网络状况 |
netperf | 网络性能监视 |
sar | 系统资源使用 |
tcpdump | 网络抓包 |
tcptrace | 数据包分析 |
top | 进程活动和CPU内存状态 |
vmstat | 虚拟内存、进程和CPU状态 |
磁盘监控
1 | $ fdisk -l /dev/vda #磁盘分区描述 |
内存管理
1 | $ free -m #内存静态信息 |
CPU管理
1 | $ ll /dev/cpu #查看cpu |
进程状态监控
1 | $ pstree # 查看进程树 |
网络性能评估
监控Linux网络带宽的工具有一大把,下面是按功能划分的命令名称。
- 监控总体带宽使用――nload、bmon、slurm、bwm-ng、cbm、speedometer和netload
- 监控总体带宽使用(批量式输出)――vnstat、ifstat、dstat和collectl
- 每个套接字连接的带宽使用――iftop、iptraf、tcptrack、pktstat、netwatch和trafshow
- 每个进程的带宽使用――nethogs
1 | $ ping 172.26.21.137 # 网络连通性测试,TTL在100-130之间则为windows,50-60或240-255之间则为linux。 |
网络抓包
最近需要对服务器的网络进行抓包统计,便用到了tcpdump。『官网传送门』,可去查看最新版本以及相关用法。用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpdump安装:
1 | # 安装依赖 |
首先需要查看设备上有哪些设备可以抓取,通过tcpdump -D会列出可以抓取的网络设备名以及编号
1 | 1.eth0 [Up, Running] |
如需要可视化页面来分析,可以安装大名鼎鼎的wireshark。最新版本是支持windows和mac了的。
可以通过tcpdump导出cap文件,供wireshark直接打开。
1 | $ tcpdump tcp -i 2 -t -s 0 -c 2000 -w x.cap |
相关参数的含义请参考官网文档。
网络参数配置
包括网卡参数、主机名、服务、域名解析等配置。
- /etc/hosts,主机和ip映射
- /etc/host.conf,如何解析主机名
- /etc/resolv.conf,配置DNS客户端
- /etc/services,记录服务名和端口号映射
- /etc/sysconfig/network
- /etc/sysconfig/network-scripts/ifcfg-lo,系统还回地址
- /etc/sysconfig/network-scripts/ifcfg-eth0,网卡设备配置文件
- /etc/nsswitch.conf,多个配置文件查找顺序
/etc/services对端口号的分配策略如下:
- 0,不使用
- 1-1023,系统保留,由root用户进程使用
- 1024-4999,由客户端程序自由分配
- 5000-65535,由服务端程序自由分配
八、IO基础
基础概念
1、用户空间与内核空间
- 由于CPU某些指令比较危险,如果错用会导致系统崩溃,为了保护系统,Linux将内存空间划分为了两部分:内核空间和用户空间。以32位为例,最高的1G(内核空间)供内核使用,较低的3G(用户空间)给各个进程使用。
- 内核空间,运行内核和驱动程序,存放的是内核代码和数据,可以运行最高级别(ring0)的指令。用户空间,运行应用程序,存放的是用户程序的代码和数据,不能直接调用系统资源(只能运行ring3级别指令),必须通过内核暴露的系统调用接口(system call)向内核发出指令。
- 当进程运行在内核空间时,它就处于内核态;当进程运行在用户空间时,它就处于用户态。通过系统调用,进程可以从用户空间切换到内核空间。
- 每个进程有私有的用户空间,其他进程无法访问。但内核空间是所有进程和内核共享的。从单个进程来看,他可以拥有4G字节的虚拟空间。
2、DMA(直接内存访问,Direct Memory Access)
POI模式中,读取磁盘文件到内存需要经过CPU存储转发。DMA模式取代了POI。
在DMA模式下,CPU只需要向DMA控制器下达指令,让DMA控制器来处理数据的传送即可,DMA控制器通过系统总线来传输数据,传送完毕再通知CPU,这样就在很大程度上降低了CPU占有率。
3、中断
允许设备(如键盘、网卡等)表明它们需要CPU。一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并调用一个称为中断服务程序的特定程序。之后,CPU会恢复执行之前被中断的程序。
磁盘IO和网络IO流程
当我们需要进行IO操作时,如读写硬盘文件、读写网卡数据等,进程需要从用户态切换到内核态,否则无法进行这样的操作,无论是从内核态切换到用户态,还是从用户态切换到内核态,都需要进行一次上下文的切换。一般情况下,应用不能直接操作内核空间的数据,需要把内核态的数据拷贝到用户空间才能操作。
一个网络请求想访问服务器上的某个静态文件,服务器的IO流程如下:
- 进程发起一个系统调用sys_read,读取磁盘的文件。
- DMA将磁盘文件数据拷贝到内核空间的read缓冲区。
- CPU把内核空间read缓冲区数据拷贝到用户空间的缓冲区。
- 进程发起一个系统调用socket_write,向网卡写数据。
- CPU把用户空间缓冲区的数据拷贝到内核空间的socket缓冲区。
- 最后DMA把内核空间的socket缓冲区数据拷贝到网卡。
如使用了sendfile命令,涉及零复制(zero copy)技术,流程可以简化为:
- DMA copy将磁盘数据copy到kernel buffer中
- 向socket buffer中追加当前要发送的数据在kernel buffer中的位置和偏移量
- DMA gather copy根据socket buffer中的位置和偏移量直接将kernel buffer中的数据copy到网卡上。
1 | $ nc -l 9999 |