服务端6月21日 21:42
APT、DNF/YUM 和 Pacman 常见操作有哪些?Linux 下装软件,最怕的不是命令记不住,而是把不同发行版的包管理器混着用:Ubuntu 上找 `yum`,Arch 上只跑 `pacman -Sy`,RHEL 新版本里还在把 `yum` 当主角。结果轻则装不上包,重则依赖版本被搞乱。
这篇按日常运维最常见的场景整理 APT、DNF/YUM、Pacman 的用法:安装、升级、删除、查询、仓库管理、PPA/EPEL/AUR,以及遇到锁、依赖损坏、数据库异常时怎么处理。
## 先分清它们分别用在哪些系统
| 包管理工具 | 常见发行版 | 底层包格式 | 说明 |
|---|---|---|---|
| APT | Debian、Ubuntu、Linux Mint | `.deb` | 日常用 `apt`,脚本里更推荐 `apt-get` / `apt-cache` |
| DNF | Fedora、RHEL 8+、CentOS Stream、Rocky/AlmaLinux 8+ | `.rpm` | 现代 RHEL 系默认包管理器,基本取代 YUM |
| YUM | CentOS 7、RHEL 7 及更早版本 | `.rpm` | 老系统常用;新系统里 `yum` 多数只是兼容入口 |
| Pacman | Arch Linux、Manjaro、EndeavourOS | `.pkg.tar.zst` | 速度快、模型简单,但不要做部分升级 |
APT、DNF/YUM、Pacman 负责解决依赖、从仓库下载软件、记录安装状态。`dpkg` 和 `rpm` 更接近底层包工具,能安装本地包,但不会像上层包管理器那样自动处理远程依赖。
## APT 常见操作
APT 主要用于 Debian/Ubuntu 系统。交互式操作可以用 `apt`,自动化脚本更建议用 `apt-get` 和 `apt-cache`。
```bash
sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt install nginx
sudo apt remove nginx
sudo apt purge nginx
sudo apt autoremove
apt search nginx
apt show nginx
apt list --installed
apt-cache policy nginx
```
`apt update` 只是刷新本地软件包列表,不会升级已安装软件。`remove` 删除软件但通常保留配置文件,`purge` 连配置文件一起删除,`autoremove` 清理不再被依赖的包。
`dpkg` 用来直接处理 `.deb` 包。它不会主动从网络仓库解决依赖,所以本地安装 deb 包后如果报依赖缺失,通常要再用 APT 修复。
```bash
sudo dpkg -i package.deb
sudo apt -f install
dpkg -L nginx
dpkg -S /usr/sbin/nginx
sudo dpkg --configure -a
```
Ubuntu/Debian 的仓库配置常见位置包括 `/etc/apt/sources.list` 和 `/etc/apt/sources.list.d/*.list`。现在不推荐随手使用老式 `apt-key add`,更稳妥的方式是把仓库密钥放到 `/usr/share/keyrings/`,再在源配置中使用 `signed-by=` 指定密钥文件。
## DNF 和 YUM 常见操作
RHEL 系现在要优先看 DNF。Fedora、RHEL 8+、Rocky Linux 8+、AlmaLinux 8+ 默认使用 DNF;CentOS 7、RHEL 7 这类老系统仍然以 YUM 为主。
```bash
sudo dnf install nginx
sudo dnf upgrade
sudo dnf check-update
sudo dnf remove nginx
sudo dnf autoremove
sudo dnf search nginx
sudo dnf info nginx
sudo dnf list installed
sudo dnf clean all
sudo dnf provides /usr/sbin/nginx
```
老系统中对应命令是 `yum install`、`yum update`、`yum remove`、`yum search`。
DNF/YUM 的 history 很适合排查“昨天装了什么之后服务坏了”。
```bash
sudo dnf history
sudo dnf history info 12
sudo dnf history undo 12
```
`rpm` 是 RHEL 系的底层包工具,类似 Debian 系里的 `dpkg`。
```bash
sudo rpm -ivh package.rpm
sudo rpm -Uvh package.rpm
sudo rpm -e package-name
rpm -qa | grep nginx
rpm -qi nginx
rpm -ql nginx
rpm -qf /usr/sbin/nginx
rpm -Va
```
EPEL 很方便,但生产环境不要无脑启用一堆第三方仓库。仓库越多,版本冲突和依赖覆盖的概率越高。
## Pacman 常见操作
Pacman 是 Arch 系发行版的核心包管理工具。它的命令短,但有一个重要原则:**不要做部分升级**。
```bash
sudo pacman -Syu
sudo pacman -S nginx
sudo pacman -R nginx
sudo pacman -Rs nginx
pacman -Q
pacman -Ss nginx
pacman -Si nginx
pacman -Ql nginx
```
`pacman -Syu` 是 Arch 上最常用、也最安全的更新方式:同步软件包数据库并升级整个系统。不要长期只执行 `sudo pacman -Sy package-name`,这容易造成“本地系统还是旧依赖,但数据库指向新依赖”的部分升级问题。
Pacman 会保留下载过的软件包缓存,方便回滚,但时间久了会占不少空间。
```bash
sudo pacman -Sc
sudo pacman -S pacman-contrib
sudo paccache -r
sudo paccache -rk2
```
AUR 是 Arch 用户仓库,里面是用户维护的构建脚本,不是官方二进制仓库。常见 AUR helper 有 `yay`、`paru`。安装前至少看一下 `PKGBUILD`,生产服务器不太建议依赖 AUR。
## 常见排查:锁文件、依赖损坏和数据库异常
APT 锁被占用时,先看是不是系统正在自动更新,别上来就删锁文件。
```bash
ps aux | grep -E 'apt|dpkg'
sudo dpkg --configure -a
sudo apt -f install
```
DNF/YUM 也先检查是否有其他包管理进程:
```bash
ps aux | grep -E 'dnf|yum|rpm'
sudo dnf clean all
sudo dnf makecache
```
Pacman 锁文件通常在 `/var/lib/pacman/db.lck`,也要先确认没有正在运行的 pacman,再删除锁。Arch 上很多问题来自部分升级,先尝试完整升级:
```bash
sudo pacman -Syu
```
## 日常使用建议
先确认发行版,再选包管理器。Ubuntu/Debian 用 APT,RHEL 新系统用 DNF,CentOS 7 这类老系统用 YUM,Arch 用 Pacman。脚本里优先用稳定命令,Debian/Ubuntu 脚本建议 `apt-get`、`apt-cache`;人工操作用 `apt` 更舒服。
不要混用来源。同一个软件尽量别同时用系统仓库、第三方仓库、手动 deb/rpm、源码安装,否则后续升级和卸载都难排查。第三方仓库要克制,PPA、EPEL、AUR 都好用,但不是越多越好。看到锁先等,不要先删。Arch 不做部分升级。底层工具少直接用,能用 APT/DNF/YUM 解决依赖时,别手动硬装。
## 快速命令对照
| 场景 | APT | DNF | YUM | Pacman |
|---|---|---|---|---|
| 更新索引 | `sudo apt update` | `sudo dnf makecache` | `sudo yum makecache` | `sudo pacman -Sy` |
| 升级系统 | `sudo apt upgrade` | `sudo dnf upgrade` | `sudo yum update` | `sudo pacman -Syu` |
| 安装软件 | `sudo apt install nginx` | `sudo dnf install nginx` | `sudo yum install nginx` | `sudo pacman -S nginx` |
| 删除软件 | `sudo apt remove nginx` | `sudo dnf remove nginx` | `sudo yum remove nginx` | `sudo pacman -R nginx` |
| 搜索软件 | `apt search nginx` | `dnf search nginx` | `yum search nginx` | `pacman -Ss nginx` |
| 查看包信息 | `apt show nginx` | `dnf info nginx` | `yum info nginx` | `pacman -Si nginx` |
| 清理缓存 | `sudo apt clean` | `sudo dnf clean all` | `sudo yum clean all` | `sudo pacman -Sc` |
真正需要特别记住的是几个差异点:现代 RHEL 系优先 DNF,Ubuntu 脚本优先 apt-get,Arch 不做部分升级,第三方仓库和 AUR 要谨慎使用。标签
Linux
Linux 是一个广泛使用的开源操作系统内核,由林纳斯·托瓦兹(Linus Torvalds)于1991年创建。它是 Unix-like 操作系统的一个重要分支,并且它的设计和实现遵循了模块化的设计原则。Linux 内核本身可以与不同的用户空间组件配合,形成完整的操作系统。这些完整的系统被称为 Linux 发行版,例如 Ubuntu、Fedora、Debian、CentOS 和 Arch Linux 等。

服务端6月21日 21:41
Linux 系统日志怎么查看、分析与轮转?## Linux 日志通常放在哪里?
Linux 排查问题,第一步往往不是重启服务,而是看日志。不同发行版路径略有差异,但大多数传统日志都在 `/var/log` 下。
常见路径:Debian/Ubuntu 系统综合日志是 `/var/log/syslog`,认证日志是 `/var/log/auth.log`;RHEL/CentOS/Rocky 常见 `/var/log/messages` 和 `/var/log/secure`。Web 服务日志常见 `/var/log/nginx/`、`/var/log/apache2/` 或 `/var/log/httpd/`。
很多新系统同时使用 systemd-journald。一部分日志在 `/var/log/*.log` 里,另一部分可以通过 `journalctl` 查询。
## 如何快速查看日志文件?
```bash
less /var/log/syslog
tail -n 100 /var/log/syslog
tail -f /var/log/syslog
zgrep -i error /var/log/syslog.*.gz
```
`less` 适合翻页查看,按 `/关键词` 搜索;`tail -f` 适合实时跟踪;压缩日志可以直接用 `zgrep`,不必先解压。
## 如何用 grep 分析日志?
```bash
grep -i 'error' /var/log/syslog
grep -E 'error|failed|timeout|denied' /var/log/syslog
grep 'Failed password' /var/log/auth.log
grep -i 'timeout' /var/log/syslog | wc -l
```
如果日志量很大,先缩小范围再搜索。比如先按日期、小时、服务名过滤,再找错误关键词。
## journalctl 怎么用?
```bash
journalctl -u nginx
journalctl -u nginx -n 100
journalctl -u nginx -f
journalctl --since '1 hour ago'
journalctl -b
journalctl -b -1
journalctl -p err
journalctl -k
```
`journalctl -u` 看服务,`-f` 实时跟踪,`--since` 按时间过滤,`-b` 看当前启动批次,`-b -1` 看上次启动,`-p` 按级别过滤,`-k` 看内核日志。
开启持久化 journal,可创建 `/var/log/journal` 并配置 `/etc/systemd/journald.conf`:
```ini
[Journal]
Storage=persistent
SystemMaxUse=1G
MaxRetentionSec=1month
```
查看和清理占用:
```bash
journalctl --disk-usage
journalctl --vacuum-time=14d
journalctl --vacuum-size=1G
```
## 如何配置 logrotate?
日志不能无限增长。`logrotate` 用来按时间、大小、保留数量压缩和删除旧日志。
```conf
/var/log/myapp/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
dateext
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
```
测试配置:
```bash
logrotate -d /etc/logrotate.conf
logrotate -f /etc/logrotate.conf
```
`copytruncate` 会复制当前日志再截断原文件,不需要 reload 服务,但复制和截断之间可能丢日志。能让服务重新打开日志,就优先用 `postrotate`;实在做不到,再考虑 `copytruncate`。
## 权限、磁盘和结构化日志
日志里可能包含 IP、用户名、请求参数、错误堆栈甚至 token。权限太宽会变成安全问题,权限太严服务又可能写不进去。logrotate 里的 `create 0640 user group` 很关键。
日志撑满磁盘时,用:
```bash
df -h
du -sh /var/log/*
journalctl --disk-usage
lsof | grep deleted
```
不要直接 `rm` 正在被进程写入的日志文件,文件名消失了,但进程可能仍持有旧文件句柄,空间不会立刻释放。
JSON 日志可以用 `jq` 分析:
```bash
cat app.log | jq 'select(.level == "error")'
cat app.log | jq -r '.path' | sort | uniq -c | sort -nr
```
建议至少包含 timestamp、level、service、trace_id/request_id、message、error 等字段。
## 远程日志和排查流程
机器多了之后,只靠 SSH 上去 `grep` 很痛苦。常见做法是用 rsyslog、syslog-ng、Filebeat、Fluent Bit、Vector、Logstash,把日志送到 Elasticsearch、OpenSearch、Loki、ClickHouse 或云厂商日志服务。远程日志要注意时间同步、字段规范和脱敏。
遇到线上问题,可以按这个顺序:确认时间和影响范围;看服务日志;看系统和认证日志;看内核和 OOM;看日志是否还在写入;查轮转和磁盘。不要只盯一个日志文件。把服务日志、系统日志、内核日志、磁盘占用、权限和轮转配置连起来看,问题通常会更快露出头。服务端6月21日 21:41
Linux cron 时间格式怎么写?常用命令和最佳实践有哪些?## cron 是什么,适合解决什么问题?
cron 是 Linux/Unix 系统里最常见的定时任务工具,适合做周期性、可重复、对秒级精度要求不高的任务,比如清理日志、备份文件、同步数据、定时拉取接口、跑统计脚本。
它的特点是简单、稳定、系统内置;缺点是默认环境变量很少、日志不集中、任务错过后通常不会自动补跑。所以写 cron 任务时,不只要会写时间表达式,还要处理路径、日志、锁、时区和失败通知。
## cron 时间格式怎么写?
普通用户的 crontab 通常是 5 个时间字段加一条命令:
```bash
* * * * * command
# 分 时 日 月 周 命令
```
常见例子:
```bash
30 2 * * * /usr/local/bin/backup.sh # 每天 2:30
*/5 * * * * /usr/local/bin/check.sh # 每 5 分钟
0 9 * * 1 /usr/local/bin/weekly-report.sh # 每周一 9 点
```
常用符号包括:`*` 任意值,`,` 多个值,`-` 范围,`/` 步长。
## 日期和星期同时写时有什么坑?
在很多 cron 实现里,日期字段 day-of-month 和星期字段 day-of-week 如果同时被限制,通常是“或”的关系,不是“且”的关系”。
```bash
0 9 1 * 1 /usr/local/bin/job.sh
```
很多人以为它表示“每月 1 号且是周一的 9 点执行”。实际上通常表示每月 1 号 9 点执行,周一 9 点也执行。如果真的要表达“每月 1 号并且是周一”,建议在脚本里再判断一次。
## crontab 常用命令有哪些?
```bash
crontab -e # 编辑当前用户任务
crontab -l # 查看当前用户任务
crontab -r # 删除当前用户所有任务
sudo crontab -u nginx -e
sudo crontab -u nginx -l
```
编辑前建议先备份:
```bash
crontab -l > ~/crontab.bak
```
用户 crontab 的格式是 `* * * * * command`;`/etc/crontab` 和 `/etc/cron.d/` 里的格式通常多一个运行用户字段:`* * * * * user command`。不要混用。
## cron 的环境变量为什么经常出问题?
cron 执行命令时,不会加载完整交互式 shell 环境。建议在 crontab 顶部显式写清楚:
```bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@example.com
```
命令和脚本尽量用绝对路径,需要进入项目目录时显式 `cd`。
```bash
*/10 * * * * cd /data/app && /usr/bin/python3 scripts/sync.py >> /var/log/sync.log 2>&1
```
## 日志和防重入怎么做?
cron 自身日志位置和发行版有关:Debian/Ubuntu 常见 `grep CRON /var/log/syslog`,RHEL/CentOS 常见 `grep CRON /var/log/cron`,systemd 系统也可以看 `journalctl -u cron` 或 `journalctl -u crond`。
生产环境建议自己重定向日志:
```bash
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
```
如果任务执行时间比调度间隔还长,会出现多个实例同时运行。最简单可靠的办法是用 `flock` 加锁:
```bash
*/5 * * * * flock -n /var/lock/sync.lock /usr/local/bin/sync.sh >> /var/log/sync.log 2>&1
```
## cron 和时区有什么关系?
cron 按系统时区执行。先确认服务器时区:
```bash
date
timedatectl
```
部分 cron 实现支持在 crontab 中设置 `CRON_TZ`:
```bash
CRON_TZ=Asia/Shanghai
0 9 * * * /usr/local/bin/report.sh
```
跨地区部署时,最好把服务器时区、业务时区和任务说明写清楚。对账、结算、计费这类任务,还要做幂等和日期校验,不要只相信 cron 调度。
## anacron 和 systemd timer 怎么选?
cron 假设机器一直开着。如果电脑或服务器在计划时间关机,任务通常就错过了。anacron 适合每天、每周、每月这类低频任务,错过后下次开机补跑。
systemd timer 更适合生产服务化任务,它日志进 journald,可声明用户、工作目录、依赖和错过补跑。一个 timer 通常由 `.service` 和 `.timer` 两个文件组成。
```ini
# /etc/systemd/system/report.timer
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
```
启用:
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now report.timer
systemctl list-timers
journalctl -u report.service
```
简单任务用 cron,生产任务需要状态、日志、依赖、告警时优先考虑 systemd timer。
## cron 最佳实践清单
使用绝对路径;显式设置 `SHELL` 和 `PATH`;保存日志;用 `flock` 防重入;脚本要幂等;区分用户 crontab 和系统 cron;注意日期和星期字段的“或”关系;确认时区;复杂逻辑写进脚本;关键任务配置告警。
cron 本身不复杂,真正让任务稳定的是这些细节:命令能不能找到,失败能不能看见,重复执行会不会出事,时间是不是你以为的那个时间。服务端6月21日 21:21
KVM、Docker、Kubernetes 有什么区别?适合哪些使用场景?KVM 是 Linux 上的全虚拟化方案,Docker 是容器运行与镜像分发方案,Kubernetes 严格来说不是虚拟化技术,而是容器编排平台。三者常被放在一起比较,是因为它们都能解决“如何把应用隔离、部署和迁移”的问题,但隔离层级完全不同:KVM 隔离到操作系统内核,Docker 容器共享宿主机内核,Kubernetes 负责把大量容器调度到多台机器上运行。
## KVM 适合什么场景?
KVM 把 Linux 内核变成 Hypervisor,通过 CPU 的 VT-x、AMD-V 等硬件虚拟化能力运行完整虚拟机。每个虚拟机都有自己的内核、磁盘、网卡和系统环境,隔离性强,适合多租户、强安全边界、不同操作系统混跑等场景。
实际使用 KVM 时,常见组合是 KVM + QEMU + libvirt:KVM 提供内核级虚拟化能力,QEMU 负责设备模拟与用户态辅助,libvirt 提供统一管理接口,方便创建、迁移、快照和管理虚拟机。
KVM 的优点是隔离强、兼容性好,能运行完整 Linux、Windows 或其他系统;缺点是启动慢、资源开销比容器高。它更适合云主机、私有云、测试不同操作系统、需要强隔离的生产环境。
## Docker 适合什么场景?
Docker 属于容器技术,不是完整虚拟机。容器通过 namespace、cgroups、联合文件系统等机制隔离进程、网络、文件系统和资源配额,但所有容器共享宿主机内核。
这意味着 Docker 启动很快,镜像分发方便,资源开销低,适合微服务、CI/CD、开发环境一致性、快速扩缩容等场景。比如一台机器上运行多个服务实例,用 Docker 比开多台虚拟机轻得多。
但共享内核也带来边界问题:容器隔离弱于虚拟机,内核漏洞可能影响所有容器。因此 Docker 适合应用级隔离,不适合把它当成完全等价于虚拟机的安全边界。
## Kubernetes 为什么不是虚拟化?
Kubernetes 不直接提供虚拟化能力,它负责容器编排。它关注的是:容器应该运行在哪台机器上,副本数是否足够,服务如何发现,失败后如何重启,滚动更新如何执行。
在生产环境里,Kubernetes 通常运行在物理机、虚拟机或云主机之上,再调度 Docker、containerd 等运行时管理的容器。它解决的是集群规模下的部署、调度、伸缩和自愈问题,而不是替代 KVM 或 Docker。
## LXC、Xen、VMware 和它们有什么关系?
LXC 更接近 Linux 原生容器,Docker 在镜像、仓库、构建和应用分发上做了更多工程化封装。
Xen 和 VMware 与 KVM 一样属于虚拟机方向。Xen 是传统 Type-1 Hypervisor,VMware 在企业虚拟化里成熟度很高;KVM 的优势是深度集成 Linux 内核,生态开放,常见于 OpenStack、云平台和私有云环境。
## 网络、存储、性能和安全怎么比较?
| 技术 | 隔离级别 | 性能开销 | 网络与存储特点 | 典型场景 |
|---|---|---|---|---|
| KVM | 完整虚拟机,独立内核 | 中等 | 虚拟网卡、虚拟磁盘、可接 Ceph/NFS/iSCSI | 云主机、强隔离、多系统环境 |
| Docker | 进程级隔离,共享内核 | 很低 | bridge、host、overlay 网络,卷挂载与镜像层 | 微服务、CI/CD、快速交付 |
| Kubernetes | 编排容器,不是虚拟化 | 取决于底层容器和集群 | CNI 管网络,CSI 管存储 | 大规模容器调度、弹性伸缩 |
| LXC | 系统容器,共享内核 | 低 | 更像轻量 Linux 系统环境 | 轻量系统隔离、实验环境 |
| Xen/VMware | 完整虚拟化 | 中等 | 企业级虚拟网络和共享存储成熟 | 企业虚拟化、传统数据中心 |
如果重点是性能,容器通常比虚拟机轻;如果重点是安全隔离,KVM、Xen、VMware 这类虚拟机更稳妥;如果重点是大规模服务治理,就需要 Kubernetes 管理容器集群。
## 如何选择?
单机运行多个应用、希望环境一致,用 Docker。要管理几十台甚至几百台机器上的容器,用 Kubernetes。需要运行不同操作系统、给不同租户提供强隔离环境,用 KVM、Xen 或 VMware。
更常见的生产组合不是三选一,而是叠加使用:底层用 KVM 提供云主机,上层用 Kubernetes 管理容器,应用通过 Docker/containerd 镜像交付。这样既有虚拟机的隔离边界,也有容器的交付效率和 Kubernetes 的集群调度能力。服务端6月21日 21:21
Linux 内核参数调优常用网络内存参数有哪些?## Linux 内核参数调优先看什么?
Linux 内核参数调优常见入口是 `sysctl`,参数主要分布在网络、内存、文件系统、进程资源和安全几个方向。它不是把网上的配置复制一遍就完事,而是要结合业务负载、机器规格、连接量、磁盘类型和监控数据逐项验证。
最稳妥的做法是:先记录当前值,再小步修改,观察指标,最后写入 `/etc/sysctl.d/*.conf` 持久化。
```bash
sysctl net.core.somaxconn
sysctl -w net.core.somaxconn=4096
sysctl -a | grep tcp
```
持久化示例:
```bash
cat >/etc/sysctl.d/99-app-tuning.conf <<'EOF'
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
vm.swappiness = 10
fs.file-max = 2097152
EOF
sysctl --system
```
## 网络参数常调哪些?
网络参数通常是 Web 服务、网关、长连接服务最先碰到的瓶颈。重点看监听队列、半连接队列、缓冲区、Keepalive、端口范围和 SYN 防护。
`net.core.somaxconn` 控制监听 socket 的最大连接队列上限。Nginx、Node.js、Java 服务的 backlog 即使设置得很大,也会被这个内核上限截断。`net.ipv4.tcp_max_syn_backlog` 控制 TCP 半连接队列大小。突发连接多、握手阶段排队明显时,这个参数很关键。
```conf
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
```
吞吐量高、跨机房传输、延迟较大的链路,常会调整收发缓冲区:
```conf
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
```
长连接服务常调 TCP Keepalive:
```conf
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
```
高并发短连接场景要关注本地临时端口范围和 TIME_WAIT:
```conf
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
```
需要特别注意:`net.ipv4.tcp_tw_recycle` 已经在新内核中移除,老资料里还会看到它,但线上应避免使用。它和 NAT 环境兼容性很差,可能导致同一出口后的客户端连接异常。
## 内存参数常调哪些?
`vm.swappiness` 控制内核使用 swap 的倾向,值越高越容易换出匿名页。数据库、缓存、延迟敏感服务通常会把它调低,例如 1-10。
```conf
vm.swappiness = 10
```
脏页参数决定文件写入后什么时候触发后台回写、什么时候阻塞前台写入:
```conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 20
```
大内存机器也可以使用字节级参数,让阈值更可控:
```conf
vm.dirty_background_bytes = 268435456
vm.dirty_bytes = 1073741824
```
内存超分相关参数:
```conf
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
```
Redis、数据库、大型 JVM 服务要谨慎修改,避免 fork、AOF rewrite、备份任务时因为内存承诺失败而出问题。
HugePages 适合部分数据库、虚拟化或高性能计算场景:
```conf
vm.nr_hugepages = 1024
```
它能减少页表开销,但也会预留固定内存。不是所有服务都能受益,配置前要确认应用是否支持。
## 文件系统与进程参数有哪些?
高并发服务常见报错是 `Too many open files`,这通常不只和应用有关,也和系统文件句柄上限有关。
```conf
fs.file-max = 2097152
fs.nr_open = 1048576
```
实际还要配合 `ulimit -n`、systemd 的 `LimitNOFILE`、容器运行参数一起看。
inotify 适合文件监听多的场景,例如前端构建、日志采集、配置中心 Agent:
```conf
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
fs.inotify.max_queued_events = 32768
```
数据库或存储服务使用 native AIO 时,可关注:
```conf
fs.aio-max-nr = 1048576
```
进程数、线程数、共享内存和信号量在数据库、中间件、容器宿主机上比较常见:
```conf
kernel.pid_max = 4194304
kernel.threads-max = 2060000
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.sem = 250 32000 100 128
```
## 安全相关参数有哪些?
安全参数不能为了“能连通”随意关闭,尤其是边界机器、网关、云主机。
```conf
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
```
`rp_filter` 可减少 IP 欺骗风险,但多网卡、多出口、策略路由场景可能需要按网卡单独调整。
## 如何按业务负载调优?
Web 网关通常优先看 `somaxconn`、`tcp_max_syn_backlog`、端口范围、Keepalive、文件句柄。数据库通常优先看 swappiness、dirty 参数、overcommit、HugePages、aio、共享内存和信号量。容器宿主机通常关注文件句柄、inotify、PID/线程上限、网络 backlog、conntrack 与 cgroup 限制。
修改后要验证:
```bash
sysctl net.core.somaxconn vm.swappiness fs.file-max
ss -s
cat /proc/sys/fs/file-nr
vmstat 1
iostat -x 1
dmesg -T | tail
journalctl -k -n 100
```
内核参数调优的结果应该能在监控里看到,而不是只停留在配置文件里。真正可靠的调优,是知道每个参数影响什么、适合什么负载、修改后用什么指标验证,并且能快速回滚。服务端6月21日 02:14
Linux ulimit 如何配置资源限制并排查常见问题?Linux 里的 `ulimit` 用来限制一个 shell 以及它启动的子进程能使用多少系统资源。它最常见的用途,是防止某个程序打开太多文件、创建太多进程、占用过多栈空间,或者在崩溃时不生成 core 文件。
不过 `ulimit` 容易被误解:你在命令行里执行 `ulimit -n 65535`,只影响当前 shell 和它后面启动的进程;已经运行的服务不会自动改变;由 systemd 管理的服务,也不会因为你改了 `/etc/security/limits.conf` 就一定生效。
## ulimit 到底限制什么?
`ulimit` 本质上是 shell 内置命令,用来查看或设置进程资源限制。最重要的两个概念是软限制和硬限制。
- **软限制(soft limit)**:当前实际生效的限制,普通用户通常可以调低,也可以在不超过硬限制的前提下调高。
- **硬限制(hard limit)**:软限制的上限,普通用户不能随便提高,通常需要 root 或具备相应权限的进程调整。
```bash
ulimit -Sn # 查看 soft nofile
ulimit -Hn # 查看 hard nofile
ulimit -a # 查看全部限制
```
## 常用 ulimit 命令有哪些?
| 命令 | 含义 | 常见场景 |
|---|---|---|
| `ulimit -n` | 最大打开文件数,等价于 nofile | Nginx、数据库、高并发连接 |
| `ulimit -u` | 最大用户进程数,等价于 nproc | 防止进程或线程创建过多 |
| `ulimit -s` | 栈大小,等价于 stack | 递归过深、线程栈配置 |
| `ulimit -c` | core 文件大小,等价于 core | 程序崩溃排查 |
| `ulimit -l` | 最大锁定内存,等价于 memlock | 数据库、DPDK、实时程序 |
| `ulimit -v` | 最大虚拟内存 | 限制进程虚拟地址空间 |
| `ulimit -t` | 最大 CPU 时间 | 限制 CPU 占用时间 |
| `ulimit -f` | 最大文件大小 | 防止写出超大文件 |
临时把最大打开文件数调到 65535:
```bash
ulimit -n 65535
```
启用 core 文件:
```bash
ulimit -c unlimited
```
这类命令只对当前 shell 和它之后启动的子进程有效。
## nofile、nproc、stack、core、memlock 分别怎么用?
`nofile` 控制一个进程最多能打开多少文件描述符。这里的“文件”不只是普通文件,还包括 socket、pipe、epoll fd 等。Web 服务、网关、数据库经常需要调大它。连接数一高,最先遇到的往往就是 `Too many open files`。
`nproc` 限制用户最多能拥有多少个进程。很多时候线程也会受到这个限制影响,所以 Java、Go、数据库或高并发程序创建线程失败时,也要检查它。
`stack` 控制进程线程栈大小。栈太小,递归深、局部变量大、线程模型复杂的程序可能崩溃;栈太大,又会让大量线程浪费地址空间。
`core` 控制程序崩溃时能否生成 core dump。core 文件还受系统 core_pattern、工作目录权限、磁盘空间、systemd-coredump 等因素影响,不能只看 `ulimit -c`。
`memlock` 控制进程最多能锁定多少内存,数据库、实时计算、DPDK、Elasticsearch 某些配置会关注它。
## limits.conf 的格式怎么写?
永久配置通常写到 `/etc/security/limits.conf` 或 `/etc/security/limits.d/*.conf`。
格式是:
```conf
<domain> <type> <item> <value>
```
常见配置:
```conf
* soft nofile 65535
* hard nofile 65535
username soft nproc 4096
username hard nproc 8192
@groupname soft memlock 1048576
@groupname hard memlock 2097152
* soft core unlimited
* hard core unlimited
```
`domain` 可以是 `*`、用户名、`@组名`;`type` 可以是 `soft`、`hard`、`-`;`item` 是 `nofile`、`nproc`、`stack`、`core`、`memlock` 等;`value` 是限制值或 `unlimited`。
生产环境里推荐把 soft、hard 分开写,便于排查到底哪个值没有生效。
## 为什么改了 limits.conf 还是没生效?
`/etc/security/limits.conf` 主要通过 PAM 的 `pam_limits.so` 在用户登录会话中生效。也就是说,它通常影响 SSH 登录、su、login 等 PAM 会话。
但 systemd 管理的服务不一定走这种登录链路。你改了 `limits.conf`,然后执行 `systemctl restart nginx`,Nginx 的限制值未必会变。systemd 服务应该用自己的配置方式。
## systemd 服务如何设置 ulimit?
推荐用 drop-in 文件,不要直接改发行版自带的 service 文件。
```bash
sudo systemctl edit nginx
```
写入:
```ini
[Service]
LimitNOFILE=65535
LimitNPROC=4096
LimitCORE=infinity
LimitMEMLOCK=infinity
```
保存后执行:
```bash
sudo systemctl daemon-reload
sudo systemctl restart nginx
```
再查看实际进程限制:
```bash
cat /proc/$(pidof nginx | awk '{print $1}')/limits
```
systemd 里常用 `infinity` 表示无限制,而 `limits.conf` 里常用 `unlimited`。
## 如何查看正在运行进程的真实限制?
不要只看当前终端的 `ulimit -a`。它只能说明当前 shell 的限制,不能代表某个服务进程。
```bash
cat /proc/PID/limits
ls /proc/PID/fd | wc -l
ps -eLf | grep PID | wc -l
```
如果要临时查看或调整某个已运行进程的限制,可以用 `prlimit`:
```bash
prlimit --pid PID
prlimit --pid PID --nofile=65535:65535
```
`prlimit` 适合临时救急或验证问题,但生产配置还是应该落到 systemd drop-in、limits.d 或应用启动脚本里,避免重启后丢失。
## fs.file-max 和 ulimit -n 是什么关系?
`ulimit -n` 控制的是单个进程的最大打开文件数。`fs.file-max` 控制的是整个系统层面的文件句柄上限。
```bash
cat /proc/sys/fs/file-max
cat /proc/sys/fs/file-nr
sysctl -w fs.file-max=2097152
```
如果单个进程的 `nofile` 很小,会先撞到 `Too many open files`;如果系统整体文件句柄耗尽,多个进程都可能异常。两者不是一个层面的限制,排查时要分开看。
## 常见故障怎么排查?
遇到 `Too many open files`,先确认是哪一层不够:
```bash
cat /proc/PID/limits | grep "open files"
ls /proc/PID/fd | wc -l
cat /proc/sys/fs/file-nr
```
如果进程 fd 数接近 `Max open files`,调大 `nofile`。如果是 systemd 服务,要配置 `LimitNOFILE=`,而不是只改当前 shell 的 `ulimit -n`。
core 文件没有生成时,检查 `ulimit -c`、`/proc/PID/limits`、`/proc/sys/kernel/core_pattern`、目录权限和磁盘空间。
进程或线程创建失败时,重点看 `nproc`。内存相关报错还要一起检查系统内存、cgroup 限制、容器限制、swap、overcommit 策略。
## 配置 ulimit 的最佳实践
先看真实进程限制,优先用 `/proc/PID/limits`。区分临时和永久:命令行 `ulimit` 适合临时验证,长期配置要落到配置文件。区分登录用户和服务:PAM 登录会话看 `limits.conf` / `limits.d`,systemd 服务看 `LimitNOFILE=`、`LimitNPROC=` 等 drop-in 配置。
不要盲目写 `unlimited`。`core`、`memlock`、`nofile` 都可能影响系统稳定性或磁盘空间。配置完必须重启服务并用 `/proc/PID/limits` 确认,而不是相信配置文件已经生效。
简单记住一句话:`ulimit` 管的是进程资源上限;`limits.conf` 多数影响 PAM 登录会话;systemd 服务要用 `Limit*` 配置;排查时以 `/proc/PID/limits` 看到的值为准。服务端6月3日 00:11
Linux 启动流程是怎样的?从 BIOS 到 login 的完整过程Linux 启动分五个阶段:固件(BIOS/UEFI)→ 引导加载器(GRUB)→ 内核 → init 系统(systemd)→ 用户登录。每个阶段接力完成,任一阶段失败系统就无法启动。
## 1. 固件阶段:BIOS/UEFI
按下电源键后,CPU 执行固件(烧在主板 ROM 里的程序):
- **BIOS**(传统):POST 自检 → 扫描启动设备 → 读取第一个扇区(MBR,512 字节)
- **UEFI**(现代):POST 自检 → 读取 EFI 系统分区(ESP)里的 .efi 引导程序
UEFI 比 BIOS 快(跳过 MBR 扫描),支持 GPT 分区(超过 2TB 磁盘),支持安全启动(Secure Boot)。新机器都是 UEFI。
## 2. 引导加载器:GRUB2
GRUB2 显示启动菜单(如果有多个内核或系统),然后加载 Linux 内核和 initramfs 到内存:
```
GRUB 菜单
├── Ubuntu, Linux 6.5.0-generic
├── Ubuntu, Linux 6.5.0-generic (recovery)
└── Advanced options
```
GRUB 的配置在 /boot/grub/grub.cfg。修改用 update-grub 命令,不要直接编辑。
## 3. 内核阶段
内核加载后:
1. 解压 initramfs(临时根文件系统,包含基本驱动)
2. 检测硬件,加载驱动模块
3. 挂载真正的根文件系统(/)
4. 执行 /sbin/init(PID 1)
内核启动时的日志用 dmesg 查看。如果卡在某个驱动加载,dmesg 能看到最后一条。
## 4. init 系统:systemd
现代 Linux 都用 systemd(取代了旧的 SysV init)。systemd 按 target(目标单元)组织启动流程:
```
sysinit.target # 基础系统初始化
↓
multi-user.target # 多用户模式(无图形界面)
↓
graphical.target # 图形界面
```
每个 target 下有多个 service 并行启动(不像旧 init 串行),启动速度更快。
查看启动耗时:
```bash
systemd-analyze # 总耗时
systemd-analyze blame # 各服务耗时排序
```
## 5. 用户登录
- **文本模式**:getty 进程在 tty1-6 显示登录提示
- **图形模式**:GDM/LightDM/SDDM 显示管理器显示登录界面
登录后:
1. 验证用户密码(/etc/shadow)
2. 启动用户 shell(/bin/bash 或 /bin/zsh)
3. 执行 shell 配置文件(.bashrc/.zshrc)
4. 用户进入系统
## 常见启动故障
**卡在 GRUB**:内核或 initramfs 损坏。用 Live USB chroot 修复:grub-install + update-grub。
**卡在内核阶段**:驱动问题。启动时在 GRUB 菜单按 e 编辑,在 linux 行末加 nomodeset 禁用图形驱动。
**卡在 systemd**:某个服务启动失败。systemctl status 查看失败服务,systemctl disable 暂时禁用。
**忘记密码**:GRUB 菜单按 e,linux 行末加 init=/bin/bash,Ctrl+X 启动到 root shell,passwd 修改密码。服务端6月3日 00:11
Linux 管道和重定向怎么用?| > >> 2>&1 详解管道(|)把一个命令的输出传给另一个命令做输入。重定向(> >> 2>&1)控制输出到文件还是设备。两者配合是 Linux 命令行最核心的组合能力。
## 重定向
### 标准输出重定向
```bash
ls > file.txt # 覆盖写入
ls >> file.txt # 追加写入
```
> 会清空文件再写入,>> 在文件末尾追加。新手常犯的错:用 > 覆盖了重要文件。
### 标准错误重定向
```bash
gcc main.c 2> errors.log # 只重定向错误
```
Linux 有三个标准流:stdin(0)、stdout(1)、stderr(2)。2> 就是重定向文件描述符 2(标准错误)。
### 同时重定向输出和错误
```bash
# 输出和错误都写到同一个文件
gcc main.c > output.log 2>&1
# 更简洁的写法(bash 4+)
gcc main.c &> output.log
```
2>&1 把 stderr 合并到 stdout。顺序重要:> output.log 2>&1 正确,2>&1 > output.log 错误(stderr 去了终端而不是文件)。
### 丢弃输出
```bash
gcc main.c > /dev/null 2>&1 # 什么都不看
gcc main.c 2> /dev/null # 只看正常输出,忽略错误
```
/dev/null 是黑洞设备,写入的数据全部丢弃。
## 管道
```bash
# 找出占用内存最多的 5 个进程
ps aux | sort -k4 -rn | head -5
# 统计当前目录下各类型文件数量
ls | grep -o '\..*$' | sort | uniq -c | sort -rn
# 在日志中搜索错误并提取时间
grep ERROR app.log | awk '{print $1, $2}'
```
管道把前一个命令的 stdout 变成后一个命令的 stdin。注意:管道只传 stdout,不传 stderr。如果要传 stderr,先 2>&1。
## 常见组合
```bash
# 查找大文件
du -sh * | sort -rh | head -10
# 统计代码行数
find . -name '*.py' | xargs wc -l | tail -1
# 批量替换文件内容
grep -rl 'old_text' . | xargs sed -i 's/old_text/new_text/g'
# 监控日志中的错误
tail -f app.log | grep --line-buffered ERROR
```
## Here Document
```bash
cat > config.yaml << EOF
server:
port: 8080
host: localhost
EOF
```
<< EOF 把多行文本作为 stdin,常用于写配置文件或脚本内嵌数据。服务端6月3日 00:11
Linux 系统怎么备份和恢复?rsync、tar 和快照实战Linux 备份分三个层级:文件级(rsync/tar)、分区级(dd)、快照级(LVM/Btrfs)。日常用 rsync 增量备份文件,关键系统用快照,dd 只在磁盘克隆时用。
## rsync:增量备份首选
rsync 只传输变化的文件,第一次全量,之后只传差异部分:
```bash
# 本地备份到外部硬盘
rsync -avz --delete /home/user/ /backup/home/
# 远程备份到服务器
rsync -avz --delete /home/user/ user@server:/backup/home/
```
参数:-a 保留权限和时间戳,-v 显示进度,-z 压缩传输,--delete 删除目标中源端已不存在的文件(保持完全同步)。
定时备份:
```bash
# 每天凌晨 2 点备份
0 2 * * * rsync -avz --delete /home/user/ /backup/home/ >> /var/log/backup.log 2>&1
```
## tar:打包归档
```bash
# 打包并压缩
tar czf backup_$(date +%Y%m%d).tar.gz /home/user/
# 解压恢复
tar xzf backup_20240101.tar.gz -C /
```
tar 适合归档到单个文件(方便传输和存储),但不支持增量。每次都全量打包,大目录慢。
## dd:磁盘级克隆
```bash
# 整盘克隆
dd if=/dev/sda of=/dev/sdb bs=4M status=progress
# 克隆到镜像文件
dd if=/dev/sda of=disk.img bs=4M status=progress
```
dd 逐扇区复制,包含分区表和引导扇区。用途:换硬盘时整盘克隆。缺点:必须卸载分区或用 Live USB,否则数据不一致。
## LVM 快照
LVM 快照冻结文件系统某一时刻的状态,备份时不需要停服务:
```bash
# 创建快照
lvcreate -L 10G -s -n snap_root /dev/vg0/root
# 挂载快照并备份
mount /dev/vg0/snap_root /mnt/snap
rsync -avz /mnt/snap/ /backup/root/
# 备份完成后删除快照
umount /mnt/snap
lvremove /dev/vg0/snap_root
```
快照不是备份——如果硬盘坏了快照也没了。快照的意义是:在不停服务的情况下获得一致的文件系统状态。
## 备份策略:3-2-1 原则
- **3** 份数据副本
- **2** 种不同存储介质(本地硬盘 + NAS)
- **1** 份离线/远程(云存储)
最小化方案:rsync 到本地 NAS + 推到 S3。两步覆盖 3-2-1。
## 恢复测试
没测过的备份等于没备份。定期恢复测试:
```bash
# 随机抽取一个文件验证
tar tzf backup.tar.gz | head -5
rsync -avzn /backup/home/ /tmp/verify/ # dry-run 验证
```
每季度做一次完整恢复演练——把备份恢复到新机器,确认能正常工作。服务端2月17日 23:38
Linux 磁盘管理和文件系统操作中如何进行分区、格式化、挂载和管理磁盘空间?Linux 磁盘管理和文件系统是系统管理员的核心技能,涉及磁盘分区、格式化、挂载和维护等操作。
磁盘分区:
- fdisk:传统的磁盘分区工具
- 查看分区:fdisk -l
- 进入交互模式:fdisk /dev/sdb
- 常用命令:n(新建分区)、p(打印分区表)、d(删除分区)、w(保存并退出)、q(不保存退出)
- parted:现代磁盘分区工具,支持 GPT 分区表
- 查看分区:parted -l
- 进入交互模式:parted /dev/sdb
- 创建分区:mkpart primary ext4 1MiB 100%
- 设置分区表:mklabel gpt
- lsblk:列出块设备信息
- blkid:查看块设备 UUID 和文件系统类型
文件系统:
- 常见文件系统类型:ext4、xfs、btrfs、ntfs、vfat
- mkfs:创建文件系统,如 mkfs.ext4 /dev/sdb1、mkfs.xfs /dev/sdb1
- mkfs.ext4:创建 ext4 文件系统
- mkfs.xfs:创建 xfs 文件系统
磁盘挂载:
- mount:挂载文件系统,如 mount /dev/sdb1 /mnt/data
- umount:卸载文件系统,如 umount /mnt/data
- 查看挂载点:mount、df -h
- /etc/fstab:自动挂载配置文件
- 格式:设备 挂载点 文件系统类型 挂载选项 dump fsck
- 示例:/dev/sdb1 /mnt/data ext4 defaults 0 2
- 使用 UUID:UUID=xxx /mnt/data ext4 defaults 0 2(推荐)
- 查看设备 UUID:blkid /dev/sdb1
磁盘空间管理:
- df:查看磁盘空间使用情况,df -h(人类可读格式)
- du:查看目录或文件大小,du -sh directory(显示目录总大小)
- du -h --max-depth=1 /:查看根目录下各目录的大小
- 清理磁盘空间:
- 清理包缓存:apt clean(Debian/Ubuntu)、yum clean all(CentOS/RHEL)
- 清理旧日志:logrotate
- 查找大文件:find / -type f -size +100M
LVM(逻辑卷管理):
- pvcreate:创建物理卷,如 pvcreate /dev/sdb1
- vgcreate:创建卷组,如 vgcreate vgname /dev/sdb1
- lvcreate:创建逻辑卷,如 lvcreate -L 10G -n lvname vgname
- lvextend:扩展逻辑卷,如 lvextend -L +5G /dev/vgname/lvname
- lvreduce:缩减逻辑卷,如 lvreduce -L -5G /dev/vgname/lvname
- resize2fs:调整 ext4 文件系统大小,如 resize2fs /dev/vgname/lvname
- xfs_growfs:扩展 xfs 文件系统
- pvdisplay、vgdisplay、lvdisplay:查看物理卷、卷组、逻辑卷信息
RAID(磁盘阵列):
- mdadm:管理软件 RAID
- 创建 RAID 0:mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
- 创建 RAID 1:mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
- 创建 RAID 5:mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
- 查看 RAID 状态:cat /proc/mdstat、mdadm --detail /dev/md0
磁盘性能优化:
- 使用 SSD:提高 I/O 性能
- 调整 I/O 调度器:echo deadline > /sys/block/sda/queue/scheduler
- 增加文件系统块大小:mkfs.ext4 -b 4096 /dev/sdb1
- 使用 noatime 挂载选项:减少磁盘写入
- 启用文件系统日志:提高数据安全性
磁盘故障排查:
- 查看磁盘健康:smartctl -a /dev/sda(需要安装 smartmontools)
- 查看磁盘 I/O:iostat -x 1
- 查看磁盘错误:dmesg | grep -i error
- 修复文件系统:fsck /dev/sdb1(需要先卸载)服务端2月17日 23:38
Linux Shell 脚本编程中如何定义变量、编写条件判断和循环语句?Linux Shell 脚本编程是自动化运维和系统管理的重要技能。
变量定义和使用:
- 变量定义:name="value"(注意等号两边不能有空格)
- 变量引用:$name 或 ${name}
- 只读变量:readonly name
- 删除变量:unset name
- 环境变量:export name="value"
- 特殊变量:$0(脚本名)、$1-$9(位置参数)、$#(参数个数)、$*(所有参数)、$@(所有参数)、$?(上一条命令退出状态)、$$(当前进程 PID)、$!(后台进程 PID)
条件判断:
- if 语句:if [ condition ]; then commands; fi
- 文件测试:-f(文件存在)、-d(目录存在)、-e(存在)、-r(可读)、-w(可写)、-x(可执行)
- 字符串比较:=(等于)、!=(不等于)、-z(空字符串)、-n(非空字符串)
- 数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)
- 逻辑运算:-a(与)、-o(或)、!(非)
循环结构:
- for 循环:for i in {1..10}; do commands; done 或 for ((i=0; i<10; i++)); do commands; done
- while 循环:while [ condition ]; do commands; done
- until 循环:until [ condition ]; do commands; done
函数定义:
- 函数定义:function_name() { commands; } 或 function function_name { commands; }
- 函数调用:function_name arg1 arg2
- 返回值:return value(0-255)
- 局部变量:local var="value"
常用命令:
- echo:输出文本,echo -n 不换行,echo -e 解析转义字符
- printf:格式化输出
- read:读取用户输入,read -p "prompt" var
- test:条件测试,[ ] 是 test 的同义词
- expr:表达式求值
- let:算术运算
- awk:文本处理工具
- sed:流编辑器
- grep:文本搜索
数组操作:
- 定义数组:arr=(item1 item2 item3)
- 访问元素:${arr[0]}、${arr[@]}(所有元素)、${#arr[@]}(元素个数)
- 添加元素:arr+=("new_item")
最佳实践:
- 使用 set -e 遇到错误立即退出
- 使用 set -u 使用未定义变量时报错
- 使用 set -o pipefail 管道中任何命令失败都返回失败
- 添加注释说明脚本用途
- 使用引号保护变量服务端2月17日 23:37
Linux 文件权限系统如何工作,包括读、写、执行权限以及特殊权限(SUID、SGID、Sticky Bit)的作用是什么?Linux 文件权限系统是 Unix-like 操作系统的核心安全机制之一。每个文件和目录都有三组权限:所有者(owner)、所属组(group)和其他用户(others)。每组权限包含读(r=4)、写(w=2)和执行(x=1)三种基本权限。
权限表示方法有两种:符号表示法(如 rwxr-xr-x)和数字表示法(如 755)。符号表示法中,r 表示读权限,w 表示写权限,x 表示执行权限。数字表示法中,读权限为 4,写权限为 2,执行权限为 1,通过相加得到组合权限值。
常用权限命令包括:
- chmod:修改文件权限,如 chmod 755 filename 或 chmod u+x filename
- chown:修改文件所有者,如 chown user:group filename
- chgrp:修改文件所属组,如 chgrp group filename
特殊权限包括:
- SUID(Set User ID):当执行设置了 SUID 的程序时,程序会以文件所有者的权限运行,而不是执行者的权限
- SGID(Set Group ID):对于文件,执行时以文件所属组的权限运行;对于目录,新创建的文件会继承目录的所属组
- Sticky Bit:对于目录,只有文件所有者和 root 才能删除目录中的文件,即使其他用户有写权限
理解文件权限对于系统安全至关重要,需要根据最小权限原则合理设置。服务端2月17日 23:37
Linux 容器技术(Docker、Kubernetes)的核心概念、常用命令和最佳实践有哪些?Linux 容器技术是现代应用部署和微服务架构的核心技术,Docker 和 Kubernetes 是最主流的容器解决方案。
Docker 基本概念:
- 镜像(Image):只读的文件系统模板,包含运行应用所需的所有依赖
- 容器(Container):镜像的运行实例,轻量级、隔离的运行环境
- 仓库(Repository):存储和分发镜像的地方,如 Docker Hub
- Dockerfile:用于构建镜像的文本文件
- Docker Compose:定义和运行多容器应用的工具
Docker 常用命令:
- 镜像管理:
- docker images:列出本地镜像
- docker pull image:拉取镜像
- docker build -t name .:构建镜像
- docker rmi image:删除镜像
- docker tag image newname:标记镜像
- 容器管理:
- docker run:运行容器
- docker ps:查看运行中的容器
- docker ps -a:查看所有容器
- docker stop container:停止容器
- docker start container:启动容器
- docker restart container:重启容器
- docker rm container:删除容器
- docker exec -it container /bin/bash:进入容器
- 容器操作:
- docker logs container:查看容器日志
- docker cp file container:/path:复制文件到容器
- docker cp container:/path file:从容器复制文件
- docker inspect container:查看容器详细信息
- docker stats:查看容器资源使用情况
Dockerfile 指令:
- FROM:指定基础镜像
- RUN:执行命令
- COPY:复制文件到镜像
- ADD:复制文件到镜像(支持解压缩和 URL)
- CMD:容器启动时执行的命令
- ENTRYPOINT:容器启动时执行的入口点
- ENV:设置环境变量
- ARG:构建时的变量
- EXPOSE:声明容器监听的端口
- VOLUME:声明挂载点
- WORKDIR:设置工作目录
- USER:设置运行用户
Docker Compose:
- 配置文件:docker-compose.yml
- 常用命令:
- docker-compose up:启动服务
- docker-compose down:停止并删除服务
- docker-compose ps:查看服务状态
- docker-compose logs:查看服务日志
- docker-compose exec service command:在服务中执行命令
- 配置示例:
```yaml
version: '3'
services:
web:
build: .
ports:
- "80:80"
volumes:
- ./data:/data
environment:
- ENV=value
```
Kubernetes 基本概念:
- Pod:最小的部署单元,包含一个或多个容器
- Node:运行 Pod 的物理或虚拟机
- Service:为 Pod 提供稳定的网络访问
- Deployment:管理 Pod 的副本和更新
- ReplicaSet:确保指定数量的 Pod 副本在运行
- StatefulSet:管理有状态应用
- DaemonSet:在每个节点上运行一个 Pod
- ConfigMap:配置数据
- Secret:敏感数据
- Namespace:资源隔离
- Ingress:HTTP/HTTPS 路由
Kubernetes 常用命令:
- 集群管理:
- kubectl cluster-info:查看集群信息
- kubectl get nodes:查看节点
- kubectl get namespaces:查看命名空间
- Pod 管理:
- kubectl get pods:查看 Pod
- kubectl describe pod podname:查看 Pod 详情
- kubectl logs podname:查看 Pod 日志
- kubectl exec -it podname /bin/bash:进入 Pod
- kubectl delete pod podname:删除 Pod
- Service 管理:
- kubectl get services:查看服务
- kubectl describe service servicename:查看服务详情
- Deployment 管理:
- kubectl get deployments:查看部署
- kubectl apply -f yaml:应用配置
- kubectl rollout status deployment/deploymentname:查看部署状态
- kubectl scale deployment/deploymentname --replicas=3:扩展副本数
Kubernetes 配置示例:
- Pod 配置:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
ports:
- containerPort: 80
```
- Deployment 配置:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: nginx
ports:
- containerPort: 80
```
容器网络:
- Docker 网络模式:
- bridge:默认模式,容器通过 Docker 网桥通信
- host:容器使用主机网络栈
- none:无网络
- container:共享另一个容器的网络
- Kubernetes 网络模型:
- Pod 网络:所有 Pod 在同一个扁平网络中
- Service 网络:为 Pod 提供稳定的 IP
- Ingress:外部访问入口
容器存储:
- Docker 存储驱动:overlay2、aufs、btrfs、zfs
- 卷(Volume):持久化存储
- 绑定挂载(Bind Mount):将主机目录挂载到容器
- Kubernetes 存储类(StorageClass):动态存储分配
- 持久卷(PersistentVolume):集群级别的存储资源
- 持久卷声明(PersistentVolumeClaim):用户对存储的请求
容器安全:
- 镜像安全:
- 使用官方镜像或可信镜像
- 定期更新镜像
- 扫描镜像漏洞
- 最小化镜像大小
- 运行时安全:
- 使用非 root 用户运行容器
- 限制容器资源
- 使用只读文件系统
- 限制容器能力
- Kubernetes 安全:
- RBAC:基于角色的访问控制
- Network Policy:网络策略
- Pod Security Policy:Pod 安全策略
容器编排最佳实践:
- 微服务架构:将应用拆分为多个微服务
- 健康检查:配置 liveness 和 readiness 探针
- 资源限制:设置 CPU 和内存限制
- 滚动更新:逐步更新应用,避免服务中断
- 自动扩缩容:根据负载自动调整副本数
- 配置管理:使用 ConfigMap 和 Secret 管理配置
- 日志收集:集中收集和分析容器日志
- 监控告警:监控容器和集群状态服务端2月17日 23:37
Linux 文本处理中 grep、sed、awk 命令的常用用法和正则表达式有哪些?Linux 文本处理是系统管理和数据分析的重要技能,掌握这些工具可以大大提高工作效率。
grep(文本搜索):
- 基本用法:grep "pattern" file
- 常用选项:
- -i:忽略大小写
- -v:反向匹配(显示不匹配的行)
- -n:显示行号
- -c:统计匹配行数
- -r:递归搜索目录
- -l:只显示包含匹配的文件名
- -A n:显示匹配行及其后 n 行
- -B n:显示匹配行及其前 n 行
- -C n:显示匹配行及其前后各 n 行
- 正则表达式:grep -E "pattern1|pattern2" file(扩展正则)
- 示例:grep -rn "error" /var/log(递归搜索日志中的错误)
sed(流编辑器):
- 基本用法:sed 'command' file
- 常用命令:
- s/pattern/replacement/:替换(只替换第一个匹配)
- s/pattern/replacement/g:全局替换(替换所有匹配)
- d:删除行
- p:打印行
- n:读取下一行
- 常用选项:
- -i:直接修改文件
- -n:抑制自动输出
- -e:执行多个命令
- 示例:
- sed 's/old/new/g' file(全局替换)
- sed '/pattern/d' file(删除匹配的行)
- sed -i 's/foo/bar/g' file(直接修改文件)
awk(文本处理工具):
- 基本用法:awk 'pattern {action}' file
- 内置变量:
- $0:整行
- $1, $2, ...:第1、2、...个字段
- NF:字段总数
- NR:当前行号
- FNR:当前文件的行号
- FS:字段分隔符(默认空格)
- OFS:输出字段分隔符
- RS:记录分隔符(默认换行符)
- ORS:输出记录分隔符
- 常用函数:
- print:打印
- printf:格式化输出
- length():字符串长度
- substr():子字符串
- split():分割字符串
- gsub():全局替换
- 示例:
- awk '{print $1}' file(打印第一个字段)
- awk -F: '{print $1, $3}' /etc/passwd(以冒号为分隔符)
- awk 'NR==1,NR==10' file(打印第1-10行)
- awk '{sum+=$1} END {print sum}' file(计算第一列总和)
cut(剪切工具):
- 基本用法:cut [options] file
- 常用选项:
- -d:指定分隔符
- -f:指定字段
- -c:指定字符位置
- 示例:
- cut -d: -f1 /etc/passwd(以冒号为分隔符,提取第一个字段)
- cut -c1-10 file(提取每行的前10个字符)
sort(排序工具):
- 基本用法:sort [options] file
- 常用选项:
- -n:按数值排序
- -r:倒序
- -k:指定排序字段
- -t:指定分隔符
- -u:去重
- 示例:
- sort -n -k2 file(按第二列数值排序)
- sort -t: -k3 -n /etc/passwd(按第三列数值排序)
uniq(去重工具):
- 基本用法:uniq [options] file
- 常用选项:
- -c:统计重复次数
- -d:只显示重复的行
- -u:只显示不重复的行
- 示例:
- sort file | uniq -c(排序后统计重复次数)
组合使用:
- 统计日志中错误数量:grep "error" log | wc -l
- 查找访问量最高的 IP:awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
- 提取文件中的邮箱:grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file服务端2月17日 23:36
Linux 系统安全加固措施有哪些,包括用户管理、SSH 配置和防火墙设置?Linux 系统安全是运维和开发人员必须掌握的重要知识,涉及用户管理、权限控制、防火墙配置等多个方面。
用户和组管理:
- useradd:创建用户,如 useradd -m -s /bin/bash username(创建用户并设置家目录和 shell)
- userdel:删除用户,如 userdel -r username(删除用户及其家目录)
- usermod:修改用户属性,如 usermod -aG group username(将用户添加到组)
- passwd:修改用户密码,如 passwd username
- groupadd:创建组,如 groupadd groupname
- groupdel:删除组,如 groupdel groupname
- gpasswd:管理组,如 gpasswd -a username groupname(将用户添加到组)
- id:查看用户 ID 和组信息
- whoami:查看当前用户
- w:查看当前登录用户
SSH 安全配置:
- 配置文件:/etc/ssh/sshd_config
- 禁用 root 登录:PermitRootLogin no
- 禁用密码登录:PasswordAuthentication no(使用密钥认证)
- 修改默认端口:Port 2222
- 限制登录用户:AllowUsers user1 user2
- 密钥认证:ssh-keygen 生成密钥对,将公钥复制到服务器的 ~/.ssh/authorized_keys
- 使用 ssh-copy-id:ssh-copy-id user@host
防火墙配置:
- iptables:传统防火墙工具
- 查看规则:iptables -L -n
- 添加规则:iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 删除规则:iptables -D INPUT 1
- 保存规则:iptables-save > /etc/iptables/rules.v4
- firewalld:动态防火墙管理
- 查看规则:firewall-cmd --list-all
- 开放端口:firewall-cmd --add-port=80/tcp --permanent
- 重载配置:firewall-cmd --reload
- ufw:简化防火墙配置(Ubuntu)
- 启用防火墙:ufw enable
- 开放端口:ufw allow 22
- 查看状态:ufw status
文件权限和 SELinux:
- chmod:修改文件权限
- chown:修改文件所有者
- chgrp:修改文件所属组
- SELinux:安全增强型 Linux
- 查看状态:getenforce
- 临时禁用:setenforce 0
- 永久禁用:修改 /etc/selinux/config
- 查看上下文:ls -Z
系统加固:
- 禁用不必要的服务:systemctl disable service
- 更新系统:apt update && apt upgrade(Debian/Ubuntu)或 yum update(CentOS/RHEL)
- 配置自动更新:unattended-upgrades(Debian/Ubuntu)
- 安装安全工具:fail2ban(防止暴力破解)、rkhunter(检测 rootkit)
- 配置日志审计:auditd
- 限制 sudo 权限:编辑 /etc/sudoers,使用 visudo 命令
安全审计:
- 查看登录日志:last、lastlog
- 查看认证日志:/var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL)
- 查看系统日志:/var/log/messages、journalctl
- 查看进程:ps aux、top
- 查看网络连接:ss -tulnp、netstat -tulnp
- 查看开放端口:nmap localhost
应急响应:
- 检查异常进程:ps aux | grep -v grep | grep -E "bash|sh|python|perl"
- 检查异常网络连接:ss -tulnp | grep ESTABLISHED
- 检查异常文件:find / -perm -4000 -o -perm -2000(查找 SUID/SGID 文件)
- 检查用户登录:last、lastlog
- 隔离受感染系统:断开网络连接
- 备份重要数据:在清理前备份关键数据服务端2月17日 23:36
Linux 系统性能监控有哪些常用工具,如何分析 CPU、内存、磁盘和网络的使用情况?Linux 系统性能监控是运维工程师的重要技能,需要掌握多种工具来诊断系统瓶颈。
CPU 监控:
- top/htop:实时查看 CPU 使用率、进程信息
- vmstat:报告虚拟内存统计信息,如 vmstat 1 5(每秒更新一次,共5次)
- mpstat:显示各个 CPU 核心的使用情况,如 mpstat -P ALL 1
- sar:系统活动报告,如 sar -u 1 10(每秒采集一次,共10次)
内存监控:
- free:显示内存使用情况,free -h 以人类可读格式显示
- vmstat:查看内存交换、缓存等信息
- ps aux:查看进程的内存占用(VSZ、RSS)
- pmap:查看进程的内存映射
磁盘监控:
- df:查看磁盘空间使用情况,df -h 以人类可读格式显示
- du:查看目录或文件的大小,du -sh directory
- iostat:查看磁盘 I/O 统计信息,如 iostat -x 1
- iotop:实时查看磁盘 I/O 使用情况(需要 root 权限)
网络监控:
- ifconfig/ip:查看网络接口配置
- netstat/ss:查看网络连接和端口监听,如 netstat -tulnp 或 ss -tulnp
- nethogs:按进程查看网络带宽使用
- tcpdump:抓包分析网络流量,如 tcpdump -i eth0 port 80
日志分析:
- /var/log/messages:系统主日志
- /var/log/syslog:系统日志(Debian/Ubuntu)
- /var/log/dmesg:内核启动日志
- journalctl:systemd 日志查看工具,如 journalctl -f(实时查看)
综合监控工具:
- dstat:集成了 vmstat、iostat、netstat 等功能
- glances:基于 Web 的系统监控工具
- prometheus + grafana:企业级监控解决方案
性能优化建议:
- CPU:优化算法、减少不必要的计算、使用多进程/多线程
- 内存:减少内存泄漏、优化数据结构、使用缓存
- 磁盘:使用 SSD、优化文件系统、减少 I/O 操作
- 网络:使用 CDN、优化 TCP 参数、减少网络请求服务端2月17日 23:35
Linux 系统服务管理中如何使用 systemctl 和 service 命令管理服务?Linux 系统服务管理是运维工程师的核心技能,主要涉及 systemd 和传统的 init 系统。
systemd 服务管理:
- systemctl start service:启动服务
- systemctl stop service:停止服务
- systemctl restart service:重启服务
- systemctl reload service:重新加载配置(不中断服务)
- systemctl status service:查看服务状态
- systemctl enable service:设置服务开机自启
- systemctl disable service:取消服务开机自启
- systemctl is-enabled service:检查服务是否开机自启
- systemctl list-units --type=service:列出所有服务
- systemctl list-unit-files --type=service:列出所有服务文件
- systemctl daemon-reload:重新加载 systemd 配置
服务配置文件:
- 位置:/etc/systemd/system/ 或 /usr/lib/systemd/system/
- 示例:/etc/systemd/system/nginx.service
服务配置文件格式:
```ini
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
传统 init 服务管理(SysVinit):
- service service start:启动服务
- service service stop:停止服务
- service service restart:重启服务
- service service status:查看服务状态
- chkconfig --list:列出所有服务
- chkconfig service on:设置服务开机自启
- chkconfig service off:取消服务开机自启
服务日志管理:
- journalctl -u service:查看特定服务的日志
- journalctl -u service -f:实时查看服务日志
- journalctl -u service --since today:查看今天的日志
- journalctl -u service --since "2024-01-01" --until "2024-01-02":查看指定时间段的日志
- journalctl -p err:查看错误级别的日志
- /var/log/messages:系统主日志
- /var/log/syslog:系统日志(Debian/Ubuntu)
服务故障排查:
- 检查服务状态:systemctl status service
- 查看服务日志:journalctl -u service
- 检查配置文件:cat /etc/systemd/system/service.service
- 检查端口监听:ss -tulnp | grep service
- 检查进程:ps aux | grep service
- 手动启动测试:直接运行服务的可执行文件
服务优化:
- 调整启动顺序:使用 After 和 Wants 指令
- 设置资源限制:使用 LimitCPU、LimitMEM 等指令
- 配置自动重启:Restart=on-failure、RestartSec=10s
- 优化启动时间:使用 Type=simple 或 Type=notify服务端2月17日 23:35
Linux 系统监控和告警的常用工具、配置方法和最佳实践有哪些?Linux 系统监控和告警是保障系统稳定运行的重要手段,需要掌握各种监控工具和告警机制。
系统监控工具:
- CPU 监控:
- top:实时查看 CPU 使用率和进程信息
- htop:交互式进程查看器,功能更强大
- mpstat:显示各个 CPU 核心的使用情况
- sar:系统活动报告,可记录历史数据
- vmstat:报告虚拟内存统计信息
- 内存监控:
- free:显示内存使用情况
- vmstat:查看内存交换、缓存等信息
- ps aux:查看进程的内存占用
- pmap:查看进程的内存映射
- 磁盘监控:
- df:查看磁盘空间使用情况
- du:查看目录或文件的大小
- iostat:查看磁盘 I/O 统计信息
- iotop:实时查看磁盘 I/O 使用情况
- 网络监控:
- ifconfig/ip:查看网络接口配置
- netstat/ss:查看网络连接和端口监听
- nethogs:按进程查看网络带宽使用
- tcpdump:抓包分析网络流量
- iftop:实时显示网络带宽使用
- 进程监控:
- ps:查看进程状态
- top/htop:实时监控进程
- pgrep:查找进程 ID
- pidstat:监控进程资源使用
性能分析工具:
- strace:跟踪系统调用和信号
- ltrace:跟踪库函数调用
- perf:性能分析工具
- sysdig:系统级监控和故障排查
- eBPF:扩展伯克利数据包过滤器
日志监控:
- /var/log/messages:系统主日志
- /var/log/syslog:系统日志(Debian/Ubuntu)
- /var/log/auth.log:认证日志
- /var/log/secure:安全日志(CentOS/RHEL)
- journalctl:systemd 日志查看工具
- logrotate:日志轮转工具
监控告警系统:
- Nagios:企业级监控系统
- Zabbix:分布式监控系统
- Prometheus:时序数据库和监控系统
- Grafana:数据可视化平台
- ELK Stack(Elasticsearch、Logstash、Kibana):日志分析和可视化
- Datadog:云监控平台
- New Relic:应用性能监控
Prometheus 监控:
- 数据采集:使用 Exporter 采集指标
- 常用 Exporter:
- node_exporter:系统指标
- mysqld_exporter:MySQL 指标
- nginx_exporter:Nginx 指标
- redis_exporter:Redis 指标
- 配置文件:/etc/prometheus/prometheus.yml
- 告警规则:使用 PromQL 定义告警条件
- 告警管理:Alertmanager 处理告警通知
Grafana 可视化:
- 数据源配置:支持 Prometheus、Elasticsearch 等
- 仪表板:创建自定义监控面板
- 告警:基于可视化图表设置告警
- 模板:使用变量创建动态仪表板
告警通知方式:
- 邮件:SMTP 邮件通知
- 短信:短信网关
- 即时通讯:Slack、钉钉、企业微信
- 电话:语音通知
- Webhook:自定义 Web 回调
告警策略:
- 告警级别:Critical、Warning、Info
- 告警阈值:根据业务需求设置合理阈值
- 告警抑制:避免告警风暴
- 告警聚合:相关告警合并通知
- 告警升级:长时间未处理自动升级
自定义监控脚本:
- 编写 Shell/Python 脚本采集指标
- 使用 cron 定时执行
- 输出格式:支持 Nagios、Prometheus 等格式
- 示例:
```bash
#!/bin/bash
# 检查磁盘使用率
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "CRITICAL: Disk usage is ${DISK_USAGE}%"
exit 2
fi
echo "OK: Disk usage is ${DISK_USAGE}%"
exit 0
```
监控最佳实践:
- 全面监控:覆盖 CPU、内存、磁盘、网络等关键指标
- 合理采样:避免监控数据量过大
- 告警分级:区分紧急和一般告警
- 告警收敛:避免重复告警
- 定期维护:清理过期数据,更新监控规则
- 文档记录:维护监控配置文档
- 测试验证:定期测试告警机制
常见监控指标:
- 系统指标:CPU 使用率、内存使用率、磁盘使用率、网络流量
- 应用指标:请求数、响应时间、错误率、并发数
- 业务指标:订单量、用户数、交易额
故障排查流程:
1. 确认告警信息
2. 查看系统监控数据
3. 检查相关服务状态
4. 分析日志文件
5. 定位问题根因
6. 实施修复措施
7. 验证修复效果
8. 总结经验教训服务端2月17日 23:35
Linux 网络配置和管理中常用的命令有哪些,如何配置网络接口、DNS 和防火墙?Linux 网络配置和管理是系统管理员的核心技能之一。
网络配置文件:
- /etc/network/interfaces(Debian/Ubuntu):网络接口配置文件
- /etc/sysconfig/network-scripts/ifcfg-*(CentOS/RHEL):网络接口配置文件
- /etc/resolv.conf:DNS 解析配置文件
- /etc/hosts:主机名到 IP 地址的映射
- /etc/hostname:主机名配置
网络配置命令:
- ifconfig:配置和显示网络接口(已废弃,推荐使用 ip 命令)
- ip:新一代网络配置工具,如 ip addr show(显示 IP 地址)、ip link show(显示网络接口)、ip route show(显示路由表)
- route:显示和操作 IP 路由表,如 route -n(显示路由表)、route add default gw 192.168.1.1(添加默认网关)
- netstat:网络统计工具,如 netstat -tulnp(显示 TCP/UDP 监听端口)、netstat -an(显示所有连接)
- ss:netstat 的替代工具,性能更好,如 ss -tulnp
- ping:测试网络连通性,如 ping -c 4 google.com
- traceroute:跟踪数据包路由,如 traceroute google.com
- nslookup/dig:DNS 查询工具,如 dig google.com
- curl/wget:下载工具,curl -I http://example.com(查看响应头)
- telnet:测试端口连通性,如 telnet host port
- nc(netcat):网络工具,如 nc -zv host port(测试端口)
网络服务管理:
- systemctl:管理网络服务,如 systemctl restart network(重启网络服务)
- service:传统服务管理命令,如 service network restart
防火墙配置:
- iptables:传统的防火墙工具,如 iptables -L(列出规则)、iptables -A INPUT -p tcp --dport 80 -j ACCEPT(添加规则)
- firewalld:动态防火墙管理守护进程,如 firewall-cmd --list-all(查看规则)、firewall-cmd --add-port=80/tcp(开放端口)
- ufw:简化防火墙配置工具(Ubuntu),如 ufw allow 80(开放端口)
网络故障排查:
- 检查网络接口:ip addr show 或 ifconfig
- 检查路由表:ip route show 或 route -n
- 检查 DNS:cat /etc/resolv.conf、dig domain.com
- 检查端口监听:ss -tulnp 或 netstat -tulnp
- 检查网络连通性:ping、traceroute
- 抓包分析:tcpdump -i eth0 port 80
- 查看网络统计:sar -n DEV 1
网络性能优化:
- 调整 TCP 参数:修改 /etc/sysctl.conf,如 net.ipv4.tcp_tw_reuse=1
- 增加连接数:net.core.somaxconn、net.ipv4.tcp_max_syn_backlog
- 优化网络缓冲区:net.core.rmem_max、net.core.wmem_max服务端2月17日 23:34
Linux 进程管理中常用的命令有哪些,如何查看、终止和管理后台进程?Linux 进程管理是系统运维和开发的核心技能。每个进程都有唯一的进程 ID(PID),父进程 ID(PPID),以及运行状态。
常用进程管理命令:
- ps:查看当前进程状态,常用选项包括 ps aux(显示所有进程)、ps -ef(完整格式显示)、ps -l(长格式显示)
- top/htop:实时监控系统进程和资源使用情况,htop 提供更友好的交互界面
- kill:终止进程,如 kill PID(发送 SIGTERM 信号)、kill -9 PID(强制终止,发送 SIGKILL 信号)
- killall:按进程名终止进程,如 killall nginx
- pkill:按模式匹配终止进程,如 pkill -f "python script.py"
- pgrep:查找进程 ID,如 pgrep nginx
- nohup:让命令在后台持续运行,如 nohup command &
- &:在后台运行命令,如 command &
- jobs:查看当前 shell 的后台任务
- bg/fg:将任务切换到后台/前台运行
进程状态包括:
- R(Running):正在运行或在运行队列中等待
- S(Sleeping):可中断睡眠
- D(Uninterruptible Sleep):不可中断睡眠
- T(Stopped):已停止
- Z(Zombie):僵尸进程
僵尸进程是已完成但父进程尚未读取其退出状态的进程,需要父进程调用 wait() 或 waitpid() 来回收。孤儿进程是父进程已终止但仍在运行的进程,会被 init 进程(PID 1)收养。
进程间通信(IPC)方式包括管道、消息队列、共享内存、信号量、套接字等。