Linux 基础 CentOS

基本命令

常用命令

  • 安装RZ SZ文件传输命令yum -y install lrzsz
  • 安装netstat命令yum install net-tools
  • 安装telnet命令yum install telnet
  • 查看centos版本号cat /etc/centos-release 结果:CentOS Linux release 7.6.1810 (Core)
  • 查看linux版本信息cat /proc/version 结果:Linux version 3.10.0-957.el7.x86_64 … gcc version 4.8.5 …

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

启动: systemctl start firewalld
关闭: systemctl stop firewalld,直接关闭可能不生效,还需要修改配置文件
查看状态: systemctl status firewalld
开机禁用: systemctl disable firewalld
开机启用: systemctl enable firewalld
注销: systemctl mask firewalld,注销服务,无法start
反注销: systemctl unmask firewalld
显示参数:systemctl show firewalld
查看所有项目:systemctl list-units --type=service -all

那怎么开启一个端口呢:

  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
19
20
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 --zone=public --add-port=9999/udp --permanent # 允许9999 UDP协议
firewall-cmd --list-all # 查看防火墙规则
firewall-cmd --list-all-zones # 查看所有的防火墙策略
firewall-cmd --reload # 重新加载配置文件
firewall-cmd --query-port=8080/tcp # 查看端口是否开放

增加访问控制

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

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

openssh

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

nmap工具

主机发现,端口扫描,应用与版本侦测,操作系统侦测

1
2
nmap localhost # 查看本机端口
nmap -sV --script ssl-enum-ciphers -p 443 192.168.1.123 # 查看ssl协议加密

系统配置

文件描述符

linux系统对文件描述符的限制有两个级别
系统级别:使用cat /proc/sys/fs/file-max查看,默认值是根据内存大小,系统自动设置的,一般为内存大小(KB)的10%,可能有各种其他原因导致file-max没有设置为内存的10%
用户级别:默认是1024,使用ulimit -n查看。ulimit -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
2
3
cat /etc/passwd
test:x:1003:1003::/home/test:/bin/bash
mongod:x:981:975:mongod:/var/lib/mongo:/bin/false
  • 用户名 (mongod): 已创建用户的用户名,字符长度 1 个到 12 个字符。
  • 密码(x):代表加密密码保存在 /etc/shadow 文件中。
  • 用户 ID(981):代表用户的 ID 号,每个用户都要有一个唯一的 ID 。UID 号为 0 的是为 root 用户保留的,UID 号 1 到 99 是为系统用户保留的,UID 号 100-999 是为系统账户和群组保留的。
  • **群组 ID **(975):代表群组的 ID 号,每个群组都要有一个唯一的 GID ,保存在 /etc/group文件中。
  • 用户信息(mongod):代表描述字段,可以用来描述用户的信息。
  • 家目录(/var/lib/mongo):代表用户的家目录。
  • Shell(/bin/false):代表用户使用的 shell 类型。

脚本命令

/dev/null受一切输入它的数据并丢弃这些数据。通常被当做垃圾桶来用。尝试从/dev/null读取数据,会立刻得到一个EOF。0代表标准输入流(stdin),1代表标准输出流(stdout),2代表标准错误流(stderr)。2> /dev/null代表忽略错误信息。将stderr转换成stdout,cmd > output.txt 2>&1使得stderr和stdout都被重新定向到同一个文件中,比如kill一个不存在的进程kill 2222211 > output.txt 2>&1

指定用户执行程序

runuser [选项] -u COMMAND

su [选项] [-] [USER [参数]…]

sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]

1
2
sudo -H -u aiot /bin/bash -c "top" # 查看内存命令。可以后台运行的命令执行"xxx &"进行后台运行
ps -ef|grep top # 查看谁执行的top命令

查看目标文件是否包含某字符串

1
2
3
4
5
6
7
grep abcd fff.txt >/dev/null && echo 'yes' # 命令执行

if [ `grep -c test fff.txt` -eq 0 ];then # -c参数:表示输出匹配的行数
echo 'yes'
else
echo 'no'
fi

判断用户是否存在脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

read -p "please input a username:" username

if id -u $username >/dev/null 2>&1; then
echo "user exists"
else
echo "user does not exist"
fi

问题排查

进程无故消失

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

服务锁定与解除锁定

systemctl mask firewalld systemctl unmask firewalld

ping丢包

arp -a查看IP地址有没冲突,ping的ip的mac地址与目标的是否相同。顺便让路由器记住这个ip。重启虚拟机,或者给虚拟机重新生成一个MAC。
windowstracert www.baidu.com tracert 192.168.11.11 linux traceroute
route -n查看路由表
可能是中间经过的路由器有问题。

ssh无法登录

各种尝试比如修改配置,修改密码都不行的话进行重新安装

1
2
3
4
yum remove openssh*
yum install openssh-server
systemctl start sshd
systemctl enable sshd

安装系统

硬盘分区:

1
2
3
4
5
6
swap : 交换分区内存的2倍
/boot : 1G # 或者500M,不能使用逻辑卷(比如lvm,必须选择磁盘比如sda),根据需要添加,有些环境是必须的,没有的话无法下一步。/boot分区就是操作系统的内核及在引导过程中使用的文件,一般是几年前的版本要求划分的一个区,大小为100MB左右,但现在的新版本都不需要对这个分区进行单独划分,也就是说你完全可以不分/boot。
/ : 剩余所有空间

# 使用LVM(后续容易扩展管理磁盘) + xfs文件系统(CentOS7)
# 说明: centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3

开发生产环境不要用root用户,分配创建普通用户使用(根据具体需求可以授权管理员权限)。安全方面考虑与系统内不同软件的用户名最好不要相同,还要禁止root登录、禁止su到root。

数据库安装,比如oracle、mysql都有各自的用户,得在root用户下安装,各自用各自的用户启动程序。对于tomcat以及其他第三方中间程序可以使用自己建的普通用户启动运行。用户名使用一些无关的,密码使用复杂的无关组合。

一般情况下没必要/,home目录分别分配空间,都给/就行了,大部分程序还是在/下的,而且大家都能用。

文件系统选择说明

ext4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统,是ext3文件系统的后继版本
ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。
ext3目前只支持32000个子目录,而ext4取消了这一限制,理论上支持无限数量的子目录

xfs是一种非常优秀的日志文件系统,它是SGI公司设计的。xfs被称为业界最先进的、最具可升级性的文件系统技术
xfs是一个64位文件系统,最大支持8EB减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在16TB
xfs在很多方面确实做的比ext4好,ext4受限制于磁盘结构和兼容问题,可扩展性和scalability确实不如xfs,另外xfs经过很多年发展,各种锁的细化做的也比较好

centos添加用户并赋予管理员权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1、新建用户,这里新建一个test的用户
adduser test
# 2、设置新用户密码
passwd test
# 3、将sudoers文件的权限修改成可编辑
chmod -v u+w /etc/sudoers
# 4、使用vim编辑sudoers文件
vim /etc/sudoers
# 5、在sudoes文件中添加如下的内容
# 找到root ALL=(ALL) ALL
# 然后添加test ALL=(ALL) ALL
# 如需新用户使用sudo时不用输密码,把最后一个ALL改为NOPASSWD:ALL即可。
# 6、将sudoers文件的权限修改成不可编辑
chmod -v u-w /etc/sudoers

修改ssh端口号

  1. vi /etc/ssh/sshd_config
    1
    2
    3
    4
    #
    Port 22 # 先保留22等新端口确定可用后再注释掉重启服务,以防万一
    Port 2288 # 新增一个ssh端口
    #AddressFamily any
  2. 防火墙放行
    1
    2
    firewall-cmd --zone=public --add-port=2288/tcp --permanent
    firewall-cmd --reload
  3. SELinux添加ssh端口
    1
    2
    3
    4
    yum provides semanage # 安装 如果已经存在可以跳过
    yum -y install policycoreutils-python # 安装依赖 如果已经存在可以跳过
    semanage port -l | grep ssh # 查看
    semanage port -a -t ssh_port_t -p tcp 2288 # 添加端口
  4. 重启systemctl restart sshd.service

网络配置

  1. 查看网卡名
    1
    ip addr # 查看网卡名
  2. 配置动态获取ip
    1
    2
    3
    4
    5
    6
    vi /etc/sysconfig/network-scripts/ifcfg-ens198 (网卡名称)
    # 修改:
    BOOTPROTO=dhcp
    ONBOOT=yes
    # 执行命令
    systemctl restart network
  3. 配置静态IP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    vi /etc/sysconfig/network-scripts/ifcfg-ens198 (网卡名称)
    # 修改
    BOOTPROTO=static
    ONBOOT=yes

    # 末尾添加
    IPADDR=192.168.1.123
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.1
    DNS1=114.114.114.114
    DNS2=8.8.8.8
    # ip不能用的话ping一下选择没人在占用的ip

    # 重启服务
    systemctl restart network

    # ping
    ping x.x.x.x # 或者ping www.baidu.com

RPM依赖包下载

方法1利用”Downloadonly”插件下载 RPM 软件包及其所有依赖包

1
2
3
4
5
6
7
8
9
10
yum install yum-plugin-downloadonly # 安装插件依赖
yum install --downloadonly <package-name> # 下载rpm包 这个命令将会下载并把软件包保存到 /var/cache/yum/ 的 rhel-{arch}-channel/packageslocation 目录,如果没下载下来就用下面的指定目录的下载方法
yum reinstall --downloadonly --downloaddir=<directory> <package-name> # 指定目录,如果已经安装了就用reinstall就会下载下来了,没有安装的用install
yum install --downloadonly --downloaddir=/root/mypackages/ nginx # 例子
yum install --downloadonly --downloaddir=/root/mypackages/ httpd vsftpd # 下载多个的例子
yum groupinstall --downloadonly --downloaddir=/root/Font/ Fonts # 例子
yum install --downloadonly --downloaddir=/root/gcc/ libgcc.i686 --setopt=protected_multilib=false # 例子
rpm -i *.rpm # 安装
rpm -Uvh *.rpm # 更新安装
rpm -q libgcc # 查询rpm是否安装

方法 2 使用 “Yumdownloader”工具来下载 RPM 软件包及其所有依赖包

1
2
3
4
yum install yum-utils
yumdownloader --resolve httpd
yumdownloader --resolve --destdir=/root/mypackages/ httpd
yumdownloader "@Development Tools" --resolve --destdir /root/mypackages/

gcc 安装例子

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
[root@localhost ntp-4.2.8p15]# yum install --downloadonly gcc gcc-c++ libstdc++-devel 
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.ustc.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package gcc.x86_64 0:4.8.5-44.el7 will be installed
--> Processing Dependency: libgomp = 4.8.5-44.el7 for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: cpp = 4.8.5-44.el7 for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: glibc-devel >= 2.2.90-12 for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: libmpfr.so.4()(64bit) for package: gcc-4.8.5-44.el7.x86_64
--> Processing Dependency: libmpc.so.3()(64bit) for package: gcc-4.8.5-44.el7.x86_64
---> Package gcc-c++.x86_64 0:4.8.5-44.el7 will be installed
--> Processing Dependency: libstdc++ = 4.8.5-44.el7 for package: gcc-c++-4.8.5-44.el7.x86_64
---> Package libstdc++-devel.x86_64 0:4.8.5-44.el7 will be installed
--> Running transaction check
---> Package cpp.x86_64 0:4.8.5-44.el7 will be installed
---> Package glibc-devel.x86_64 0:2.17-326.el7_9 will be installed
--> Processing Dependency: glibc-headers = 2.17-326.el7_9 for package: glibc-devel-2.17-326.el7_9.x86_64
--> Processing Dependency: glibc = 2.17-326.el7_9 for package: glibc-devel-2.17-326.el7_9.x86_64
--> Processing Dependency: glibc-headers for package: glibc-devel-2.17-326.el7_9.x86_64
---> Package libgomp.x86_64 0:4.8.5-36.el7 will be updated
---> Package libgomp.x86_64 0:4.8.5-44.el7 will be an update
---> Package libmpc.x86_64 0:1.0.1-3.el7 will be installed
---> Package libstdc++.x86_64 0:4.8.5-36.el7 will be updated
---> Package libstdc++.x86_64 0:4.8.5-44.el7 will be an update
---> Package mpfr.x86_64 0:3.1.1-4.el7 will be installed
--> Running transaction check
---> Package glibc.x86_64 0:2.17-260.el7 will be updated
--> Processing Dependency: glibc = 2.17-260.el7 for package: glibc-common-2.17-260.el7.x86_64
---> Package glibc.x86_64 0:2.17-326.el7_9 will be an update
---> Package glibc-headers.x86_64 0:2.17-326.el7_9 will be installed
--> Processing Dependency: kernel-headers >= 2.2.1 for package: glibc-headers-2.17-326.el7_9.x86_64
--> Processing Dependency: kernel-headers for package: glibc-headers-2.17-326.el7_9.x86_64
--> Running transaction check
---> Package glibc-common.x86_64 0:2.17-260.el7 will be updated
---> Package glibc-common.x86_64 0:2.17-326.el7_9 will be an update
---> Package kernel-headers.x86_64 0:3.10.0-1160.71.1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================================================================================================================================
Package Arch Version Repository Size
======================================================================================================================================================================================================================================
Installing:
gcc x86_64 4.8.5-44.el7 base 16 M
gcc-c++ x86_64 4.8.5-44.el7 base 7.2 M
libstdc++-devel x86_64 4.8.5-44.el7 base 1.5 M
Installing for dependencies:
cpp x86_64 4.8.5-44.el7 base 5.9 M
glibc-devel x86_64 2.17-326.el7_9 updates 1.1 M
glibc-headers x86_64 2.17-326.el7_9 updates 691 k
kernel-headers x86_64 3.10.0-1160.71.1.el7 updates 9.1 M
libmpc x86_64 1.0.1-3.el7 base 51 k
mpfr x86_64 3.1.1-4.el7 base 203 k
Updating for dependencies:
glibc x86_64 2.17-326.el7_9 updates 3.6 M
glibc-common x86_64 2.17-326.el7_9 updates 12 M
libgomp x86_64 4.8.5-44.el7 base 159 k
libstdc++ x86_64 4.8.5-44.el7 base 306 k

Transaction Summary
======================================================================================================================================================================================================================================
Install 3 Packages (+6 Dependent packages)
Upgrade ( 4 Dependent packages)

Total download size: 57 M
Background downloading packages, then exiting:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/13): cpp-4.8.5-44.el7.x86_64.rpm | 5.9 MB 00:00:41
(2/13): gcc-c++-4.8.5-44.el7.x86_64.rpm | 7.2 MB 00:00:50
(3/13): glibc-devel-2.17-326.el7_9.x86_64.rpm | 1.1 MB 00:00:12
(4/13): glibc-headers-2.17-326.el7_9.x86_64.rpm | 691 kB 00:00:06
(5/13): libgomp-4.8.5-44.el7.x86_64.rpm | 159 kB 00:00:01
(6/13): libmpc-1.0.1-3.el7.x86_64.rpm | 51 kB 00:00:00
(7/13): libstdc++-4.8.5-44.el7.x86_64.rpm | 306 kB 00:00:02
(8/13): libstdc++-devel-4.8.5-44.el7.x86_64.rpm | 1.5 MB 00:00:10
(9/13): mpfr-3.1.1-4.el7.x86_64.rpm | 203 kB 00:00:01
(10/13): glibc-common-2.17-326.el7_9.x86_64.rpm | 12 MB 00:01:15
(11/13): kernel-headers-3.10.0-1160.71.1.el7.x86_64.rpm | 9.1 MB 00:00:43
(12/13): gcc-4.8.5-44.el7.x86_64.rpm | 16 MB 00:01:40
(13/13): glibc-2.17-326.el7_9.x86_64.rpm | 3.6 MB 00:01:52
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total




glibc = 2.17-326.el7_9 is needed by glibc-devel-2.17-326.el7_9.x86_64 左边被右边需要,所以左边要先安装


[root@localhost src]# rpm -Uvh glibc*
Preparing... ################################# [100%]
package glibc-common-2.17-326.el7_9.x86_64 is already installed
package glibc-2.17-326.el7_9.x86_64 is already installed
package glibc-headers-2.17-326.el7_9.x86_64 is already installed
package glibc-devel-2.17-326.el7_9.x86_64 is already installed
[root@localhost src]# rpm -Uvh gcc*
Preparing... ################################# [100%]
package gcc-4.8.5-44.el7.x86_64 is already installed
package gcc-c++-4.8.5-44.el7.x86_64 is already installed
[root@localhost src]# rpm -Uvh libstdc++-
libstdc++-4.8.5-44.el7.x86_64.rpm libstdc++-devel-4.8.5-44.el7.x86_64.rpm
[root@localhost src]# rpm -Uvh libstdc++-*
Preparing... ################################# [100%]
package libstdc++-4.8.5-44.el7.x86_64 is already installed
package libstdc++-devel-4.8.5-44.el7.x86_64 is already installed
[root@localhost src]# cc
cc: fatal error: no input files
compilation terminated.

1
2
3
4
5
6
7
8
9
10
11
12
13
error: Failed dependencies:
libmpfr.so.4()(64bit) is needed by gcc-4.8.5-44.el7.x86_64
libmpfr.so.4()(64bit) is needed by gcc-c++-4.8.5-44.el7.x86_64
libmpfr.so.4()(64bit) is needed by cpp-4.8.5-44.el7.x86_64
libmpfr.so.4()(64bit) is needed by libmpc-1.0.1-3.el7.x86_64

其实就是少了一个mpfr包!
rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm
把所有相关的依赖都关联上:

rpm -Uvh glibc* gcc* libstdc++* cpp* kernel* libmp* libm* mpfr*
也可以带先对路径或者绝对路径比如:
rpm -Uvh src/glibc* src/gcc* src/libstdc++* src/cpp* src/kernel* src/libmp* src/libm* src/mpfr*

不知道依赖关系的可以全部写在同一行里面 rpm -Uvh glibc* gcc* libstdc++* cpp* kernel* libmp* libm* mpfr*

最终步骤
rpm -Uvh libstdc++*
rpm -Uvh kernel* glibc*
rpm -Uvh mpfr* libmpc*
rpm -Uvh cpp* gcc* libgomp*

openssl-devel例子

1
2
3
4
yum install --downloadonly openssl-devel

rpm -Uvh openssl* zlib* krb5* key* libcom* libkadm5* libselinux* libverto* libcom* libsepol* pcre* libsepol* e2* libss* # 通过*自动关联相关依赖
rpm -Uvh libcap*
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost src]# rpm -Uvh libcap-devel-2.22-11.el7.x86_64.rpm
error: Failed dependencies:
libcap = 2.22-11.el7 is needed by libcap-devel-2.22-11.el7.x86_64

还需要libcap包,左边是调用方法位置,右边是缺少的包的名字
[root@localhost src]# yum install --downloadonly libcap-devel

Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/2): libcap-devel-2.22-11.el7.x86_64.rpm | 26 kB 00:00:00
(2/2): libcap-2.22-11.el7.x86_64.rpm | 47 kB 00:00:04


安装ntp

不能直接使用make后的包,还是得从configure步骤开始,因为不同环境会导致make install执行不过。
我想到一个办法,提高速度,先安装默认的旧版,然后把新版的ntp可执行文件直接覆盖进去就行了。

遇到问题如何解决

主机无法访问?

  1. 检查防火墙,端口
  2. 检查程序需要监听的端口是否正确
  3. 内网换一个服务器试ping一下或者telnet一下
  4. 还是不行重启一下无法访问的服务器

scp执行拷贝命令 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!错误解决

重装主机导致ssh的认证改变

方法一:

1
ssh-keygen -R xxx.xxx.xx.xxx(ip) # update一下,如果还是不行,使用下面那个方法

方法二:

1
vim ~/.ssh/known_hosts # 进去删除掉无法连接的主机信息

非root用户不能使用低于1024的端口

可以启动一个应用比如tomcat使用8088端口,通过防火墙把80端口转发到8088端口

1
2
3
4
5
firewall-cmd --add-masquerade --permanent
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8088 --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --remove-port=8088/tcp --permanent # 可以不方开8088端口
firewall-cmd --reload

网络问题排查

1
2
3
4
5
arping # 可以ping MAC地址。由于arping命令基于ARP广播机制,所以arping命令只能测试同一网段或子网的网络主机的连通性,ping命令则是基于ICMP协议,是可以路由的,所以使用ping命令可以测试任意网段的主机网络连通性。某些环境可能ICMP协议会被禁。地址解析协议,即ARP(Address Resolution Protocol)。是根据IP地址获取物理地址的一个TCP/IP协议,是网络链路层的协议,在局域网中使用。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。广播请求不能出局域网,所以ARP协议只能存在于内网,不能通过路由器。
arping -I em1 192.168.1.19 # 获取IP的MAC地址
arp -i em1 -a # 查看arp缓存
arping -D -I em1 192.168.1.18 # 冲突检测,如果返回的MAC地址出现不同说明有多个MAC使用了该IP
arp -a # 也可以查看是否有IP冲突

不同程序的用户无法互相访问对方目录

双方加到对方的分组里,组权限加上+rx。默认创建文件的umask一般再tomcat,vsftp,用户bash文件或者环境变量中配置
usermod -a -G test nginx
chmod -R g+rwx /home/test/ 目录要有x权限,不然程序还是进不去。非常重要

调整LVM分区大小

卸载/home如果报错,就需要kill xxx掉fuser -m /home列出的进程号去除字符C。

迁移/home目录到根目录

  1. 在根目录下面建home1
  2. 复制home目录下文件到home1
  3. 卸载home
  4. 重命名home1为home
  5. etc启动项目注释对home目录磁盘的挂载

阿里云

CentOS7安装图形界面

1
2
3
sudo  yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
sudo ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
reboot

CenttOS7增加交换空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
free -h
df -h
dd if=dev/zero of=/root/swapfile bs=1M count=8192
/sbin/mkswap /root/swapfile
/sbin/swapon /root/swapfile

#出现权限问题
chmod 600 /root/swapfile

# 重启后丢失,rc.local添加命令:
vi /etc/rc.local
/sbin/swapon /root/swapfile
# 还有 echo "/mnt/swap swap swap defaults 0 0" >> /etc/fstab
vi /etc/fstab
/home/swap swap swap defaults 0 0

查看网络使用情况,带宽是否用完

1
2
3
4
yum install dstat
dstat # ping www.baidu.com -s 5000 可以看到流量变化

# 还有nload命令,iftop命令可以精确分析某地址端口的流量。

参考