• [技术干货] 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系统安装dpkg,apt函数库
    在嵌入式 Linux 开发板上离线安装 dpkg 和 apt 函数库,通常涉及以下几个步骤:识别系统架构和版本:确定开发板的CPU架构(例如 armhf、arm64)和操作系统版本。下载必要的软件包:从适当的软件源下载所需的 .deb 包文件。传输到开发板:将这些软件包传输到开发板。手动安装软件包:使用 dpkg 或其他工具手动安装这些软件包。下面是一个具体操作步骤:步骤 1:确定系统架构和版本在开发板上运行以下命令以确定系统的架构和操作系统版本:uname -m # 确定系统架构,如 armhf, arm64 cat /etc/os-release # 确定操作系统版本步骤 2:下载必要的软件包在你的PC上,根据上一步获取的信息,下载dpkg和apt相关的Debian包。你可以前往Debian Package Archives或者使用apt-get download来下载:例如,对于 armhf 架构:mkdir dpkg_apt_pkgs cd dpkg_apt_pkgs sudo apt-get download dpkg:armhf apt:armhf libapt-pkg5.0:armhf libstdc++6:armhf libgcc1:armhf liblzma5:armhf libbz2-1.0:armhf libc6:armhf步骤 3:传输到开发板使用 scp 或者 USB 驱动器将下载好的 .deb 文件传输到开发板。例如,使用 scp:scp *.deb user@<开发板IP地址>:/path/to/target/directory步骤 4:手动安装软件包在开发板上,进入存放 .deb 文件的目录,并手动安装这些包:cd /path/to/target/directory # 按依赖顺序安装所有必需的包 sudo dpkg -i libgcc1_<version>_<arch>.deb sudo dpkg -i libstdc++6_<version>_<arch>.deb sudo dpkg -i liblzma5_<version>_<arch>.deb sudo dpkg -i libbz2-1.0_<version>_<arch>.deb sudo dpkg -i libc6_<version>_<arch>.deb sudo dpkg -i libapt-pkg5.0_<version>_<arch>.deb sudo dpkg -i apt_<version>_<arch>.deb sudo dpkg -i dpkg_<version>_<arch>.deb使用示例假设下载的软件包如下:libgcc1_8.3.0-6_armhf.deb libstdc++6_8.3.0-6_armhf.deb liblzma5_5.2.4-1_armhf.deb libbz2-1.0_1.0.6-9_armhf.deb libc6_2.28-10_armhf.deb libapt-pkg5.0_1.8.2_armhf.deb apt_1.8.2_armhf.deb dpkg_1.19.7_armhf.deb依次执行以下命令:sudo dpkg -i libgcc1_8.3.0-6_armhf.deb sudo dpkg -i libstdc++6_8.3.0-6_armhf.deb sudo dpkg -i liblzma5_5.2.4-1_armhf.deb sudo dpkg -i libbz2-1.0_1.0.6-9_armhf.deb sudo dpkg -i libc6_2.28-10_armhf.deb sudo dpkg -i libapt-pkg5.0_1.8.2_armhf.deb sudo dpkg -i apt_1.8.2_armhf.deb sudo dpkg -i dpkg_1.19.7_armhf.deb确保安装成功验证 dpkg 和 apt 是否已正确安装:dpkg --version apt --version如果以上命令能够正确输出版本信息,则说明安装成功。注意事项请确保下载的软件包与开发板的操作系统版本和体系结构匹配。如果遇到依赖关系问题,可以通过阅读错误消息并下载缺少的依赖包来解决。强烈建议在执行这些操作之前备份开发板上的数据。
  • [技术干货] 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 
  • [技术干货] 容器化部署 Jenkins,并配置SSH远程操作服务器-转载
    一、Jenkins是什么 Jenkins可以简单理解为一个自动化工具,它帮助软件开发团队实现了持续集成和持续交付的过程。持续集成是指将不同开发者的代码合并到主干之前,自动进行构建、测试等操作,以确保代码质量和稳定性。持续交付则是指在每次代码变更后,自动进行打包和部署,以便快速将新功能或修复发布给用户。  使用Jenkins,你可以设置一个任务或流水线,在其中定义一系列需要执行的步骤。比如,当有新的代码提交到版本控制系统(如Git)时,Jenkins会检测到变更,并触发相应的构建任务。它会自动下载最新的代码、编译项目、运行各种测试(单元测试、集成测试等),甚至还能进行静态代码分析来找出潜在问题。  如果构建和测试成功,Jenkins可以进一步将生成的软件包部署到目标服务器上,使其能够被用户访问到。这样做的好处是节省了手动操作的时间和错误风险,并确保了每次更新都经过验证并可靠地发布。  总之,Jenkins是一个强大且灵活的工具,通过自动化执行构建、测试和部署等任务,提高了开发团队的效率和代码质量,同时降低了出错的可能性。  二、常见的部署Jenkins的方法 最常见的部署 Jenkins 的方法有以下几种:  独立安装:可以从 Jenkins 官网上下载适合你操作系统的安装包,然后按照官方文档的步骤进行安装。这种方式比较灵活,可以在本地服务器或云服务器上进行安装。  容器化部署:Jenkins 提供了官方的 Docker 镜像,可以通过 Docker 来运行 Jenkins。只需安装好 Docker 环境,在命令行中执行相应指令即可拉取镜像并运行 Jenkins 容器。  三、为什么选择容器化部署 容器化部署通常使用 Docker 镜像来实现。Docker 是一种流行的容器化平台,它提供了一种打包应用程序及其依赖项的方法,并将其封装在一个可移植和隔离的环境中,即容器。这个容器可以在任何支持 Docker 的主机上运行,而不需要额外的配置或依赖项。  在容器化部署 Jenkins 中,可以使用 Docker 镜像来创建一个独立的 Jenkins 容器,该容器包含了所有所需的软件、库和配置文件。这样就可以轻松地在各个环境中部署 Jenkins,保证环境一致性,并且能够快速进行部署和升级操作。  选择容器化部署 Jenkins 的好处主要有以下几点:  灵活性:容器化部署可以将 Jenkins 及其依赖项打包到一个独立的容器中,使其更加独立、可移植和易于管理。您可以轻松地在不同的环境中进行部署,例如开发环境、测试环境或生产环境。  隔离性:每个 Jenkins 容器都是相互隔离的,这意味着它们之间的运行不会相互干扰。这种隔离性能够提供更高的安全性和稳定性,确保一个容器中出现问题不会影响到其他容器。  快速部署和升级:由于容器镜像具备轻量级和可复制的特点,因此可以快速地进行部署和升级。只需创建新的容器实例,并替换旧版本即可完成升级过程,而无需手动配置。  环境一致性:通过容器化部署,您可以确保在不同的环境中(开发、测试、生产)运行的 Jenkins 实例是一致的。这有助于减少因环境差异引起的问题,并提供更可靠的构建和部署过程。  容器化部署能够提供更灵活、隔离和快速部署的 Jenkins 环境,更加便捷地管理和使用 Jenkins。  四、容器化部署Jenkins步骤 1、安装 Docker 首先,需要在目标服务器上安装 Docker。  安装步骤见:linux环境安装docker-CSDN博客  2、获取 Jenkins 镜像 从 Docker Hub 上获取 Jenkins 的官方镜像。可以使用以下命令拉取最新版本的 Jenkins 镜像:  docker pull jenkins/jenkins 3、创建并运行容器 创建一个基于 Jenkins 镜像的容器实例,并将其运行起来。  docker run -d -u root -p 8080:8080 -p 50000:50000 -v /home/test:/var/jenkins_home  --name my_jenkins jenkins/jenkins 这个命令是用来在 Docker 中运行 Jenkins 镜像,并将容器的端口映射到主机的 8080 和 50000 端口,同时将主机的 /home/test 目录挂载到容器内部的 /var/jenkins_home 目录。容器名称被指定为 my_jenkins。  解释每个选项的含义:  -d:以后台模式运行容器。 -u root:以 root 用户身份运行容器。 -p 8080:8080 -p 50000:50000:将容器内部的 8080 和 50000 端口映射到主机上相同的端口。 -v /home/test:/var/jenkins_home:将主机上的 /home/test 目录挂载到容器内部的 /var/jenkins_home 目录。 --name my_jenkins:给容器设置一个名称为 my_jenkins。 通过运行该命令,您可以在本地访问 Jenkins Web UI,使用 localhost:8080 访问 Jenkins 主界面,并使用 Docker 容器中 /var/jenkins_home 存储数据。  注:为啥要进行主机目录挂载到容器  假设我们正在使用一个容器来运行 Jenkins 服务器,而在主机上,我们希望将 Jenkins 的数据目录存储在 /home/test 目录下。为了实现这一目的,我们可以将主机上的 /home/test 目录挂载到容器内部的 /var/jenkins_home 目录。  通俗地讲,挂载的作用是将主机上的某个目录与容器内部的某个目录建立连接,以实现数据共享和持久化。在这种情况下,我们选择将 Jenkins 数据目录挂载到主机上的 /home/test 目录,并映射到容器内部的 /var/jenkins_home 目录。  4、访问 Jenkins 在浏览器中访问 http://<服务器IP地址>:8080 来打开 Jenkins Web UI。按照提示完成初始化设置,获取管理员密码并创建管理员账号。  4.1 查看初始密码问题 直接cat 给出的路径 提示找不到文件   因为我们是在docker里部署的,所以需要进到容器中才能访问这个文件,使用如下命令进入容器  docker exec -it my_jenkins /bin/bash 这个命令是使用Docker来在正在运行的名为"my_jenkins"的Jenkins容器中执行一个交互式的bash终端会话。解释如下:  docker exec: 用于在正在运行的容器中执行命令。 -it: 表示以交互式方式运行命令,并分配一个伪终端(TTY)。 my_jenkins: 指定要执行命令的容器名称或ID。 /bin/bash: 指定要在容器中执行的bash shell。 通过这个命令,您可以进入正在运行的Jenkins容器内部,以便进行一些特定操作或调试。这将打开一个与Jenkins容器关联的bash终端,允许您在容器内部进行命令行操作。  进入到容器内部后再查看初始密码,就可以正常查看到了   密码复制过来   5、配置 Jenkins 5.1 安装插件 点击安装推荐的插件即可,然后等待安装完成    5.2 创建管理员用户 一定牢记账号密码   5.3 实例配置 默认即可   这样就可以使用Jenkins了   五、简单使用Jenkins配置SSH远程操作服务器 进入Jenkins主页面   linux服务器上我们有一个shell文件,文件和内容如下:   我们通过Jenkins的构建任务的方式去执行这个文件  在Jenkins中进行构建时,需要首先SSH登录到一个远程服务器以执行必要的脚本,然后再执行构建。这时,需要安装SSH Plugin,并进行如下配置。  1、安装SSH Plugin 在Jenkins界面,系统管理->管理插件->安装SSH Plugin  说明,SSH Plugin的目的就是支持SSH到远程服务器,然后执行Shell命令。   可以先去已安装里搜索看有没有已经安装SSH Plugin,没有的话去未安装里去搜索安装    2、配置凭据 凭据管理中添加配置凭据       3、SSH相关配置  SSH remote hosts 配置SSH服务器站点,ip,账号,密码以及刚刚创建的凭证,保存  Hostname: SSH服务器的地址 Port: 22 Credentials:选择刚才添加的凭据  4、新建任务  输入任务名称,选择第一个自由风格的项目,确定   构建环境 选择 Execute shell script on remote host using ssh SSH站点配置默认就是刚刚配置的凭证 然后填写执行前和执行后的Shell脚本   5、构建任务 点击立即构建   6、查看构建结果 点击查看构建历史,点击控制台输出,就可以看到执行结果 SUCCESS   与直接在linux服务器上执行结果一致  ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/m0_59681797/article/details/135882908 
  • [技术干货] 如何查看ubuntu服务器上防火墙信息-转载
    1、检查防火墙状态: Ubuntu 18.04及更高版本使用的是ufw(Uncomplicated Firewall)。您可以使用以下命令检查ufw是否已安装并处于运行状态:  sudo ufw status 1 如果ufw已安装并正在运行,则会显示防火墙的状态(如活动、已停止等)以及开放的端口。  2、检查已开放的端口: 使用以下命令查看当前ufw防火墙规则及已开放的端口:  sudo ufw show added 1 这将显示已添加的防火墙规则,包括已开放的端口。  如果ufw未安装或未启用,可能是因为使用的Ubuntu版本未默认安装该防火墙。在这种情况下,可以通过以下命令安装ufw并启用防火墙:  sudo apt update sudo apt install ufw sudo ufw enable ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 
  • [技术干货] 探索GoServer:高效、易用的Golang服务器框架 -转载
    探索GoServer:高效、易用的Golang服务器框架 项目地址:https://gitcode.com/ecdiy/goserver  GoServer 是一个由Golang编写的高性能网络服务器框架,它旨在简化开发过程,提供稳定且高效的网络服务实现。本文将深入探讨GoServer的核心特性、技术亮点及应用案例,帮助开发者更好地理解和利用这一强大的工具。  项目简介 GoServer是一个轻量级但功能丰富的框架,它集成了常见的服务器功能,如HTTP/HTTPS、TCP/UDP服务、WebSocket支持,还提供了模块化的中间件系统,使得扩展和定制变得简单。对于需要快速构建网络服务的开发团队,GoServer是一个理想的选择。  技术分析 1. 基于Golang的并发模型 GoServer充分利用了Golang的goroutine和channel特性,实现了高并发处理能力。通过协程间的通信,它可以有效地管理大量连接,保证了系统的响应速度。  2. 模块化设计 该框架采用了模块化设计,包括路由、中间件、日志等核心组件,都可以方便地进行扩展和替换。这意味着你可以根据自己的需求调整或定制任何部分,保持代码的灵活性和可维护性。  3. 中间件系统 GoServer支持自定义中间件,可以用于处理请求前后的逻辑,例如认证、日志记录、限速等。这种设计使得复杂的功能可以分解为一系列小的、独立的处理步骤,降低了代码耦合度。  4. 高性能网络库 GoServer底层使用的是Golang标准库net/http和net,经过优化,能够处理大量的并发连接,确保服务的稳定性和效率。  5. 易于上手 尽管功能强大,但GoServer的API设计简洁直观,新用户可以很快熟悉并开始编写服务器应用程序。  应用场景 Web服务 - 快速搭建HTTP/HTTPS服务,支持RESTful API。 实时通信 - 利用WebSocket构建实时数据推送的应用,如聊天室、股票交易通知等。 物联网(IoT) - 可以作为设备通信服务器,处理TCP/UDP数据包,实现设备控制和监控。 游戏服务器 - 支持高并发连接,适用于网络游戏、多人在线游戏的后端架构。 特点总结 高性能 - 利用Golang原生并发机制,轻松处理大量并发请求。 灵活性 - 模块化设计使扩展和定制变得更加简单。 易于使用 - 简洁的API和丰富的文档,降低学习成本。 稳定可靠 - 基于成熟的标准库,保证服务稳定性。 总的来说,无论是新手还是经验丰富的开发者,GoServer都是构建高性能服务器应用的理想选择。如果你正在寻找一个既高效又灵活的Golang服务器框架,不妨尝试一下GoServer,让开发变得更简单、更高效。  项目地址:https://gitcode.com/ecdiy/goserver ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/gitblog_00017/article/details/137221159 
  • [技术干货] 使用Linux命令修改服务器时间及设置时区-转载
    在服务器管理和维护中,准确的系统时间对于保证服务器正常运行和数据一致性至关重要。  而有时候,我们可能需要手动修改服务器上的系统时间,以调整时区、修复时间漂移等问题。  本文将介绍如何使用Linux命令来修改服务器时间。  一、检查当前时间 首先,我们需要使用命令来检查服务器的当前时间。在终端中输入以下命令:  date 1 显示出当前的日期和时间,以及所设置的时区。确认当前时间和时区是否符合预期,可用作后续操作的比对标准。  二、修改时间日期  修改日期:要修改服务器的日期,可以使用date命令并指定日期格式,例如: date -s "2023-12-12" 1 将日期设置为指定的日期(年-月-日)。请注意,您可能需要具有管理员权限才能更改日期。  修改时间:要修改服务器的时间,同样可以使用date命令并指定时间格式,例如: date -s "21:57:12" 1 将时间设置为指定的时间(时:分:秒)。  同时修改日期和时间:如果要同时修改日期和时间,可以将日期和时间合并到一个命令中,例如: date -s "2023-12-12 21:57:12" 1 同时修改日期和时间。  三、设置时区  查看当前时区:要查看当前的时区设置,可以使用以下命令: timedatectl show --property=Timezone 1 显示出当前的时区。  修改时区:要修改服务器的时区,可以使用以下命令,并将"Asia/Shanghai"替换为所需的时区标识符: timedatectl set-timezone Asia/Shanghai 1 将时区设置为指定的时区。  四、验证修改结果  完成以上操作后,我们可以再次使用date命令来验证是否成功修改了服务器的时间和时区。确认系统时间以及时区是否与预期一致。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/warmspace2008/article/details/134960098 
  • [技术干货] pg_rman在恢复服务器上恢复源库的备份-转载
    文章目录 说明 恢复笔记 待恢复的数据库文件所在目录与文件层级如下 检查事项 具体操作 修改3: mv recovery.conf recovery.done 需要重置 wal 日志然后启库 检查效果 补充笔记(2024-02-07更新) pg_rman 安装与使用参考: pg_rman 编译安装与使用  说明 需求是能启库就行, 可以接受数据丢失, 恢复步骤有偷懒, 本文仅供个人记录笔记使用, 请不要完全照抄 规范合理的步骤是需要使用 recovery.conf 文件, 写清楚目标环境上的归档日志路径(当前提前得将源库中的wal日志拷贝到目标环境归档路径下) 来启动并恢复 恢复笔记 以 db_test 为例:  待恢复的数据库文件所在目录与文件层级如下 /data/restore/pg_restore/backups/db_test20231216/014025/backup.ini  检查事项 0.目录级别与生产环境保持一致,如果不一致, 需要自己手动创建确保一致, 1.最上级目录(20231216同级目录)存在 pg_rman.ini 2.20231216/014025下存在 file_database.txt 3.文件 20231216/014025/backup.ini 中的 STATUS=OK      -bash-4.2$ cat backup.ini     # configuration     BACKUP_MODE=FULL     WITH_SERVERLOG=false     COMPRESS_DATA=true     # result     TIMELINEID=5     START_LSN=4bb/4e000028     STOP_LSN=4bb/7e81c420     START_TIME='2023-02-15 01:35:03'     END_TIME='2023-02-15 07:42:53'     RECOVERY_XID=181372900     RECOVERY_TIME='2023-02-15 06:04:45'     TOTAL_DATA_BYTES=233395485133     READ_DATA_BYTES=233408059346     READ_ARCLOG_BYTES=32782681011     WRITE_BYTES=35758753390     BLOCK_SIZE=8192     XLOG_BLOCK_SIZE=8192     STATUS=OK  具体操作 创建恢复目录(你要将 数据库备份集恢复到哪里去), 相当于是执行了 pg_rman -B $BACKUP_PATH init mkdir -p   /data/restore/2023_pg_restore/db_test/data 1 检查待恢复的数据库文件集合是否正常, 如果显示 OK 则可以继续操作, 如果显示 RUNNING或者ERROR 则说明备份文件集合有问题, 需要重新弄一份新的 pg_rman -B /data/restore/pg_restore/backups/db_test show  具体恢复命令 (-D 指向你要将数据库文件集合恢复到哪里去) pg_rman -B /data/restore/pg_restore/backups/db_test restore -D /data/restore/2023_pg_restore/db_test/data 这里如果报 ARC_PATH 相关的错误(ERROR), 需要手动创建该目录 ,如果只是报 warning 可以先忽略 比如: mkdir -p /data/restore/2023_pg_restore/db_test/arc_log mkdir -p /data/restore/2023_pg_restore/db_test/srv_log 更新 /data/restore/pg_restore/backups/db_test/pg_rman.ini 文件  修改 配置文件 /data/restore/2023_pg_restore/db_test/data/postgresql.conf 与 /data/restore/2023_pg_restore/db_test/data/backup_label(如果存在的话) 修改1: 禁用 archive_mode 修改2: 修改 log_directory 与 data_directory 与 hba_file 配置项中的 data 值 与 /data/restore/2023_pg_restore/db_test/data 保持一致  修改3: mv recovery.conf recovery.done 修改4: mv backup_label backup_label_lxm 修改5: 将 listen_addresses= ‘10.33.45.110’ 改为 listen_addresses = ‘*’  手动启动数据库 (-D 启动哪个目录对应的数据库实例 ) pg_ctl start -D /data/restore/2023_pg_restore/db_test/data 如果还报错, 查看日志文件  -bash-4.2$ tailf /data/restore/2023_pg_restore/db_test/data/pg_log/postgresql-25.*csv 2023-12-25 15:44:37.909 HKT,,,119321,,658932e5.1d219,4,,2023-12-25 15:44:37 HKT,,0,FATAL,XX000,"could not locate required checkpoint record",,"If you are not restoring from a backup, try removing the file ""/data/restore/2023_pg_restore/db_test/data/backup_label"".",,,,,,,"" 2023-12-25 15:44:37.910 HKT,,,119317,,658932e5.1d215,1,,2023-12-25 15:44:37 HKT,,0,LOG,00000,"startup process (PID 119321) exited with exit code 1",,,,,,,,,"" 2023-12-25 15:44:37.910 HKT,,,119317,,658932e5.1d215,2,,2023-12-25 15:44:37 HKT,,0,LOG,00000,"aborting startup due to startup process failure",,,,,,,,,"" 2023-12-25 15:49:10.374 HKT,,,136964,,658933f6.21704,1,,2023-12-25 15:49:10 HKT,,0,LOG,00000,"database system was interrupted; last known up at 2023-12-16 02:17:39 HKT",,,,,,,,,"" 2023-12-25 15:49:10.375 HKT,,,136964,,658933f6.21704,2,,2023-12-25 15:49:10 HKT,,0,LOG,00000,"could not open tablespace directory ""pg_tblspc/0/PG_9.4_201409291"": No such file or directory",,,,,,,,,"" 2023-12-25 15:49:10.459 HKT,,,136964,,658933f6.21704,3,,2023-12-25 15:49:10 HKT,,0,LOG,00000,"invalid primary checkpoint record",,,,,,,,,"" 2023-12-25 15:49:10.459 HKT,,,136964,,658933f6.21704,4,,2023-12-25 15:49:10 HKT,,0,LOG,00000,"invalid secondary checkpoint record",,,,,,,,,""  FATAL,XX000,"could not locate required checkpoint record", 需要重置 wal 日志然后启库 Report bugs to <pgsql-bugs@postgresql.org>. -bash-4.2$ pg_resetxlog -f /data/restore/2023_pg_restore/db_test/data Transaction log reset -bash-4.2$  -bash-4.2$  pg_ctl start -D /data/restore/2023_pg_restore/db_test/data server starting -bash-4.2$ 2023-12-25 15:50:13 HKT::@:[138504]: LOG:  redirecting log output to logging collector process 2023-12-25 15:50:13 HKT::@:[138504]: HINT:  Future log output will appear in directory "/data/restore/2023_pg_restore/db_test/data/pg_log". 检查效果 -bash-4.2$ netstat -anp |grep 5472 (Not all processes could be identified, non-owned process info  will not be shown, you would have to be root to see it all.) tcp        0      0 0.0.0.0:5472            0.0.0.0:*               LISTEN      138504/postgres      tcp6       0      0 :::5472                 ::: *                    LISTEN      138504/postgres      unix  2      [ ACC ]     STREAM     LISTENING     2208435216 138504/postgres      /tmp/.s.PGSQL.5472 unix  3      [ ]         STREAM     CONNECTED     154721   -                     unix  3      [ ]         STREAM     CONNECTED     154720   -    -bash-4.2$ psql -p 5472 psql (9.4.14) Type "help" for help.  postgres=# \l+                                                                     List of databases    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description                  -----------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------  db_test   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 69 GB   | pg_default |   repmgr    | repmgr   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 687 MB  | pg_default |   template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 6729 kB | pg_default | unmodifiable empty database            |          |          |             |             | postgres=CTc/postgres |         |            |   template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 8697 kB | pg_default | default template for new databases            |          |          |             |             | postgres=CTc/postgres |         |            |   补充笔记(2024-02-07更新) 1. 修改 /postgresql/hq/bk/restore/pg_restore/backups/iobs/pg_rman.ini  将 ARCLOG_PATH 值改为一个新路径, 例如/postgresql/hq/bk/restore/2023_pg_restore/iobs_new_arc_log, 需要先手动创建该路径并授予 postgres的属主权限  2. 执行 pg_rman -B /postgresql/hq/bk/restore/pg_restore/backups/iobs/ restore -D /postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2 >> ./res.log 2>&1 & 进行恢复  3. 检查恢复结果 tail res.log -bash-4.2$ tail res.log  LOG: (16485/16492) 00000009000010B800000014 LOG: (16486/16492) 00000009000010B800000015 LOG: (16487/16492) 00000009000010B800000016 LOG: (16488/16492) 00000009000010B800000017 LOG: (16489/16492) 00000009000010B800000018 LOG: (16490/16492) 00000009000010B800000019 LOG: (16491/16492) 00000009000010B80000001A LOG: (16492/16492) 00000009000010B80000001B LOG: backup 2024-02-24 01:35:25 is valid INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started.  4.进入新的 data目录  cd /postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2  cp postgresql.conf postgresql.conf_bak_`date +%F`  cp recovery.conf recovery.conf_bak_`date +%F`  vim recovery.conf  将 recovery_target_timeline 值改为 'latest'  vim postgresql.conf 修改里面的相关路径 包括如下配置 -bash-4.2$ diff postgresql.conf postgresql.conf_bak_20240311  2,3c2,3 < data_directory                    ='/postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2' < hba_file                        ='/postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2/pg_hba.conf' --- > data_directory                    ='/postgresql/pg5472/data' > hba_file                        ='/postgresql/pg5472/data/pg_hba.conf' 7c7 < listen_addresses                   = '*' --- > listen_addresses                   = '10.33.45.110' 57,58c57,58 < #archive_command = 'test ! -f /postgresql/pgbackup/iobs/archlog/%f && cp %p /postgresql/pgbackup/iobs/archlog/%f' < archive_command = 'test ! -f /postgresql/hq/bk/restore/2023_pg_restore/iobs_new_arc_log/%f && cp %p /postgresql/hq/bk/restore/2023_pg_restore/iobs_new_arc_log/%f' --- > archive_command = 'test ! -f /postgresql/pgbackup/iobs/archlog/%f && cp %p /postgresql/pgbackup/iobs/archlog/%f' >  67c67 < log_directory = '/postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2/pg_log' --- > log_directory = '/postgresql/pg5472/data/pg_log' -bash-4.2$  5. 启动数据库 postmaster -D /postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2 &  6. 登录(根据配置文件中 listen_port 为 5472 -bash-4.2$ psql -p 5472 psql (9.4.14) Type "help" for help.  postgres=# show data_directory ;                   data_directory                    ---------------------------------------------------  /postgresql/hq/bk/restore/2023_pg_restore/iobs_new_lxm2 (1 row)                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/yueludanfeng/article/details/137179651 
  • [技术干货] linux之用户和权限-转载
    在 Linux 中,管理用户和权限是一个重要的方面,因为它决定了用户可以访问和修改哪些文件和程序。以下是一些关于用户和权限管理的基本命令和常见问题的解答:  如何切换用户? 使用 su (switch user) 命令可以切换用户。  示例:切换到用户 username。  su - username 如果你没有指定用户(即只输入 su),默认会切换到超级用户(root)。在切换用户时,系统通常会要求输入目标用户的密码。  如何查看当前用户? whoami  whoami 命令显示当前用户的用户名。  whoami id  id 命令显示当前用户的 UID(用户 ID)、GID(组 ID)和所属的用户组。  id 如何查看和修改文件权限? ls -l  使用 ls -l 可以查看文件的权限。  ls -l filename 输出会显示文件的权限、所有者和所属组。  chmod  chmod (change mode) 命令用于修改文件或目录的权限。  示例:给 file.txt 文件所有者添加执行权限。  chmod u+x file.txt 示例:给 file.txt 设置具体权限(所有者读写执行,组读执行,其他用户读)。  chmod 754 file.txt 如何添加或删除用户? useradd  useradd 命令用于创建新用户。  示例:添加新用户 newuser。  sudo useradd newuser userdel  userdel 命令用于删除用户。  示例:删除用户 olduser。  sudo userdel olduser 如何修改用户密码? 使用 passwd 命令可以修改用户的密码。  示例:修改当前用户的密码。  passwd 如果你是超级用户,可以为其他用户设置密码。  sudo passwd username 没有文件运行权限怎么办? 如果你试图运行一个没有执行权限的文件,你可以使用 chmod 命令为该文件添加执行权限,如上面 chmod 的例子所示。  如何查看用户所属的用户组? groups  groups 命令显示当前用户所属的所有用户组。  groups 若要查看特定用户所属的用户组:  groups username id  id 命令也可以用来查看用户所属的用户组。  id username 如何修改文件的所有者或所属组? chown  chown (change owner) 命令用于修改文件或目录的所有者。  示例:将 file.txt 的所有者更改为 newowner。  sudo chown newowner file.txt chgrp  chgrp (change group) 命令用于修改文件或目录的所属组。  示例:将 file.txt 的所属组更改为 newgroup。  sudo chgrp newgroup file.txt 如何切换到 root 用户? 使用 su 命令可以切换到 root 用户。  su - 你需要输入 root 用户的密码。如果你使用的是 sudo,可以使用以下命令切换到 root 用户:  sudo -i 或  sudo su - 在使用 sudo 时,你需要输入自己的密码,而不是 root 的密码。  这些命令和概念是 Linux 用户和权限管理的基础。管理员通常需要熟练 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/hebtu666/article/details/139309127 
  • [技术干货] Linux-查看服务器--硬件配置信息-转载
    在Linux服务器上查看硬件配置信息,可以使用一系列命令行工具。以下是一些常用命令来获取不同硬件组件的详细信息: 查看CPU信息: cat /proc/cpuinfo:显示处理器类型、型号、频率、核心数等详细信息。 lscpu:提供更为人性化的CPU架构和核心数量等信息。 查看内存信息:  free -h 或 free -m:显示当前系统中内存的使用情况(以合适的单位如GB或MB显示)。 dmidecode -t memory:获取更详细的内存条信息,包括插槽数量、大小、速度等。 查看硬盘信息:  fdisk -l 或 lsblk -f:列出所有磁盘及其分区情况。 hdparm -I /dev/sda(替换 /dev/sda 为你的磁盘设备名):获取SATA硬盘的详细参数。 smartctl -a /dev/sda(适用于S.M.A.R.T.支持的磁盘):获取硬盘健康状况和详细信息。 查看网络接口信息:  ip addr show 或 ifconfig(部分新系统已弃用 ifconfig):显示网络接口及IP地址配置。 ethtool eth0(替换 eth0 为你的网卡设备名):查看网络接口的详细信息,如速度、双工模式等。 查看主板、BIOS以及其他硬件信息:  lshw:全面展示系统硬件结构,包括主板、显卡、声卡等各种设备信息。 dmidecode:从DMI表中读取系统硬件信息,例如制造商、产品序列号、BIOS版本等。 查看RAID阵列信息:  对于软RAID,可以查看 /proc/mdstat 来了解MDADM管理的RAID状态。 对于硬RAID,可能需要特定厂商提供的工具,如HP Smart Array阵列则使用 hpacucli 命令。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/weixin_72186894/article/details/136240066 
  • [问题求助] ABC运行环境中有一个目录使用率100%,是否会影响系统的正常运行?
    环境信息:ABC_20.3环境问题一句话总结:在进行ABC运行环境巡检时,发现下图的目录空间的使用率已达到100%,是否会影响业务系统的正常运行?此目录下的tmpfs是什么文件?能否删除?。问题现象截图:使用场景或目的:不涉及。操作步骤:无希望优化的地方或希望实现的效果:租户账号:nxx项目名称: 天津xx
总条数:1058 到第
上滑加载中