Linux 基础 CentOS

基本命令

常用命令

  • 安装RZ SZ文件传输命令yum -y install lrzsz
  • 安装netstat命令yum install net-tools
  • 安装telnet命令yum install telnet

CentOS7使用firewalld打开关闭防火墙与端口

启动: systemctl start firewalld
关闭: systemctl stop firewalld,直接关闭可能不生效,还需要修改配置文件
查看状态: systemctl status firewalld
开机禁用: systemctl disable firewalld
开机启用: systemctl enable firewalld

那怎么开启一个端口呢:

  1. 添加: firewall-cmd --zone=public --add-port=80/tcp --permanent (–permanent永久生效,没有此参数重启后失效)
  2. 重新载入: firewall-cmd --reload
  3. 查看: firewall-cmd --zone= public --query-port=80/tcp
  4. 查看开启端口:firewall-cmd --zone=public --list-ports

删除端口: firewall-cmd --zone= public --remove-port=80/tcp --permanent

乱码解决

  1. 查看当前语言:locale或者echo $LANG en_US.UTF-8也能够支持中文显示的。
  2. CRT设置语言: 选项→会话选项→终端→外观→字符编码→UTF-8
  3. 然后通过CRT写入中文,就不会显示乱码
  4. 可以给系统安装个中文语言包:yum groupinstall chinese-support

语言说明:
en_US.UTF-8:你说英语,你在美国,字符集是utf-8
zh_CN.UTF-8:你说中文,你在中国,字符集是utf-8
如果你的LANG环境变量是en_US.UTF-8,那么系统的菜单、程序的工具栏语言、输入法默认语言就都是英文的。
如果你的LANG环境变量是zh_CN.UTF-8,那么系统的菜单、程序的工具栏语言、输入法默认语言就都是中文的。

软件安装

普通用户是无法使用yum进行安装软件的,直接下载RPM包也是不行的,因为要写到/bin /usr等目录。可以通过解压出来,再在vim ~/.bashrc添加环境变量来操作。
处于安全考虑需要非root启动,避免比如tomact等程序被外部攻击获取到root权限:可以使用root用户安装软件,然后授权给非root用户运行使用。

版本升级

小版本升级-补丁版本

1
2
sudo yum list kernel
sudo yum update -y kernel

大版本升级-内核版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 载入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 载入elrepo-kernel元数据
yum --disablerepo=\* --enablerepo=elrepo-kernel repolist
# 查看可用的rpm包
yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel*
# 安装最新版本的kernel
yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml.x86_64
# 查看默认启动顺序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (3.10.0-1062.18.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-14cd5fb0ee114fa88d6c747daee61c31) 7 (Core)
# 默认启动的顺序是从0开始,新内核是从头插入(目前位置在0,而3.10.0的是在1),所以需要选择0。
grub2-set-default 0
# 删除老内核以及内核工具
rpm -qa|grep kernel|grep 3.10
rpm -qa|grep kernel|grep 3.10|xargs yum remove -y
# 安装新版本工具包
yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml-tools.x86_64

rpm -qa|grep kernel
# 重启并检查
reboot
uname -a

其他应用

### 查看定时器

1
2
crontab -l # 查看定时任务
crontab -r # 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除

防火墙

添加防火墙需要非常小心,如果是远程连接很可能导致无法连接上,必须到机房进行登录操作。阿里云等云服务器都有安全策略也可以添加一些过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
systemctl status firewalld # 查看firewall服务状态
firewall-cmd --state # 查看firewall的状态
systemctl start firewalld # 启动
systemctl stop firewalld # 关闭
systemctl enable firewalld # 设置开机启动 谨慎设置
systemctl disable firewalld # 取消开机启动
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="11.22.33.44" drop' # 禁止 11.22.33.44访问
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="116.255.0.0/16" drop' # 禁止一个IP段,比如禁止116.255.*.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="116.255.192.0/24" drop' # 禁止一个IP段,比如禁止116.255.192.*
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="11.22.33.44" drop' # 解除-禁止IP(11.22.33.44)访问
firewall-cmd --permanent --add-service=http # 允许http服务
firewall-cmd --permanent --remove-service=http # 关闭http服务
firewall-cmd --permanent --add-port=3306/tcp # 允许端口
firewall-cmd --permanent --add-port=1-3306/tcp # 允许端口 1-3306
firewall-cmd --permanent --remove-port=3306/tcp # 关闭放行端口3306
firewall-cmd --list-all # 查看防火墙规则
firewall-cmd --list-all-zones # 查看所有的防火墙策略
firewall-cmd --reload # 重新加载配置文件

增加访问控制

限制shh可以登录root的ip地址

1
2
3
4
5
vi /etc/ssh/sshd_config
#---添加内容
AllowUsers root@120.33.88.*
#---
service sshd restart

openssh

服务器openssh版本升级后客户端工具的版本也要升级,不然可能导致无法连接

系统配置

文件描述符

linux系统对文件描述符的限制有两个级别
系统级别:使用cat /proc/sys/fs/file-max查看,默认值是根据内存大小,系统自动设置的,一般为内存大小(KB)的10%,可能有各种其他原因导致file-max没有设置为内存的10%
用户级别:默认是1024,使用ulimit -n查看。limit -a查看所有限制信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
core file size          (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 125514
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 125514
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

为什么需要文件描述符?
原因1 – 资源问题:每个打开的文件都需要消耗内存来管理,而内存是有限的。
原因2 – 安全问题:如果不限制的话,有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。
所以限制文件描述符的数量对于linux系统的稳定性是非常重要的

hard和soft的区别: soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值
core是内核文件,nofile是文件描述符,noproc是进程,一般情况下只限制文件描述符数和进程数就够了

vi /etc/security/limits.conf,配置打开文件数、内存限制等。This file sets the resource limits for the users logged in via PAM.It does not affect resource limits of the system services.

1
2
3
4
5
6
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited

查看系统当前打开的文件描述符数量sudo cat /proc/sys/fs/file-nr
查看某个进程打开的文件描述符数量(list open files)lsof -p 12324 |wc -l
查看进程打开文件描述符数量排序lsof -n |awk '{print $1}'|sort |uniq -c |sort -nr|head -10

内核参数

/etc/sysctl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
kernel.sysrq = 0               # 是否启用kernel.sysrq(在大多数服务已无法 响应的情况下,还能通过按键组合来完成一系列 预先定义的系统操作,1启用,0禁用;
kernel.core_pattern = /core/core-%e-%t-%s # core格式
kernel.core_uses_pid = 1 # 可以控制core文件的文件名中是否添加pid作为扩展(文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的 core文件同一命名为core);
kernel.msgmnb = 65536 # 限制一个队列的最大长度;
kernel.msgmax = 65536 # 限制一条消息的最大长度;
kernel.shmmax = 68719476736 # 最大共享内存段大小;
kernel.shmall = 4294967296 # 可以使用的共享内存的总量;
kernel.shmmni = 4096 # 整个系统共享内存段的最大数目;
kernel.sem = 250 32000 100 128 # 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操数;系统范围内最大信号对象集数;
kernel.msgmni = 256 # 决定了系统中同时运行的最大的消息队列的个数;
fs.file-max = 6815744 # 系统级打开最大文件句柄的数量;
fs.aio-max-nr = 1048576 # 此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障。
net.ipv4.ip_forward = 0 # (0代表禁止进行IP转发;1代表可以进行IP转发);
net.ipv4.conf.default.rp_filter = 1 # 控制系统是否开启对数据包源地址的校验;
net.ipv4.conf.default.accept_source_route = 0 # 禁用icmp源路由选项;
net.ipv4.tcp_syncookies = 1 # 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击, 默认为0,表示关闭;
net.ipv4.conf.all.forwarding = 0 # 0代表不转发源路由帧,若做NAT建议开启;
net.ipv4.ip_local_port_range = 9000 65000 # 系统中的程序会选择这个范围内的端口来连接到目的端口(目的端口当然是用户指定的;
net.ipv4.tcp_fin_timeout = 30 # 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认是60,降低这个值以提高系统性能;
net.ipv4.tcp_keepalive_time = 600 # 这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置得小一些,可以更快地清理无效的连接
net.ipv4.tcp_max_syn_backlog = 8192 # 定义backlog队列容纳的最大半连接数,如果配置高可以设置的更高;
net.ipv4.tcp_mem = 786432 1048576 1572864 # 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。示例中第一个值为786432*4/1024/1024=3G,第二个值为1048576*4/1024/1024=4G,第三个值为1572864*4/1024/1024=6G
net.core.rmem_default = 262144 # 套接字接收缓冲区大小的缺省值;
net.core.rmem_max = 4194304 # 套接字接收缓冲区大小的最大值;
net.core.wmem_default = 262144 # 套接字发送缓冲区大小的缺省值;
net.core.wmem_max = 1048576 # 套接字发送缓冲区大小的最大值;
vm.swappiness = 0 # 表示尽量使用内存,减少使用磁盘swap交换分区;
net.core.somaxconn = 262144 # 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
net.core.netdev_max_backlog = 262144 # 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值

sysctl -p更新配置

cat /proc/sys/fs/nr_open 一个进程可以打开的文件个数 默认1048576,可以修改,正常够用
cat /proc/sys/fs/file-nr 其中第一个数表示当前系统已分配使用的打开文件描述符数,为第二个数已经分配但未使用的文件描述符数,第三个数等于file-max

  1. 所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
  2. 单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
  3. nofile的soft limit不能超过其hard limit
  4. nofile的hard limit不能超过/proc/sys/fs/nr_open

问题排查

进程无故消失

  1. 先查看相关日志:grep -i kill /var/log/message*

服务锁定与解除锁定

systemctl mask firewalld systemctl unmask firewalld

参考