乐闻世界logo
搜索文章和话题

Linux面试题手册

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 commandcrontab 命令: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 cronanacron(异步 cron):用于不是 24 小时运行的系统配置文件:/etc/anacrontab适合笔记本电脑等不常开机的设备会检查上次执行时间,如果错过则补执行systemd 定时器:systemd 的定时任务替代方案配置文件:/etc/systemd/system/*.timer查看定时器:systemctl list-timers更灵活的调度选项更好的日志集成
阅读 0·2月17日 23:39

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 gptlsblk:列出块设备信息blkid:查看块设备 UUID 和文件系统类型文件系统:常见文件系统类型:ext4、xfs、btrfs、ntfs、vfatmkfs:创建文件系统,如 mkfs.ext4 /dev/sdb1、mkfs.xfs /dev/sdb1mkfs.ext4:创建 ext4 文件系统mkfs.xfs:创建 xfs 文件系统磁盘挂载:mount:挂载文件系统,如 mount /dev/sdb1 /mnt/dataumount:卸载文件系统,如 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 +100MLVM(逻辑卷管理):pvcreate:创建物理卷,如 pvcreate /dev/sdb1vgcreate:创建卷组,如 vgcreate vgname /dev/sdb1lvcreate:创建逻辑卷,如 lvcreate -L 10G -n lvname vgnamelvextend:扩展逻辑卷,如 lvextend -L +5G /dev/vgname/lvnamelvreduce:缩减逻辑卷,如 lvreduce -L -5G /dev/vgname/lvnameresize2fs:调整 ext4 文件系统大小,如 resize2fs /dev/vgname/lvnamexfs_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(需要先卸载)
阅读 0·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/bashBACKUP_DIR="/backup"DATE=$(date +%Y%m%d)tar -czvf $BACKUP_DIR/backup-$DATE.tar.gz /path/to/backupfind $BACKUP_DIR -name "backup-*.tar.gz" -mtime +7 -delete云备份解决方案:AWS S3:对象存储服务Azure Blob Storage:Azure 对象存储Google Cloud Storage:Google 云存储阿里云 OSS:阿里云对象存储腾讯云 COS:腾讯云对象存储rclone:多云存储同步工具备份验证:定期测试恢复流程验证备份完整性检查备份文件大小使用校验和验证数据恢复策略:完全恢复:从完全备份恢复增量恢复:从完全备份开始,依次应用增量备份差异恢复:从完全备份开始,应用最新的差异备份时间点恢复:恢复到指定时间点(需要 binlog)灾难恢复:异地备份恢复备份最佳实践:制定备份策略文档自动化备份流程定期测试恢复加密敏感数据监控备份状态保留多个备份版本异地备份定期审查备份策略文档化恢复流程故障排查:备份失败:检查磁盘空间、权限、网络连接恢复失败:验证备份文件完整性、检查目标路径性能问题:优化备份时间、使用增量备份存储空间不足:清理旧备份、使用压缩
阅读 0·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; donewhile 循环:while [ condition ]; do commands; doneuntil 循环:until [ condition ]; do commands; done函数定义:函数定义:functionname() { commands; } 或 function functionname { commands; }函数调用:function_name arg1 arg2返回值:return value(0-255)局部变量:local var="value"常用命令:echo:输出文本,echo -n 不换行,echo -e 解析转义字符printf:格式化输出read:读取用户输入,read -p "prompt" vartest:条件测试,[ ] 是 test 的同义词expr:表达式求值let:算术运算awk:文本处理工具sed:流编辑器grep:文本搜索数组操作:定义数组:arr=(item1 item2 item3)访问元素:${arr[0]}、${arr[@]}(所有元素)、${#arr[@]}(元素个数)添加元素:arr+=("new_item")最佳实践:使用 set -e 遇到错误立即退出使用 set -u 使用未定义变量时报错使用 set -o pipefail 管道中任何命令失败都返回失败添加注释说明脚本用途使用引号保护变量
阅读 0·2月17日 23:38

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
阅读 0·2月17日 23:37

Linux 容器技术(Docker、Kubernetes)的核心概念、常用命令和最佳实践有哪些?

Linux 容器技术是现代应用部署和微服务架构的核心技术,Docker 和 Kubernetes 是最主流的容器解决方案。Docker 基本概念:镜像(Image):只读的文件系统模板,包含运行应用所需的所有依赖容器(Container):镜像的运行实例,轻量级、隔离的运行环境仓库(Repository):存储和分发镜像的地方,如 Docker HubDockerfile:用于构建镜像的文本文件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:在服务中执行命令配置示例: version: '3' services: web: build: . ports: - "80:80" volumes: - ./data:/data environment: - ENV=valueKubernetes 基本概念:Pod:最小的部署单元,包含一个或多个容器Node:运行 Pod 的物理或虚拟机Service:为 Pod 提供稳定的网络访问Deployment:管理 Pod 的副本和更新ReplicaSet:确保指定数量的 Pod 副本在运行StatefulSet:管理有状态应用DaemonSet:在每个节点上运行一个 PodConfigMap:配置数据Secret:敏感数据Namespace:资源隔离Ingress:HTTP/HTTPS 路由Kubernetes 常用命令:集群管理:kubectl cluster-info:查看集群信息kubectl get nodes:查看节点kubectl get namespaces:查看命名空间Pod 管理:kubectl get pods:查看 Podkubectl describe pod podname:查看 Pod 详情kubectl logs podname:查看 Pod 日志kubectl exec -it podname /bin/bash:进入 Podkubectl delete pod podname:删除 PodService 管理: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 配置: apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx ports: - containerPort: 80Deployment 配置: 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 提供稳定的 IPIngress:外部访问入口容器存储: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 管理配置日志收集:集中收集和分析容器日志监控告警:监控容器和集群状态
阅读 0·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
阅读 0·2月17日 23:37

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 重定向到文件描述符 mn<&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 mypipecat > 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 或 |&
阅读 0·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-60:关机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 中的 GRUBCMDLINELINUX
阅读 0·2月17日 23:36