服务端2月17日 23:39
Linux 定时任务 cron 的时间格式、常用命令和最佳实践有哪些?Linux 定时任务(cron)是自动化运维的重要工具,可以定期执行脚本和命令。
cron 基本概念:
- cron 是 Linux 系统的定时任务调度器
- 由 cron 守护进程(crond)负责执行定时任务
- 配置文件:/etc/crontab(系统级)、/var/spool/cron/username(用户级)
- 时间格式:分 时 日 月 周 命令
时间格式说明:
- 分(0-59):每小时的第几分钟
- 时(0-23):每天的第几小时
- 日(1-31):每月的第几天
- 月(1-12):每年的第几个月
- 周(0-7,0 和 7 都表示周日):每周的第几天
特殊符号:
- *:匹配所有值
- ,:分隔多个值,如 1,3,5 表示第 1、3、5
- -:表示范围,如 1-5 表示 1 到 5
- /n:表示间隔,如 */5 表示每 5 个单位
常用示例:
- 每分钟执行:* * * * * command
- 每小时执行:0 * * * * command
- 每天凌晨 2 点执行:0 2 * * * command
- 每周一凌晨 3 点执行:0 3 * * 1 command
- 每月 1 号凌晨 4 点执行:0 4 1 * * command
- 每 5 分钟执行一次:*/5 * * * * command
- 工作日(周一到周五)每天上午 9 点执行:0 9 * * 1-5 command
crontab 命令:
- crontab -e:编辑当前用户的定时任务
- crontab -l:列出当前用户的定时任务
- crontab -r:删除当前用户的所有定时任务
- crontab -u username -e:编辑指定用户的定时任务(需要 root 权限)
系统级定时任务:
- /etc/crontab:系统级定时任务配置文件
- /etc/cron.hourly/:每小时执行的任务目录
- /etc/cron.daily/:每天执行的任务目录
- /etc/cron.weekly/:每周执行的任务目录
- /etc/cron.monthly/:每月执行的任务目录
环境变量:
- cron 任务执行时环境变量与用户登录时不同
- 可以在 crontab 文件中定义环境变量
- 建议在脚本中使用绝对路径
- 可以在脚本开头 source 环境变量文件:source ~/.bashrc
日志和调试:
- cron 日志位置:/var/log/syslog 或 /var/log/cron
- 查看日志:grep CRON /var/log/syslog
- 调试技巧:将输出重定向到日志文件:command >> /tmp/cron.log 2>&1
- 发送邮件:cron 默认会将输出发送到用户邮箱
最佳实践:
- 使用绝对路径
- 在脚本中设置正确的环境变量
- 添加日志记录便于调试
- 使用锁文件防止重复执行
- 测试脚本后再添加到 cron
- 合理设置执行时间,避免系统高峰期
- 定期检查 cron 任务执行情况
常见问题:
- 脚本权限不足:确保脚本有执行权限(chmod +x script.sh)
- 环境变量问题:在脚本中显式设置环境变量
- 路径问题:使用绝对路径或切换到正确目录
- 时区问题:确保系统时区正确
- cron 服务未启动:systemctl status cron 或 systemctl start cron
anacron(异步 cron):
- 用于不是 24 小时运行的系统
- 配置文件:/etc/anacrontab
- 适合笔记本电脑等不常开机的设备
- 会检查上次执行时间,如果错过则补执行
systemd 定时器:
- systemd 的定时任务替代方案
- 配置文件:/etc/systemd/system/*.timer
- 查看定时器:systemctl list-timers
- 更灵活的调度选项
- 更好的日志集成标签
Linux
Linux 是一个广泛使用的开源操作系统内核,由林纳斯·托瓦兹(Linus Torvalds)于1991年创建。它是 Unix-like 操作系统的一个重要分支,并且它的设计和实现遵循了模块化的设计原则。Linux 内核本身可以与不同的用户空间组件配合,形成完整的操作系统。这些完整的系统被称为 Linux 发行版,例如 Ubuntu、Fedora、Debian、CentOS 和 Arch Linux 等。

服务端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 系统备份和恢复的常用工具、策略和最佳实践有哪些?Linux 系统备份和恢复是数据安全的重要保障,需要掌握各种备份策略和恢复方法。
备份类型:
- 完全备份(Full Backup):备份所有数据
- 增量备份(Incremental Backup):只备份自上次备份以来变化的数据
- 差异备份(Differential Backup):备份自上次完全备份以来变化的数据
- 热备份(Hot Backup):在系统运行时进行备份
- 冷备份(Cold Backup):在系统停止时进行备份
备份工具:
- tar:归档工具
- 常用选项:
- -c:创建归档
- -x:提取归档
- -v:显示详细信息
- -f:指定归档文件
- -z:使用 gzip 压缩
- -j:使用 bzip2 压缩
- 示例:
- tar -czvf backup.tar.gz /path/to/backup:创建压缩备份
- tar -xzvf backup.tar.gz:提取压缩备份
- tar -czvf backup-$(date +%Y%m%d).tar.gz /path/to/backup:带时间戳的备份
- rsync:同步和备份工具
- 常用选项:
- -a:归档模式,保留文件属性
- -v:显示详细信息
- -z:压缩传输
- --delete:删除目标中多余的文件
- --exclude:排除文件或目录
- 示例:
- rsync -avz /source/ /destination/:同步目录
- rsync -avz --delete /source/ /destination/:同步并删除多余文件
- rsync -avz --exclude '*.log' /source/ /destination/:排除日志文件
- dd:磁盘和分区备份工具
- 示例:
- dd if=/dev/sda of=/backup/sda.img:备份整个磁盘
- dd if=/dev/sda1 of=/backup/sda1.img:备份分区
- dd if=/backup/sda.img of=/dev/sda:恢复磁盘
- dump/restore:文件系统备份工具(ext2/ext3/ext4)
- dump -0u -f /backup/root.dump /:备份根文件系统
- restore -rf /backup/root.dump:恢复文件系统
- Bacula:企业级备份解决方案
- Amanda:高级 Maryland 自动网络磁盘归档器
- Duplicity:加密备份工具
- Borg:去重备份工具
数据库备份:
- MySQL:
- mysqldump:逻辑备份工具
- mysqldump -u root -p database > backup.sql:备份数据库
- mysqldump -u root -p --all-databases > all.sql:备份所有数据库
- mysqldump -u root -p --single-transaction database > backup.sql:一致性备份
- mysql -u root -p database < backup.sql:恢复数据库
- mysqlhotcopy:物理备份工具(MyISAM)
- Percona XtraBackup:物理备份工具(InnoDB)
- PostgreSQL:
- pg_dump:逻辑备份工具
- pg_dump database > backup.sql:备份数据库
- pg_dumpall > all.sql:备份所有数据库
- psql database < backup.sql:恢复数据库
- pg_basebackup:物理备份工具
- MongoDB:
- mongodump:备份工具
- mongorestore:恢复工具
系统备份策略:
- 3-2-1 原则:
- 3 份备份副本
- 2 种不同介质
- 1 份异地备份
- 备份频率:
- 完全备份:每周一次
- 增量备份:每天一次
- 差异备份:每天一次
- 保留策略:
- 每日备份保留 7 天
- 每周备份保留 4 周
- 每月备份保留 12 个月
- 自动化备份:
- 使用 cron 定时执行备份脚本
- 示例:
```bash
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
tar -czvf $BACKUP_DIR/backup-$DATE.tar.gz /path/to/backup
find $BACKUP_DIR -name "backup-*.tar.gz" -mtime +7 -delete
```
云备份解决方案:
- AWS S3:对象存储服务
- Azure Blob Storage:Azure 对象存储
- Google Cloud Storage:Google 云存储
- 阿里云 OSS:阿里云对象存储
- 腾讯云 COS:腾讯云对象存储
- rclone:多云存储同步工具
备份验证:
- 定期测试恢复流程
- 验证备份完整性
- 检查备份文件大小
- 使用校验和验证数据
恢复策略:
- 完全恢复:从完全备份恢复
- 增量恢复:从完全备份开始,依次应用增量备份
- 差异恢复:从完全备份开始,应用最新的差异备份
- 时间点恢复:恢复到指定时间点(需要 binlog)
- 灾难恢复:异地备份恢复
备份最佳实践:
- 制定备份策略文档
- 自动化备份流程
- 定期测试恢复
- 加密敏感数据
- 监控备份状态
- 保留多个备份版本
- 异地备份
- 定期审查备份策略
- 文档化恢复流程
故障排查:
- 备份失败:检查磁盘空间、权限、网络连接
- 恢复失败:验证备份文件完整性、检查目标路径
- 性能问题:优化备份时间、使用增量备份
- 存储空间不足:清理旧备份、使用压缩服务端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 包管理工具(APT、YUM、PACMAN)的使用方法和常见操作有哪些?Linux 包管理是系统维护和软件安装的核心技能,不同的发行版使用不同的包管理工具。
Debian/Ubuntu 包管理(APT):
- apt update:更新软件包列表
- apt upgrade:升级已安装的软件包
- apt full-upgrade:升级软件包(可能删除依赖包)
- apt install package:安装软件包
- apt remove package:删除软件包(保留配置文件)
- apt purge package:删除软件包及其配置文件
- apt autoremove:删除不再需要的依赖包
- apt search keyword:搜索软件包
- apt show package:显示软件包详细信息
- apt list --installed:列出已安装的软件包
- apt-cache depends package:查看软件包依赖关系
- apt-cache rdepends package:查看依赖该软件包的其他包
- dpkg -l:列出已安装的软件包
- dpkg -i package.deb:安装 .deb 文件
- dpkg -r package:删除软件包
- dpkg -P package:删除软件包及其配置文件
CentOS/RHEL 包管理(YUM/DNF):
- yum update:更新软件包列表和已安装的软件包
- yum install package:安装软件包
- yum remove package:删除软件包
- yum search keyword:搜索软件包
- yum info package:显示软件包详细信息
- yum list installed:列出已安装的软件包
- yum provides command:查找提供某个命令的软件包
- yum check-update:检查可更新的软件包
- yum clean all:清理缓存
- yum deplist package:查看软件包依赖关系
- rpm -qa:列出所有已安装的软件包
- rpm -ivh package.rpm:安装 .rpm 文件
- rpm -e package:删除软件包
- rpm -q package:查询软件包是否已安装
- rpm -ql package:列出软件包安装的文件
- rpm -qf file:查找文件属于哪个软件包
Arch Linux 包管理(PACMAN):
- pacman -Syu:同步软件包数据库并升级系统
- pacman -S package:安装软件包
- pacman -R package:删除软件包
- pacman -Rs package:删除软件包及其依赖
- pacman -Rns package:删除软件包、依赖和配置文件
- pacman -Ss keyword:搜索软件包
- pacman -Si package:显示软件包详细信息
- pacman -Qe:列出显式安装的软件包
- pacman -Qm:列出从 AUR 安装的软件包
- pacman -Fy:同步文件数据库
- pacman -Fo command:查找提供某个命令的软件包
软件源配置:
- Debian/Ubuntu:/etc/apt/sources.list 和 /etc/apt/sources.list.d/
- CentOS/RHEL:/etc/yum.repos.d/
- Arch Linux:/etc/pacman.conf
第三方软件仓库:
- EPEL(Extra Packages for Enterprise Linux):为 RHEL/CentOS 提供额外软件包
- PPA(Personal Package Archive):Ubuntu 用户个人软件仓库
- AUR(Arch User Repository):Arch Linux 用户软件仓库
包管理最佳实践:
- 定期更新系统:apt update && apt upgrade 或 yum update
- 使用版本锁定:apt-mark hold package 或 yum versionlock package
- 清理缓存:apt autoremove && apt clean 或 yum clean all
- 备份重要配置:在升级前备份 /etc 目录
- 测试环境验证:在生产环境更新前先在测试环境验证
- 使用自动化工具:Ansible、Chef、Puppet 等进行批量管理
常见问题解决:
- 依赖冲突:使用 apt -f install 或 yum --skip-broken
- 软件包损坏:使用 dpkg --configure -a 或 yum reinstall package
- 锁定问题:删除 /var/lib/dpkg/lock 或 /var/run/yum.pid
- 找不到软件包:检查软件源配置,运行 apt update 或 yum makecache服务端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 管道和重定向的使用方法和常见场景有哪些?Linux 管道和重定向是命令行操作的核心功能,可以实现进程间通信和数据流控制。
标准输入输出:
- 标准输入(stdin,文件描述符 0):默认来自键盘
- 标准输出(stdout,文件描述符 1):默认输出到屏幕
- 标准错误(stderr,文件描述符 2):默认输出到屏幕
- /dev/stdin:标准输入设备
- /dev/stdout:标准输出设备
- /dev/stderr:标准错误设备
重定向操作符:
- 输出重定向:
- >:将标准输出重定向到文件(覆盖)
- >>:将标准输出追加到文件
- 2>:将标准错误重定向到文件(覆盖)
- 2>>:将标准错误追加到文件
- &>:将标准输出和标准错误重定向到文件(覆盖)
- &>>:将标准输出和标准错误追加到文件
- >file 2>&1:将标准输出和标准错误都重定向到文件
- 2>&1:将标准错误重定向到标准输出
- 输入重定向:
- <:从文件读取输入
- <<:here document,从命令行读取输入直到遇到定界符
- <<<:here string,从字符串读取输入
- 文件描述符重定向:
- n>&m:将文件描述符 n 重定向到文件描述符 m
- n<&m:将文件描述符 n 重定向为文件描述符 m 的副本
- 禁用输出:
- > /dev/null:将输出重定向到空设备(丢弃)
- 2> /dev/null:将错误重定向到空设备(丢弃)
管道操作符:
- |:将前一个命令的标准输出作为后一个命令的标准输入
- |&:将前一个命令的标准输出和标准错误作为后一个命令的标准输入
- 管道示例:
- ps aux | grep nginx:查找 nginx 进程
- cat file.txt | grep "pattern" | wc -l:统计匹配行数
- ls -l | awk '{print $5}' | sort -n:按文件大小排序
- find / -name "*.log" 2>/dev/null | xargs grep "error":查找日志中的错误
常用管道命令:
- grep:文本搜索
- awk:文本处理
- sed:流编辑器
- sort:排序
- uniq:去重
- cut:剪切
- head:显示前几行
- tail:显示后几行
- wc:统计行数、字数、字符数
- tee:读取标准输入并写入文件和标准输出
- xargs:从标准输入构建并执行命令
tee 命令:
- tee:读取标准输入,写入文件和标准输出
- 常用选项:
- -a:追加到文件(不覆盖)
- -i:忽略中断信号
- 示例:
- command | tee output.txt:将输出保存到文件并显示在屏幕
- command | tee -a output.txt:将输出追加到文件并显示在屏幕
xargs 命令:
- xargs:从标准输入读取参数并执行命令
- 常用选项:
- -n num:每次使用 num 个参数
- -I str:用 str 替换输入中的参数
- -p:执行前提示确认
- -t:显示执行的命令
- 示例:
- find . -name "*.txt" | xargs rm -f:删除所有 .txt 文件
- echo "file1 file2" | xargs -n 1 cat:逐个显示文件内容
- ls *.jpg | xargs -I {} cp {} /backup/:复制所有 jpg 文件到备份目录
进程替换:
- <(command):将命令的输出作为临时文件
- >(command):将命令的输入作为临时文件
- 示例:
- diff <(sort file1) <(sort file2):比较排序后的文件
- command > >(logger):将输出发送到日志系统
命名管道(FIFO):
- mkfifo:创建命名管道
- 命名管道是文件系统中的特殊文件
- 允许不相关的进程进行通信
- 示例:
- mkfifo mypipe
- cat > mypipe:向管道写入数据
- cat < mypipe:从管道读取数据
实际应用示例:
- 日志分析:
- tail -f /var/log/nginx/access.log | grep "404":实时监控 404 错误
- cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10:统计访问量最高的 IP
- 数据处理:
- cat data.csv | cut -d, -f1 | sort | uniq:提取第一列并去重
- ps aux | awk '{sum+=$3} END {print sum}':计算 CPU 总使用率
- 系统监控:
- vmstat 1 | awk '{print $4}':监控内存使用
- iostat -x 1 | grep -v "^$": 监控磁盘 I/O
- 批量操作:
- find . -type f -name "*.sh" | xargs chmod +x:批量添加执行权限
- cat servers.txt | xargs -I {} ssh {} "uptime":批量查看服务器运行时间
最佳实践:
- 使用管道连接简单命令,构建复杂功能
- 合理使用重定向保存输出结果
- 使用 /dev/null 丢弃不需要的输出
- 使用 tee 同时查看和保存输出
- 使用 xargs 处理大量文件
- 注意管道的缓冲区限制
- 处理错误输出时使用 2>&1 或 |&服务端2月17日 23:36
Linux 系统启动流程包括哪些阶段,从 BIOS/UEFI 到用户登录的详细过程是什么?Linux 系统启动流程是理解系统工作原理的重要知识,掌握启动流程有助于故障排查和系统优化。
BIOS/UEFI 启动阶段:
- BIOS(Basic Input/Output System):
- 传统固件接口
- 执行 POST(Power-On Self-Test)自检
- 检测硬件设备
- 查找可启动设备
- 加载 MBR(Master Boot Record)
- UEFI(Unified Extensible Firmware Interface):
- 现代固件接口
- 支持 GPT 分区表
- 启动速度更快
- 支持安全启动
- 加载 EFI 应用程序
引导加载程序阶段:
- GRUB(Grand Unified Bootloader):
- 最常用的 Linux 引导加载程序
- 支持 GRUB Legacy(0.97)和 GRUB 2
- 配置文件:/boot/grub/grub.cfg(GRUB 2)、/boot/grub/menu.lst(GRUB Legacy)
- 支持 Linux、Windows 等多系统引导
- 提供命令行界面进行故障恢复
- LILO(Linux Loader):
- 传统的 Linux 引导加载程序
- 配置文件:/etc/lilo.conf
- 已被 GRUB 取代
- systemd-boot:
- 简单的 UEFI 引导加载程序
- 配置文件:/boot/loader/entries/*.conf
- 适合简单的启动场景
内核加载阶段:
- 加载内核镜像:/boot/vmlinuz-*
- 加载 initramfs(初始 RAM 文件系统):/boot/initrd.img-*
- 内核解压缩并初始化
- 检测和初始化硬件设备
- 挂载根文件系统
- 启动 init 进程(PID 1)
init 进程阶段:
- SysVinit(传统 init 系统):
- 配置文件:/etc/inittab
- 运行级别(runlevel):0-6
- 0:关机
- 1:单用户模式
- 2:多用户模式(无网络)
- 3:多用户模式(有网络)
- 4:未使用
- 5:图形界面模式
- 6:重启
- 启动脚本:/etc/rc.d/rc*.d/ 或 /etc/rc*.d/
- 使用 chkconfig 管理服务
- systemd(现代 init 系统):
- 配置文件:/etc/systemd/system/
- 目标(target):类似于运行级别
- poweroff.target:关机
- rescue.target:救援模式
- multi-user.target:多用户模式
- graphical.target:图形界面模式
- reboot.target:重启
- 使用 systemctl 管理服务
- 支持并行启动,启动速度更快
- 更好的日志集成(journalctl)
系统服务启动阶段:
- SysVinit:
- 按 runlevel 顺序启动服务
- 执行 /etc/rc.d/rcN.d/ 目录下的脚本
- S 开头的脚本表示启动(Start)
- K 开头的脚本表示停止(Kill)
- systemd:
- 并行启动服务
- 根据依赖关系确定启动顺序
- 执行 .service 文件定义的服务
登录阶段:
- 显示登录提示符
- 用户输入用户名和密码
- 验证用户凭据
- 启动用户 shell
- 执行用户配置文件:~/.bash_profile、~/.bashrc
启动过程的关键文件:
- /boot/grub/grub.cfg:GRUB 2 配置文件
- /boot/grub/menu.lst:GRUB Legacy 配置文件
- /etc/inittab:SysVinit 配置文件
- /etc/systemd/system/default.target:systemd 默认启动目标
- /etc/fstab:文件系统挂载配置
- /etc/hostname:主机名配置
- /etc/hosts:主机名到 IP 映射
启动故障排查:
- GRUB 故障:
- 修复 GRUB:grub-install /dev/sda
- 重建 GRUB 配置:update-grub 或 grub2-mkconfig -o /boot/grub2/grub.cfg
- 进入 GRUB 命令行:按 'c' 键
- 内核故障:
- 查看内核日志:dmesg、journalctl -k
- 尝试恢复模式:在 GRUB 菜单选择 recovery mode
- 使用旧内核启动
- 文件系统故障:
- 修复文件系统:fsck /dev/sda1
- 检查 /etc/fstab 配置
- 服务启动故障:
- 查看服务状态:systemctl status service
- 查看服务日志:journalctl -u service
- 禁用故障服务:systemctl disable service
启动优化:
- 减少 GRUB 等待时间:修改 /etc/default/grub 中的 GRUB_TIMEOUT
- 禁用不必要的启动服务:systemctl disable service
- 使用 systemd-analyze 分析启动时间:
- systemd-analyze:查看总启动时间
- systemd-analyze blame:查看各服务启动时间
- systemd-analyze critical-chain:查看关键启动链
- 使用并行启动:systemd 默认支持
- 优化内核参数:修改 /etc/default/grub 中的 GRUB_CMDLINE_LINUX服务端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 系统日志管理中如何查看、分析和轮转日志文件?Linux 系统日志管理是故障排查和安全审计的重要环节,掌握日志分析技能可以快速定位问题。
日志文件位置:
- /var/log/messages:系统主日志(CentOS/RHEL)
- /var/log/syslog:系统日志(Debian/Ubuntu)
- /var/log/auth.log:认证日志(Debian/Ubuntu)
- /var/log/secure:安全日志(CentOS/RHEL)
- /var/log/kern.log:内核日志
- /var/log/boot.log:系统启动日志
- /var/log/dmesg:内核启动消息
- /var/log/cron:定时任务日志
- /var/log/maillog:邮件日志
- /var/log/nginx/:Nginx 日志目录
- /var/log/apache2/:Apache 日志目录
- /var/log/mysql/:MySQL 日志目录
日志查看工具:
- cat:查看整个文件内容
- less:分页查看,支持上下滚动和搜索
- tail:查看文件末尾,tail -f 实时查看
- head:查看文件开头
- grep:搜索特定内容
- zcat:查看压缩的日志文件(.gz)
- zgrep:搜索压缩的日志文件
- journalctl:systemd 日志查看工具
journalctl 常用命令:
- journalctl:查看所有日志
- journalctl -f:实时查看日志
- journalctl -u service:查看特定服务的日志
- journalctl -u service -f:实时查看服务日志
- journalctl --since today:查看今天的日志
- journalctl --since "2024-01-01" --until "2024-01-02":查看指定时间段的日志
- journalctl -p err:查看错误级别的日志
- journalctl -p warning:查看警告级别的日志
- journalctl -b:查看当前启动的日志
- journalctl -b -1:查看上一次启动的日志
- journalctl --disk-usage:查看日志磁盘占用
- journalctl --vacuum-size=1G:限制日志大小为 1GB
日志级别:
- emerg:紧急
- alert:警报
- crit:严重
- err:错误
- warning:警告
- notice:通知
- info:信息
- debug:调试
日志轮转(logrotate):
- 配置文件:/etc/logrotate.conf 和 /etc/logrotate.d/
- 配置示例:
```
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
```
- 手动执行:logrotate -f /etc/logrotate.conf
- 测试配置:logrotate -d /etc/logrotate.conf
日志分析技巧:
- 统计错误数量:grep -i error /var/log/syslog | wc -l
- 查找特定时间段的日志:grep "2024-01-01" /var/log/syslog
- 查找特定 IP 的访问:grep "192.168.1.1" /var/log/nginx/access.log
- 统计访问量最高的 IP:awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
- 查找失败的登录尝试:grep "Failed password" /var/log/auth.log
- 查找系统重启记录:last reboot
日志管理最佳实践:
- 定期清理旧日志:使用 logrotate 自动轮转
- 监控日志大小:设置告警阈值
- 集中日志管理:使用 ELK(Elasticsearch、Logstash、Kibana)或 Graylog
- 日志备份:定期备份重要日志
- 日志权限:确保日志文件权限正确,防止未授权访问
- 结构化日志:使用 JSON 格式便于解析和分析
远程日志收集:
- rsyslog:系统日志服务,支持远程日志收集
- syslog-ng:功能强大的日志管理工具
- fluentd:统一日志收集层
- filebeat:轻量级日志收集器
故障排查流程:
1. 确认问题发生时间
2. 查看系统主日志(/var/log/messages 或 /var/log/syslog)
3. 查看相关服务日志
4. 使用 grep 搜索错误信息
5. 分析日志上下文
6. 结合其他监控工具(top、vmstat、iostat)综合判断服务端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 系统资源限制 ulimit 的作用、配置方法和常见应用场景有哪些?Linux 系统资源限制(ulimit)是控制进程资源使用的重要机制,可以防止进程占用过多系统资源。
ulimit 基本概念:
- ulimit 是 shell 内置命令,用于控制 shell 进程及其子进程的资源限制
- 限制分为软限制(soft limit)和硬限制(hard limit)
- 软限制可以由用户调整,但不能超过硬限制
- 硬限制只能由 root 用户提高
- 配置文件:/etc/security/limits.conf、/etc/security/limits.d/
常用 ulimit 命令:
- ulimit -a:显示所有当前资源限制
- ulimit -n:查看/设置最大打开文件数
- ulimit -u:查看/设置最大用户进程数
- ulimit -s:查看/设置栈大小
- ulimit -v:查看/设置最大虚拟内存
- ulimit -m:查看/设置最大常驻内存
- ulimit -c:查看/设置 core 文件大小
- ulimit -t:查看/设置最大 CPU 时间
- ulimit -f:查看/设置最大文件大小
- ulimit -l:查看/设置最大锁定内存
- ulimit -p:查看/设置管道缓冲区大小
- ulimit -e:查看/设置最大调度优先级
- ulimit -r:查看/设置最大实时优先级
资源限制类型:
- 文件描述符限制:
- open files:最大打开文件数(-n)
- max locked memory:最大锁定内存(-l)
- 进程限制:
- max user processes:最大用户进程数(-u)
- max pending signals:最大挂起信号
- 内存限制:
- max memory size:最大常驻内存(-m)
- virtual memory:最大虚拟内存(-v)
- stack size:栈大小(-s)
- CPU 限制:
- cpu time:最大 CPU 时间(-t)
- max nice priority:最大 nice 优先级(-e)
- max realtime priority:最大实时优先级(-r)
- 其他限制:
- file size:最大文件大小(-f)
- pipe size:管道缓冲区大小(-p)
- core file size:core 文件大小(-c)
limits.conf 配置格式:
- 格式:<domain> <type> <item> <value>
- domain:可以是用户、组、*(所有用户)、%组名
- type:soft(软限制)、hard(硬限制)、-(同时设置软硬限制)
- item:资源类型,如 nofile、nproc、memlock 等
- value:限制值,unlimited 表示无限制
配置示例:
```
# 限制所有用户的最大打开文件数
* soft nofile 65535
* hard nofile 65535
# 限制特定用户的最大进程数
username soft nproc 4096
username hard nproc 8192
# 限制特定组的最大内存
@groupname soft memlock 1048576
@groupname hard memlock 2097152
# 启用 core 文件
* soft core unlimited
* hard core unlimited
```
临时修改限制:
- 在当前 shell 中修改:ulimit -n 65535
- 仅对当前 shell 及其子进程有效
- 退出 shell 后失效
永久修改限制:
- 编辑 /etc/security/limits.conf 文件
- 编辑 /etc/security/limits.d/ 目录下的配置文件
- 修改后需要重新登录才能生效
- 对于服务进程,需要重启服务
systemd 服务限制:
- 在服务配置文件中设置限制
- 配置项:
- LimitNOFILE=65535:最大打开文件数
- LimitNPROC=4096:最大进程数
- LimitMEMLOCK=infinity:最大锁定内存
- LimitCORE=infinity:core 文件大小
- 示例:
```
[Service]
LimitNOFILE=65535
LimitNPROC=4096
```
常见应用场景:
- Web 服务器(Nginx、Apache):
- 增加最大打开文件数:ulimit -n 65535
- 增加最大进程数:ulimit -u 4096
- 数据库服务器(MySQL、PostgreSQL):
- 增加最大打开文件数:ulimit -n 65535
- 增加 core 文件大小:ulimit -c unlimited
- 高并发应用:
- 增加最大打开文件数:ulimit -n 65535
- 增加最大进程数:ulimit -u 8192
- 开发环境:
- 启用 core 文件:ulimit -c unlimited
- 增加 core 文件大小:ulimit -c unlimited
查看进程限制:
- 查看 PID 的限制:cat /proc/PID/limits
- 查看进程打开的文件数:ls /proc/PID/fd | wc -l
- 查看进程线程数:ps -eLf | grep PID | wc -l
故障排查:
- "Too many open files" 错误:增加 ulimit -n
- "Cannot allocate memory" 错误:检查内存限制
- 进程无法启动:检查进程数限制
- core 文件未生成:检查 core 文件限制
最佳实践:
- 根据应用需求设置合理的限制值
- 不要设置过高的限制值,避免资源耗尽
- 监控资源使用情况,及时调整限制
- 在生产环境应用前先在测试环境验证
- 定期检查和更新限制配置服务端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 虚拟化技术(KVM、Docker、Kubernetes)的特点和使用场景有哪些?Linux 虚拟化技术是现代云计算和容器化部署的基础,掌握虚拟化技术对于系统架构和运维至关重要。
虚拟化类型:
- 全虚拟化(Full Virtualization):通过 hypervisor 模拟完整的硬件环境,客户操作系统无需修改
- 半虚拟化(Para-virtualization):客户操作系统需要修改以配合 hypervisor
- 操作系统级虚拟化(OS-level Virtualization):在同一个操作系统内核上运行多个隔离的用户空间实例
KVM(Kernel-based Virtual Machine):
- Linux 内核的虚拟化模块
- 将 Linux 内核转变为 hypervisor
- 需要 CPU 支持硬件虚拟化(Intel VT-x 或 AMD-V)
- 使用 QEMU 作为设备模拟器
- 命令示例:
- 安装 KVM:apt install qemu-kvm libvirt-daemon-system libvirt-clients
- 检查 KVM 支持:kvm-ok 或 lsmod | grep kvm
- 创建虚拟机:virt-install --name vm1 --ram 2048 --vcpus 2 --disk path=/var/lib/libvirt/images/vm1.qcow2,size=20 --cdrom /path/to/iso
Xen:
- 开源 hypervisor
- 支持 paravirtualization 和 full virtualization
- Domain 0(Dom0):特权域,负责硬件访问和管理
- Domain U(DomU):非特权域,运行客户操作系统
- 命令示例:xl create vm.cfg、xl list
VMware:
- 商业虚拟化解决方案
- VMware ESXi:企业级 hypervisor
- VMware Workstation:桌面虚拟化软件
- VMware vSphere:虚拟化管理平台
Docker 容器:
- 轻量级虚拟化技术
- 共享主机内核,隔离用户空间
- 镜像(Image):只读的文件系统模板
- 容器(Container):镜像的运行实例
- 常用命令:
- docker run:运行容器
- docker ps:查看运行中的容器
- docker images:查看镜像
- docker build:构建镜像
- docker exec:在容器中执行命令
- docker logs:查看容器日志
- docker stop/start:停止/启动容器
Kubernetes(K8s):
- 容器编排平台
- 管理容器化应用的部署、扩展和管理
- 核心概念:
- Pod:最小的部署单元
- Service:为 Pod 提供稳定的网络访问
- Deployment:管理 Pod 的副本和更新
- ConfigMap:配置数据
- Secret:敏感数据
- 常用命令:
- kubectl get pods:查看 Pod
- kubectl get services:查看服务
- kubectl apply -f yaml:应用配置
- kubectl logs pod:查看日志
LXC(Linux Containers):
- 操作系统级虚拟化
- 共享内核,隔离进程和网络
- 比 Docker 更接近传统虚拟机
- 命令示例:
- lxc-create:创建容器
- lxc-start:启动容器
- lxc-stop:停止容器
- lxc-ls:列出容器
libvirt:
- 虚拟化管理 API 和工具集
- 支持 KVM、QEMU、Xen、LXC 等多种虚拟化技术
- 提供统一的虚拟化管理接口
- 命令示例:
- virsh list:列出虚拟机
- virsh start vm:启动虚拟机
- virsh shutdown vm:关闭虚拟机
- virsh dumpxml vm:查看虚拟机配置
虚拟化网络:
- Bridge(网桥):将虚拟机连接到物理网络
- NAT(网络地址转换):虚拟机通过主机访问外部网络
- Host-only:仅主机和虚拟机之间的网络
- VLAN:虚拟局域网
虚拟化存储:
- 镜像格式:qcow2、raw、vmdk、vdi
- 存储池:libvirt 存储池管理
- 共享存储:NFS、iSCSI、Ceph
性能优化:
- CPU 亲和性:绑定虚拟机到特定 CPU 核心
- 内存 ballooning:动态调整虚拟机内存
- 巨页(Huge Pages):提高内存性能
- virtio:半虚拟化 I/O 驱动
虚拟化安全:
- SELinux/AppArmor:强制访问控制
- 资源限制:cgroups 限制 CPU、内存、磁盘 I/O
- 网络隔离:VLAN、防火墙规则
- 镜像安全:定期更新、扫描漏洞服务端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)方式包括管道、消息队列、共享内存、信号量、套接字等。服务端2月17日 13:41
Linux 内核参数调优中常用的网络、内存和文件系统参数有哪些?Linux 内核参数调优是提升系统性能的重要手段,通过调整 /etc/sysctl.conf 文件可以优化系统行为。
网络参数调优:
- TCP 连接参数:
- net.ipv4.tcp_tw_reuse=1:允许将 TIME-WAIT sockets 重新用于新的 TCP 连接
- net.ipv4.tcp_tw_recycle=0:关闭 TCP 连接快速回收(可能导致 NAT 问题)
- net.ipv4.tcp_fin_timeout=30:减少 FIN-WAIT-2 状态的超时时间
- net.ipv4.tcp_keepalive_time=600:TCP keepalive 探测时间
- net.ipv4.tcp_keepalive_probes=3:TCP keepalive 探测次数
- net.ipv4.tcp_keepalive_intvl=15:TCP keepalive 探测间隔
- TCP 缓冲区参数:
- net.ipv4.tcp_rmem="4096 87380 16777216":TCP 接收缓冲区大小
- net.ipv4.tcp_wmem="4096 65536 16777216":TCP 发送缓冲区大小
- net.core.rmem_max=16777216:最大接收缓冲区
- net.core.wmem_max=16777216:最大发送缓冲区
- TCP 连接队列:
- net.core.somaxconn=65535:最大监听队列长度
- net.ipv4.tcp_max_syn_backlog=8192:最大 SYN 队列长度
- net.ipv4.tcp_syncookies=1:启用 SYN cookies 防止 SYN 攻击
- 其他网络参数:
- net.ipv4.ip_local_port_range="1024 65535":本地端口范围
- net.ipv4.tcp_max_tw_buckets=5000:TIME-WAIT bucket 数量
- net.ipv4.tcp_fastopen=3:启用 TCP Fast Open
内存参数调优:
- 虚拟内存:
- vm.swappiness=10:降低使用 swap 的倾向(0-100)
- vm.vfs_cache_pressure=100:调整内核回收内存的倾向
- vm.dirty_ratio=10:脏页占内存的比例
- vm.dirty_background_ratio=5:后台写入脏页的比例
- vm.dirty_expire_centisecs=3000:脏页过期时间
- 内存分配:
- vm.overcommit_memory=1:允许过度分配内存
- vm.overcommit_ratio=50:过度分配比例
- Huge Pages:
- vm.nr_hugepages=0:大页数量
- vm.hugetlb_shm_group=0:允许使用大页的组 ID
文件系统参数调优:
- 文件句柄:
- fs.file-max=65535:系统最大打开文件数
- fs.inotify.max_user_watches=524288:inotify 监控数量
- 文件系统:
- fs.aio-max-nr=1048576:最大异步 I/O 数量
- fs.nr_open=1048576:进程最大打开文件数
进程和线程参数调优:
- 进程限制:
- kernel.pid_max=4194303:最大进程 ID
- kernel.threads-max=4194303:最大线程数
- 信号量:
- kernel.sem="250 32000 100 128":信号量参数
- kernel.shmmax=68719476736:最大共享内存段大小
- kernel.shmall=4294967296:共享内存页数
安全参数调优:
- 网络安全:
- net.ipv4.conf.all.rp_filter=1:启用反向路径过滤
- net.ipv4.conf.default.rp_filter=1:默认启用反向路径过滤
- net.ipv4.icmp_echo_ignore_all=0:允许 ICMP echo 请求
- net.ipv4.icmp_echo_ignore_broadcasts=1:忽略广播 ICMP
- net.ipv4.conf.all.accept_source_route=0:拒绝源路由
- net.ipv4.conf.default.accept_source_route=0:默认拒绝源路由
- 内核安全:
- kernel.dmesg_restrict=1:限制 dmesg 访问
- kernel.kptr_restrict=1:限制内核指针访问
- kernel.perf_event_paranoid=2:限制性能事件访问
性能监控参数:
- 系统监控:
- kernel.sysrq=0:禁用 SysRq 键
- kernel.randomize_va_space=2:地址空间随机化
- 日志参数:
- kernel.printk="4 4 1 7":控制台日志级别
参数应用方法:
- 临时修改:sysctl -w parameter=value
- 永久修改:编辑 /etc/sysctl.conf 文件
- 应用配置:sysctl -p 或 sysctl --system
- 查看当前值:sysctl parameter
- 查看所有参数:sysctl -a
调优建议:
- 根据实际应用场景调整参数
- 修改前备份原配置
- 逐步调整,观察效果
- 使用性能监控工具验证调优效果
- 参考官方文档和最佳实践
- 生产环境调优前先在测试环境验证
常见应用场景:
- Web 服务器:增加连接队列、调整 TCP 参数
- 数据库服务器:优化内存参数、增加文件句柄
- 高并发服务:增加端口范围、优化 TCP 缓冲区
- 虚拟化环境:调整内存参数、启用 Huge Pages