初始文档

This commit is contained in:
2026-01-14 11:27:47 +08:00
parent 84a58e8daf
commit 564285cf07
62 changed files with 8729 additions and 0 deletions

151
Linux/Ansible自动化.md Normal file
View File

@@ -0,0 +1,151 @@
# ansible配置文件
```sh
# ansible的默认库存文件是/etc/ansible/hosts文件,如果运行时不指定-i 库存文件则会使用默认文件,解决方法:在当前目录创建ansible.cfg文件,添加以下内容
[defaults]
inventory = ./inventory.yml #库存文件路径
```
# 库存清单管理
## 库存配置示例
```yml
# yaml文件清单配置示例
all:
children:
web: #主机组
hosts:
192.168.1.10: #主机
ansible_user: root #主机变量
web.example.com:
vars:
anisble_user: root #主机组变量
ansible_port: 22
db:
hosts:
db[01:10].example.com: #批量定义10台主机
192.168.2.[100:200]: #批量定义100台主机
```
## 测试库存
```sh
# 以json格式显示清单
ansible-inventory -i inventory.yml --list
# 以树状显示清单
ansible-inventory -i inventory.yml --graph
# 对web组主机进行ping测试
ansible web -i inventory.yml -m ping
```
## 检查库存配置文件
```sh
ansible-playbook --check -i inventory.yml
```
# playbook
## 执行特定任务
### 1.使用tags标签
```yaml
# 示例任务定义
- name: 任务A
command: /bin/true
tags:
- task_a
- name: 任务B
command: /bin/true
tags:
- task_b
- name: 任务C
command: /bin/true
tags:
- task_c
```
```bash
# 只执行带task_a标签的任务
ansible-playbook playbook.yml --tags "task_a"
# 执行除task_b外的所有任务
ansible-playbook playbook.yml --skip-tags "task_b"
# 执行多个标签的任务
ansible-playbook playbook.yml --tags "task_a,task_c"
```
### 2.使用when条件控制
```yaml
- name: 可选执行的任务
command: /bin/echo "这是可选任务"
when: execute_optional_task is defined and execute_optional_task
```
```bash
# 执行该任务(传递变量)
ansible-playbook playbook.yml -e "execute_optional_task=true"
# 不执行该任务不传递变量或设为false
ansible-playbook playbook.yml
```
### 3.使用--start-at-task参数
```bash
# 从"任务B"开始执行(跳过之前的所有任务)
ansible-playbook playbook.yml --start-at-task "任务B"
```
## 创建包含加密内容的playbook
```yaml
# playbook.yml
- hosts: all
vars_files:
- secrets.yml # 直接引用加密文件
tasks:
- name: 打印加密变量(仅示例,实际不要打印敏感信息)
debug:
msg: "Redhat用户: {{ rh_subscription_user }}"
```
# ansible-vault加解密
## 交互式秘钥加解密(临时)
```sh
# 加密文件,后续加解密时会提示输入密码
ansible-vault encrypt 文件名
# 加密字符串,并命名
ansible-vault encrypt_string "my_redhat_password" --name "rh_subscription_pass"
```
## 秘钥文件加解密(推荐)
```sh
# 创建秘钥文件
echo "my_secure_vault_pass" > vault_pass.txt
# 限制文件权限
chmod 600 vault_pass.txt
# 使用密钥文件加密字符串
ansible-vault encrypt_string "my_redhat_password" --name "rh_subscription_pass" --vault-password-file vault_pass.txt
# 使用秘钥文件加密文件
ansible-vault encrypt secrets.yml --vault-password-file vault_pass.txt
```
## 修改vault秘钥
```sh
# 交互式更换密钥(先输入旧密码,再输入新密码)
ansible-vault rekey secrets.yml
# 使用旧密钥文件更换为新密钥文件
ansible-vault rekey secrets.yml --vault-password-file old_vault_pass.txt --new-vault-password-file new_vault_pass.txt
```
## 查看或编辑加密文件
```sh
# 查看加密文件内容(解密查看)
ansible-vault view secrets.yml --vault-password-file vault_pass.txt
# 编辑加密文件(会自动重新加密保存)
ansible-vault edit secrets.yml --vault-password-file vault_pass.txt
```
## 执行包含加密内容的palybook
```sh
# 执行时会提示输入Vault密码
ansible-playbook playbook.yml --ask-vault-pass
# 通过密钥文件提供密钥
ansible-playbook playbook.yml --vault-password-file vault_pass.txt
```ini
# 在ansible.cfg中配置默认秘钥文件路径
[defaults]
vault_password_file = ./vault_pass.txt # 相对或绝对路径
```
```sh
ansible-playbook playbook.yml # 自动读取配置的密钥文件
```

81
Linux/ESXi常见问题.md Normal file
View File

@@ -0,0 +1,81 @@
## img文件转化为vmdk文件
以openwrt镜像为例:https://downloads.openwrt.org/releases/22.03.0-rc6/targets/x86/64/openwrt-22.03.0-rc6-x86-64-generic-squashfs-combined-efi.img.gz
```sh
qemu-img convert -f raw openwrt-22.03.0-rc6-x86-64-generic-squashfs-combined-efi.img -O vmdk openwrt.vmdk
```
openwrt.vmdk文件可直接在vmware work中使用
在esxi中使用需要进行格式转换,进入esxi主机的shell
```sh
vmkfstools -i
openwrt.vmdk -d eagerzeroedthick openwrt-esxi.vmdk
```
## esxi镜像封装驱动环境搭建
[esxi-customizer-ps脚本链接](https://github.com/VFrontDe-Org/ESXi-Customizer-PS)
1. 先安装python3.7.9版本及相关包
```sh
pip install six psutil lxml pyopenssl -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
```
2. 在以管理员运行powershell
```powershell
Install-Module -Name VMware.PowerCLI
# 验证安装,输出welcome to VMware PowerCLI即安装成功
Import-Module -Name VMware.PowerCLI
# 进入esxi的zip镜像所在目录
# 设置安全策略(unrestricted可以运行任意脚本且不警告)
Set-ExecutionPolicy Unrestricted
```
### esxi7.0以下封装驱动
[7.0以下驱动下载](https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages)
```powershell
# 把脚本和esxi的zip文件都放到同一目录下,在当前目录下新建一个目录放vib驱动文件
# 运行脚本打包镜像(.\pkg\为vib驱动文件所在的目录),打包成功后会在当前目录下生成iso镜像
.\ESXi-Customizer-PS.ps1 -izip .\ESXi670-201912001.zip -pkgDir .\pkg\
```
### esxi7.0以上封装驱动
[7.0以上驱动下载](https://www.diy-nas.cn/?golink=aHR0cHM6Ly9mbGluZ3Mudm13YXJlLmNvbS9mbGluZ3M/cHJvZHVjdD1FU1hp)
```powershell
# 驱动和zip镜像都放到统一目录下,设置安全策略
# 导入所需要的包
Add-EsxSoftwareDepot .\ESXi800-VMKUSB-NIC-FLING-61054763-component-20826251.zip
Add-EsxSoftwareDepot .\Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip
Add-EsxSoftwareDepot .\nvme-community-driver_1.0.1.0-3vmw.700.1.0.15843807-component-18902434.zip
Add-EsxSoftwareDepot .\VMware-ESXi-8.0b-21203435-depot.zip
# 获取官方配置文件
Get-EsxImageProfile
# 克隆一份到本地,ESXi-8.0b-21203435-standard是上一步获取的,name参数随意,这里设为esxi-8.0,vendor是版权声明
New-EsxImageProfile -CloneProfile ESXi-8.0b-21203435-standard -Name esxi-8.0 -Vendor cvms.cn
# 如果使用了第三方包需要修改安全级别为社区
Set-EsxImageProfile -ImageProfile esxi-8.0 -AcceptanceLevel CommunitySupported
# 导入驱动文件,vmkusb-nic-fling名称是驱动压缩文件内的vib20目录下的目录名称
Add-EsxSoftwarePackage -ImageProfile esxi-8.0 -SoftwarePackage vmkusb-nic-fling
Add-EsxSoftwarePackage -ImageProfile esxi-8.0 -SoftwarePackage net-community
Add-EsxSoftwarePackage -ImageProfile esxi-8.0 -SoftwarePackage nvme-community
# 导出镜像在当前目录
Export-EsxImageProfile -ImageProfile esxi-8.0 -ExportToIso -FilePath VMware-ESXi-8.0b-21203435.iso
```
## esxi格式化硬盘
> fdisk格式的分区esxi无法识别
```sh
# 获取磁盘分区
partedUtil getptbl /dev/disks/磁盘文件名称
# 删除原有分区
partedUtil delete /dev/disks/磁盘文件名称 1
# 删除所有分区后可以在esxi控制台新建存储了
```

View File

@@ -0,0 +1,430 @@
# frp配置
## 1.配置systemd服务
```sh
sudo vim /etc/systemd/system/frps.service
# 配置文件内容
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
```
## 2.tls双向认证加密
### a.创建加密证书
```sh
# 创建目录存放证书
mkdir frp_certs && cd frp_certs
# 拷贝openssl默认配置文件到当前目录
cp /etc/ssl/openssl.cnf ./
# 生成CA秘钥
openssl genrsa -out frp_ca.key 2048
# 生成CA证书
openssl req -x509 -new -nodes -key frp_ca.key -subj "/CN=frp-ca" -days 3650 -out frp_ca.crt
# 创建客户端证书专用配置文件,按实际修改客户端ip地址
cat > frpc.cnf << EOF
[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[ req_distinguished_name ]
C = CN
ST = Beijing
L = Beijing
O = Frp
CN = frp-client
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.140.122
EOF
# 创建服务端专用配置文件,按实际修改服务器ip地址
cat > frps.cnf << EOF
[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[ req_distinguished_name ]
C = CN
ST = Beijing
L = Beijing
O = Frp
CN = frp-server
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 47.106.206.100
EOF
# 生成服务端私钥
openssl genrsa -out frps.key 2048
# 生成服务端CSR强制包含 IP SAN
openssl req -new -sha256 -key frps.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Frp/CN=frp-server" -config frps.cnf -extensions v3_req -out frps.csr
# 生成服务端证书
openssl x509 -req -days 3650 -sha256 -in frps.csr -CA frp_ca.crt -CAkey frp_ca.key -CAcreateserial -extfile frps.cnf -extensions v3_req -out frps.crt
# 生成客户端私钥
openssl genrsa -out frpc.key 2048
# 生成客户端CSR强制包含 IP SAN
openssl req -new -sha256 -key frpc.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Frp/CN=frp-client" -config frpc.cnf -extensions v3_req -out frpc.csr
# 生成客户端证书
openssl x509 -req -days 3650 -sha256 -in frpc.csr -CA frp_ca.crt -CAkey frp_ca.key -CAcreateserial -extfile frpc.cnf -extensions v3_req -out frpc.crt
# 验证服务端证书是否包含服务器IP,输出结果需显示服务器IP
openssl x509 -in frps.crt -text -noout | grep -A 2 "Subject Alternative Name"
# 验证客户端证书是否包含客户端IP,输出结果需显示客户端IP
openssl x509 -in frpc.crt -text -noout | grep -A 2 "Subject Alternative Name"
```
### b.以toml格式配置文件
```sh
# 设置token身份认证
auth.method = "token"
auth.token = "frptoken"
# 在服务端添加以下配置,改为实际的证书路径
transport.tls.force = true # 强制启用双向验证
transport.tls.certFile = "/etc/frp/ssl/frps.crt"
transport.tls.keyFile = "/etc/frp/ssl/frps.key"
transport.tls.trustedCaFile = "/etc/frp/ssl/frp_ca.crt"
# 在客户端添加以下配置,改为实际的证书路径
transport.tls.enable = true
transport.tls.certFile = "/etc/frp/ssl/frpc.crt"
transport.tls.keyFile = "/etc/frp/ssl/frpc.key"
transport.tls.trustedCaFile = "/etc/frp/ssl/frp_ca.crt"
```
## 3.创建tcp代理
```sh
# 代理本机
[[proxies]]
name = "ssh-local"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 12322
# 代理其他主机端口
[[proxies]]
name = "dev-ssh"
type = "tcp"
localIP = "192.168.140.121"
localPort = 22
remotePort = 12323
```
## 4.配置负载均衡及健康检查
```sh
# 支持的代理类型包括tcp, http, tcpmux
# frpc.toml
[[proxies]]
name = "test1"
type = "tcp"
localPort = 8080
remotePort = 80
loadBalancer.group = "web"
loadBalancer.groupKey = "123"
[[proxies]]
name = "test2"
type = "tcp"
localPort = 8081
remotePort = 80
loadBalancer.group = "web"
loadBalancer.groupKey = "123"
# tcp健康检查
[[proxies]]
name = "test1"
type = "tcp"
localPort = 22
remotePort = 6000
# 启用健康检查,类型为 tcp
healthCheck.type = "tcp"
# 建立连接超时时间为 3 秒
healthCheck.timeoutSeconds = 3
# 连续 3 次检查失败,此 proxy 会被摘除
healthCheck.maxFailed = 3
# 每隔 10 秒进行一次健康检查
healthCheck.intervalSeconds = 10
# http健康检查
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["test.yourdomain.com"]
# 启用健康检查,类型为 http
healthCheck.type = "http"
# 健康检查发送 http 请求的 path后端服务需要返回 2xx 的 http 状态码
healthCheck.path = "/status"
healthCheck.timeoutSeconds = 3
healthCheck.maxFailed = 3
healthCheck.intervalSeconds = 10
```
## 5.获取用户真实IP
```sh
#目前只有 http 类型的代理或者启用了 https2http 或 https2https 插件的代理支持这一功能。可以通过 HTTP 请求 header 中的 X-Forwarded-For 来获取用户真实 IP默认启用.只要实现proxy协议的tcp后端也可以获取到
# 在客户端配置文件frpc.toml添加
transport.proxyProtocolVersion = "v2"
```
## 6.代理限速
```sh
# 在客户端配置文件frpc.toml添加
transport.bandwidthLimit = "1MB" #单位支持MB和KB
# 在服务端限速
transport.bandwidthLimitMode = "server"
```
## 7.虚拟网络(类似组网)
- 服务端配置
```sh
# 服务端配置frps.toml
featureGates = { VirtualNet = true }
serverAddr = "x.x.x.x"
serverPort = 7000
featureGates = { VirtualNet = true }
# 配置虚拟网络接口
virtualNet.address = "100.86.0.1/24"
[[proxies]]
name = "vnet-server"
type = "stcp"
secretKey = "your-secret-key"
[proxies.plugin]
type = "virtual_net"
```
- 客户端配置
```sh
# frpc.toml (客户端)
serverAddr = "x.x.x.x"
serverPort = 7000
featureGates = { VirtualNet = true }
# 配置虚拟网络接口
virtualNet.address = "100.86.0.2/24"
[[visitors]]
name = "vnet-visitor"
type = "stcp"
serverName = "vnet-server"
secretKey = "your-secret-key"
bindPort = -1
[visitors.plugin]
type = "virtual_net"
destinationIP = "100.86.0.1" # 目标虚拟 IP 地址
```
## 8.安全代理STCP
`使用 stcp(secret tcp) 类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端`
- 被访问客户端配置
```sh
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "secret_ssh"
type = "stcp"
# 只有与此处设置的 secretKey 一致的用户才能访问此服务
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
```
- 访问者客户端配置
```sh
serverAddr = "x.x.x.x"
serverPort = 7000
[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
# 要访问的 stcp 代理的名字
serverName = "secret_ssh"
secretKey = "abcdefg"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000
```
- 访问示例
```sh
ssh -o Port=6000 test@127.0.0.1
```
## 9.点对点透传(P2P)
- 被访问客户端配置
```sh
serverAddr = "x.x.x.x"
serverPort = 7000
# 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器
# natHoleStunServer = "xxx"
[[proxies]]
name = "p2p_ssh"
type = "xtcp"
# 只有共享密钥 (secretKey) 与服务器端一致的用户才能访问该服务
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
```
- 访问者客户端配置
```sh
serverAddr = "x.x.x.x"
serverPort = 7000
# 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器
# natHoleStunServer = "xxx"
[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
# 要访问的 P2P 代理的名称
serverName = "p2p_ssh"
secretKey = "abcdefg"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000
# 如果需要自动保持隧道打开,将其设置为 true
# keepTunnelOpen = false
```
- 配置回滚,如果打洞失败改为stcp
```sh
[[visitors]]
name = "stcp-visitor"
type = "stcp"
serverName = "stcp-test"
secretKey = "abc"
bindPort = -1
[[visitors]]
name = "xtcp-visitor"
type = "xtcp"
serverName = "xtcp-test"
secretKey = "abc"
bindAddr = "127.0.0.1"
bindPort = 9002
fallbackTo = "stcp-visitor"
fallbackTimeoutMs = 2000 #超时时间,单位:毫秒
```
# kvm虚拟化
## KVM存储池管理
### 删除存储池
```sh
# 列出所有存储池
sudo virsh pool-list --all
# 停用存储池
sudo virsh pool-destroy <存储池名称>
# 取消存储池自动启动
sudo virsh pool-autostart --disable <存储池名称>
# 删除存储池文件
sudo virsh pool-delete <存储池名称>
# 取消存储池定义
sudo virsh pool-undefine <存储池名称>
```
### 创建存储池
```sh
# 存储池类型:本地文件系统,网络文件系统,物理磁盘设备,lvm卷组,iSCSI,预格式化的块设备
# 创建目录/data/vmfs,定义并构建一个基于本地目录的存储池,
virsh pool-define-as vmdisk --type dir --target /data/vmfs
virsh pool-build vmdisk
# 激活并设置开机自启
virsh pool-start vmdisk
virsh pool-autostart vmdisk
# 在存储池中创建磁盘卷
virsh vol-create-as vmdisk myvm-disk.qcow2 20G --format qcow2
# 使用qemu-img直接创建磁盘文件
qemu-img create -f qcow2 /var/lib/libvirt/images/myvm-disk.qcow2 20G
```
## KVM磁盘管理
```sh
# 扩容虚拟机磁盘
qemu-img resize /var/lib/libvirt/images/vm_name.qcow2 +100G
```
## KVM状态管理
```sh
# 列出虚拟机​
virsh list --all #查看所有虚拟机(包括已关闭的)
# 启动虚拟机​
virsh start <虚拟机名称> #启动指定虚拟机
# ​正常关机​
virsh shutdown <虚拟机名称> #向虚拟机发送关机信号,推荐使用
# ​强制关机​
virsh destroy <虚拟机名称> #相当于直接断电,用于虚拟机无响应时
# 重启虚拟机​
virsh reboot <虚拟机名称> #重启虚拟机
# 挂起/恢复​
virsh suspend <虚拟机名称>/ virsh resume <虚拟机名称> #暂停或恢复虚拟机运行
# 设置开机自启​
virsh autostart <虚拟机名称> #宿主机启动时,该虚拟机自动启动
# ​连接控制台​
virsh console <虚拟机名称> #连接到虚拟机的文本控制台
```
## KVM快照管理
```sh
# 创建快照​
virsh snapshot-create-as --domain <虚拟机名称> --name <快照名称> #为指定虚拟机创建快照
# ​查看快照列表​
virsh snapshot-list <虚拟机名称> #查看虚拟机的所有快照
# 恢复快照​
virsh snapshot-revert --domain <虚拟机名称> --snapshotname <快照名称> #将虚拟机状态恢复到创建快照时的状态
# 删除快照​
virsh snapshot-delete --domain <虚拟机名称> --snapshotname <快照名称>
```
## KVM网络管理
```sh
```
## KVM配置管理
```sh
# 查看虚拟机详细信息
virsh dominfo <虚拟机名称>
# 导出虚拟机xml配置
virsh dumpxml <虚拟机名称> > vm-config.xml #可用于备份或复制虚拟机配置
# ​编辑虚拟机配置
virsh edit <虚拟机名称> #这是最安全的修改配置方式它会检查XML语法
```
# caddy服务
```json
# caddyfile配置文件
# 配置重定向
cvms.cn {
redir https://www.cvms.cn{uri} permanent
}
# 配置反向代理
www.cvms.cn {
reverse_proxy http://124.71.69.197:4000
}
# 使用http协议反向代理
http://api.cvms.cn {
reverse_proxy http://localhost:45000
}
```

1612
Linux/Linux笔记.md Normal file

File diff suppressed because it is too large Load Diff

305
Linux/Linux通用文档.md Normal file
View File

@@ -0,0 +1,305 @@
# 文件管理
## ACL访问控制
# 网络管理
## nmcli命令管理网络配置
### 1.管理网络连接与状态
```sh
# 显示所有连接包括名称、UUID、类型、设备
nmcli connection show
#​仅显示活动连接​
nmcli connection show --active
# 查看所有网络设备及其状态​(如连接状态、类型):
nmcli device status
# 查看指定设备的详细信息​(如 IP、MAC 地址
nmcli device show eth0
# 删除网卡
nmcli conn delete eth0
# 添加物理网卡
nmcli connection add type ethernet ifname ens38 con-name my-ens38
# 添加网桥从接口网卡
nmcli conn add type bridge-slave ifname enp1s0 con-name enp1s0 master bridge0
# ​激活(启用)指定连接
nmcli connection up "Wired connection 1"
# 停用指定连接
nmcli connection down "Wired connection 1"
# 启用所有网络管理
nmcli networking on
# 禁用所有网络管理
nmcli networking off
# 禁用再启用设备​(相当于重启某个网卡
nmcli device disconnect eth0 && nmcli device connect eth0
# 重新加载连接配置​(修改配置文件后
nmcli connection reload
# 检查网络连通性
nmcli networking connectivity
# 监控网络状态变化
nmcli monitor
# 重载配置
nmcli conn reload
# 修改设备名称
sudo nmcli connection modify "旧连接名" connection.id "新连接名"
```
### 2.wifi管理
```sh
# 列出所有可用的 Wi-Fi 网络​
nmcli device wifi list
# 连接到有密码保护的 Wi-Fi 网络
nmcli device wifi connect "SSID名称" password "你的密码"
# 连接到隐藏的 Wi-Fi 网络​
nmcli device wifi connect "SSID名称" password "你的密码" hidden yes
# 断开当前 Wi-Fi 连接​
nmcli device disconnect wlan0 # wlan0 为你的无线设备名
# 打开 Wi-Fi
nmcli radio wifi on
# 关闭 Wi-Fi
nmcli radio wifi off
# 扫描wifi
nmcli device wifi rescan
```
### 3.有线网络管理
```sh
# 配置静态 IP 地址
nmcli connection modify "eth0" ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns 8.8.8.8
# 激活配置使其生效
nmcli connection up "eth0"
# 配置动态 IPDHCP
# 将 IPv4 方法设置为自动以通过 DHCP 获取 IP
nmcli connection modify "eth0" ipv4.method auto
nmcli connection up "eth0"
# 添加多个 IP 地址
# 为连接 eth0 添加一个辅助 IP 地址
nmcli connection modify "eth0" +ipv4.addresses "192.168.1.101/24"
nmcli connection up "eth0"
```
# 磁盘管理
### LVM虚拟磁盘
#### LVM功能介绍
**LVM**Logical Volume Manager逻辑卷管理是Linux系统中一种强大的**磁盘管理机制**,它在物理磁盘和文件系统之间增加了一个抽象层,使管理员能够**灵活地管理存储空间**。LVM通过将物理存储资源虚拟化允许动态调整磁盘容量而无需重新分区或中断系统运行极大提高了存储管理的便捷性和效率。
LVM的核心组件包括**物理卷PV**、**卷组VG**和**逻辑卷LV**。物理卷是LVM的基本存储单元可以是整个物理磁盘或磁盘分区卷组由一个或多个物理卷组成形成一个存储池用于统一管理物理存储资源
逻辑卷是从卷组中划分出的虚拟磁盘分区可以在其上创建文件系统并挂载使用LVM的最小存储单元是**物理扩展块PE**默认大小为4MB物理卷被划分为多个PE逻辑卷则由多个逻辑扩展块LE组成LE与PE一一对应。
LVM的**工作原理**是通过抽象层屏蔽下层物理磁盘的布局,提供统一的存储视图。管理员可以动态调整逻辑卷的大小,添加或移除物理卷,而无需关心数据的物理存储位置,这种机制使得存储管理更加灵活,特别适用于需要频繁调整存储空间的场景。
_表LVM核心组件及其功能
|**组件**|**全称**|**功能描述**|
|---|---|---|
|**PV (Physical Volume)**|物理卷|LVM的基本存储单元可以是物理磁盘或分区被划分为多个PE|
|**VG (Volume Group)**|卷组|由一个或多个PV组成的存储池用于集中管理物理存储资源|
|**LV (Logical Volume)**|逻辑卷|从VG中划分出的虚拟磁盘分区可格式化为文件系统并挂载使用|
|**PE (Physical Extent)**|物理扩展块|PV中可分配的最小存储单元默认大小为4MB|
|**LE (Logical Extent)**|逻辑扩展块|LV中可分配的最小存储单元与PE大小相同且一一对应|
##### LVM分区与传统分区对比
|特性|传统分区|LVM (逻辑卷管理)|
|---|---|---|
|**灵活性**|分区大小固定,调整困难且风险高|**可动态调整**逻辑卷大小,无需重启|
|**存储池**|每个分区独立,无法合并使用|将**多个物理磁盘/分区**整合为单一存储池(卷组)|
|**扩展性**|新增硬盘需手动迁移数据|可轻松将新硬盘加入现有存储池,​**无缝扩展**容量|
|**高级功能**|不支持|支持**快照**​(用于备份)、**条带化、镜像**等|
|**管理复杂度**|简单直观|需要学习额外概念和命令|
|**性能**|无额外开销|有**轻微性能开销**|
|**数据恢复**|相对简单|略复杂,需专用工具|
**✅ 推荐使用 LVM 的场景:​**
- **服务器环境**​:需要灵活调整分区大小,避免因某个分区空间耗尽而停机维护
- **多磁盘系统**​:希望轻松整合多个物理磁盘的容量,并能够从存储池中按需分配空间
- **需要高级功能**​:如使用快照功能进行在线备份
- **不确定未来存储需求时**LVM 提供了未来调整的余地,无需在初始分区时就精确设定不可更改的大小
**❌ 可能无需 LVM 的场景:​**
- **简单的桌面系统**​:磁盘分区结构固定,没有调整需求
- **嵌入式设备或小型系统**​:对存储需求非常固定,且资源有限
- **对 I/O 性能极其敏感的应用**​:希望避免 LVM 可能带来的轻微性能开销
#### 物理卷PV操作
```sh
# pvcreate将物理设备初始化为物理卷
pvcreate /dev/sdb1 #将分区/dev/sdb1初始化为物理卷
# pvdisplay显示物理卷的详细信息
pvdisplay /dev/sdb1 #显示指定物理卷的详细信息
# pvscan扫描系统中所有的物理卷
pvscan #列出系统中所有物理卷
# pvs以简洁格式显示物理卷信息
pvs #提供物理卷的概要信息
# pvremove移除物理卷上的LVM元数据
pvremove /dev/sdb1 #移除/dev/sdb1上的LVM标识使其不再为物理卷
# pvmove在卷组中移动物理卷上的数据
pvmove /dev/sdb1 #将数据从/dev/sdb1移动到卷组中的其他物理卷
# pvchange更改物理卷的属性
pvchange -x n /dev/sdb1 #禁止从物理卷/dev/sdb1分配PE
```
#### 卷组VG操作
```sh
#vgcreate创建卷组
vgcreate my_vg /dev/sdb1 /dev/sdb2 #使用两个物理卷创建名为 my_vg的卷组
# vgdisplay显示卷组的详细信息
vgdisplay my_vg #显示指定卷组的详细信息
# vgscan扫描系统中所有的卷组
vgscan #检测并列出系统中所有卷组
# vgs以简洁格式显示卷组信息
vgs #提供卷组的概要信息
# vgextend扩展卷组容量添加物理卷
vgextend my_vg /dev/sdc1 #将物理卷/dev/sdc1添加到卷组my_vg中
# vgreduce缩减卷组容量移除物理卷
vgreduce my_vg /dev/sdb1 #从卷组my_vg中移除物理卷/dev/sdb1
# vgremove删除卷组
vgremove my_vg #删除名为 my_vg的卷组
# vgchange更改卷组属性如激活/停用)
vgchange -a n my_vg #停用卷组 my_vg
# vgexport导出卷组
vgexport my_vg #将卷组 my_vg从系统中导出常用于系统间移动卷组
# vgimport导入卷组
vgimport my_vg #将卷组 my_vg导入系统
```
#### 逻辑卷LV操作
```sh
# lvcreate创建逻辑卷,大写L指定容量,小写l使用百分比
lvcreate -L 10G -n my_lv my_vg #在卷组 my_vg中创建大小为10G、名为 my_lv的逻辑卷
lvcreate -l 100%FREE -n lv_name vg_name #将卷组所有空间划分给逻辑卷
# lvdisplay显示逻辑卷的详细信息
lvdisplay /dev/my_vg/my_lv #显示指定逻辑卷的详细信息
# lvscan扫描系统中所有的逻辑卷
lvscan # 检测并列出系统中所有逻辑卷
# lvs以简洁格式显示逻辑卷信息
lvs #提供逻辑卷的概要信息
# lvextend扩展逻辑卷容量
lvextend -L +5G /dev/my_vg/my_lv #将逻辑卷 my_lv扩展5G
# lvreduce缩减逻辑卷容量 (需谨慎操作)
lvreduce -L -2G /dev/my_vg/my_lv #将逻辑卷 my_lv缩减2G (务必先备份数据并卸载文件系统)
# lvremove删除逻辑卷
lvremove /dev/my_vg/my_lv #删除逻辑卷 my_lv
# lvresize调整逻辑卷大小扩展或缩减
lvresize -L 15G /dev/my_vg/my_lv #将逻辑卷 my_lv大小调整为15G
# lvrename重命名逻辑卷
lvrename my_vg old_lv_name new_lv_name #将逻辑卷重命名
```
#### 创建新卷组和逻辑卷
```sh
# 1.使用lsblk命令查看磁盘设备树
# 2.将新磁盘初始化为lvm
sudo pvcreate /dev/sdb1
# 3.将一个或多个物理卷加入卷组
sudo vgcreate vg_name /dev/sdb1 /dev/sdc1
# 4.创建一个逻辑卷
sudo lvcreate -L 20G -n lv_name vg_name
# 5.格式化新创建的逻辑卷为ext4
sudo mkfs.ext4 /dev/vg_name/lv_name
# 挂载格式化后的逻辑卷
sudo mkdir /mnt/data && mount /dev/vg_name/lv_name /mnt/data
```
#### 逻辑卷扩容
```sh
# 1.使用lsblk命令查看磁盘设备树
# 2.将新磁盘初始化为lvm
sudo pvcreate /dev/sdb1
# 3.将新的物理卷加入卷组
sudo vgextend vg_name /dev/sdb1
# 4.扩展已有的lv逻辑卷
sudo lvextend -L +10G /dev/my_vg/my_lv
# 扩展逻辑卷后需要更新文件系统,新创建的不需要,否则df命令看不到空间扩容
# 针对ext4格式
resize2fs /dev/vg_data/lv_data
# 针对xfs格式
xfs_growfs /dev/vg_data/lv_data
# xfs系统不支持缩容,ext4缩容风险较高,注意备份
```
#### 移除LVM磁盘步骤
```sh
# 1.确认物理磁盘使用情况
pvs -o+pv_used
# 2.检查其他卷组是否有空间进行数据迁移
vgs
# 均匀迁移sdb1的数据到其他卷组
sudo pvmove /dev/sdb1
# 迁移sdb1的数据到指定卷组
sudo pvmove /dev/sdc1
# 使用pvs -o+used确认卷组清空,然后移除卷组
sudo vgreduce vg_name /dev/sdb1
# 移除物理卷元数据
sudo pvremove /dev/sdb1
```
## 挂载外置存储
```sh
# 挂载nfs存储
showmount -e 服务器地址 # 显示目标服务器的可挂载路径
sudo mkdir /mnt/nfs #创建挂载目录
sudo mount -t nfs 服务器地址:/path/name /mnt/nfs
# 挂载本地iso文件
sudo mkdir /mnt/iso
mount -o loop /path/file.iso /mnt/iso
```
# 安全管理
# 系统管理
# 用户管理
# 软件源管理
## 添加软件源
```sh
# 查看所有软件源
dnf repolist all
# 安装epel源
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
# 启用epel源
subscription-manager repos --enable epel
```

87
Linux/RedHat系文档.md Normal file
View File

@@ -0,0 +1,87 @@
# 软件安装
### 安装pip
```sh
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --user
```
## 安装ansible
```sh
# 为当前用户正常安装
python3 -m pip install --user ansible
# 为当前用户最小安装
python3 -m pip install --user ansible-core
# 升级ansible
python3 -m pip install --upgrade --user ansible
# 隔离环境安装ansible
pip install --user pipx
pipx install --include-deps ansible
pipx upgrade --include-injected ansible
```
# 激活订阅管理
## 命令行取消激活
```sh
# 取消注册
subscription-manager unregister
# 清理文件
subscription-manager clean
```
## 命令行激活订阅
```sh
注册订阅
subscription-manager register --username adhsite@qq.com --password n5HIvS9C3mGb#Esz
```
# firewalld防火墙基本用法
```sh
# 启动:
systemctl start firewalld
#查看状态:
systemctl status firewalld
#停止:
systemctl disable firewalld
# 禁用:
systemctl stop firewalld
# 放通80端口(--permanent永久生效没有此参数重启后失效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 关闭80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
# 更新防火墙规则:
firewall-cmd --reload
# 查看所有打开的端口:
firewall-cmd --zone=public --list-ports
# 查看版本:
firewall-cmd --version
# 查看帮助:
firewall-cmd --help
# 显示状态:
firewall-cmd --state
# 查看区域信息:
firewall-cmd --get-active-zones
# 查看指定接口所属区域:
firewall-cmd --get-zone-of-interface=eth0
# 拒绝所有包:
firewall-cmd --panic-on
# 取消拒绝状态:
firewall-cmd --panic-off
# 查看是否拒绝:
firewall-cmd --query-panic
# 查看80端口
firewall-cmd --zone=public --query-port=80/tcp
```

70
Linux/个性账号名.md Normal file
View File

@@ -0,0 +1,70 @@
以下是为您精心设计的 **Linux 账号名方案**,分门别类方便选择:
---
### 🌟 **极简科技风**
| 用户名 | 灵感来源 | 记忆点 |
|-----------|--------------------------|-------------------------------|
| **nova** | 超新星爆发(天文现象) | 简短有力,象征新生力量✨ |
| **zephyr**| 西风之神(希腊神话) | 轻盈灵动,开发者偏爱名🌀 |
| **axon** | 神经元突触(生物学) | 科技感 + 易键入x 键位特殊)🔬|
| **vortex**| 数据漩涡🌀 | 适合做数据分析的机器 |
---
### 🎨 **文艺个性派**
| 用户名 | 隐藏含义 | 适合场景 |
|-------------|---------------------------|-----------------------------|
| **solstice**| 冬至/夏至(节气转折点) | 纪念重要日期的服务器📅 |
| **halcyon** | 宁静祥和(翡翠鸟传说) | 个人开发机首选,寓意平和🕊️ |
| **eclipse** | 日蚀月蚀的天文奇观 | 适合做备份服务器的名字🌑 |
| **obelisk** | 方尖碑(神秘符号) | 极客范儿,适合加密设备🗿 |
---
### 🛠️ **实用主义组**
| 用户名 | 设计思路 | 优势分析 |
|--------------|--------------------------|---------------------------|
| **ctrlalt_** | 经典快捷键致敬⌨️ | 巧妙空格提示用 `_` 收尾 |
| **5h311** | "Shell" 的 leet 写法5=h, 3=e, 1=l | 黑客文化彩蛋💻 |
| **dotfile** | 配置文件的灵魂所在⚙️ | 直击 Linux 用户痛点 |
| **0x1a** | 十六进制的 26ASCII 换页符) | 极简数字流,适合服务器🔢 |
---
### 🌿 **自然元素系**
| 用户名 | 意象 | 适用设备 |
|-------------|-------------------------|--------------------------|
| **fern** | 蕨类植物(古老而顽强)🌿 | 长期运行的服务器 |
| **stratus** | 层云(云计算双关)☁️ | 云服务器/VPS 专用 |
| **basalt** | 玄武岩(坚固稳定)🗻 | 防火墙或网关设备 |
| **tundra** | 冻原(纯净极简)❄️ | 做开发测试环境 |
---
### 💡 **命名技巧**
1. **混合创作法**`姓氏缩写 + 出生年份后两位`**lj24** (李杰2024)
2. **反向拼写法**`宠物名倒写` → 猫咪"Milo" → **oliM**
3. **领域术语**`专业词汇变形` → 程序员可用 **bool_**
4. **键盘美学**`相邻键位组合`**ujm** (YUHJNM 键区三角)
---
### ✅ 最终检查清单
- 在终端测试是否存在冲突:
```bash
getent passwd 拟用用户名 # 返回为空则表示可用
```
- 避免使用 `root`/`admin` 等高风险名称
- 长度控制在 **3-8个字符** 最佳
- 首字母推荐小写(遵循 Linux 传统)
示例命令创建用户:
```bash
sudo useradd -m -s /bin/bash nova # 创建名为 nova 的用户
passwd nova # 设置密码
```
让您的用户名成为系统上的独特印记吧! 🐧