首页
国外VPS
国内云主机
关于我们
推荐
主机排名
SEO博客
Search
1
RackNerd:五大机房 2核/1G/35G/4T流量 年付25.89美元
51,428 阅读
2
TMHHOST - 日本软银 / 洛杉矶CN2 / 韩国CN2
634 阅读
3
Linux在IPv4/IPv6下,使用IPv4连接优先设置教程
585 阅读
4
CentOS7 Debian Fedora一键安装Fail2ban安全软件教程
563 阅读
5
开源软件-蓝眼云盘 3.1.0 发布
484 阅读
云主机
独立服务器
干货教程
域名注册
云服务器
Search
标签搜索
CN2
干货教程
洛杉矶机房
独服
每周推荐
高防
GIA
bgp
双11
圣何塞机房
RackNerd
linux
windows
沙田机房
amd
DDOS
大带宽
荷兰机房
edgenat
kvm
主机排名
累计撰写
281
篇文章
累计收到
36
条评论
首页
栏目
云主机
独立服务器
干货教程
域名注册
云服务器
页面
国外VPS
国内云主机
关于我们
推荐
主机排名
SEO博客
搜索到
10
篇与
linux
的结果
2020-10-18
Linux在IPv4/IPv6下,使用IPv4连接优先设置教程
虽然目前很多服务器托管商都已经增加IPv6,但是各家的IPv6使用上并不一定畅通。所以我们要设置一下让IPv4作为默认的连接方式。但是根据RFC3484协议Linux默认情况下IPv6优先级高于IPv4,应用程序优先使用IPv6地址。 1、如果要使用ipv4连接优先也不禁用ipv6,需要修改gai.conf配置文件使其生效。 编辑 /etc/gai.conf 文件,查找 precedence ::ffff:0:0/96 100 将前面的注释 # 去掉并保存,如果前面没有 # 号表示已经更改过设置了。如果没有查找到该行直接在文件末尾添加上 precedence ::ffff:0:0/96 100 CentOS默认没有 /etc/gai.conf 该文件,可以执行命令 cp -p /usr/share/doc/glibc-common-2.17/gai.conf /etc/ 拷贝该文件后修改。 修改完成保存生效。这样设置后有IPv4的话优先使用IPv4,也不影响IPv6的使用。 注:::ffff:0:0/96 为IPv4/IPv6转换地址 (IPv4-mapped IPv6 address)。 2、如果确实不需要IPv6,我们可以禁用IPv6 执行命令:echo "1" > /proc/sys/net/ipv6/conf/all/disable_ipv6 这样就掉了禁用ipv6,如需恢复的话删除掉 /proc/sys/net/ipv6/conf/all/disable_ipv6 这个文件就可以。
2020年10月18日
585 阅读
0 评论
0 点赞
2020-09-10
如何在Linux服务器中生成SSH密钥
我们大部分网友使用登录Linux服务器一般直接使用的服务器ROOT用户,当然我们正常的设置强密码、修改默认22端口,一般是没有多大问题的。但是我们也有一些比较方便的,且安全的做法就是直接使用SSH密钥登录。我们只需要连接密钥文件无需密码就可以登录。 这里我们就以创建OPENSSH来到我们的Linux服务器环境中创建生成SSH密钥的办法。对于大部分的服务器是可以使用的,当然必须是Linux系统。这里我们使用的是OpenSSH工具,在大多数Linux发行版中提供。 我们可以按照以下步骤使用OpenSSH实用程序创建SSH密钥。 ssh-keygen -t rsa -b 4096 -C "Example" 我们回车键后会把密钥保存在默认位置。 默认情况下,密钥存储在〜/ .ssh目录中。 使用默认文件名很方便,因为大多数SSH客户端会自动将默认文件名id_rsa用作私钥,将id_rsa.pub用作公用密钥。 Generating public/private rsa key pair. Enter file in which to save the key (/home/example_user/.ssh/id_rsa): 我们这可以输入密钥密码。 我们也可以按ENTER跳过此提示。 如果您使用密码,除非您也使用ssh-agent,否则每次使用密钥时都将输入密码。 Enter passphrase (empty for no passphrase): Enter same passphrase again: 然后我们的密钥被保存。 Your identification has been saved in /home/example_user/.ssh/id_rsa. Your public key has been saved in /home/example_user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:J3gbQIodn23nisdgbGhdEBwpaqF/p0 Example comment The key's randomart image is: 公钥的默认文件名在 /home/example_user/.ssh/id_rsa.pub。确保备份私钥〜/ .ssh / id_rsa。 如果丢失,密钥将无法恢复。如果我们需要添加到账户中,则复制黏贴。
2020年09月10日
159 阅读
0 评论
0 点赞
2020-08-12
阿里云ECS卸载阿里云盾(安骑士)
作用说明: 用了一段时间阿里云的ECS,发现这个阿里云盾(安骑士)功能真心没什么用,还需要长驻内存。上网找找了方法,直接干掉吧,记录一下分享给您。 系统卸载: 如果你使用的centos系统,直接就可以卸载: service aegis stop chkconfig --del aegis 脚本卸载: 有时候系统卸载不方便,则需要使用脚本来干掉它,脚本为阿里云官方提供,安全放心。 卸载脚本 wget http://update.aegis.aliyun.com/download/uninstall.sh sh uninstall.sh wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh sh quartz_uninstall.sh 删除残留 pkill aliyun-service rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service rm -rf /usr/local/aegis* 屏弊云盾 iptables -I INPUT -s 140.205.201.0/28 -j DROP iptables -I INPUT -s 140.205.201.16/29 -j DROP iptables -I INPUT -s 140.205.201.32/28 -j DROP iptables -I INPUT -s 140.205.225.192/29 -j DROP iptables -I INPUT -s 140.205.225.200/30 -j DROP iptables -I INPUT -s 140.205.225.184/29 -j DROP iptables -I INPUT -s 140.205.225.183/32 -j DROP iptables -I INPUT -s 140.205.225.206/32 -j DROP iptables -I INPUT -s 140.205.225.205/32 -j DROP iptables -I INPUT -s 140.205.225.195/32 -j DROP iptables -I INPUT -s 140.205.225.204/32 -j DROP 执行htop观测几分钟,干净清爽。
2020年08月12日
291 阅读
1 评论
0 点赞
2020-08-05
centos Chrony设置服务器集群同步时间详解
Chrony有两个核心组件,分别是:chronyd:是守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率,并对此进行调整补偿。chronyc:提供一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。 OS环境: 10.28.204.65 客户端 10.28.204.66 服务端 CentOS Linux release 7.4.1708 (Core) 情况说明:两台机器都是内网,将204.66作为NTP时间服务器,204.65为NTP客户端到204.66上同步时间。 1.安装Chrony 系统默认已经安装,如未安装,请执行以下命令安装: yum install chrony -y 2.启动并加入开机自启动 systemctl enable chronyd.service systemctl restart chronyd.service systemctl status chronyd.service 3.Firewalld设置 firewall-cmd --add-service=ntp --permanent firewall-cmd --reload 因NTP使用123/UDP端口协议,所以允许NTP服务即可。 4.配置Chrony 以下是系统默认配置文件,我对此加以说明: # 使用pool.ntp.org项目中的公共服务器。以server开,理论上你想添加多少时间服务器都可以。 # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst # 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。 driftfile /var/lib/chrony/drift # chronyd根据需求减慢或加速时间调整, # 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。 # 该指令强制chronyd调整时期,大于某个阀值时步进调整系统时钟。 # 只有在因chronyd启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。 makestep 1.0 3 # 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。 rtcsync # Enable hardware timestamping on all interfaces that support it. # 通过使用hwtimestamp指令启用硬件时间戳 #hwtimestamp eth0 #hwtimestamp eth1 #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器 #allow 192.168.0.0/16 #deny 192.168/16 # Serve time even if not synchronized to a time source. local stratum 10 # 指定包含NTP验证密钥的文件。 #keyfile /etc/chrony.keys # 指定日志文件的目录。 logdir /var/log/chrony # Select which information is logged. #log measurements statistics tracking 5.设置时区 查看当前系统时区: timedatectl 显示结果如下: Local time: Fri 2018-2-29 13:31:04 CST Universal time: Fri 2018-2-29 05:31:04 UTC RTC time: Fri 2018-2-29 08:17:20 Time zone: Asia/Shanghai (CST, +0800) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a 如果你当前的时区不正确,请按照以下操作设置。 查看所有可用的时区: timedatectl list-timezones 筛选式查看在亚洲S开的上海可用时区: timedatectl list-timezones | grep -E "Asia/S.*" 结果下面这样: Asia/Sakhalin Asia/Samarkand Asia/Seoul Asia/Shanghai Asia/Singapore Asia/Srednekolymsk 设置当前系统为Asia/Shanghai上海时区: timedatectl set-timezone Asia/Shanghai 设置完时区后,强制同步下系统时钟: chronyc -a makestep 6.服务器集群之间的系统时间同步 在生产环境中,其网络都是内网结构,那么内网如何保证服务器之间的时间同步呢?其实这个问题很简单,只需要搭建一台内网时间服务器,然后让所有计算机都到服务端(10.28.204.66)去同步时间即可。 在服务端注释以下内容: #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst 并添加以下内容:(表示与本机同步时间) server 10.28.204.66 iburst 如果NTP服务器还需要和互联网NTP服务器同步,再添加以下内容: server ntp.aliyun.com iburst server ntp.ntsc.ac.cn iburst 这样我们需求的一台内网时间服务器已经配置完毕。 同样在客户端注释掉其他server,并在客户端(10.28.204.65)添加以下: server 10.28.204.66 iburst 到此已经完成系统时间的同步。如有多台机器,操作也是如此。 7.常用命令 查看时间同步源: chronyc sources -v #查看时间同步源状态: chronyc sourcestats -v #设置硬件时间 timedatectl set-local-rtc 1 #硬件时间默认为UTC 启用NTP时间同步: $ timedatectl set-ntp yes 校准时间服务器: $ chronyc tracking 最后需要注意的是,配置完/etc/chrony.conf后,需重启chrony服务,否则可能会不生效。
2020年08月05日
297 阅读
1 评论
0 点赞
2020-08-02
CentOS7 Debian Fedora一键安装Fail2ban安全软件教程
上次有在"如何使用 fail2ban 和 FirewallD 黑名单保护你的系统"文章中记录到在centos系统镜像中安装和部署Fail2ban安全软件阻止SSH安全的策略。一般我们网站是没有安装的,我们可能 会通过修改端口、强密码,或者WEB服务器客户端的一些工具帮助设置安全。有些运维高手一般很少会使用第三方工具,而是直接在服务器端设置安全。 在前一篇文章中,记录到在centos系统中安装Fail2ban 的方法,这里顺带一并把在CentOS7/Debian/Fedora安装Fail2ban安全软件教程都记录下来,其实有些是相似的,但是鉴于以后可能会需要用到就一并整理出来。如果有需要的可以看看。 第一、Fedora 1、升级系统 dnf update 2、安装Fail2ban dnf install fail2ban 3、安装邮件软件 dnf install sendmail 4、开启防火墙 systemctl start fail2ban systemctl enable fail2ban systemctl start sendmail systemctl enable sendmail 我们可以看到基本的策略和前面看到的ubuntu差不多的,区别就在于命名稍微有点不同。 第二、Debian 1、升级镜像 apt-get update && apt-get upgrade -y 2、安装 apt-get install fail2ban 3、安装邮件软件 apt-get install sendmail-bin sendmail 第三、CentOS7 目前我们使用较多的CentOS版本还是从7开始,8虽然有但是我个人建议不要太用新的。有些软件兼容不是太好,以及对于服务器要求是比较大的。 1、升级系统 yum update && yum install epel-release 2、安装 yum install fail2ban -y 3、安装邮件 yum install sendmail 4、防火墙 systemctl start fail2ban systemctl enable fail2ban systemctl start sendmail systemctl enable sendmail
2020年08月02日
563 阅读
0 评论
0 点赞
2020-07-30
从零开始创建lvm虚拟磁盘阵列脚本化
前言 逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume management)功能。它在硬盘的硬盘分区之上,又创建一个逻辑层,以方便系统管理硬盘分割系统。 最先由IBM开发,在AIX系统上实现,OS/2 操作系统与 HP-UX也支持这个功能。在1998年,Heinz Mauelshagen 根据在 HP-UX 上的逻辑卷管理器,写作出第一个 Linux 版本的逻辑卷管理器。 LVM基本术语: PV:物理卷,PV处于LVM系统最低层,它可以是整个硬盘,或者与磁盘分区具有相同功能的设备(如RAID),但和基本的物理存储介质相比较,多了与LVM相关管理参数 VG:卷组,创建在PV之上,由一个或多个PV组成,可以在VG上创建一个或多个“LVM分区”(逻辑卷),功能类似非LVM系统的物理硬盘 LV:逻辑卷,从VG中分割出的一块空间,创建之后其大小可以伸缩,在LV上可以创建文件系统(如/var,/home) PE:物理区域,每一个PV被划分为基本单元(也被称为PE),具有唯一编号的PE是可以被LVM寻址的最小存储单元,默认为4MB 我们可以通过LVM灵活便捷的管理系统中的磁盘,并且根据需求快速、无感得扩容目标磁盘,并且几乎不会影响性能。 过程 创建lvm分区的方法其实非常的简单,主要分为以下几个步骤: 1、创建磁盘分区part 目前做LVM分区比较推荐的工具还是fdisk,不是说parted不能做,而是fdisk可能更加方便一点。流程如下: # fdisk /dev/nvme0n1 Command (m for help): n ## 新建 Command action e extended p primary partition (1-4) p ## 主分区 Partition number (1-4): 1 ## 分区号 First cylinder (2048-543352123, default 2048): ## 回车用默认的1 Last cylinder, +cylinders or +size{K,M,G} (2048-543352123, default 543352123): ## 回车默认大小大小 Command (m for help): t ## 改变toggle类型 Selected partition 1 Hex code (type L to list codes): 8e ## LVM 的分区代码8e Changed system type of partition 1 to 8e (Linux LVM) 2、创建物理卷PV 在分区完成之后需要做的就是创建物理卷,直接将刚才创建的分区进行 pvcreate: # pvcreate /dev/nvme0n1p1 3、创建虚拟卷VG 在创建玩物理卷之后,需要对该磁盘进行虚拟卷的创建。需要注意的是一个虚拟卷可以由多个物理卷构成。例如: # vgcreate nvme /dev/nvme0n1p1 /dev/nvme1n1p1 /dev/nvme2n1p1 该命令的意义就在于创建一个叫做nvme的虚拟卷,由/dev/nvme0n1p1、 /dev/nvme1n1p1、 /dev/nvme2n1p1三个做了pv的分区构成 4、创建逻辑卷LG 到了这一步,基本上LVM的创建已经到了尾声了,最后一步就是从虚拟卷中创建一个逻辑卷。如下: # lvcreate -L 2.91T -n data nvme 这条命令的意思为从虚拟卷nvme中创建一个2.91T的逻辑卷作为lvm分区并命名为data,如果想一次性全部用完所有的容量,也可以这样: # lvcreate -l -n data nvme 此时在linux的/dev/文件夹下面我们可以看到有/nvme/data的文件结构。 5、挂载并更新文件 在创建完lvm分区后,我们需要将分区挂在到系统中的路径中。假设需要挂载的路径是/data。 # mkdir /data ##创建该路径 # mount /dev/mapper/nvme-data /data ##需要注意的时候这里推荐使用/dev/mapper/nvme-data作为挂载的设备路径,而不是/dev/nvme/data 之后通过blkid命令获取这个新的lvm分区的UUID,然后更新到/etc/fstab中就可以了 脚本化 上述的LVM实现过程可以直接通过shell脚本进行实现: #!/bin/bash ##本案例中以服务器的/dev/nvme0n1这块nvme磁盘为例进行操作 OPTS="noatime,nobarrier,errors=remount-ro,nofail" ##部分写入/etc/fstab的固定变量 umount /data/ && parted /dev/nvme0n1 rm 1 ## 首先确保目标磁盘没有残留的分区信息。 echo "n p 1 t 8e w " | fdisk /dev/nvme0n1 ##通过fdisk工具创建一个分区 echo "y " | pvcreate /dev/nvme0n1p1 ##创建一个物理卷 echo "y y y " | vgcreate nvme /dev/nvme0n1 ##创建一个虚拟卷 echo "y " | lvcreate -L 2.91T -n data nvme && mkfs.ext4 /dev/nvme/data && mount /dev/mapper/nvme-data /data/ ##创建一个逻辑卷并进行格式化,然后挂载到目标路径 sed -i '$d' /etc/fstab ##将UUID等相关信息更新到/etc/fstab中 #do if [ $? -eq 0 ]; then UUID=$(blkid /dev/mapper/nvme-data | sed -e 's/.*\(UUID=.*\) TYPE.*/\1/') echo -e "${UUID}\t\t/data\t\text4\t\t${OPTS}\t\t0 0" >> /etc/fstab fi seq=$(($seq+1)) #done
2020年07月30日
216 阅读
0 评论
0 点赞
2020-07-28
怎么分别在Linux和Windows系统服务器绑定域名
周末的时候遇到一个比较奇怪的事情,实际上这个问题已经在之前几年也有陆续重复遇到过。有一个网友可能是根据笔记中的介绍购买到某一个商家的VPS主机。当然也有是虚报的,因为之前也有遇到过是自己或者是在其他博客看到某个商家购买的服务器,然后不会 解决问题,于是就说看到你推荐购买的,以表是你的网友一样。 具体是什么事情呢?他购买VPS主机的时候,一般我们是看到是需要设置主域名的。于是他在主域名那填写到自己的域名,于是在服务器开通之后,他域名解析到服务器,后面打开域名无法访问网站,他就抱怨是不是商家问题,服务器无法使用。包括不能直接在面板中管理服务器文件。 估计这个朋友是之前有才从虚拟主机那没有过度过来,因为在Linux或者Windows系统服务器的时候,我们不是这样绑定域名的。那服务器怎么绑定域名呢? 第一、安装合适的WEB系统环境 不管我们是Linux系统还是Windows系统的服务器。我们都需要先在服务器开通之后,登录SSH远程地址,还是远程桌面,我们然后再去安装WEB服务器环境。比如宝塔面板,比如是LNMP一键安装包,只有在系统面板WEB环境安装完毕之后,我们再通过这个平台去绑定我们的域名。 对于服务器安装什么样子的WEB套件,这是不在当前文章的范围之内,我们可以自己查看之前的文章教程。 第二、检查域名是否有权限 既然提到这个问题,就在说一下上周遇到的问题。不清楚他是看到哪里的教程的,然后购买到一台腾讯云服务器上海机房,于是在宝塔面板安装完毕之后,折腾半天没有问题。然后他绑定的域名无法访问,实际上是他的域名没有备案导致的。因为目前在国内的服务器域名都是需要备案接入白名单的。 总结,当然有些时候我们也有特别的个例是因为我们网站的域名可能有被封的问题或者其他的问题导致无法连接和绑定服务器主机。但是,我们在对于服务器绑定域名的话,一定是需要在WEB环境中配置才可以绑定,而不是绑定。
2020年07月28日
217 阅读
0 评论
0 点赞
2020-07-25
ethtool 原理介绍和解决网卡丢包排查思路
ethtool 简介 ethtool - utility for controlling network drivers and hardware ethtool is the standard Linux utility for controlling network drivers and hardware, particularly for wired Ethernet devices. It can be used to: Get identification and diagnostic information Get extended device statistics Control speed, duplex, autonegotiation and flow control for Ethernet devices Control checksum offload and other hardware offload features Control DMA ring sizes and interrupt moderation Control receive queue selection for multiqueue devices Upgrade firmware in flash memory Most features are dependent on support in the specific driver. See the manual page for full information. ethtool 用于查看和修改网络设备(尤其是有线以太网设备)的驱动参数和硬件设置。你可以根据需要更改以太网卡的参数,包括自动协商、速度、双工和局域网唤醒等参数。通过对以太网卡的配置,你的计算机可以通过网络有效地进行通信。该工具提供了许多关于接驳到你的 Linux 系统的以太网设备的信息。 了解接收数据包的流程 这里摘取了美团技术团队的分析,在此表示感谢 接收数据包是一个复杂的过程,涉及很多底层的技术细节,但大致需要以下几个步骤: 网卡收到数据包。 将数据包从网卡硬件缓存转移到服务器内存中。 通知内核处理。 经过 TCP/IP 协议逐层处理。 应用程序通过 read() 从 socket buffer 读取数据。 [] 将网卡收到的数据包转移到主机内存(NIC 与驱动交互) NIC 在接收到数据包之后,首先需要将数据同步到内核中,这中间的桥梁是 rx ring buffer。它是由 NIC 和驱动程序共享的一片区域,事实上,rx ring buffer 存储的并不是实际的 packet 数据,而是一个描述符,这个描述符指向了它真正的存储地址,具体流程如下: 驱动在内存中分配一片缓冲区用来接收数据包,叫做 sk_buffer; 将上述缓冲区的地址和大小(即接收描述符),加入到 rx ring buffer。描述符中的缓冲区地址是 DMA 使用的物理地址; 驱动通知网卡有一个新的描述符; 网卡从 rx ring buffer 中取出描述符,从而获知缓冲区的地址和大小; 网卡收到新的数据包; 网卡将新数据包通过 DMA 直接写到 sk_buffer 中。 [] 当驱动处理速度跟不上网卡收包速度时,驱动来不及分配缓冲区,NIC 接收到的数据包无法及时写到 sk_buffer,就会产生堆积,当 NIC 内部缓冲区写满后,就会丢弃部分数据,引起丢包。这部分丢包为 rx_fifo_errors,在 /proc/net/dev 中体现为 fifo 字段增长,在 ifconfig 中体现为 overruns 指标增长。 通知系统内核处理(驱动与 Linux 内核交互) 这个时候,数据包已经被转移到了 sk_buffer 中。前文提到,这是驱动程序在内存中分配的一片缓冲区,并且是通过 DMA 写入的,这种方式不依赖 CPU 直接将数据写到了内存中,意味着对内核来说,其实并不知道已经有新数据到了内存中。那么如何让内核知道有新数据进来了呢?答案就是中断,通过中断告诉内核有新数据进来了,并需要进行后续处理。 提到中断,就涉及到硬中断和软中断,首先需要简单了解一下它们的区别: 硬中断: 由硬件自己生成,具有随机性,硬中断被 CPU 接收后,触发执行中断处理程序。中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。 软中断: 由硬中断对应的中断处理程序生成,往往是预先在代码里实现好的,不具有随机性。(除此之外,也有应用程序触发的软中断,与本文讨论的网卡收包无关。)也被称为下半部分。 当 NIC 把数据包通过 DMA 复制到内核缓冲区 sk_buffer 后,NIC 立即发起一个硬件中断。CPU 接收后,首先进入上半部分,网卡中断对应的中断处理程序是网卡驱动程序的一部分,之后由它发起软中断,进入下半部分,开始消费 sk_buffer 中的数据,交给内核协议栈处理。 [] 通过中断,能够快速及时地响应网卡数据请求,但如果数据量大,那么会产生大量中断请求,CPU 大部分时间都忙于处理中断,效率很低。为了解决这个问题,现在的内核及驱动都采用一种叫 NAPI(new API)的方式进行数据处理,其原理可以简单理解为 中断 + 轮询,在数据量大时,一次中断后通过轮询接收一定数量包再返回,避免产生多次中断。 ifconfig 解释 [
[email protected]
~]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.135 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe9b:52d3 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:9b:52:d3 txqueuelen 1000 (Ethernet) RX packets 833 bytes 61846 (60.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 122 bytes 9028 (8.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 (1) RX errors 表示总的收包的错误数量,这包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。 (2) RX dropped 表示数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。 (3) RX overruns 表示了 fifo 的 overruns,这是由于 Ring Buffer(aka Driver Queue) 传输的 IO 大于 kernel 能够处理的 IO 导致的,而 Ring Buffer 则是指在发起 IRQ 请求之前的那块 buffer。很明显,overruns 的增大意味着数据包没到 Ring Buffer 就被网卡物理层给丢弃了,而 CPU 无法即使的处理中断是造成 Ring Buffer 满的原因之一,上面那台有问题的机器就是因为 interruprs 分布的不均匀 (都压在 core0),没有做 affinity 而造成的丢包。 (4) RX frame 表示 misaligned 的 frames。 网卡工作原理 如果上面接收数据包的流程觉得不够详细可以再看纯文字解释 网卡收包 网线上的 packet 首先被网卡获取,网卡会检查 packet 的 CRC 校验,保证完整性,然后将 packet 头去掉,得到 frame。网卡会检查 MAC 包内的目的 MAC 地址,如果和本网卡的 MAC 地址不一样则丢弃 (混杂模式除外)。 网卡将 frame 拷贝到网卡内部的 FIFO 缓冲区,触发硬件中断。(如有 ring buffer 的网卡,好像 frame 可以先存在 ring buffer 里再触发软件中断(下篇文章将详细解释 Linux 中 frame 的走向),ring buffer 是网卡和驱动程序共享,是设备里的内存,但是对操作系统是可见的,因为看到 linux 内核源码里网卡驱动程序是使用 kcalloc 来分配的空间,所以 ring buffer 一般都有上限,另外这个 ring buffer size,表示的应该是能存储的 frame 的个数,而不是字节大小。另外有些系统的 ethtool 命令 并不能改变 ring parameters 来设置 ring buffer 的大小,暂时不知道为什么,可能是驱动不支持。) 网卡驱动程序通过硬中断处理函数,构建 sk_buff,把 frame 从网卡 FIFO 拷贝到内存 skb 中,接下来交给内核处理。(支持 napi 的网卡应该是直接放在 ring buffer,不触发硬中断,直接使用软中断,拷贝 ring buffer 里的数据,直接输送给上层处理,每个网卡在一次软中断处理过程能处理 weight 个 frame) 过程中,网卡芯片对 frame 进行了 MAC 过滤,以减小系统负荷。(除了混杂模式) 网卡发包 网卡驱动程序将 IP 包添加 14 字节的 MAC 头,构成 frame(暂无 CRC)。Frame(暂无 CRC)中含有发送端和接收端的 MAC 地址,由于是驱动程序创建 MAC 头,所以可以随便输入地址,也可以进行主机伪装。 驱动程序将 frame(暂无 CRC)拷贝到网卡芯片内部的缓冲区,由网卡处理。 网卡芯片将未完全完成的 frame(缺 CRC)再次封装为可以发送的 packet,也就是添加头部同步信息和 CRC 校验,然后丢到网线上,就完成一个 IP 报的发送了,所有接到网线上的网卡都可以看到该 packet。 网卡中断处理函数 产生中断的每个设备都有一个相应的中断处理程序,是设备驱动程序的一部分。每个网卡都有一个中断处理程序,用于通知网卡该中断已经被接收了,以及把网卡缓冲区的数据包拷贝到内存中。 当网卡接收来自网络的数据包时,需要通知内核数据包到了。网卡立即发出中断。内核通过执行网卡已注册的中断处理函数来做出应答。中断处理程序开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包。 这些都是重要、紧迫而又与硬件相关的工作。内核通常需要快速的拷贝网络数据包到系统内存,因为网卡上接收网络数据包的缓存大小固定,而且相比系统内存也要小得多。所以上述拷贝动作一旦被延迟,必然造成网卡 FIFO 缓存溢出 - 进入的数据包占满了网卡的缓存,后续的包只能被丢弃,这也应该就是 ifconfig 里的 overrun 的来源。 当网络数据包被拷贝到系统内存后,中断的任务算是完成了,这时它把控制权交还给被系统中断前运行的程序。 缓冲区访问 网卡的内核缓冲区,是在 PC 内存中,由内核控制,而网卡会有 FIFO 缓冲区,或者 ring buffer,这应该将两者区分开。FIFO 比较小,里面有数据便会尽量将数据存在内核缓冲中。 网卡中的缓冲区既不属于内核空间,也不属于用户空间。它属于硬件缓冲,允许网卡与操作系统之间有个缓冲; 内核缓冲区在内核空间,在内存中,用于内核程序,做为读自或写往硬件的数据缓冲区; 用户缓冲区在用户空间,在内存中,用于用户程序,做为读自或写往硬件的数据缓冲区; 另外,为了加快数据的交互,可以将内核缓冲区映射到用户空间,这样,内核程序和用户程序就可以同时访问这一区间了。 对于有 ring buffer 的网卡,ring buffer 是由驱动与网卡共享的,所以内核可以直接访问 ring buffer,一般拷贝 frames 的副本到自己的内核空间进行处理(deliver 到上层协议,之后的一个个 skb 就是按 skb 的指针传递方式传递,直到用户获得数据,所以,对于 ring buffer 网卡,大量拷贝发生在 frame 从 ring buffer 传递到内核控制的计算机内存里)。 丢包排查思路 网卡工作在数据链路层,数据量链路层,会做一些校验,封装成帧。我们可以查看校验是否出错,确定传输是否存在问题。然后从软件层面,是否因为缓冲区太小丢包。 先查看硬件情况 一台机器经常收到丢包的报警,先看看最底层的有没有问题: (1) 查看工作模式是否正常 [
[email protected]
~]# ethtool eth0 | egrep 'Speed|Duplex' Speed: 1000Mb/s Duplex: Full (2) 查看检验是否正常 [
[email protected]
~]# ethtool -S eth0 | grep crc rx_crc_errors: 0 Speed,Duplex,CRC 之类的都没问题,基本可以排除物理层面的干扰。 overruns 和 buffer size # 通过 ifconfig 可以看到 overruns 是否一直增大 for i in `seq 1 100`; do ifconfig eth2 | grep RX | grep overruns; sleep 1; done # 这里一直增加 RX packets:346547657 errors:0 dropped:0 overruns:35345 frame:0 # 可以通过 ethtool 来修改网卡的 buffer size ,首先要网卡支持,我的服务器是是 INTEL 的 1000M 网卡, 我们看看 ethtool 说明 -g –show-ringQueries the specified ethernet device for rx/tx ring parameter information. -G –set-ringChanges the rx/tx ring parameters of the specified ethernet device. # 查看当前网卡的 buffer size 情况 ethtool -g eth0 [
[email protected]
~]# ethtool -g eth0 Ring parameters for eth0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 0 TX: 4096 Current hardware settings: RX: 256 RX Mini: 0 RX Jumbo: 0 TX: 256 # 修改 buffer size 大小 ethtool -G eth0 rx 2048 ethtool -G eth0 tx 2048 [
[email protected]
~]# ethtool -G eth0 rx 2048 [
[email protected]
~]# ethtool -G eth0 tx 2048 [
[email protected]
~]# ethtool -g eth0 Ring parameters for eth0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 0 TX: 4096 Current hardware settings: RX: 2048 RX Mini: 0 RX Jumbo: 0 TX: 2048 Red Hat 官方解决思路 Issue Why rx_crc_errors incrementing in the receive counter of ethtool -S output? $ ethtool -S <Interface_name> | grep -i error rx_error_bytes: 0 tx_error_bytes: 0 tx_mac_errors: 0 tx_carrier_errors: 0 rx_crc_errors: 9244 rx_align_errors: 0 Resolution Change the cable. Check switch configuration. Change the network interface card. Root Cause Most of the time incrementing the value of rx_crc_errors means the problem is in Layer-1 of the networking model. When a packet is received at the interface, it goes through a data integrity check which is called cyclic redundancy check. If the packet fails in that check, it is marked as rx_crc_errors. The switch was forcing the NIC to operate in half-duplex mode. Fixing the switch to tell the NIC to operate in full-duplex mode have resolved the issue. Diagnostic Steps Check ethtool -S output and find where are the drops and errors. $ ethtool -S <Interface_name> | grep -i error rx_error_bytes: 0 tx_error_bytes: 0 tx_mac_errors: 0 tx_carrier_errors: 0 rx_crc_errors: 9244 >>>>>> rx_align_errors: 0 Check the numbers corresponding to rx_crc_errors. ethtool 常用命令 ethtool p1p1 Settings for p1p1: Supported ports: [ FIBRE ] Supported link modes: 10000baseT/Full Supported pause frame use: Symmetric Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: 10000baseT/Full Advertised pause frame use: Symmetric Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: 10000Mb/s Duplex: Full Port: FIBRE PHYAD: 0 Transceiver: internal Auto-negotiation: off Supports Wake-on: d Wake-on: d Current message level: 0x00000007 (7) drv probe link Link detected: yes 显示了 p1p1 的接口类型,连接模式,速率等等信息,以及当前是否连接了网线(如果是网线 Supported ports 就是 TP,如果是光纤则显示 Fiber),这里例举下 3 个重要关键词 Supported ports: [ FIBRE ] Speed: 10000Mb/s Link detected: yes # -S 显示 NIC- and driver-specific 的统计参数,如网卡接收 / 发送的字节数、接收 / 发送的广播包个数等。 ethtool -S p1p1 | grep -i error rx_errors: 0 tx_errors: 0 rx_over_errors: 0 rx_crc_errors: 0 rx_frame_errors: 0 rx_fifo_errors: 0 rx_missed_errors: 0 tx_aborted_errors: 0 tx_carrier_errors: 0 tx_fifo_errors: 0 tx_heartbeat_errors: 0 rx_length_errors: 0 rx_long_length_errors: 0 rx_short_length_errors: 0 rx_csum_offload_errors: 0 # -p 用于区别不同 ethX 对应网卡的物理位置,常用的方法是使网卡 port 上的 led 不断的闪 ethtool -p <Interface_name> ethtool -p eth0 # -i 显示网卡驱动的信息,如驱动的名称、版本等 ethtool -i p1p1 driver: ixgbe version: 5.1.0-k-rh7.6 firmware-version: 0x80000960, 18.3.6 expansion-rom-version: bus-info: 0000:04:00.0 supports-statistics: yes supports-test: yes supports-eeprom-access: yes supports-register-dump: yes supports-priv-flags: yes # ethtool –s ethX [speed 10|100|1000] [duplex half|full] [autoneg on|off] # 设置网口速率 10/100/1000M、设置网口半 / 全双工、设置网口是否自协商 ethtool -s eth0 speed 100
2020年07月25日
246 阅读
0 评论
0 点赞
2020-07-24
确保和保护服务器系统安全的几个常见做法
我们在选择云主机或者服务器之后,所有的服务器安全都需要我们用户自己管理,确实在一定程度上给我们增加不少烦恼,但是由于项目的需要我们不得不选择云服务器产品。当然在之前也有提到的,我们有些朋友会选择虚拟主机或者全管理型服务器,这样是会减少一些麻烦。实际上,对于我们个人用户而言,基础的安全设置基本上问题不大,但是对于大型公司而言我们肯定是有专业的运维人员的。 对于我们大部分普通用户而言,我们需要做几个常用的服务器系统安全,可以在一定程度上解决系统安全的问题。在这篇文章中,整理 几个我们常用的服务器系统安全操作办法,这里只是提供个大概的思路,具体的操作后面有时间再整理。 第一、定期更新镜像升级 一般镜像的安全也是有的,比如我们以前也有看到镜像官方或者软件方会提到某个软件版本在某个镜像版本以下是有安全风险的,于是我们只需要升级镜像就可以。当然我们有些朋友可能从开始安装服务器以及软件环境之后就不会升级,这里我们可以注意一些运维社区新闻,然后遇到有我们版本的问题在升级。 第二、添加专有SSH账户 一般我们服务器使用的是ROOT用户名或者Administor账户。实际上我们确保安全的话,可以不用这些默认账户,我们可以禁止这些账户,然后开启单独的我们自己知道的用户名和管理账户权限。我们可以通过:adduser example_user 这样的方式来添加账户以及设置权限,包括我们有使用FTP的也可以单独设置FTP账户权限的。 第三、密钥管理登录服务器 同样的,我们大部分是直接用ROOT用户名登录服务器,端口22登录的。我们实际上是可以更换端口,以及采用密钥的方式登录服务器的。采用密钥的相对比用直接账户登录安全一些,但是密钥的话我们需要自己管理好,如果本地和服务器不匹配的时候自己也无法登录。 1、Xshell设置密钥登录确保Linux VPS及服务器更加安全 2、腾讯云服务器CVM创建和配置SSH密钥 - 创建密钥且应用到服务器 第四、安装安全工具 比如我们有些网友是有安装Fail2Ban安全软件的。在一定程度上是可以有一点点作用,但是我们主要的还是需要用到强密码和端口安全组比较多见。比如我们目前使用的一些国内主机商都是强制使用安全组的,当然也可以利用上面提到的密钥登录服务器。 以及我们在使用WEB服务器或者软件的时候可以设置限制管理员登录URL地址和IP地址,以及一定的二次密码验证安全。 第五、删除不用的安装包 我们如果是有一定运营能力的,可以进行服务器镜像软件的精简,比如可以卸载一些无用的软件包,确保服务器的安全,当然也可以减少体积提高利用率。 CentOS yum remove package_name Debian / Ubuntu apt purge package_name 以及我们也可以配置防火墙。 总之,我们从开始使用服务器,就要确保服务器的安全,毕竟是关乎到服务器的数据安全和用户信息的。
2020年07月24日
134 阅读
0 评论
0 点赞
2012-09-20
购买国外VPS前你需要了解的知识点
1,什么是VPS主机 VPS(Virtual Private Server 虚拟专用服务器),它是将一台服务器分隔成多个虚拟的专享服务器,你使用起来感觉就是在使用台独立的服务器一样。 2,VPS主机有什么优点 虽然VPS都是在一台服务器上,但是它拥有一台服务器所有的功能,CPU、内存、磁盘、IP、带宽都是独立的,因此与服务器上其他的VPS不会相互影响。 3,VPS主机 vs. 虚拟主机 VPS可以理解成是独立的服务器器,它理论上没有网站个数的限制;而虚拟主机一般都只允许创建一个站点,和其他用户的站点在同一个Web服务器下。 4,VPS主机 vs. 云主机 云主机架构需要比VPS更高的技术,它比VPS有更强的扩展性。国内市面上的云主机基本都是VPS包装的,不要相信主机商所宣称的云主机,所以美国基本的主机商都没有宣称云(Cloud)主机。 5,国外VPS操作系统选择 VPS按操作系统一般分为Windows VPS 和 Linux VPS。如果你是.NET站点,可以使用Windows VPS,如果是PHP或者Java之类的你可以选择Linux VPS,国外的VPS大多提供的都是Linux 系统,Windows VPS相对较少。 6,国外主机备案 备案只限制在中国大陆地区,因此像美国、香港的主机都是无需备案的,因此选用国外主机无需担心备案问题。
2012年09月20日
231 阅读
1 评论
0 点赞