• [技术干货] Linux:Linux权限解析-转载
    一、Linux下的用户分类  在Linux下,有两种用户,一种是超级用户,一种是普通用户 超级用户:可以再linux系统下做任何事情,不受权限限制(制定规则,但不需要遵守规则) 普通用户:在linux下做有限的事情。(必须遵守相应的规则) 超级用户的命令提示符是“#”,普通用户的命令提示符是“$” 1、用户的切换方式 命令:su [用户名] 功能:切换用户。 例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码。 2、Linux中的所有用户都要有自己的密码,无论是root还是普通用户,并且root的密码和普通用户的密码尽量不要一样!! 3、有些事情只有root可以进行,比如说用yum命令安装软件,但是如果我们普通用户想要去使用root才能使用的命令,那么就需要用sudo command暂时对一条命令进行短暂提权。  4、既然我普通用户可以用sudo对命令按时提权,那么我不就可以相当于root吗??其实这是不合理的,目前我们直接adduser新建的用户,并不可以直接进行sudo,因为系统不信任你,除非未来将普通用户,添加到系统的信任白名单里,才可以用sudo对命令进行提权。 二、Linux权限的概念 什么叫做权限呢??通俗一点说就是一件事情是否允许你做!  2.1 文件访问者的分类(人的不同身份) 文件和文件目录的所有者:u---User(拥有者) 文件和文件目录的所有者所在的组的用户:g---Group(所属组) 其它用户:o---Others (其他人) 思考: 1、 这三个分类和用户有什么关系??? 答:用户相当于是人,而拥有者、所属组、其他人相当于是他们的不同身份,所以任何一个用户都可以是拥有者、所属组或者是其他人。 2、怎么理解拥有者呢?? 答:拥有者就相当于是创建该文件的人,对文件具有相关的操作权限。 3、怎么理解其他人呢?? 答:举个例子,假设张三和李四一起进到腾讯,你们进到了不同的部门,但是由于资金短缺,两个部门共用一台电脑,而腾讯要开发一款叫做王者荣耀的游戏,让你们两个部门都去开发这个游戏,哪个部门开发得好就用谁的(这其实是“赛马论”,虽然大部分的公司都不会让两个部门一起干一件事,因为有点资源浪费,但是在有些公司是会有这种情况的,通过这种方式来给员工们建立一个竞争的环境,激发他们的工作动力,同时不同部门之间也能互相借鉴经验,一起进步。)。所以张三和李四在这条条件下就形成了竞争关系,而两人又在一个寝室,平时李四经常会去借鉴张三的代码,所以有一天当张三写了一段非常好的代码之后(张三属于拥有者),为了不让李四抄袭,就可以对设置其他人的权限(这时李四属于其他人)。 4、为什么会需要所属组呢?? 答:还是刚刚的例子,张三通过设置“其他人”权限,让李四无法抄袭自己的代码,但是有一天他的部门组长王五想看看他写的代码,这个时候张三发现如果放开权限的话,这样李四也能看到自己的代码,所以这个时候就需要“所属组”(王五属于所属组),同时所属组的存在也有利于同个部门之间的成员可以看到相互之间写的代码。 2.2 文件类型和访问权限(事物的不同属性)  2.2.1 文件类型 d:文件夹  -:普通文件(文本、可执行文件、库)  b:块设备文件(例如硬盘、光驱等磁盘文件)       ——>所在路径:/dev/vda1  p:管道文件(用来进行通信)                           ——> 用mkfifo可以创建管道文件 c:字符设备文件(例如键盘、显示器等串口设备)——>所在路径:/dev/tty(tty是终端的意思)   l:软链接(类似Windows的快捷方式) s:套接口文件 2.2.2  Linux后缀无意义但需要 Linux系统中,文件名后缀没有没有直接的意义。  当我们用用gcc文件编译.c文件之后,无论这个可执行程序改成什么名字,都可以正常执行!!  但是不代表Linux系统上运行的其他软件不需要后缀!!比如说gcc是一款编译器、软件,他编译只认.c后缀的文件,如果是其他后缀,他不认。 所以Linux中的文件是否需要使用后缀,具体看用户的需求!!  2.2.3 文件基本权限 i.可读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限 ii.可写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限 iii.可执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限 iv.“—”表示不具有该项权限  所以2-10位,每三个为一组,分别代表拥有者、所属组、其他人的权限 而每组的对应的位置含义是什么我们是知道的——每个位置对应的是r/w/x或者是- 所以每个位置都有只有是或者否,对应其指定的文件!!因此我们可以用1表示是,0表示否,每组都可以用一个八进制数字来表示。 2.2.4 文件权限的表示方法  a、字符表示方法 b、8进制数值的表示方法  2.2.5 文件访问权限的相关设置方法 1、chmod  功能:设置文件的访问权限  格式:chmod [参数] 权限 文件名  常用选项:  R -> 递归修改目录文件的权限  说明:只有文件的拥有者和root才可以改变文件的权限  chmod命令权限值的格式:  ① 用户表示符+/-=权限字符  (在原有的基础上进行权限的增删查改)  +:向权限范围增加权限代号所表示的权限  -:向权限范围取消权限代号所表示的权限  =:向权限范围赋予权限代号所表示的权限  用户符号:  u:拥有者  g:所属组  o:其它用户  a:所有用户    ②三位8进制数字  (直接对权限进行设置 每个数字分别对应拥有者、所属组、其他人)     2、chown  功能:修改文件的拥有者  格式:chown [参数] 用户名 文件名  注意事项:  我们要把文件给别人时,有两种方法:要么是别人同意,要么是sudo强制提权,而当文件的拥有者改变后,我们只能执行所属组的权限,而不能执行拥有者的权限!且无法再修改权限!!  3、chgrp  功能:修改文件或目录的所属组  格式:chgrp [参数] 用户组名 文件名  常用选项:-R 递归修改文件或目录的所属组  2.2.6 没有权限会怎么样   但是要注意的是,root不受权限约束!!可以随意操作!   2.3 起始权限问题——文件掩码  为什么普通文件是664,而目录文件是775呢??   答:其实普通文件的默认起始权限是666,而目录文件的其实权限是777,而影响他们的其实是文件掩码!!  命令:umask  功能:查看或修改文件掩码(凡是在umask中出现的文件,不会在最终的文件权限中出现!)  格式:umask  权限值(不带权限值就是查看,带的话就是设置)   看上去好像是默认权限减掉起始权限,但其实并不是这样的,因为我们要考虑这个权限本身就不存在的情况!! 所以无论原来的权限是0还是1,当umask为1时,都要变成0(将某位设置为0,我们要想到&)所以有1则为0而umask为0时,就不能影响原来的权限(如果用&,要想不改变,就得希望该位置是0,其他位置是1,所以可以想到~)  最终权限=起始权限&(~umask)  超级用户默认掩码值为0022,普通用户默认为0002。  2.4 目录权限 r:是否允许我们查看指定目录下的文件内容(ls) w:是否允许我们在当前目录下进行创建(mkdir、touch)、更改(mv)、删除(rm) x:可否在目录下执行命令,是否允许用户进入(cd)对应的目录。 注意事项:如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r读权限,而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,即使可以执行ls命令,但仍然没有权限读出目录下的文档。 2.5 共享文件——粘滞位  1、普通用户自己的家目录权限是700,所以在家目录创建的文件,别人都看不到!! 2、所以如果当我们需要一些共享文件让所有用户共享时,我们显然不能将该目录建在家目录下!(要建在根目录下) 但是试想一下这样的场景,你作为共享文件的拥有者,你可以设置权限,当你给其他人设置了不可读不可写的权限,其他人怀恨在心,就把你的文件给删了,这显然是不合理的!!! 3、一个文件能否被删除,与文件本身无关,而与存储该文件的目录有关  但是如果我们不想让别人删除,我们就需要去掉目录的w权限,但是如果这样的话,共享的意义就不存在了!!!因此我们就有了一个新方案叫做粘滞位! 4、粘滞位:给目录进行设置(chmod +t  文件),一般是共享目录,大家可以在目录进行各自文件的增删查改,只允许文件的拥有者或者是root去删除这个文件,其他人一概不允许,t是一种特殊的x权限!!!  5、其实在根目录下就存在一个tmp目录是带粘滞位的,他相当于就是系统自带的共享文件,我们可以在里面去创建共享文件,而不需要每次创建共享文件都在根目录!!  2.6 易错点:每个角色只能执行一种身份的权限!! 假设我是拥有者,我也是所属组,而拥有者的权限是---,所属者的权限是rwx,但实际上我只能以拥有者的身份去执行我的权限!  2.7 file指令  功能说明:辨识文件类型。  语法:file [选项] 文件或目录...   常用选项:  -c 详细显示指令执行过程,便于排错或分析程序执行的情形。  -z 尝试去解读压缩文件的内容 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/weixin_51142926/article/details/140380555 
  • [技术干货] Linux下DNS服务设置详解-转载
    DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,实现了方便用户使用域名访问网站的目的。在Linux操作系统中,DNS服务也是一个重要的组成部分,我们可以使用bind9软件来实现DNS服务。本文将介绍如何在Linux环境下安装并配置bind9,实现主从DNS服务器的搭建。  一、DNS的基本原理  DNS是一种基于UDP协议的分布式数据库服务,它将主机名映射到IP地址。当用户在浏览器中输入一个网址时,计算机会首先向本地DNS服务器发出查询请求,如果本地DNS服务器无法解析该网址,则它会向根DNS服务器发出请求,根DNS服务器会返回负责该顶级域名的权威DNS服务器的地址,本地DNS服务器再向权威DNS服务器发出请求,最终获得该网址对应的IP地址。  二、Linux DNS基本概念 1. 域名:域名是Internet上的一种标识,用于代替IP地址。例如,www.example.com就是一个域名。 2. IP地址:IP地址是Internet上设备的唯一标识,通常以点分十进制表示,如192.168.1.1。 3. DNS服务器:DNS服务器是负责将域名解析为IP地址的服务器。Linux系统中有两种类型的DNS服务器:主DNS服务器和辅助DNS服务器。主DNS服务器负责处理区域内的域名解析请求,而辅助DNS服务器则从主DNS服务器获取区域数据并缓存。 4. 区域:区域是一个DNS命名空间,包含了一组资源记录(Resource Record,RR)。资源记录是DNS数据库中的一条记录,用于存储域名和IP地址之间的映射关系。  三、Linux中的DNS服务  1. BIND软件 BIND(Berkeley Internet Name Domain)是一款实现DNS服务的软件,它是最广泛使用的DNS服务器软件之一。在Linux中,可以使用BIND来实现DNS服务。 2. named服务 named是BIND软件中的一个守护进程,它是Linux中默认安装的DNS服务进程。当启动named服务时,它会读取配置文件/etc/named.conf以及相应的区域文件(zone file),并监听53端口等待客户端的查询请求。 3. 配置文件/etc/named.conf /etc/named.conf是BIND的主配置文件,它包含了全局设置和区域声明等内容。在该文件中可以指定正向查找区域、反向查找区域、主域名服务器、辅助域名服务器等信息。 4. 区域文件 区域文件是BIND中用于存储域名解析信息的文件,它包含了该区域内所有主机的IP地址和主机名之间的映射关系。在Linux中,区域文件通常存放在/var/named目录下。  四、Linux DNS配置 实验环境:Linux操作系统(如CentOS 7)  基本配置步骤: 1.安装dns服务及nslookup所在包bind-utils #  yum  -y  install  bind  bind-utils  2.在主配置文件中设置DNS服务器的全局参数 建立主配置文件named.conf(在listening加服务器ip)  # vi  /etc/named.conf   options  {       listen-on  port 53  {192.168.111.135; };   //本机IP                       directory   "/var/named";                                    allow-query  { 192.168.111.0/24; };       };  3.设置主域名服务器 A:确认本机网络地址、主机映射、DNS服务器地址 # hostname  ns1 # vi  /etc/hosts 192.168.111.135 ns1.qym.com ns1 (确认有类似上面一行内容)    # vi  /etc/resolv.conf  192.168.111.135 (确认有类似上面一行内容)  B:设置区域配置文件 建立正、反向区域数据文件  # vi  /etc/named.rfc1912.zones   zone  "qym.com"  IN  { type  master;                                        file  "qym.com.zone";                              }; zone  "111.168.192.in-addr.arpa"  IN  { type  master; file  "111.168.192.arpa";                              }; 将上面内容输进  C:建立正向解析数据库文件 # vi  /var/named/qym.com.zone   将下面内容输进 $TTL  86400 @   IN  SOA  qym.com.   admin.qym.com.  (         2011030301         4H         30M         12H         1D )     NS    @       A      192.168.111.135 ns1   A       192.168.111.135 www  A      192.168.111.10 mail   A      192.168.111.20   D:建立反向解析数据库文件 # vi  /var/named/111.168.192.arpa   将下面内容输进 $TTL  86400 @  IN   SOA  qym.com.  admin.qym.com.  (          2011030301         4H         30M         12H         1D )          NS      @           A    192.168.111.135 10        PTR  ns1.qym.com. 10        PTR  www.qym.com. 20        PTR  mail.qym.com.     E:启动dns服务 启动named服务,或重载配置  # systemctl  start  named 没有出现错误提示继续往下 F:测试dns 验证主域名服务器  # nslookup  ns1.qym.com 测试成功   # nslookup  www.qym.com    # nslookup  192.168.111.135  通过本实验,学习如何在Linux系统中配置DNS服务器,掌握DNS服务的基本原理和配置方法。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/2301_82084396/article/details/139649872 
  • [技术干货] linux tomcat版本查看-转载
     在Linux系统中,查看Tomcat服务器版本信息通常有以下几种方法:  方法一:通过version.sh脚本 打开终端:  使用快捷键(通常为Ctrl + Alt + T)或从应用程序菜单中打开终端。 定位到Tomcat安装目录:  在终端中输入以下命令,将路径切换到Tomcat的bin目录,其中<TOMCAT_INSTALL_DIR>代表您的实际Tomcat安装路径(例如:/usr/local/tomcat): bash      cd <TOMCAT_INSTALL_DIR>/bin 3. 执行版本查询脚本:  在终端中输入以下命令并回车,执行version.sh脚本: bash      ./version.sh 脚本执行后,终端将显示Tomcat的版本信息,包括版本号、构建日期等。 方法二:通过catalina.sh脚本 保持在终端: 如果您已经按照方法一打开了终端并定位到了Tomcat的bin目录,可以直接执行下一步;否则,请重复方法一的前两步。 执版本查询命令: 在终端中输入以下命令并回车,执行catalina.sh脚本并传递version参数: bash       ./catalina.sh version 终端将显示Tomcat的版本信息。 方法三:查看MANIFEST.MF文件 打开终端: 如果尚未打开终端,请按照方法一的第一步操作。 定位到Tomcat的lib目录: 输入以下命令切换到Tomcat的lib目录: bash      cd <TOMCAT_INSTALL_DIR>/lib 3. 查看catalina.jar中的MANIFEST.MF文件: 使用以下命令查看catalina.jar包内的MANIFEST.MF文件中的版本信息: bash      unzip -q -c catalina.jar META-INF/MANIFEST.MF | grep -E 'Specification-Version:|Implementation-Version:' 命令执行后,终端将显示Specification-Version:(规范版本)和Implementation-Version:(实现版本)对应的行,它们分别表示Tomcat遵循的规范版本和具体的实现版本。 通过以上任一方法,您都可以在Linux系统中轻松查看已安装的Tomcat服务器版本信息。如果您遇到权限问题无法访问某些文件或执行脚本,请尝试使用sudo命令或以具有足够权限的用户身份登录。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/zengliguang/article/details/138225839 
  • [技术干货] Linux:Linux发展史-转载
    一、计算机的发展历史背景         首先我们要知道,早期大多数科技的进步都是以国家的对抗为历史背景的,因为一个国家要想强大,只有通过不断提高自己的科技实力,造就更加强大的武器,才能更加从容地立于不败之地。   1.1 第二次世界大战         在第二次世界大战中,敌对双方都使用了飞机和火炮,猛烈轰炸对方军事目标。但要想打得准,必须精确计算并绘制出"射击图表"。经查表确定炮口的角度,才能使射出去的炮弹正中飞行目标!!针对这种情况,在1946年2月14日,第一台电子计算机“埃尼阿克”诞生——>标志着电脑时代的开始。          但在当时,该计算机的操作成本极高(集成化程度极低——>体积大、消耗大)  1.2 美苏冷战和摩尔定律的提出         随着二战的结束,美苏冷战开始爆发(1961-1975),这样的时代背景下促进了技术的极大突破,同时摩尔定律在1965年被提出(当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。这意味着,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。)这说明集成电路的集成化程度越来越高——>推动了计算机小型化的发展。  1.3 硅谷模式的产生 1.3.1 第一阶段  1、政府和军方推动了技术的进步         早期的技术研究更多地是用来针对战争,比如计算机的产生更多的是为了计算导弹的发射路径,并不是为了给大众使用的。所以军方和政府起到了主导作用。   2、政府通过启动资金和研究机构、高校合作推进研究         但是研究新技术,政府和军方并没有专业的研究人员,所以必须依靠和高校和研究机构合作来推动,而项目的运行则需要大量的启动资金。   3、需要大量的启动资金,所以必须想办法“可持续”         但是每个项目都需要大量的资金,所以我们必须想办法“可持续发展”,比如说现在投了一个项目,当这个项目出现研究成果的时候,通过这个研究成果去盈利,来让资金回流继续去投资更多的项目。  4、为了满足“可持续”,有人提出了“硅谷模式”  1.3.2 第二阶段(硅谷模式) 1、政府有需求,就有人会满足(专利的出现)        当政府有相关需求的时候,如果我正好研究了某个东西,那我可以将这个东西卖给政府,政府也就不需要花费时间和金钱去继续研究了,这就是最早的技术专利。——>本质上是减少了研究成本。  2、启动资金+技术人员+商人(商人的出现)         但是光靠减少研究成本并不顶用啊!!所以一些研究并不会去针对政府的需求,而是去针对大众的需求。所以就需要擅长和社会打交道的人,比如说我们创建了一个app,我需要想办法让大众能够去购买和使用他,从而实现盈利,并且还需要根据大众的需求和意见,去不断改进产品,这些过程都需要打交道,所以商人出现了。  3、成立了很多公司,出现很多商业人物(公司的出现)         商人将成果售卖给大众,自然必须要保证大众能够正常的使用,并且还得确保这个东西能够及时地根据不同的意见去维护,这个过程需要相关的技术人员,那既然这样,那就由商人牵头,招募技术人员,所以出现了公司。通过诸如乔布斯、比尔盖茨这样的商业大佬开始出现。  4、孵化新的产品(盈利带动创造力的出现)        公司开始不断盈利,是一个很好的势头,这让他们更加致力于研究面向大众的产品,因此不断的涌现出各种各样针对大众化的新产品。  1.3.3 第三阶段(全球化) 1、产品不断更新,并开始逐渐卖向全球(跨国企业的出现)  2、政府通过税收的方式实现资金回流(税收的出现)  1.4 计算机软硬件的发展 1.IBM公司(硬件)          早期IBM公司的理念是——计算机未来只会给高校和大企业用到。          但是在后期的时候,发明了thinkpad,只不过被联想收购了。  2.苹果公司(硬件+软件)          苹果公司的理念是——计算机是一种大趋势,必然会大众化。          专注研发自己的产品,产品质量很高(主打性能),但是较贵  3.微软公司(软件)          微软只做软件,而苹果的产品如果卖的越多,那么他对应的会是自己的操作系统,所以微软的市场份额本来就有限,他非常担心自己的操作系统会被其他的硬件厂商换掉。  ——>找到IBM合作,但是IBM认为计算机造价高,只会由企业或机构使用,与微软的观念不符合,分道扬镳。  ——>找到因特尔(硬件支持)+大量计算机制造商(联想、华硕等品牌)+微软(软件支持)组成新的阵营。由于各个模块都是专注于自己的事情,所以效率高成本低,但由于阵营太大,所以品控较困难。(主打性价比)。  1.5 图形化界面的出现(转折点)       就这样,几个巨头斗了一段时间,在1979年乔布斯访问了施乐公司发现了图形化界面和鼠标界面,开始让自己的研发团队深入研究,而后微软也开始学习,就此拉开了图形化界面的大趋势。  二、Linux的诞生和发展 2.1 Linux的发展 1.Unix         除了masco和windows,其实在20世纪70年代还有一款商用的操作系统叫做Unix,由IBM公司安装在一体机上,然后交由企业机构去使用,或者是捐赠给高校。  2.雷纳斯托瓦兹        赫尔辛基大学1991年,大学生雷纳斯托瓦兹使用了学校实验室搭载的UNIX操作系统的电脑,开始思考我能否自己开发一款免费的操作系统呢??Liunx(Linux全称:Linux is not unix)应运而生。并将Linux的demo源代码公开。  3.顶级的黑客、工程师、收费操作系统的对抗者愿意无偿参与项目        为什么愿意无偿呢?我的理解其实跟我们平时的志愿者一样,有些事情不一定是拿钱去说话,可能会有各种各样方方面面的原因,而我认为在当时这更多地是一种对计算机从业者的挑战,与大公司巨头挑战的机会。这样使得Linux操作系统越来越强大。  4.Linux更多的是给工程师使用的       为什么Linux操作系统越来越大,但是我们平时看见更多地是windows和mas呢???原因就是因为苹果和微软之所以在图形化界面下大功夫就是为了增加用户体验,让普通老百姓也能更好地区使用计算机,所以Linux更多的是给工程师使用的,他不需要顾忌客户的使用体现,更为原始和高效。  5.苹果系统和安卓系统的出现       苹果开始做手机了,他们有自己的操作系统——>所以谷歌收购了相关产品进行了开源,诞生安卓,安卓是基于Linux内核的手机操作系统。  2.2 Linux操作系统 客户关注点:好用、快、安全、稳定        购买计算机的时候其实操作系统就算在计算机的钱里面,微软是直接从计算机厂商这里拿钱的,那为什么计算机厂商不安装盗版的免费的操作系统呢?因为不安全,如果盗版有任何问题,那么可能直接导致用户连电脑都不打算购买了,大多数客户是不会为操作系统去买单的,不敢对操作系统进行太大的变化,即使换新的操作系统(比如华为从安卓变成鸿蒙) 也要尽可能保持不变,保证用户使用习惯(其实早期的windows会有纸牌、扫雷等游戏,是为了帮助用户培养使用windows的习惯,产生客户粘性)  企业关注点:稳定、安全、快速、成本低         不仅仅是我们的电脑,手机要用操作系统,互联网公司也要选择自己的后端操作系统(服务器,不需要显示器,只需要处理数据)。Liunx操作系统->开源->免费(大众产品在用户体验上不能疏忽,所以互联网公司必须使用微软的操作系统,主要是为了客户的快和好用,但是对于公司内部来说,就更倾向于使用免费的linux而不是微软的操作系统了)——>公司开始广泛使用Liunx(成本低、快速、安全、稳定)  问题1:为什么开源比闭源好的???       稳定——>很多人去看,纠正错误。      安全——>闭源的话我们一旦出问题了看不到底层,找不到解决方案,就不安全,比如一段代码如果我们不清楚逻辑贸然去使用,说不定有病毒,或者窃取数据。      快速——>代码质量越来越好  问题2:为什么Liunx被大多公司使用??  1、服务器需要操作系统永远不关机,而windows连续不关机的话一段时间后就会非常卡。所以Liunx可以适应高强度的使用场景 2、未来越来越多的场景需要操作系统,而当你需要的时候,就有Liunx这个免费好用又安全稳定的操作系统,并且会被不断迭代发展。  问题3:Linux是免费开源的,那Liunx一些网站、一些社区维护不需要钱么??            其实也是需要钱的,当一个软件被大多数人使用的时候,就越不会有人希望这个东西消失,所以会想方设法地保留。免费本身只是一种方式,但是并不是什么都是免费的,也需要维护。   2.3 Linux提炼特征 a.开源-大部分是免费的、稳定的、安全的、高效 b.更多的被专业的人所使用  2.4 Linux的应用场景 1.Linux在服务器领域的发展        随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占 据了越来越多的市场份额,已经形成了大规模市场应用的局面。并且保持着快速的增长率。尤其在政府、 金融、农业、交通、电信等国家关键领域。此外,考虑到Linux的快速成长性以及国家相关政策的扶持力 度,Linux服务器产品一定能够冲击更大的服务器市场。        据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛 起,已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。  2、Linux在桌面领域的发展        近年来,特别在国内市场,Linux桌面操作系统的发展趋势非常迅猛。国内如中标麒麟Linux、红旗Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得 到了广泛应用。另外SUSE、Ubuntu也相继推出了基于Linux的桌面系统,特别是Ubuntu Linux,已经积 累了大量社区用户。但是,从系统的整体功能、性能来看,Linux桌面系统与Windows系列相比还有一定 的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面。 Linux在移动嵌入式领域的发展 Linux的低成本、强大的定制功能以及良好的移植性能,使得Linux在嵌入式系统方面也得到广泛应用,目 前Linux以广泛应用于手机、平板电脑、路由器、电视和电子游戏机等领域。  3、Linux在移动设备上广泛使用的          Android操作系统就是创建在Linux内核之上的。目前,Android已经成为全球最流行的智能手机操作系 统,据2015年权威部门最新统计,Android操作系统的全球市场份额已达84.6%。        此外,思科在网络防火墙和路由器也使用了定制的Linux,阿里云也开发了一套基于Linux的操作系 统“YunOS”,可用于智能手机、平板电脑和网络电视;常见的数字视频录像机、舞台灯光控制系统等都在 逐渐采用定制版本的Linux来实现,而这一切均归功与Linux与开源的力量。  4、Linux在云计算/大数据领域的发展          互联网产业的迅猛发展,促使云计算、大数据产业的形成并快速发展,云计算、大数据作为一个基于开源 软件的平台,Linux占据了核心优势;据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云 计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。  2.5 Linux版本 a.商业化版本线 (发行版 底层是内核    在内核的基础上搭建自己的生态形成不同的版本  上层的指令有些不同,但如果你把一款用得非常熟,再去使用另一个也是得心应手的 比如安卓也是在Liunx内核上产生的 虽然收费但还是有公司会去使用的,因为本身就没有专门的研发人员,如果出问题了还得自己维护,而用收费的就自然有人会去维护,我们选择Centos7.6/7.8/7.9)  b.技术版本线(源代码版本  Linux内核  xxx.yyy.zzz  x表示主版本,y表示次版本,z表示修正次数) ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 
  • [问题求助] uboot使用do_go_exec无法启动standalone程序?
    各位大佬好:开发需要使用uboot的standalone功能1、当前环境验证使用uboot中example demo预研,编译出的demo.bin通过tftp拷贝到系统0x82000000后,使用go命令成功运行; 2、将demo.bin环境填充到uboot固件新定义的一个.myboot的section中,在uboot启动过程中找到这个段将bin拷贝到0x8200000后,执行do_go_exec()函数,该函数实现就是go命令的实现,但是会存在报错,内容如下: "Synchronous Abort" handler, esr 0x02000000elr: 0000000004918000 lr : 00000000808ae498 (reloc)elr: 0000000084000000 lr : 00000000fff96498x0 : 0000000000000001 x1 : 00000000fddd7b70x2 : 00000000fddd7b70 x3 : 0000000000000000x4 : 00000000840002a8 x5 : 00000000fddd74a8x6 : 0000000000000038 x7 : 000000000000000fx8 : 00000000fddd7b18 x9 : 0000000000000008x10: 00000000ffffffd8 x11: 0000000000000010x12: 000000000000785c x13: 00000000fddd79fcx14: 00000000fddd7bd0 x15: 0000000000000020x16: 0000000084000000 x17: 0000000000000000x18: 00000000fdde7df0 x19: 00000000fff964a8x20: 000000007f6e8000 x21: 00000000fffc07d0x22: 0000000000000000 x23: 0000000000000000x24: 0000000000000000 x25: 0000000000000000x26: 0000000000000000 x27: 0000000000000000x28: 0000000000000000 x29: 00000000fddd7b50 3、自己的排查点: (1)修改do_hikboot运行时机,(1.1)run_main_loop之前;(1.2)在autoboot_command之前,调整启动位置无改善(2)直接调用do_go函数运行,失败,现象一致(3)更换启动地址为0x84000000后无改善,确认0x82000000可以运行,go命令可以启动
  • [技术干货] Linux实现双网卡绑定的代码详解【转】
    一、介绍linux 主机安装双网卡,共享一个IP地址,对外提供访问,实际同样连接两条物理线路到交换机实现平时双网卡同时工作,分流网络压力,同时提供冗余备份,监控,防止物理线路的单点故障。配置双网卡的目的:实现高可用、流量负载均衡实现原理:Linux bonding 驱动模块 提供了一种方法,用以把多个网络接口(network interface)组合成一个 逻辑的 “bonded” 接口。 Bonded 接口的工作方式取决于驱动的模式:不同的模式提供了热备份或负载均衡等不同的服务。几种模式:• 轮询策略(round robin),mode=0,按照设备顺序依次传输数据包,提供负载均衡和容错能力• 主备策略(active-backup),mode=1,只有主网卡处于工作状态,备网卡处于备用状态,主网卡坏掉后备网卡开始工作,提供容错能力• 异或策略(load balancing (xor)),mode=2,根据源MAC地址和目的MAC地址进行异或计算的结果来选择传输设备,提供负载均衡和容错能力• 广播策略(fault-tolerance (broadcast)),mode=3,将所有数据包传输给所有接口通过全部设备来传输所有数据,一个报文会复制两份通过bond下的两个网卡分别发送出去,提供高容错能力• 动态链接聚合(lacp),mode=4,按照802.3ad协议的聚合自动配置来共享相同的传输速度,网卡带宽最高可以翻倍,链路聚合控制协议(LACP)自动通知交换机聚合哪些端口,需要交换机支持 802.3ad协议,提供容错能力• 输出负载均衡模式(transmit load balancing),mode=5,输出负载均衡模式,只有输出实现负载均衡,输入数据时则只选定其中一块网卡接收,需要网卡和驱动支持ethtool命令• 输入/输出负载均衡模式(adaptive load balancing),mode=6,输入和输出都实现负载均衡,需要网卡和驱动支持ethtool命令二、步骤1、进入网卡配置目录下:cd /etc/sysconfig/network-scripts/ 2、vim ifcfg-bond0:3、vim ifcfg-ens33:4、vim ifcfg-ens36:5、vim /etc/modprobe.d/dist.conf:12alias bond0 bondingoptions bond0 miimon=100 mode=1 primary=eth0alias bond0 bonding,表示系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0miimon=100,表示系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线mode=1,表示绑定模式为1primary=eth0,系统首先eth0作为bond0接口与外界信息的传输接口6、vim /etc/rc.local:1modprobe bonding miimon=100 mode=17、所有配置都已完成,重启网络:12systemctl restart networkifconfig查看信息ifconfig8、检查bonding mode,想查看那个网卡再工作,使用下面这个命令12cat /proc/net/bonding/bond0cat /sys/class/net/bond0/bonding/mode  9、 网卡切换12ifenslave –c bond0 eth0           //测试bonding能否正常切换 Bonding完成后配置全局网关,vi  /etc/sysconfig/network
  • [技术干货] Linux 中的 Shell 脚本编写
    Linux 中的 Shell 脚本编写在 Linux 系统中,Shell 脚本是一种强大的工具,它允许我们将一系列的命令组合起来,实现自动化任务、系统管理和各种复杂的操作。一、Shell 脚本基础1. 什么是 Shell 脚本Shell 脚本是一个包含一系列命令的文本文件,这些命令按照特定的顺序执行。Shell 会读取并解释脚本中的每一行命令。2. 选择 Shell 解释器常见的 Shell 解释器有 bash(Bourne Again Shell)、sh(Bourne Shell)等。通常,我们使用 bash 来编写脚本。脚本的第一行通常指定解释器,例如:#!/bin/bash二、Shell 脚本的结构1. 注释以 # 开头的行是注释,用于解释脚本的功能和代码的作用。2. 变量可以使用 name=value 的形式定义变量,例如:my_variable="Hello World"在使用变量时,使用 $ 符号,如 echo $my_variable 。3. 条件判断使用 if-else 结构进行条件判断,例如:if [ $condition ]; then # 执行的命令 else # 执行的命令 fi4. 循环包括 for 循环、while 循环等。for 循环示例:for item in item1 item2 item3; do # 执行的命令 donewhile 循环示例:while [ $condition ]; do # 执行的命令 done三、常用命令和操作1. 文件操作如 cat 显示文件内容、mkdir 创建目录、rm 删除文件或目录等。2. 进程管理使用 ps 查看进程状态、kill 终止进程等。3. 字符串处理例如,使用 cut 提取字符串的部分内容、sed 进行字符串替换等。四、函数可以在脚本中定义函数来实现代码的复用,例如:function my_function { # 函数体 }五、输入和输出1. 标准输入(stdin)、标准输出(stdout)和标准错误(stderr)可以使用 > 重定向标准输出,2> 重定向标准错误。2. 读取用户输入使用 read 命令获取用户输入的值。六、实际应用示例1. 系统备份脚本定期备份重要的文件和目录。2. 服务器监控脚本监测服务器的资源使用情况,如 CPU 利用率、内存使用等,并发送告警邮件。七、调试技巧使用 -x 选项启用脚本的调试模式,可以查看每一行命令的执行过程和变量的值。编写 Shell 脚本需要不断的实践和积累经验,通过巧妙的运用,可以极大地提高工作效率和系统管理的便利性。
  • [技术干货] Linux 中 SMTP 系统配置
    Linux 中 SMTP 系统配置在 Linux 系统中,配置 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务可以实现邮件的发送和接收功能。这对于服务器的监控告警、系统通知等场景非常有用。一、SMTP 简介SMTP 是用于在网络上发送电子邮件的标准协议。它定义了邮件服务器之间如何相互通信以传递邮件。二、选择 SMTP 服务器软件在 Linux 中有多种 SMTP 服务器软件可供选择,如 Postfix、Sendmail、Exim 等。这里以常见的 Postfix 为例进行配置说明。三、安装 Postfix在大多数 Linux 发行版中,可以使用以下命令安装 Postfix:sudo apt install postfix # 对于基于 Debian 的系统 sudo yum install postfix # 对于基于 Red Hat 的系统四、Postfix 基本配置安装完成后,主要的配置文件位于 /etc/postfix/main.cf 。设置域名myhostname = yourdomain.com将 yourdomain.com 替换为您的实际域名。设置网络接口inet_interfaces = all表示监听所有网络接口。设置邮件来源mydestination = $myhostname, localhost.$mydomain, localhost五、配置邮件转发如果需要将邮件转发到其他邮件服务器,可以进行如下配置:relayhost = [mailserver.example.com]将 [mailserver.example.com] 替换为实际的转发目标服务器地址。六、设置访问控制可以通过配置 /etc/postfix/access 文件来控制哪些主机或网络可以使用此 SMTP 服务器发送邮件。例如,允许特定 IP 地址发送邮件:192.168.1.10 OK然后使用以下命令将其转换为数据库并应用:sudo postmap /etc/postfix/access sudo systemctl restart postfix七、测试 SMTP 配置配置完成后,可以使用以下命令发送测试邮件:echo "This is a test email" | mail -s "Test" recipient@example.com将 recipient@example.com 替换为接收测试邮件的实际邮箱地址。八、常见问题及解决邮件发送失败 检查配置文件中的参数是否正确,特别是域名、转发服务器地址等。被其他邮件服务器拒绝 可能是由于 IP 信誉问题、SPF 记录不正确等,需要检查相关设置。配置 SMTP 系统需要仔细设置各个参数,并根据实际需求进行调整和优化。通过正确配置,可以实现稳定可靠的邮件发送功能。
  • [技术干货] Linux 时钟同步问题解决:NTP 和 Chrony 的使用
    Linux 时钟同步问题解决:NTP 和 Chrony 的使用在 Linux 系统中,保持准确的时钟对于系统的正常运行和各种应用的正确执行至关重要。时钟不同步可能会导致日志记录不准确、认证问题以及依赖时间戳的应用出现异常。本文将介绍如何使用 NTP(Network Time Protocol)和 Chrony 来解决 Linux 系统的时钟同步问题。一、NTP 的使用NTP 是一种广泛使用的网络时间协议,用于在计算机网络中同步系统时钟。安装 NTP 服务在大多数 Linux 发行版中,可以使用以下命令安装 NTP 服务:sudo apt install ntp # 对于基于 Debian 的系统 sudo yum install ntp # 对于基于 Red Hat 的系统配置 NTP 服务安装完成后,需要对 NTP 进行配置。通常,配置文件位于 /etc/ntp.conf 。您可以在配置文件中指定 NTP 服务器的地址。例如:server ntp.example.com这里的 ntp.example.com 应替换为您实际使用的 NTP 服务器地址。启动和启用 NTP 服务安装并配置好后,使用以下命令启动 NTP 服务:sudo systemctl start ntp sudo systemctl enable ntp # 确保在系统启动时自动启动检查时钟同步状态可以使用 ntpq -p 命令来查看与 NTP 服务器的同步状态。二、Chrony 的使用Chrony 是另一种流行的时钟同步工具,具有一些独特的特性和优势。安装 Chrony类似于 NTP,安装 Chrony 可以使用以下命令:sudo apt install chrony # 对于基于 Debian 的系统 sudo yum install chrony # 对于基于 Red Hat 的系统配置 ChronyChrony 的主要配置文件是 /etc/chrony.conf 。您可以在其中添加 NTP 服务器的信息,例如:server ntp.example.com iburstiburst 选项可以加快初始同步速度。启动和启用 Chrony 服务启动服务:sudo systemctl start chrony sudo systemctl enable chrony # 开机自启检查同步状态使用 chronyc sources 命令查看同步源的状态。三、常见问题及解决在时钟同步过程中,可能会遇到一些问题,例如无法连接到 NTP 服务器、同步时间过长等。如果无法连接到服务器,可以检查网络连接、服务器地址是否正确以及防火墙设置。如果同步时间过长,可以尝试更换其他可靠的 NTP 服务器。希望本文能够帮助您在 Linux 系统中顺利解决时钟同步的相关问题,让您的系统始终保持准确的时间。
  • [技术干货] Linux 进阶命令:grep、awk、sed 的用法
    Linux 进阶命令:grep、awk、sed 的用法在 Linux 系统中,掌握一些进阶命令可以大大提高我们处理文本和数据的效率。本文将重点介绍 grep、awk 和 sed 这三个强大的命令。一、grep 命令grep 命令用于在文件中搜索匹配指定模式的行。基本用法grep "pattern" file.txt其中,"pattern" 是要搜索的模式,file.txt 是要搜索的文件。常用选项-i:忽略大小写进行搜索。-v:反转匹配,即输出不匹配指定模式的行。-n:显示匹配行的行号。例如,要在文件 example.txt 中搜索包含字符串 "hello" 的行,不区分大小写,可以使用以下命令:grep -i "hello" example.txt二、awk 命令awk 是一种用于处理文本数据的编程语言,常用于提取和处理文件中的特定字段。基本语法awk 'pattern {action}' file.txtpattern 是匹配模式,action 是要执行的操作。示例用法假设我们有一个包含学生成绩的文件 scores.txt,格式如下:Name,Math,English Alice,85,90 Bob,78,82 Charlie,92,88要计算每个学生的平均成绩,可以使用以下 awk 命令:awk -F ',' '{print $1, ($2 + $3) / 2}' scores.txt这里,-F ',' 指定逗号为字段分隔符。三、sed 命令sed 用于对文本进行流编辑。基本用法sed 'command' file.txt常见命令s/pattern/replacement/:替换匹配 pattern 的部分为 replacement 。例如,要将文件 text.txt 中的所有 "old" 替换为 "new" ,可以使用:sed '/old/new/g' text.txt多行操作sed 还可以处理多行文本。例如,删除连续的空行:sed '/^$/N;/^\n$/D' file.txt掌握 grep、awk 和 sed 这三个命令,可以让我们在处理 Linux 中的文本数据时更加得心应手,大大提高工作效率。希望这篇博客能够帮助您更好地理解和运用这些 Linux 进阶命令。
  • [技术干货] LVM 与传统分区方案相比有哪些优势
    LVM(Logical Volume Manager,逻辑卷管理器)相较于传统分区方案具有以下显著优势:1. 灵活性和可扩展性传统分区方案在创建分区时就固定了大小,后续难以更改。而 LVM 可以在不重新分区和不影响现有数据的情况下,轻松地扩展或缩小逻辑卷的大小。例如,当系统存储需求突然增加时,LVM 可以快速为逻辑卷分配更多的空间,无需重新安装系统或迁移数据。2. 更好的磁盘空间管理传统分区可能会导致磁盘空间分配不均,某些分区空间不足,而其他分区却有大量未使用的空间。LVM 可以将多个物理卷组合成一个卷组,从而更有效地利用磁盘空间。例如,一个卷组中可以包含不同大小和类型的磁盘,将它们的空间整合起来统一管理。3. 易于数据迁移和备份在 LVM 中,可以方便地将逻辑卷从一个物理卷移动到另一个物理卷,或者将整个卷组迁移到新的存储设备上。比如,当需要更换硬盘或升级存储设备时,LVM 能够简化数据迁移的过程,降低数据丢失的风险。4. 在线操作LVM 支持大多数操作在系统运行时进行,无需停机。这对于需要保持高可用性的服务器环境至关重要。例如,在服务器运行过程中,可以实时扩展逻辑卷以满足新的业务需求,而不会导致服务中断。5. 逻辑抽象LVM 提供了一个逻辑层面的抽象,使得管理员可以更关注于逻辑卷的使用,而不必过于关心底层物理磁盘的细节。例如,无需了解具体的磁盘布局和分区表,只需管理逻辑卷的大小和属性。总的来说,LVM 为磁盘管理提供了更强大、灵活和高效的解决方案,尤其适用于对存储需求变化较大、需要高可用性和高效磁盘空间利用的场景。
  • Linux 中 LVM(Logical Volume Manager)的用法
    在 Linux 系统中,LVM(Logical Volume Manager,逻辑卷管理器)是一种非常强大且灵活的磁盘管理工具。它允许管理员更轻松地管理磁盘空间,实现动态的存储分配和调整。一、LVM 的基本概念LVM 主要由物理卷(Physical Volume,PV)、卷组(Volume Group,VG)和逻辑卷(Logical Volume,LV)组成。物理卷是指磁盘分区或整个磁盘。卷组是由一个或多个物理卷组成的存储池。逻辑卷则是从卷组中划分出来的可用于文件系统的存储空间。二、创建 LVM 的步骤准备物理卷使用 fdisk 命令对磁盘进行分区,并将分区类型设置为 8e(LVM 类型)。例如:fdisk /dev/sdb输入 n 创建新分区,选择分区类型为 8e 。创建物理卷使用 pvcreate 命令将分区创建为物理卷。示例:pvcreate /dev/sdb1创建卷组使用 vgcreate 命令创建卷组,并指定物理卷。比如:vgcreate myvg /dev/sdb1创建逻辑卷使用 lvcreate 命令创建逻辑卷,并指定大小和名称。例如:lvcreate -L 10G -n mylv myvg三、扩展逻辑卷当存储空间不足时,可以扩展逻辑卷。检查卷组中的空闲空间使用 vgdisplay 命令查看卷组的空闲空间。扩展逻辑卷使用 lvextend 命令扩展逻辑卷大小。例如:lvextend -L +5G /dev/myvg/mylv调整文件系统大小根据文件系统类型,使用相应的命令调整文件系统大小。对于 ext4 文件系统,可以使用 resize2fs 命令。示例:resize2fs /dev/myvg/mylv四、缩小逻辑卷(需谨慎操作)卸载文件系统umount /dev/myvg/mylv检查文件系统使用 e2fsck -f /dev/myvg/mylv 命令检查文件系统。缩小文件系统resize2fs /dev/myvg/mylv 5G缩小逻辑卷lvreduce -L 5G /dev/myvg/mylv五、删除 LVM删除逻辑卷lvremove /dev/myvg/mylv删除卷组vgremove myvg删除物理卷pvremove /dev/sdb1LVM 为 Linux 系统的磁盘管理提供了极大的灵活性和可扩展性,但在操作过程中务必小心谨慎,以免造成数据丢失。希望这篇博客能够帮助您更好地理解和使用 Linux 中的 LVM 功能。
  • [技术干货] Linux中Docker遇到报port is already allocated错误【转】
    在Linux系统中,当你运行Docker容器或其他服务时,如果遇到port is already allocated错误,,这意味着该端口已经被另一个进程占用,因此无法再次被分配给任何新的服务。解决此类问题,通常可以采用下面步骤操作找出哪个进程占用了端口方式一:lsof命令1lsof -i :<port_number>这个命令会列出所有绑定到指定端口 <port_number> 的进程。输出结果中,PID列显示的就是对应进程的ID。注意:冒号【:】后面不要带空格;否则会出现unacceptable port specification in的错误提示。方式二:netstat命令1netstat -tulpn | grep :<port_number>这个命令将展示所有TCP连接以及监听中的UDP端口,并通过管道配合 grep 过滤出指定端口号的行。在输出信息中,可以看到对应的PID/Program name。方式三:ss命令1ss -plnt | grep :<port_number>ss 是一个用来分析 socket 统计信息的工具,它提供了比 netstat 更高效更详细的输出。停止占用端口的进程找到占用端口的PID(进程ID),然后使用kill命令结束该进程1kill <pid>如果是Docker容器占用如果发现是某个Docker容器占用了端口,可以先列出所有正在运行的容器,并查找与问题端口相关的容器:显示当前正在运行的容器1docker ps显示所有状态的容器1docker ps -aDocker容器的状态共有 7 种:created|restarting|running|removing|paused|exited|dead。显示所有正在运行容器及其端口映射1docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}"停止并移除容器12docker stop <container_id_or_name>docker rm <container_id_or_name>重新映射端口如果你需要同时运行多个服务且它们都希望使用相同的端口,你可以为新的Docker容器映射不同的主机端口1docker run -p <new_host_port>:<container_port> ...为什么不直接kill掉Docker占用端口进程在Docker容器中,如果你知道某个进程的PID,并且想要结束该进程,理论上你可以使用 kill pid 命令来终止它。但是通常并不推荐,这是因为:隔离性: Docker 容器内部运行的所有进程都在一个独立的命名空间内,这意味着宿主机上的直接 PID 可能与容器内部的 PID 不一致。你需要首先通过 docker exec 进入容器环境,然后获取并使用容器内的 PID 执行命令。容器管理: 正常情况下,应该通过 Docker 提供的接口来管理容器及其内部服务。比如,使用 docker stop 或 docker kill 来停止或强制停止整个容器,这将确保容器按照预期的方式关闭所有服务和资源。服务稳定性: 如果直接杀掉容器中的某个进程,而不考虑容器的整体状态和服务依赖关系,可能会导致容器内部的服务状态异常、数据丢失或其他未预见的问题。服务重启策略: 在很多场景下,Docker 容器会配置为自动重启失败的服务,而直接在容器内部杀死进程可能违反了这种重启策略,使得容器无法正常恢复到期望状态。
  • [技术干货] linux 服务器无 sudo 权限非 root 用户安装特定版本 cuda -转载
    1. 下载 cuda toolkit  下载想要版本的 cuda toolkit  CUDA Toolkit 11.8 Downloads | NVIDIA Developer      [xxx@localhost ~]$ hostnamectl    Static hostname: localhost.localdomain          Icon name: computer-server            Chassis: server         Machine ID: b4258bf9bef54798b03e8e3a13756124            Boot ID: df28bae14b0a4398a6ddb7fa3ee20c90   Operating System: CentOS Linux 8 (Core)        CPE OS Name: cpe:/o:centos:centos:8             Kernel: Linux 4.18.0-193.28.1.el8_2.x86_64       Architecture: x86-64   wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run 2 无sudo 权限安装CUDA 对于无 sudo 权限 或者 非 root 用户,在安装cuda的时候,将cuda toolkit的安装路径设置为自己有权限的目录就行,比如 /home/zhaozb/cuda-10.0,之后将后续步骤中对应cuda toolkit的安装路径都进行更改就行了 。  要实现上一步,首先需要进入tmp查看是否存在cuda-installer.log文件,如果存在,你是没法办装的,得让这个文件的所有者或者具有sudo 权限的管理员将其删除,同样,你安装完后也会生成这个文件,记得使用 rm -rf cuda-installer.log删掉!!  cd /tmp ls -l cuda-installer.log    #查看文件信息  删除  sudo 登录  sudo rm -rf cuda-installer.log 再次查看  ls -l cuda-installer.log    #查看文件信息 如果报no such file or directory表示不存在该文件,按照一下步骤安装CUDA toolkit  [@localhost software]$ sh cuda_11.8.0_520.61.05_linux.run Log file not open. cuda_11.8.0_520.61.05_linux.run: line 524: 2195323 Segmentation fault      (core dumped) ./cuda-installer ┌─┐ │  End User License Agreement                                                  │ │  -                                                                           │ │                                                                              │ │  NVIDIA Software License Agreement and CUDA Supplement to                    │ │  Software License Agreement. Last updated: October 8, 2021                   │ │                                                                              │ │  The CUDA Toolkit End User License Agreement applies to the                  │ │  NVIDIA CUDA Toolkit, the NVIDIA CUDA Samples, the NVIDIA                    │ │  Display Driver, NVIDIA Nsight tools (Visual Studio Edition),                │ │  and the associated documentation on CUDA APIs, programming                  │ │  model and development tools. If you do not agree with the                   │ │  terms and conditions of the license agreement, then do not                  │    download or use the software.      Last updated: October 8, 2021.        Preface    -    ─   Do you accept the above EULA? (accept/decline/quit):  键入accept  除了cuda toolkit其他全部取消,然后进入options    然后进入options,把X全部去掉   进入change path更改路径,因为没有root权限,没办法放入默认路径,因此更改为自己的路径即可,我更改为/home1/username/cuda-11.8(需要提前自己创建 mkdir /home1/username/cuda-11.8)        回到options界面,修改library install path,   在刚刚的路径后面新建一个mylib文件夹   回到主界面,选择install开始安装(需要等待一会),   安装好后界面如下   # <<< conda initialize <<<   export LD_LIBRARY_PATH=/home/xxx/cuda-11.3/lib64:${LD_LIBRARY_PATH} export CUDA_INSTALL_DIR=/home/xxx/cuda-11.3   export CUDA_HOME=/home/xxx/cuda-11.3 export CUDA_PATH=/home/xxx/cuda-11.3 export PATH=${CUDA_HOME}/bin:$PATH 按 i 进入insert 模式,粘贴后按 Esc,再输入 :wq 进行保存并退出  执行下列命令让更改立即生效  source ~/.bashrc  [xxx@localhost ~]$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Sun_Mar_21_19:15:46_PDT_2021 Cuda compilation tools, release 11.3, V11.3.58 Build cuda_11.3.r11.3/compiler.29745058_0  大功告成!   [xxx@localhost ~]$ sh cuda_11.3.0_465.19.01_linux.run =========== = Summary = ===========   Driver:   Not Selected Toolkit:  Installed in /home/xxx/cuda-11.3/ Samples:  Not Selected   Please make sure that  -   PATH includes /home/xxx/cuda-11.3/bin  -   LD_LIBRARY_PATH includes /home/xxx/cuda-11.3/lib64, or, add /home/xxx/cuda-11.3/lib64 to /etc/ld.so.conf and run ldconfig as root   To uninstall the CUDA Toolkit, run cuda-uninstaller in /home/xxx/cuda-11.3/bin ***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 465.00 is required for CUDA 11.3 functionality to work. To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:     sudo <CudaInstaller>.run --silent --driver   Logfile is /tmp/cuda-installer.log [xxx@localhost ~]$ vim ~/.bashrc [xxx@localhost ~]$ source ~/.bashrc [xxx@localhost ~]$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Sun_Mar_21_19:15:46_PDT_2021 Cuda compilation tools, release 11.3, V11.3.58 Build cuda_11.3.r11.3/compiler.29745058_0    3 安装并管理多版本CUDA  按照上述步骤下载安装,最后将.bashrc中CUDA 的路径更改一下即可。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/qq_35831906/article/details/138415615 
  • [技术干货] 网络网络层之(6)ICMPv4协议-转载
    1. 概述 1.1 ICMPv4介绍 ICMPv4是IPv4协议族中的一个重要协议,它主要用于传递网络层的控制和错误信息。与IP数据报不同,ICMPv4报文并不直接用于传输用户数据,而是辅助IP协议更好地完成数据传输任务。  ICMPv4报文封装在IP数据报中进行传输。报文主要由两部分组成:报头和数据部分。报头包含了类型、代码和校验和等重要信息,用于识别报文的类型和检测传输错误,数据部分携带了与具体报文类型相关的信息。  根据功能,ICMPv4报文可以分为两大类:差错报告报文和查询报文。  (1) 差错报告报文用于告知源主机在数据传输过程中遇到的各种错误情况:  目标不可达,数据包无法送达目标地址。 超时,数据包在网络中存在的时间超过限制。 重定向,通知源主机有更优的路由路径。 (2) 查询报文则用于网络探测和管理:  回显请求和应答,对应ping工具,用于连通性测试。 时间戳请求和应答,用于进行时间同步。 常用的网络诊断工具如ping、traceroute都是基于ICMPv4实现的,可以利用它们快速判断网络状态,定位故障点。  1.2 相关RFC文档 以下是与ICMPv4相关的主要RFC文档列表:  RFC 792 - Internet Control Message Protocol (1981),定义了ICMPv4协议的基本规范,包括报文格式、类型和代码等。 RFC 950 - Internet Standard Subnetting Procedure (1985),引入了子网编址的概念,通过子网掩码实现IP地址的划分。 RFC 1122 - Requirements for Internet Hosts – Communication Layers (1989),定义了互联网主机在实现TCP/IP协议栈时需要遵循的各项要求。 RFC 1191 - Path MTU Discovery (1990),提出了路径MTU发现机制,用于确定到达目标主机路径上的最小MTU。 RFC 1256 - ICMP Router Discovery Messages (1991),引入了ICMPv4路由器发现报文,用于主机动态地发现本地网络上的路由器。 RFC 1393 - Traceroute Using an IP Option (1993),描述了使用IP选项实现traceroute的方法。 RFC 1812 - Requirements for IP Version 4 Routers (1995),定义了IPv4路由器的各项需求,其中包括对ICMPv4的处理要求。 RFC 2463 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification (1998),定义了ICMPv6协议,作为IPv6协议族中与ICMPv4相对应的协议。 RFC 4443 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification (2006),更新了ICMPv6协议的规范,取代了RFC 2463。 RFC 4884 - Extended ICMP to Support Multi-Part Messages (2007),扩展了ICMPv4和ICMPv6,支持多部分消息,增加了对大型诊断消息的传输能力。 RFC 5837 - ICMP Extensions for Multiprotocol Label Switching (2010),定义了用于MPLS的ICMPv4和ICMPv6扩展,支持MPLS网络的错误报告和诊断。 RFC 5508 - NAT Behavioral Requirements for ICMP (2009),定义了网络地址转换(NAT)设备处理ICMPv4报文的行为要求,以保证NAT环境下ICMP的正确工作。 2. 报文格式 2.1 ICMPv4首部 ICMPv4报文格式由类型、代码和校验和三个固定字段组成,后面紧跟与具体报文类型相关的数据部分。   字段说明:  IPv4报文首部协议(proto)字段值为1,表示其携带了ICMPv4报文数据。  Type(类型,8位)标识ICMPv4报文的类型,不同的类型对应不同的报文格式和用途,如0表示回显应答,8表示回显请求等。  Code(代码,8位)与类型字段一起标识ICMPv4报文的具体含义,同一类型的报文可能有多个代码值,表示不同的错误原因或附加信息。  Checksum(校验和,16位)用于检测报文在传输过程中是否出现错误,计算时需要将校验和字段置零,然后对整个ICMP报文进行16位二进制反码求和。  Message Body(消息体,长度可变)携带与具体报文类型相关的数据,如错误信息、回显数据等,不同类型的报文有不同的消息体格式。  2.2 ICMPv4报文类型 常见的ICMPv4报文类型如下:  类型    名称    RFC文档    差错or查询    用途描述 0    Echo Reply    RFC792    查询    响应Echo Request,用于确认连通性和RTT测量 3    Destination Unreachable    RFC792    差错    通知源主机目标不可达,具体原因在Code字段中说明 4    Source Quench    RFC792    差错    通知源主机降低发送速率,避免拥塞(已废弃) 5    Redirect    RFC792    差错    通知源主机有更好的路由,优化路由路径 8    Echo Request    RFC792    查询    请求目标主机回应,用于确认连通性和RTT测量 9    Router Advertisement    RFC1256    查询    路由器定期或应请求发送,公告自身作为默认网关的可用性 10    Router Solicitation    RFC1256    查询    主机发送该报文,请求路由器立即发送Router Advertisement 11    Time Exceeded    RFC792    差错    当TTL耗尽或分片重组超时时,告知源主机 12    Parameter Problem    RFC792    差错    IP首部存在问题导致无法处理时,告知源主机 13    Timestamp    RFC792    查询    请求目标主机回送时间戳,用于时间同步(已废弃) 14    Timestamp Reply    RFC792    查询    Timestamp查询的应答报文(已废弃) 15    Information Request    RFC792    查询    请求目标主机提供IP地址信息(已废弃) 16    Information Reply    RFC792    查询    Information Request的应答报文(已废弃) 17    Address Mask Request    RFC1256    查询    请求子网掩码信息(已废弃) 18    Address Mask Reply    RFC1256    查询    Address Mask Request的应答报文(已废弃) 类型3、4、5、11、12属于差错报文,用于通知源主机存在的问题。  类型0、8、13、14、15、16属于查询报文,用于诊断连通性、测量时延等。  有些类型如Source Quench、Timestamp等已经被废弃不再使用。  2.3 ICMPv4常见代码 ICMPv4中类型3、5、9、11、12的常见代码号如下:  类型    代码    名称    描述 3    0    Net Unreachable    目标网络不可达 3    1    Host Unreachable    目标主机不可达 3    2    Protocol Unreachable    目标协议不可达 3    3    Port Unreachable    目标端口不可达 3    4    Fragmentation Needed and Don’t Fragment was Set    需要分片但设置了不分片位 3    5    Source Route Failed    源路由失败 3    6    Destination Network Unknown    目标网络未知 3    7    Destination Host Unknown    目标主机未知 3    8    Source Host Isolated    源主机被隔离 3    9    Communication with Destination Network is Administratively Prohibited    与目标网络的通信被管理员禁止 3    10    Communication with Destination Host is Administratively Prohibited    与目标主机的通信被管理员禁止 3    11    Destination Network Unreachable for Type of Service    对于此类服务,目标网络不可达 3    12    Destination Host Unreachable for Type of Service    对于此类服务,目标主机不可达 3    13    管理禁止通信    被过滤策略禁止的通信 3    14    违反主机优先级    src/dest/port不准许的优先级 3    15    优先级终止生效    在最小Tos之下(RFC1812) 5    0    Redirect Datagram for the Network    对特定网络重定向 5    1    Redirect Datagram for the Host    对特定主机重定向 5    2    Redirect Datagram for the Type of Service and Network    对特定类型服务和网络重定向 5    3    Redirect Datagram for the Type of Service and Host    对特定类型服务和主机重定向 9    0    Normal Router Advertisement    正常路由器通告 9    16    Does Not Route Common Traffic    不路由普通流量 11    0    Time to Live exceeded in Transit    传输过程中超过生存时间 11    1    Fragment Reassembly Time Exceeded    分片重组超时 12    0    Pointer indicates the error    参数问题,错误由指针指出 12    1    Missing a Required Option    缺少必需的选项 12    2    Bad Length    长度错误 2.4 ICMPv4差错报文限制 在某些情况下,网络设备不会产生ICMPv4差错报文,以避免网络拥塞、安全问题或无用的错误报告:  广播或组播地址,当IP数据报的目标地址是广播或组播地址时,通常不会产生ICMPv4差错报文,如"目标不可达"或"超时"等。  分片,当接收到IP分片时,如果出现错误(如超时、目标不可达等),通常不会为每个分片生成单独的ICMPv4差错报文,而是等到全部分片到达后再生成一个差错报文。  ICMP差错报文,为了避免无限循环,当一个ICMP差错报文触发另一个差错时,通常不会再生成新的ICMP差错报文。  源地址不可达,当源IP地址不可达时(零地址、环回地址、广播地址或组播地址),通常不会生成ICMPv4差错报文,以避免网络拥塞和广播风暴。  作为链路层广播的数据报,避免产生大量的差错报文。  安全策略,根据网络管理员的安全策略,某些类型的ICMPv4报文可能会被禁用或过滤,如ping请求、重定向等。  2.5 ICMPv4目的不可达(类型3) ICMPv4的目的不可达报文(Destination Unreachable Message)是类型3的差错报文,用于在数据包无法送达目标时,由路由器或主机向源端发送,告知其发生了不可达的情况。  RFC 792报文的格式如下:              Destination Unreachable Message(RFC 792)     0                   1                   2                   3     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |     Type      |     Code      |          Checksum             |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |                             unused                            |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |      Internet Header + 64 bits of Original Data Datagram      |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 字段说明如下:  Type(8位),值为3,表示目的不可达报文。 Code(8位),表示不可达的具体原因,取值范围0~15。 Checksum(16位),ICMPv4头部和数据部分的校验和。 unused(32位),未使用字段,必须置0。 Internet Header + 64 bits of Original Data Datagram,数据部分,包含引发差错报文的原始IP数据报的IP头部和至少64位数据。在不超过576字节的情况下,应尽量的多包涵原始数据。 RFC 4884报文格式如下(支持扩展数据结构):              Destination Unreachable Message(RFC 4884)    0                   1                   2                   3    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   |     Type      |     Code      |          Checksum             |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   |     unused    |    Length     |         Next-Hop MTU*         |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   |      Internet Header + leading octets of original datagram    |   |                                                               |   |                           //                                  |   |                                                               |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   |             ICMP扩展头部以及零个或多个关联对象                      |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Type、Code、Checksum、unused字段与原有格式相同。 Original IPv4 Header + data,数据部分,包含引发差错报文的原始IP数据报的IP头部和数据。与原有格式不同,该字段长度可变,不再限于64位,至少应包含128字节。 Length,指示Original IPv4 Header + data字段的长度,单位为4字节(IPv4和IPv6单位不一样)。 代码为4(报文太大)时,Next-Hop MTU字段用于记录下一跳的MTU,并被PMTUD使用。 当路由器或主机无法转发或处理接收到的数据包时,就会向源端发送一个相应的目的不可达报文。源端收到该报文后,可以根据Code值判断具体的不可达原因,并结合数据部分携带的原始报文信息进行问题的定位和调整。  Code字段表示不可达的具体原因,常见取值如下:  Net Unreachable(0),网络不可达。 Host Unreachable(1),主机不可达。 Protocol Unreachable(2),协议不可达。 Port Unreachable(3),端口不可达。 Fragmentation Needed and Don’t Fragment was Set(4),需要分片但禁止分片。 Source Route Failed(5),源路由失败。 Destination Network Unknown(6),目标网络未知。 Destination Host Unknown(7),目标主机未知。 Source Host Isolated(8),源主机被隔离。 Communication with Destination Network Administratively Prohibited(9),目标网络通信被管理员禁止。 Communication with Destination Host Administratively Prohibited(10),目标主机通信被管理员禁止。 Destination Network Unreachable for Type of Service(11),对于当前服务类型,目标网络不可达。 Destination Host Unreachable for Type of Service(12),对于当前服务类型,目标主机不可达。 数据部分包含了引发该差错报文的原始IP数据报的IP头部和前64位数据,用于帮助源端定位和诊断问题。如果原始数据报小于64位,则截断后填充0。  ICMPv4定义了"Packet Too Big"(PTB)报文,用于在网络中发现和调整数据包的大小,以适应不同链路的MTU限制,这种机制称为"Path MTU Discovery"(PMTUD),对于优化网络性能和避免分片非常重要。  在ICMPv4中,PTB报文属于目的不可达报文(类型3)的一种特例,使用代码4表示。当一个路由器收到一个数据包,其大小超过了下一跳链路的MTU,且该数据包设置了"Don’t Fragment"(DF)标志时,路由器会丢弃该数据包,并向源主机发送一个PTB报文。  PTB报文的格式与普通的目的不可达报文类似,但在未使用字段中携带了下一跳链路的MTU值。源主机收到PTB报文后,会将该报文中指示的MTU值作为目标地址的Path MTU(PMTU),并据此调整后续数据包的大小。  如果源主机无法缩减数据包大小,则会中止发送并向上层应用报告错误。  2.6 ICMPv4重定向(类型5) ICMPv4的重定向报文(Redirect Message)是一种特殊的ICMP报文,用于通知主机更优的路由路径。当主机发送数据包时,如果路由器发现主机使用了次优的路由路径,则会向主机发送重定向报文,建议主机更新其路由表,以便后续数据包可以直接发送到更优的下一跳路由器。                          Redirect Message(5)     0                   1                   2                   3      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |     Type      |     Code      |          Checksum             |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |                 Gateway Internet Address                      |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |      Internet Header + 64 bits of Original Data Datagram      |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Type(8位),值为5,表示重定向报文。 Code(8位),表示重定向的具体原因,取值范围0~3。 Checksum(16位),ICMP报文的校验和。 Gateway Internet Address(32位),建议的更优下一跳路由器的IP地址。 Internet Header + 64 bits of Original Data Datagram,触发重定向报文的原始IP数据报的IP头部和前64位数据。 重定向类型(Code):  Network Redirect(0),表示对特定网络的重定向。 Host Redirect(1),表示对特定主机的重定向。 Network Redirect for TOS(2),表示对特定网络和服务类型(TOS)的重定向。 Host Redirect for TOS(3),表示对特定主机和服务类型(TOS)的重定向。 2.7 ICMPv4超时(类型11) ICMPv4的超时报文(Time Exceeded Message)是一种重要的差错报文,用于通知源主机在数据包传输过程中发生了超时。这种超时通常分为两种情况:  传输过程中超过了IP头部中的生存时间(TTL)。 分片重组超时,相当于整个数据报被丢弃。 下面是ICMPv4超时报文的格式:                          Time Exceeded Message(11)      0                   1                   2                   3      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |     Type      |     Code      |          Checksum             |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |                             unused                            |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |      Internet Header + 64 bits of Original Data Datagram      |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 字段说明:  Type(8位),值为11,表示超时报文。 Code(8位),表示超时的具体原因,取值范围0~1。 Checksum(16位),ICMP报文的校验和。 unused(32位),未使用字段,置0。 Internet Header + 64 bits of Original Data Datagram,触发超时报文的原始IP数据报的IP头部和前64位数据。 超时代码(Code):  Time to Live exceeded in Transit(0),表示数据包在传输过程中超过了IP头部中的TTL值。每经过一个路由器,IP头部的TTL值就会减1,当TTL减为0时,路由器会丢弃该数据包,并向源主机发送一个Code 0的超时报文。 Fragment Reassembly Time Exceeded(1),表示分片重组超时。当一个数据包被分片传输时,目标主机需要在一定时间内收到所有分片并重组,如果超过了设定的时间阈值,就会触发Code 1的超时报文。 超时报文用于通知源主机在数据包传输过程中发生了异常,帮助源主机诊断和调试网络问题:  Code 0的超时报文通常表明网络路径过长或存在路由环路,源主机可以据此调整TTL值或检查路由配置。Code 0的超时报文也被用于traceroute等网络诊断工具,以发现网络路径上的路由器。 Code 1的超时报文提示分片重组过程出现了问题,可能是因为网络拥塞、分片丢失或目标主机资源不足等原因。 2.8 ICMPv4参数问题(类型12) ICMPv4的参数问题报文(Parameter Problem Message)是一种重要的差错报文,用于通知源主机在数据包的首部中发现了错误或不完整的信息。当路由器或主机在处理数据包时检测到头部字段存在问题,无法正确解析或处理时,就会向源主机发送参数问题报文。                      Parameter Problem Message(12)     0                   1                   2                   3     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |     Type      |     Code      |          Checksum             |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |    Pointer    |                   unused                      |     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+     |      Internet Header + 64 bits of Original Data Datagram      | 字段说明:  Type(8位),值为12,表示参数问题报文。 Code(8位),表示错误的具体原因,取值范围0~2。 Checksum(16位),ICMP报文的校验和。 Pointer(8位),指向数据包首部中发生错误的字节位置。 unused(24位),未使用字段,置0。 Internet Header + 64 bits of Original Data Datagram,触发参数问题报文的原始IP数据报的IP头部和前64位数据。 错误代码(Code):  Pointer indicates the error(0),表示Pointer字段指向了数据包首部中发生错误的具体位置。 Missing a Required Option(1),表示数据包缺少了某个必需的选项。 Bad Length(2),表示数据包的长度存在问题,可能是总长度与首部长度和数据长度之和不一致,或者超过了网络的MTU限制。 参数问题报文用于通知源主机在发送数据包时出现了首部错误,帮助源主机诊断和调试网络问题:  Code 0的参数问题报文通常表明数据包的某个首部字段存在无法识别或不合法的值,Pointer字段会指明具体的错误位置,源主机可以据此检查和修正数据包的构造过程。 Code 1的参数问题报文提示数据包缺少了某个必需的首部选项,例如安全选项、源路由选项等,源主机需要检查上层协议和应用的设置,确保包含所有必需的选项。 Code 2的参数问题报文表示数据包的长度字段存在问题,可能是上层协议计算错误或者数据包在传输过程中被截断,源主机需要检查数据包的封装和传输过程。 2.9 ICMPv4回显请求/应答(类型0/8) ICMP回显请求和应答是我们日常网络应用中最常见的两种ICMP报文。它们构成了Ping程序的基础,让我们能够方便地检测网络的连通性和延迟。                Echo(8) or Echo Reply(0) Message     0                   1                   2                   3     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |     Type      |     Code      |          Checksum             |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |           Identifier          |        Sequence Number        |    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |     Data ...    +-+-+-+-+- 一个完整的ICMP回显请求或应答报文由以下几个字段依次组成:  类型(Type,8位),回显请求的类型值为8,而回显应答的类型值则为0。 代码(Code,8位),对于回显请求和应答报文,代码字段的值通常都为0,表示这是一个标准的查询和响应过程。 校验和(Checksum,16位),ICMP报文的前4个字节和数据部分一起被用于计算校验和。 标识符(Identifier)和序号(Sequence Number),这两个字段各占2字节,它们的值由发送方任意指定,但在请求和应答报文中必须保持一致。 数据部分,在回显请求和应答中,这部分内容是完全一样的。数据的具体内容由请求方定义,应答方只需原封不动地返回即可。 最常见的应用莫过于Ping程序了。当我们在命令行中输入"ping 目标IP地址"时,源主机就会构造一系列ICMP回显请求报文,填入适当的标识符和序号,然后连续发送给目标主机。  目标主机收到请求后,会提取报文中的标识符和序号,构造对应的ICMP回显应答报文,再发送回源主机。源主机根据收到的ICMP应答,计算往返时间和丢包率,评估与目标主机之间的网络质量。  另一个常见的应用是traceroute程序,它通过逐步增加IP包的生存时间(TTL),结合ICMP超时错误和到达目标时的ICMP端口不可达错误,一跳一跳地探测到目标主机的网络路径。  2.10 ICMPv4路由器请求和通告(类型9/10) ICMPv4 路由器请求和通告报文帮助主机自动发现附近的路由器,获取必要的配置信息。  路由器请求报文的ICMP类型值为 9,当一台主机希望自动获取路由器的信息时,它会在本地网络上广播一个路由器请求报文。这个报文的目标地址通常为受限广播地址255.255.255.255或本地网段的广播地址。  路由器请求报文的格式非常简洁,除了公共的 ICMP 报头外,没有其他特殊字段:                  ICMP Router Solicitation Message(9)        0                   1                   2                   3        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |     Type      |     Code      |           Checksum            |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |                           Reserved                            |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 路由器通告报文的ICMP类型值为10,当路由器收到一个路由器请求报文或者自身的通告时间间隔到期时,它就会主动向本地网络发送一个路由器通告报文。这个报文通常以组播的形式发送,目标地址为 224.0.0.1。                  ICMP Router Advertisement Message(10)        0                   1                   2                   3        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |     Type      |     Code      |           Checksum            |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |   Num Addrs   |Addr Entry Size|           Lifetime            |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |                       Router Address[1]                       |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |                      Preference Level[1]                      |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |                       Router Address[2]                       |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |                      Preference Level[2]                      |       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       |                               .                               |       |                               .                               |       |                               .                               |  相比请求报文,通告报文的内容就丰富多了,除了ICMP报头,它还包含以下重要信息:  地址数(Num Addrs),表示通告报文中包含的路由地址条目数量,每个块包含一个IPv4地址和相应的优先水平(Preference level)。 地址条目大小(Addr Entry Size),说明每个地址条目的大小,以 32 位字为单位。 生存周期(Lifetime),告知主机在收到下一个通告报文之前,本报文中的信息有效的时间,单位为秒。 路由器地址(Router Address),路由器拥有的一个或多个 IP 地址。 优先水平(Preference level),一个32位的有符号二进制补码整数,其值越大代表优先级越高。默认的优先水平是0,特殊值0x80000000表示这个地址不应该作为有效的默认路由。 主机收到路由器通告报文后,会提取出路由器的IP地址,并根据报文中的生存时间设置老化定时器。在定时器到期之前,主机就可以使用通告的路由器地址作为默认网关,将目标不在本地网段的数据报文转发给路由器处理。  3. ICMP攻击 3.1 洪泛攻击 ICMP协议作为网络层的重要协议之一,在网络管理、故障诊断等方面发挥着关键作用。然而,由于其设计的开放性和灵活性,ICMP也常常被恶意利用,成为网络攻击的工具。  (1) ICMP洪泛攻击(ICMP Flood)是一种典型的拒绝服务(DoS)攻击方式。攻击者通过向目标主机或网络发送大量的ICMP请求报文(如Echo请求、时间戳请求等),耗尽目标的网络带宽和系统资源,导致其无法正常提供服务。  攻击者通常采用伪造源IP地址的方式,隐藏自己的真实身份,并利用僵尸网络放大攻击流量。当大量的ICMP请求同时到达目标时,网络设备的处理能力和带宽很快被耗尽,合法用户的请求无法得到及时响应,网络服务质量严重下降。  (2) **ICMP路由重定向攻击(ICMP Redirect)**用于路由器通知主机更优的路由路径。然而,恶意攻击者可以伪造ICMP重定向报文,引诱主机将数据报文发送到错误的路由器或恶意主机,造成数据泄露或中间人攻击。  攻击者通常在与目标主机相同的本地网络内,伪装成合法的路由器,向目标主机发送虚假的ICMP重定向报文。如果主机没有对报文来源进行严格验证,就可能误认为攻击者是可信的路由器,从而将敏感数据发送给攻击者,或者陷入恶意主机设置的"陷阱"。  (3) **ICMP目的不可达攻击(ICMP Destination Unreachable)**用于告知源主机目标主机或端口无法到达。攻击者可以利用这一机制,向目标主机发送伪造的目的不可达报文,导致目标主机错误地中断与合法主机的通信。  例如,攻击者监听到目标主机与某个合法服务器之间的通信后,就伪造一个源IP为该服务器、目标IP为目标主机的ICMP目的不可达报文,并声称服务器的某个端口不可达。目标主机收到报文后,可能会误认为服务器主动断开了连接,从而中断与服务器的通信。当攻击者持续发送这类报文时,目标主机与合法服务器之间的通信就会不断受到干扰。  (4) Ping of Death攻击,早期的一些操作系统和网络设备在处理超大的ICMP回显请求报文时存在缓冲区溢出漏洞。攻击者利用这一漏洞,构造一个超过最大允许长度(65535字节)的ICMP请求报文,在目标主机上引发系统崩溃或重启,造成拒绝服务。  为了防范ICMP报文攻击,网络管理员可以采取以下措施:  在网络边界和主机上启用ICMP报文过滤,仅允许必要的ICMP报文通过。 对ICMP报文进行速率限制,避免少量主机占用过多网络资源。 对ICMP报文的合法性进行验证,丢弃可疑的伪造报文。 及时更新系统和设备,修复已知的ICMP相关漏洞。 部署抗DDoS设备,实时监测和清洗恶意ICMP流量。 ICMP报文攻击是网络安全领域的一大挑战,攻击者利用ICMP的开放性和灵活性,通过多种手段破坏网络通信和服务。   ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/Once_day/article/details/139426408 
总条数:1199 到第
上滑加载中