Leon Ding Blog - Linux系统
type: channel
link: https://blog.leonding.me/category/linux.html
description: 收录关于 Linux 系统文章
items: Java 原生化的未来 Graal AOT 编译器
items: 在 Ubuntu 上安装 MySQL8.x 版本
items: 使用 Ansible 自动化运维
items: 网络配置好帮手 DHCP 协议
items: 在 RHEL9 上安装 MySQL 社区版本
items: SELinux 和 journalctl 工具
items: Linux 中的网络配置
items: Linux 编译安装 PHP 环境
items: RIAD 磁盘冗余阵列
items: Linux 命令必知必会

Java 原生化的未来 Graal AOT 编译器
type: item
date: 2024-07-17T22:35:00+08:00
description: Java 这门语言与生俱来的显著特性就是“一次编译，到处运行”，这种功能得益于 JVM 平台的支持，Java 程序通常通过将其打包为 JAR 或 WAR 包，并依赖 JVM 和 Servlet 容器来运行。其底层运行时 JVM 采用 JIT（即时编译）模式来执行程序代码，JVM 会在运行时进行编译优化和动态执行代码，这通常会导致较高的内存占用。这样的好处是采用 JIT 可以热更新和热部署程序，并且 JVM 可以在运行期间对程序进行动态分析，来实时优化程序以达到最好的性能状态。Cloud Native 面临的问题随着云计算的发展，服务端程序的运行和部署方式发生了巨大变化，特别是在云原生（Cloud Native）场景下，服务器程序被打包成一个个容器运行。在这种环境下，传统方式容器化的 Java 程序面临着打包后的镜像文件过大的问题。镜像文件中需要包含 JRE 和各种第三方库，导致镜像体积庞大，占用更多的磁盘空间。目前云计算的计费方式也发生了改变，采用按需分配的实时计费方式，根据程序的内存占用和运行时间计费。这与传统 IDC 自托管式机房中长时间运行服务器程序形成鲜明对比，按需分配的计费方式显然更具性价比，因此优化 Java 程序在容器环境中的运行方式变得尤为重要。Serverless 面临的问题传统的 JVM 工作原理要求程序员先将编写的 Java 程序打包为 JAR 或 WAR 包，这是普通 Java 开发者所能接触到的程序编译和构建阶段。然而当程序运行起来之后，底层的 JVM 会进行许多复杂的操作，包括内存管理、垃圾回收、即时编译等。需要先启动 JRE 中的 JVM 来加载 Tomcat 服务器所需的字节码，再加载 WAR 包中的字节码文件到 Servlet 容器中运行服务，这个过程非常耗时。下图为整个传统 Java 程序从源代码到程序运行各个阶段的工作流程：下图为传统的 Java 运行时执行程序的生命周期，首先应用的开发者将 *.java 源代码编译为 bytecode 和 jar 依赖包通过 maven 构建打包为一个单独的 jar 包。当执行 java -jar xxx.jar 命令时，首先要启动 JRE 中的 JVM 程序，因为 JVM 本身也是一款单独程序对应着 $JAVA_HOME\bin 目录中的 java ，当 JVM 启动之后会在系统中创建一个进程，将要运行的 jar 程序包和 JRE 标准库中 class 文件加载入 JVM 内存中，并且找到 main 方法开始解释执行。当程序运行一段时间之后 JVM 充分获取了 Java 程序的一些执行数据信息，开始对程序进行 JIT 及时编译优化程序，当程序被 JIT 优化之后的程序才能达到和 C/C++ 这种直接编译为 Native Code 程序的性能。在云计算推崇的 Serverless 架构场景下，Java 的 JIT 模式并不适合，Serverless 应用程序需要能够快速启动以响应事件驱动的请求，并且在空闲时自动关机销毁，释放在服务请求期间所使用的内存。然而，这种需求与传统的 Java 程序运行模式背道而驰，使得 Java 在 Serverless 场景中显得不适用，这就是被业界称为的 冷启动 问题。为了解决这一痛点，Oracle Labs 推出一款新的 JDK 产品 GraalVM JDK ，相比传统的 JDK 该产品内置 Java 静态编译工具和一款新的虚拟机，和传统的 JVM 不一样 GraalVM 是支持多语言进行混合编程的虚拟机，这也是它一大亮点。GraalVM 中的静态编译工具不仅是支持将 Java 编译为二进制可执行文件，还支持 JavaScript 和 Python 等其他语言的编译优化功能，本文只关注于 GraalVM 对 Java 程序进行 AOT（Ahead-Of-Time）编译的解决方案。使用 GraalVM 对 Java 程序进行 AOT 编译的解决方案，可以显著缩短启动时间并降低内存占用，使 Java 程序更适合在 Serverless 环境中运行，通过 AOT 编译，编译器生成一个 Native Code 二进制文件，即对应平台架构的机器代码程序。这种方式无需像 JIT 那样依赖于 JVM 运行，在内存和磁盘占用上有显著改善。下图为 AOT 编译工作流程，在编译阶段会程序进行静态分析，通过它内置工具分析 Java 源代码中依赖关系，将其所有依赖和代码执行逻辑都进行提前编译为机器代码，缺点也很明显可能会失去在 JIT 模式下的动态反射功能。如上图，在 AOT 模式下将在运行时的过程放到在程序构建阶段，构建阶段会对 Java 程序执行静态代码分析和依赖可达性分析，将其所有的依赖软件包都编译生产所属平台对应的可执行二进制文件。AOT…

在 Ubuntu 上安装 MySQL8.x 版本
type: item
date: 2024-06-23T19:29:00+08:00
description: 在 MySQL 8.x 带来了许多新特性和改进包括 JSON 数据类型和 Java Script 作为 JavaScript Shell 支持，可以直接使用 JavaScript（JS）作为数据库查询语言或存储过程的语言，更好的性能和安全性，例如连接过程中出现的 Public Key Retrieval is not allowed 错误提示，这些都是新版本特性。本文将记录完整的基于 Ubuntu 最新版本中安装 MySQL8.x 版本的过程。安装和配置在安装 MySQL8.x 之前可以尝试先更新一下操作系统和软件包，执行下面命令可以更新：sudo apt update && apt upgrade -y更新系统和软件包版本需要一点时间，这个过程取决于你网络和所使用的 apt 软件包数据源地址，数据源配置文件路径 /etc/apt/sources.list。[scode type="yellow"]如果不确定系统中是否安装其他版本的 MySQL 版本，可以先执行清理命令。清空完成之后，提供 apt search mysql 包管理工具搜索最新的 MySQL8.x 软件安装包，最后通过 apt install 执行进行安装。[/scode]sudo apt remove mysql* sudo apt autoremove sudo apt autoclean清空完成之后提供 apt 所提供的 MySQL 软件包进行安装：sudo apt search mysql sudo apt install mysql-*安装完成之后，可以使用 sudo mysql_secure_installation 来初始化 root 用户的密码，这是 MySQL 新版本所提供的初始化数据库程序：sudo mysql_secure_installation[scode type="yellow"]如果需要让 MySQL 服务器能被远程的用户提供客户端访问，需要配置修改服务器所绑定监听的 ipv4 地址，默认是本地环路地址，在这个 /etc/mysql/mysql.conf.d/mysqld.cnf 中找到 bind-address 的值修改它为 0.0.0.0 即可。[/scode]# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir # tmpdir = /tmp # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 0.0.0.0 #这一行 ✅ mysqlx-bind-address = 127.0.0.1通过上面的配置目前 root 还是只能通过本机的客户端进行连接，有远程登录需求的可以配置一个远程用户并且允许远程登录，并且设置初始化密码，我这里开放的是 root 用户，执行下面命令：GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码' WITH GRANT OPTION;解决安全连接问题在 MySQL8.x 版本中如果要使用正常的密码连接到 Server 中连接过程中出现的 Public Key Retrieval is not allowed 错误提示，这个是新特别特意到安全功能增强，如果要使用这种方式连接必须要配置 SSL/TLS 密钥对进行连接。[scode type="yellow"]指定用户使用的密码验证方法 mysql_native_password ，这让 MySQL 使用的默认身份验证插件，它支持基于用户名和密码的常规身份验证机制，执行下面命令使用默认密码验证方式进行连接：[/scode]ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'new password';执行上面的 SQL 之后，刷新一下 MySQL 授权表：flush privileges;最后记得在服务器上允许开放 3306 端口数据包的连接。

使用 Ansible 自动化运维
type: item
date: 2023-03-29T16:41:00+08:00
description: 如果是一名服务端程序员，开发最多程序应该为服务器端应用程序，而服务器端端应用程序大部分部署在 Linux 操作系统之上，在 Linux 上部署应用和管理 Linux 系统大部分都是使用 SSH 端方式管理。这篇文章要介绍的是 Ansible 自动化运行工具，它可以帮助我们自动化各种 IT 任务，从部署应用程序和服务到协调网络设备和云资源的管理，个人感觉相比 K8s 的设计 Ansible 更贴合的是物理机器设计的管理软件。[scode type="blue"]Ansible 是基于代理的，不需要在被管理的节点上安装客户端直接使用 SSH 协议进行通信，而 Kubernetes 是基于主从节点的，需要在被管理的节点上安装 Kubernetes Agent ，Ansible 主要用于管理配置和协调各种 IT 任务，包括应用程序部署、系统配置、网络管理等，Kubernetes 是一种容器编排平台，用于自动化和管理容器化应用程序的部署、伸缩、故障恢复和负载均衡。[/scode]上图为 ansible 的软件架构图。安装 AnsibleAnsible 目前支持类 RHEL 发行版本系列系统，大部分默认的系统镜像软件默认是不带有 ansible 服务程序，需要自己手动安装，需要从 Extra Packages for Enterprise Linux 扩展软件仓库中获取，首先要配置 epel 软件仓库最新的地址，执行下面命令：sudo yum install -y epel-release # 安装 ansible 服务软件 yum install -y ansible # 检查是否成功安装 ansible --version[scode type="yellow"]通过上面 2 条命令即可安装 Ansible 服务程序，其他受管理的节点不需要安装 Ansible ，但是依赖于 OpenSSH 程序，集群中的其他节点必须提前安装好 OpenSSH 和 Python3 运行环境并且对外提供 SSH 连接服务，目前 Ansible 可以支持千台机器的管理和运维支持，默认的安装配置文件位于在 /etc/ansible/ansible.cfg 文件中。[/scode]参数描述-i, --inventory-file指定主机清单文件路径-l, --limit指定要操作的主机或主机组-u, --user指定 SSH 用户名-b, --become切换为管理员权限-K, --ask-become-pass请求管理员密码-c, --connection指定连接类型，如 SSH 或本地连接-t, --timeout指定操作超时时间-k, --ask-pass请求 SSH 密码-s, --sudo使用 sudo 命令执行任务-f, --forks指定同时运行任务的最大数量-v, --verbose显示详细输出信息-h, --help显示帮助信息以上是 ansible 常用的主要命令行参数信息。初始化集群首先 Ansible 是基于 SSH 协议进行通信的，我们必须将管理节点的 SSH 公钥传送到被控制子节点中，从而实现免密码登录到远程其他子节点主机，首先要创建 SSH 密钥对，执行下面命令：# 生成 ssh 密钥对 ssh-keygen -t rsa -b 2048 -C "管理员邮箱地址" # 复制公钥到远程子主机上 ssh-copy-id 192.168.31.86[scode type="yellow"]生成默认公钥地址位 /root/.ssh/id_rsa.pub ，这个文件的中内容就为公钥的字符串，也可以手动上传到子节点服务器 ~/.ssh/authorized_keys 文件中。如果需要管理的机器超过几百台，每次都手动复制密钥文件很麻烦，可以编写一个 shell 脚本来帮助复制公钥文件到远程主机中：[/scode]#!/bin/bash # 设置公钥路径和远程主机列表文件的路径 public_key_path="/root/.ssh/id_rsa.pub" remote_hosts_file="/remote/hosts.txt" # 读取远程主机列表 remote_hosts=$(cat "$remote_hosts_file") # 循环遍历远程主机并将公钥复制到其中 for host in $remote_hosts; do # 将公钥复制到远程主机 ssh-copy-id -i "$public_key_path" "$host" <<EOF your_password EOF done上面编写了一段代码，将 /root/.ssh/id_rsa.pub 文件逐个复制到 /remote/hosts.txt 文件中的主机中，hosts.txt…

网络配置好帮手 DHCP 协议
type: item
date: 2023-03-28T14:47:00+08:00
description: 前面的技术博文解释过通过 nmcil 来配置网络参数，而这篇文章要介绍的是 DHCP 协议程序，每当我们电脑接入网络时都会自动分配 IP 和 DNS 、子网掩码信息，并没有自己来配置网络连接信息，而是 IP 自动分配，能做到这一点就得益于 DHCP 协议，能帮助我们的设备自动配置网络信息。[scode type="blue"]现在建设你作为学校机房的管理员或者是网吧的管理员，每次都有不同的网络设备要接入到就局域网中，这就会带来大量配置网络信息工作，而且每次上完课部分设备又离开了教室，分配出去的 IP 如果不能回收，会导致 IP 地址被占用，不能被其他人再次使用，导致 IP 不够用浪费 IP 情况，也会带来手动管理 IP 麻烦，DHCP 要解决的问题就是针对这些场景的，自动化配置和自动化管理接入设备的 IP 地址。[/scode]DHCP 协议目前大部分网络设备和操作系统都默认支持 DHCP 协议，如果系统没有支持可以通过软件包的方式安装 DHCP 软件来支持 DHCP 协议，DHCP 分为两个部分一个服务器另外一个是客户端，服务器为提供网络接入服务的设备，而客户端则是要接入网络的设备。[scode type="yellow"]配置 DHCP 服务器：首先，您需要在网络上设置一个 DHCP 服务器，并为 DHCP 服务器分配 IP 地址和其他必要的网络参数，您可以使用现有的服务器，如路由器或专用 DHC P服务器，也可以使用开源 DHCP 服务器软件，如 ISC DHCP 或 dnsmasq ，在 Linux 下安装 dhcp 服务器可以使用下面命令：[/scode]# 安装 dhcp 服务器 dnf install -y dhcp-server 配置文件位如 /etc/dhcp/dhcpd.conf 文件中，DHCP 选项可以用来设置其他网络参数，如 DNS 服务器地址、NTP 服务器地址和 SMTP 服务器地址等，可以在 DHCP 服务器上配置这些选项，并在 DHCP 客户端上使用它们，有客户端接入到网络中 DHCP 会按照这些参数来配置自己的网络参数，官方提供参数参考文件，目录位于 /usr/share/doc/dhcp-server/ ，目前支持的网络参数列表：配置项配置值option domain-nameexample.comoption domain-name-serversns1.example.com, ns2.example.comsubnet192.168.1.0netmask255.255.255.0range192.168.1.100 - 192.168.1.200option routers192.168.1.1option subnet-mask255.255.255.0option broadcast-address192.168.1.255default-lease-time600max-lease-time7200hostclient1hardware ethernet00:11:22:33:44:55fixed-address192.168.1.10class"phone"matchsubstring(hardware, 1, 3) = 00:11:22option domain-name-serversns3.example.comshared-network"office"subnet192.168.2.0netmask255.255.255.0range192.168.2.100 - 192.168.2.200option routers192.168.2[scode type="yellow"]最常用参数也就那么几个，下面整理参数对应的作用说明：[/scode]配置参数说明option domain-name指定 DHCP 服务器分配的主机名所属的域名。option domain-name-servers指定 DHCP 客户端应该使用的 DNS 服务器列表。subnet定义 DHCP 服务器分配 IP 地址的子网。netmask定义 DHCP 子网的子网掩码。range定义 DHCP 服务器可以分配的 IP 地址范围。option routers指定 DHCP 客户端应该使用的网关地址。option subnet-mask指定 DHCP 客户端应该使用的子网掩码。option broadcast-address指定 DHCP 客户端应该使用的广播地址。default-lease-time定义 DHCP 服务器分配的 IP 地址的默认租约时间（以秒为单位）。max-lease-time定义 DHCP 服务器分配的 IP 地址的最大租约时间（以秒为单位）。host指定 DHCP 客户端的…

在 RHEL9 上安装 MySQL 社区版本
type: item
date: 2023-03-22T16:47:00+08:00
description: 关系型数据库目前有很多产品共同特点是分为商业版本和社区开源免费版本，目前社区开源版本的关系型数据库用的最多的数据库是 MySQL Community Server Edition ，最大特点为免费商业使用也不用顾虑任何法律相关的问题，MySQL 被 Oracle 公司收购之后也推出了商业服务，原有的 MySQL 开发人员为了能摆脱 Oracle 相关的控制也在 MySQL 原有代码的分支上开发出来了 MariaDB 开源社区驱动开发的版本。[scode type="lbule"]对于一个想要学习数据库技术的新手来说要解决的问题当然是如何拥有数据库服务器端，数据库也是一种 C/S 架构的程序，对于多数开发者来说用的最多的是客户端，服务器管理大部分由 dba 操作，这篇博客将介绍如何通过 tar 包的方式在 RHEL9 上安装 MySQL 服务端程序。[/scode]准备工作首先需要一台已经安装 RHEL9 的操作系统，目前 rhel 官方的仓库已经支持直接使用 dnf 命令安装 MySQL 服务器，这种针对是完全没有经验用户傻瓜安装方式。如果需要自定义安装路径和用户组还是推荐使用 tar 包的方式安装，首先安装一些依赖包和工具包：yum -y groupinstall "Development Tools" yum -y intsall vim wget libaio[scode type="yellow"]最后去 MySQL 官方网站找对应的 Linux Generic Archive 安装包下载到本地：[/scode]wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz[scode type="yellow"]创建一个用于存储 MySQL 服务器程序的目录，通过命令 mkdir -p /usr/local/mysql ，将其解压到这个目录中：[/scode]# 解压到指定目录中 tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz -C /usr/local # 重新命名目录 mv mysql-8.0.32-linux-glibc2.12-x86_64 mysql解压完成之后接下来需要创建两个目录，一个用来存放 mysql 运行时产生的日志文件，另外一个为存放 mysql 生成的数据文件目录，需要创建两个目录命令如下：# 创建 log 目录 和 创建数据目录 sudo mkdir -p /usr/local/mysql/data /usr/local/mysql/logs将 mysql 的支持文件拷贝到 /etc/systemd/system/ 目录中，该目录存放都是一些开机自动化启动程序，能够使用 systemctl 程序的子命令 start 、 stop 、restart 、reload 来管理某个具体的应用，例如这里的 mysql 程序。# 复制支持文件，并且重新命名为 mysqld sudo cp /usr/local/mysql/support-files/mysql.server /etc/systemd/system/ # 所有者应有执行权限 sudo chmod +x /etc/systemd/system/mysql.server[scode type="blue"]接下来要创建用来运行 mysqld 的用户，和将上面的文件夹所有者和所属组全部设置为新创建的 mysql 用户和组：[/scode]# 创建用户 useradd -M -s /sbin/nologin mysql # 更改文件所属组和所有者 chown -R mysql:mysql /usr/local/mysql[scode type="yellow"]最后将 mysql 的二进制命令工具目录加到环境变量中，以方便在任何地方都能使用 mysql 提供的命令工具：[/scode]# 在 /etc/profile 最后一行添加 echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile # 刷新环境变量 source /etc/profile到此整个安装前置条件已经满足，剩下就是对数据库进行安装和初始化了。初始化安装当准备工作完成之后就需要对数据库进行初始化，这里初始化使用 mysqld 命令，要提供 --initialize 参数，--user 指定运行程序用户，--basedir 指定数据库生成的数据文件存放的目录，--defaults-file 指定配置文件路径，执行命令会自动初始化数据库并且设置默认的 root 登…

SELinux 和 journalctl 工具
type: item
date: 2023-03-17T19:05:00+08:00
description: [scode type="lblue"]传统的 Linux 安全机制靠着默认的用户权限、所属组、其他组、 ACL 等功能来实现权限控制，而目前还有另外一套安全机制 SELinux 机制来管理系统安全性，相比默认的权限控制 SELinux 的机制更为强制，默认的用户权限是靠着用户或者超级管理员设置和管理，而 SELinux 强制访问控制机制是由操作系统内核强制实施的，从而使系统更加安全。如果开启了 SELinux 每当操作的时候，SELinux 都会检测是否进程系统调用和网络套节字合法，如果不符合 SELinux 默认的权限就会被拒绝和终止。[/scode]SELinux 提供了一种安全的策略语言，管理员可以使用它来定义系统安全策略。这种策略语言是相当复杂的，但是可以通过使用预定义的策略模块进行简化。这些策略模块是一组预定义的规则集，可以保护常见的应用程序和服务，如 Apache Web 服务器、MySQL 数据库等。总的来说，SELinux 可以帮助管理员保护系统免受恶意攻击和安全漏洞的影响，从而提高系统的安全性和稳定性。然而，由于 SELinux 是一种高级的安全机制，其配置和管理需要一定的技能和经验。一般情况下很少自己起编写 SELinux 的安全策略文件，只会临时或者配置 SELinux 默认的安全策略级别信息，SELinux 配置文件路径 /etc/selinux/config 中，目前很多发行版本已经默认启动该功能。级别说明enforcing默认启动，强制实行安全策略，如果不符合要求就会被禁止permissive该级别会提示用户操作不符合安全策略，但是不会拒绝操作disabled直接禁止功能，因此也不会占用系统资源而策略文件存放在 /etc/selinux/targeted/policy 中，是针对系统的安全策略进行定义的文件。SELinux 有两大策：域（domain）的概念允许定义哪些进程可以访问某些文件和目录；上下文 (context) 默认会给每个系统资源文件设置一个标签，而 SELinux 安全功能就要根据策略文件来检测进程和上下文的关系，从而来控制哪些进程可以访问什么资源。# 查看进程域 ps -Z # 查看资源上下文 ls -Z # 查看目录 ls -Zd /xxx/dir # 查看 selinux 状态 sestatus[scode type="yellow"]在 SELinux 上下文包括以下字段： user（用户）、role（角色）、type（类型）和 security level（安全级别），例如有一个策略规则允许 Apache作为 httpd_t 运行的 Web 服务器进程，访问通常位于 /var/www/html/ 和其他 Web 服务器目录中上下文的文件和目录 httpd_sys_content_t ，但是策略中没有允许规则适用于通常位于 /mysql 和 /data/msyql/ 中的文件，因此不允许访问，即使 Apache 被破坏，一个恶意的脚本可以访问它，也无法访问 /data/msyql/ 目录 。[/scode]因为有默认安全规则配置文件的存在，创建新文件或者移动文件修改文件会导致进程域和上下文不相符的情况，SELinux 默认就会拒绝此类操作导致不符合预期的效果，例如把 nginx 默认的网站目录设置为其他目录导致无法正常运行。此时就要使用下面命令修改进程上下文，使得 nginx 能正常访问到文件：semanage fcontext -a -t httpd_sys_content_t /wwwroot semanage fcontext -a -t httpd_sys_content_t /wwwroot/* # 如果是网络描述符资源，例如端口上下文 semange fcontext -a -t http_port_t -p tcp 8080 # 生效刚刚到修改 restorecon -Rv /wwwroot # 查找符合 http 端口 semanage port -l | grep http[scode type="yellow"]SELinux 默认提供多个命令可以协助帮助设置权限和查看 SELinux 目前运行状态和参数信息：[/scode]命 令作用说明setenforce临时修改 SELinux 状态getenforce获取当前系统 SELinux 状态getsebool [-a]查询 SElinux 策略内各项规则的布尔值setsebool [-P]设置策略并且永久生效修改之后 nginx 进程就能成功访问到 /wwwroot 目录中的文件了， SELinux 没有阻挡读取文件的请求，SELinux 修改的日志相信会存储在 /var/log/audit/audit…

Linux 中的网络配置
type: item
date: 2023-03-14T23:55:00+08:00
description: 本篇博客将记录一下 Linux 系统下网络配置，会对 Linux 网络配置和基于 Linux 网络的负载均衡的配置介绍，如何在 Linux 系统下配置网络设置是一个极客程序员必须掌握的，如何配置 sshd 服务程序的知识和免密登录、创建虚拟网卡提高系统可靠性。Network ManagerNetworkManager 软件工具的目标是降低在 Linux 与其他类 Unix 操作系统上的计算机网络使用难度，RedHat 在 2004 年发起了 NetworkManager 项目，其目标是让 Linux 用户能够更容易的处理现代的网络需求，特别是无线网络。# 安装 NetWorkManager 软件包 dnf install NetworkManager -y # 查看网卡信息 ifconfig # 查看网卡状态 mii-tools ens160 # 查看网卡详细状态信息 ethtool ens160 # 给某块网卡启一个别名 ip addr 192.168.31.200/24 dev eth0 label eth0:1 # 命令行图像配置 nmtui比较老的版本可以在 /etc/sysconfig/network-scripts/ 目录中，编写对应的网卡脚本文件，Linux 会根据文件内容来设置对应的网卡信息，一个简单模版：# vim ifcfg-ens160 固定前缀 ifcfg- 后面为网卡名称 TYPE=Ethernet # 网络类型 BOOTPROTO=static # 静态分配 NAME=eno16777736 # 网卡名称 ONBOOT=yes # 是否自动启用该网络接口 IPADDR=192.168.10.10 # 分配的 IP NETMASK=255.255.255.0 # 子网掩码 GATEWAY=192.168.10.1 # 网关地址 DNS1=8.8.8.8 # DNS 地址 # 重启网络模块 systemctl restart network以上为老版本系统所使用的方式，不再推荐使用！ RHEL9 和 CentOS 9 Stream 默认使用了 NetworkManager 来管理网络，因此 systemctl restart network 命令已经不再被使用了，目前可以使用 nmcli 命令来管理网络连接，以下是一些常用的 nmcli 命令：nmcli connection show： # 显示所有的网络连接。 nmcli connection up # [连接名称]：启用某个网络连接。 nmcli connection down # [连接名称]：禁用某个网络连接。 nmcli device status # 显示所有网络设备的状态。 nmcli device wifi list # 列出所有可用的 Wi-Fi 热点。 nmcli connection add help # 列出所有适用于 add 的参数信息如果您需要修改网络连接的配置，可以使用以下命令：nmcli connection modify [连接名称] [选项] [值]：修改连接的配置，例如 IP 地址、网关、DNS 等。注意对于任何更改都要谨慎，以免影响系统的网络连接，最可怕是禁止使用网卡导致远程 SSH 连接断开。以下是一些常用的 nmcli connection modify 命令选项：参数名称参数作用ipv4.method设置 IPv4 的获取方式，可选值为 auto、manual、dhcp 或 shared。ipv4.addresses设置 IPv4 地址，格式为 IP 地址/掩码，多个地址之间用逗号分隔。ipv4.gateway设置 IPv4 网关地址。ipv4.dns设置 IPv4 DNS 服务器地址，多个地址之间用逗号分隔。ipv6.method设置 IPv6 的获取方式，可选值为 auto、manual 或 ignore。ipv6.addresses设置 IPv6 地址，格式为 IP 地址/前缀长度，多个地址之间用逗号分隔。ipv6.gateway设置 IPv6 网关地址。ipv6.dns设置 IPv6 DNS 服务器地址，多个地址之间用逗号分隔。例如要修改名为 eth0 的有线网络连接的 IPv4 地址为 192.168.1.2/24、网关为 192.168.1.1，DNS 服务器为 8.8.8.8 和 8.8.4.4，可以执行以下命令：nmcli connection modify eth0 ipv4.addresses 192.168.1.2/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8,8.8.4.4"nmctl 不仅可以配置网络参数，还可以基于现有多网卡设备创建新…

Linux 编译安装 PHP 环境
type: item
date: 2023-03-09T18:48:00+08:00
description: 最近打算把博客基础环境迁移到 typecho ，其实在 2017 年为的博客就是使用 typecho 搭建的，但是 2019 年考虑到动态网站并且还是基于 php 的博客系统的安全性问题，我就迁移到了静态博客系统 hexo 上，最后 2020 年又迁移到 hugo 上，虽然静态博客系统可以抵抗 xss 反射和 xss 持久化攻击，但是部分功能目前满足不了我，决定迁移会到 typecho 系统上，本篇博客记录一下如何配置 php 运行环境。php-fpm 环境作为一个基本的动态的 web 服务来说必须有要数据库和 http 服务器支持，所以这里就诞生了一些基于开源软件的解决方案，例如 LNMP 的架构，php 本身只是一个动态类型的脚本语言不能作为 http 服务器，这里通过将 php-fpm 和 nginx 整合到一起来提供动态网站的服务。nginx 和 postgresql 服务器采用通过 rpm 软件包的方式安装，相比于通过源代码编译安装的方式要简单多一点，也不需要等待很长的编译时间，而 php-fpm 为了稳定性采用源代码的方式进行编译安装，首先运行下面命令：# 安装 nginx yum install -y nginx相对于 nginx 而 postgresql 数据库安装要复杂，postgresql 目前有很多版本，安装要去官方网站查询对应的版本，并且还需要设置最新的 yum 仓库信息：# 安装 postgresql # Install the repository RPM: sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm # Disable the built-in PostgreSQL module: sudo dnf -qy module disable postgresql # Install PostgreSQL: sudo dnf install -y postgresql15-server # Optionally initialize the database and enable automatic start: sudo /usr/pgsql-15/bin/postgresql-15-setup initdb sudo systemctl enable postgresql-15 sudo systemctl start postgresql-15nginx 和 postgresql 配置完成之后，接下来将需要进行编译安装 php-fpm 环境，先要解决相关依赖包问题，如何下载 php8 最新版本源码包：# 安装依赖的软件包 sudo yum groupinstall "Development Tools" # 下载 php8 的源码包 wget https://www.php.net/distributions/php-8.2.3.tar.gz # 解压源代码和进入目录 tar zxf php-8.2.3.tar.gz && cd php-8.2.3接下来要对 php-fpm 进行源代码编译安装，首先我们要对进行参数设置支持数据库模块，这里要支持 psql 模块，如果使用的是 mysql 使用 --with-mysql 参数，需要指定 psql 的安装目录 :./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-pdo-pgsql=/usr/pgsql-15 --with-pgsql=/usr/pgsql-15 --with-freetype --with-jpeg --with-zlib --enable-bcmath --enable-shmop --enable-sysvsem --with-curl --enable-mbstring --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap-sasl --with-xmlrpc --enable-soap --with-gettext --enable-fpm --with-zip --enable-gd --with-webp在此过程中会不断检测依赖软件关系和版本，如果遇到版本较低软件可以手动安装和更新，不知道包在 yum 仓库的完整包名可以使用 search 查看：如果默认 yum 不能正常搜索到软件包，可以尝试手动下载对应的软件包安装，第…

RIAD 磁盘冗余阵列
type: item
date: 2023-03-03T11:23:00+08:00
description: 传统保存备份数据的方式是把某个数据文件拷贝到多个磁盘上保存多个副本，或者采用云盘的方式存储，而在 Linux 中通过一个类似于的功能，可以将多块物理磁盘组成一个逻辑的磁盘单位使用，RAID 代表独立磁盘冗余阵列或廉价磁盘冗余阵列，RAID 的目的是将文件的数据分布在多个磁盘上，这样单个磁盘故障就不会丢失该数据。RAID 技术在计算机中最重要的就是数据，而数据在持久化之后就会被存储到硬盘上，此时对硬件质量和安全性就提出更高要求，例如如果硬盘出现故障之后数据就无法被正常读取导致丢失，RAID 技术就简单来说就是把多块硬盘组成一个整体，从而提升数据可靠性和读写效率问题，缺点明显就是浪费多空间。目前实现 RAID 技术有两种方案，一种软件的方式来实现，另外一种通过硬件的方式，很多在线商城可以购买到支持 RAID 硬盘阵列盒子 有物理设计支持；共同的特点是就是需要多块磁盘，最低需要为 2 块磁盘，不同的 RAID 方案有不同磁盘个数要求。RIAD 0 级别最少需要 2 块硬盘，安全性低，数据依次写入到所有的硬盘中，不具备备份数据和容错能力，其中一块出现异常整个数据就会受到影响，数据可以并行读取和写入不同磁盘中。RIAD 1 级别最少需要 2 块硬盘，安全性高，数据同步写入到所有的硬盘中，数据被冗余存储在多个硬盘中，有一块硬盘可用数据就不会受到影响，以 2 块硬盘为例空间利用率只有 50% ，但是读取数据性能会提升。RIAD 5 级别最少需要 3 块硬盘，和前面方式不同的是采用一种经过数学上一种奇偶数校验来到达数据的完备性，会把真实数据依次存储在不同硬盘中，并且将数据的奇偶数信息存储在不同的硬盘中，当某块硬盘出现问题时，可以通过奇偶数校验反向还原出来原始的数据信息，此种方案能有效提高硬盘利用率和读写效率，也是数据安全性高的。RIAD 1-0 级别是组合了 RIAD 0 和 RIAD 1 两个级别的产物，先对数据采用 RIAD 1 的方式来存储，最后再将其使用 RIAD 0 的方式组合，形成了高可读写和高数据完备性的方案，只要不是损坏的同一阵列的硬盘，那么最高可允许 50% 硬盘损坏而还能正常提供服务。RIAD 的级别远不止这么多，但是最为常用也就这几个，目前使用最多还是 RIAD 5 和 RIAD 10 级别能提供读写性能也能提高数据的安全性，至于怎么创建磁盘阵列可以查看 mdadm 命令。其他资料Virtual Data OptimizerStandard RAID levels软件 RAID 配置 | 储存管理指南 | SUSE

Linux 命令必知必会
type: item
date: 2023-02-03T13:55:00+08:00
description: 我个人接触 Linux 比较早，最开始喜欢研究网络安全相关的话题，所以第一次使用的 Linux 系统是 Kali Linux，虽然现在有很多的 Linux 发行版本，但大多都是还是使用命令行进行操作的。和 MacOS 不同 Linux 大部分软件生态还是没有 Apple MacOS 完整，这里只的是图形界面和第三方公司开发的软件，而且大部分软件都是一些命令行下的软件，作为一名开发者都有必要掌握一些基础的 Linux 操作命令，这些都是类 Unix 系统，大部分基础命令是相通的，所以介绍同样常用的命令。代替鼠标的命令在 Windows 很少有人使用的 DOS 命令行进行操作，但是在 Linux 下最为常见的是使用命令行，当然 Windows 也可以完全使用的 CMD 命令进行操作来控制电脑，但是大部分人还是使用视窗界面和鼠标。如果计算机操作系统没有图形化界面那么估计到现在还没有普及起来呢。最为常见为目录切换和文件查看，文件和目录创建、文件移动和文件复制、文件下载和文件编辑等操作，下面介绍：# 使用 cd 可以切换目录 cd /home/auula # 返回上一层目录 cd .. # 使用相对路径切换 cd ../../xxx # 快速返回到家目录 cd ~创建文件和创建目录：# 创建一个文件 touch Hello.java # 更新一些文件最后访问时间 touch -d Hello.java # 创建一个目录 mkdir /home/xxxx # 递归创建目录 mkdir -p /home/a/b/c文件移动和创新命名都为同一个 mv 命令：# 将目录a到b中 mv /aaaxx/a /bbbxx/b # 重新命名 mv a.tar b.tar文件复制操作：# 将a.txt文件复制到b目录中 cp /xxxx/a.txt /xxx/b # 使用递归复制 cp -r /xxx/aaa/*.txt /xxx/bbb/从远程的网络服务器上下载程序压缩包，可以有很多种方式，最常见上 wget：# wget 下载文件 -b 后台运行 -c 支持断点续传 wget -b -c https://blog.ibyte.me/mirror/trojan-install.sh查看当前工作目录的位置，和当前命令下有什么文件：# 当前位置信息 pwd # 查看当前目录下有什么文件，包括隐藏文件 ls -al查看某个文件内容，如果文件内容太多可以分页查看：# 查看某个文件的内容 cat /xxx/Hello.java # 通过分页查看某个文件的内容 more /xxx/Hello.java当在一个多层次顶层目录中，查看当前目录下的所有子目录：# 查看当前目录，打印目录结构树 tree .查看文件属性信息和文件夹属性信息：# 查看文件属性信息 file Hello.java # stat 查看文件夹和文件信息 stat directory对文本文件内容高级操作：# 查看文件的行数和字节树 wc -l /etc/passwd # 替换文件内容的字符串 cat Hello.java | tr S X对文件内容进行匹配过滤，和比较两个文件内容差异：# 查看符合批评 root 字符串的内容 cat /etc/shadow | grep root # 查看两个文件内容的差异 diff -brief a.java b.java在 Linux 系统中所有的东西都被抽象成了文件，所以如果要删除某个文件得注意！删除文件和目录命令如下：# 删除某个目录，如果目录中有其他文件夹和文件会交互式删除 rm /xxxx # 强制删除，通配符 rm -rf /xxxx/*.go在 Linux 中安装软件传统的方式上通过源代码的方式进行编译安装，这种方式要求管理员自己解决各个软件包的依赖关系，还有一种方式采用的不同 Linux 发行版本中提供软件包管理工具来管理软件。目前为两大主流的发行版本，基于 Debian 和 Redhat 版本的，对于量大不同的包管理工具 deb 和 rpm，这里为主要介绍 rpm 的方式：# 安装某个 rpm 软件包 rpm -ivh xxxx.rpm # 查找安装目录 rpm -ql package | grep bin # 查找某个全包名 rpm -qa | grep java # 卸载某个软件包 rpm -y remove package 在命令行模式没有图形化界面来查看时间，如果需要查看当前系统时间，可以使用 date 命令：# 格式化输出当前系统时间 date "+%Y-%m-%d %H:%M:%S %p" # 当前已经过去多少天 date "+%j" # 设置当前系统时间 date -s "20221101 8:30:00" # 设置时区 time…