软件包管理

瑞克 0 阅读 linux服务

05 软件包管理


目录

  1. 软件包管理概述
  2. RHEL系:yum/dnf包管理
  3. RHEL系:RPM包直接操作
  4. RHEL系:自建仓库
  5. Debian系:apt/dpkg包管理
  6. Debian系:apt源管理
  7. 源码编译安装(通用)
  8. Snap与Flatpak简介
  9. 国内镜像源配置
  10. 版本锁定与依赖解决
  11. 运维常用命令精选
  12. 趣味命令专栏

1. 软件包管理概述

生活类比

📦 快递类比:软件包就像快递包裹——里面有程序(商品)、依赖列表(配件清单)、安装脚本(组装说明)。包管理器就是你的"智能快递柜",自动处理拆包、组装和退货。

两大阵营对比

特性RHEL系Debian系
包格式.rpm.deb
高级管理器yum(旧)/ dnf(新)apt / apt-get
底层工具rpmdpkg
仓库配置/etc/yum.repos.d/*.repo/etc/apt/sources.list
代表发行版CentOS, RHEL, Fedora, 麒麟V10Ubuntu, Debian, Kali

💡 想一想:为什么会有两套包管理系统?统一成一个不好吗?

答案:历史原因——RPM由Red Hat开发(1997),DPKG由Debian社区开发(1994),各自发展了20多年,生态和工具链已经深度绑定,就像中文和英文各自有完整的语法体系。


2. RHEL系:yum/dnf包管理

问题:我想在CentOS/麒麟V10上安装软件,怎么做?

解决:使用 yum(CentOS 7)或 dnf(CentOS 8+/Fedora/麒麟V10)。

yum与dnf的关系

  • dnfyum 的升级版,命令几乎相同
  • CentOS 8+ / Fedora / 麒麟V10 使用 dnf
  • CentOS 7 使用 yum
  • 下面的命令中,把 yum 替换为 dnf 即可在新版系统上使用

基础操作

# 安装软件
sudo yum install -y vim             # -y 表示自动确认
sudo dnf install -y nginx           # Fedora/麒麟V10用dnf

# 卸载软件
sudo yum remove -y vim

# 搜索软件
yum search nginx                    # 按关键词搜索
yum list installed                  # 列出已安装的包
yum list available                  # 列出可安装的包

# 更新软件
sudo yum update                     # 更新所有软件
sudo yum update -y nginx            # 只更新nginx

# 查看软件信息
yum info nginx

# 查看软件依赖
yum deplist nginx

仓库管理

# 查看已启用的仓库
yum repolist
# 输出示例:
# repo id                    repo name                   status
# baseos                     CentOS-8 - BaseOS           3000+
# appstream                  CentOS-8 - AppStream        8000+
# epel                       Extra Packages for E-Linux  13000+

# 启用/禁用仓库
sudo yum install -y --enablerepo=epel htop
sudo yum install -y --disablerepo=epel vim

# 添加EPEL仓库(Extra Packages for Enterprise Linux)
sudo yum install -y epel-release

yum history —— 包管理的"后悔药"

# 查看安装历史
yum history

# 输出示例:
# ID | Command line          | Date       | Action(s) | Altered
# ---+-----------------------+------------+-----------+--------
#  5 | install -y nginx      | 2024-03-15 | Install   |      3
#  4 | remove -y vim         | 2024-03-14 | Remove    |      1
#  3 | update                | 2024-03-13 | Update    |     25

# 查看某次操作的详情
yum history info 5

# 撤销某次操作(后悔药!)
sudo yum history undo 5

# 重做某次操作
sudo yum history redo 5

清理缓存

# 清理所有缓存
sudo yum clean all

# 重建缓存
sudo yum makecache

# 查看缓存大小
du -sh /var/cache/yum/

💡 想一想yum installyum update 的区别是什么?对一个已安装的包执行 yum install 会怎样?

答案:install只在新安装时使用(已安装则跳过),update会升级到最新版本。对已安装的包执行install不会升级。


3. RHEL系:RPM包直接操作

问题:我下载了一个.rpm文件,怎么手动安装?

解决:使用 rpm 命令直接操作。

# 安装rpm包
sudo rpm -ivh nginx-1.20.1-1.el8.x86_64.rpm
# -i: install安装  -v: verbose详细  -h: hash显示进度条

# 升级rpm包
sudo rpm -Uvh nginx-1.22.0-1.el8.x86_64.rpm

# 卸载rpm包
sudo rpm -e nginx

# 查询已安装的包
rpm -qa                           # 列出所有已安装包
rpm -qa | grep nginx              # 搜索特定包

# 查看包包含哪些文件
rpm -ql nginx                     # 列出nginx安装的所有文件

# 查看某个文件属于哪个包
rpm -qf /etc/nginx/nginx.conf
# 输出:nginx-1.20.1-1.el8.x86_64

# 查看包信息
rpm -qi nginx

RPM的四大查询

命令功能记忆口诀
rpm -qa查询所有已安装包query all
rpm -ql 包名查询包安装的文件query list
rpm -qf 文件查询文件属于哪个包query file
rpm -qi 包名查询包的详细信息query info

RPM vs YUM/DNF

特性rpmyum/dnf
自动解决依赖❌ 不支持✅ 支持
安装本地包✅(yum localinstall xxx.rpm
从仓库安装
建议仅用于本地包日常使用首选

⚠️ 注意:直接使用 rpm 安装包时,如果有依赖未满足会报错。推荐使用 yum localinstall xxx.rpm,它会自动解决依赖。

# 推荐方式:自动解决依赖
sudo yum localinstall nginx-1.20.1-1.el8.x86_64.rpm

💡 想一想:为什么 rpm -ivh 安装包经常失败,而 yum install 很少失败?

答案:rpm不解决依赖关系,如果A包依赖B包,必须手动先装B再装A;yum自动从仓库下载所有依赖,一步到位。


4. RHEL系:自建仓库

问题:公司内部网络不能访问外网,怎么搭建自己的软件仓库?

解决:使用 createrepo 创建本地仓库。

# 安装工具
sudo yum install -y createrepo httpd

# 创建仓库目录
sudo mkdir -p /var/www/html/repo/Packages

# 把rpm包放进去
sudo cp *.rpm /var/www/html/repo/Packages/

# 生成仓库元数据
sudo createrepo /var/www/html/repo/

# 启动HTTP服务
sudo systemctl start httpd
sudo systemctl enable httpd

# 客户端配置(创建repo文件)
sudo tee /etc/yum.repos.d/local.repo << 'EOF'
[local-repo]
name=Local Repository
baseurl=http://192.168.1.100/repo/
enabled=1
gpgcheck=0
EOF

# 刷新缓存
sudo yum clean all && sudo yum makecache

💡 想一想:为什么要用自建仓库而不是直接用rpm安装?

答案:自建仓库支持依赖解析,团队成员可以像使用官方仓库一样用yum安装软件,不需要手动管理依赖。


5. Debian系:apt/dpkg包管理

问题:我想在Ubuntu/Debian/Kali上安装软件,怎么做?

解决:使用 apt(推荐)或 apt-get

基础操作

# 更新包列表(必须先做!)
sudo apt update
# 类比:先去图书馆查一下有哪些书、哪些书有新版

# 安装软件
sudo apt install -y vim

# 卸载软件(保留配置文件)
sudo apt remove -y vim

# 彻底卸载(删除配置文件)
sudo apt purge -y vim

# 搜索软件
apt search nginx

# 查看软件信息
apt show nginx

# 列出包的文件
dpkg -L nginx

# 升级所有已安装的软件
sudo apt upgrade -y

# 清理不再需要的依赖
sudo apt autoremove -y

# 清理已下载的包缓存
sudo apt clean

apt与apt-get的关系

命令说明
apt新式命令,输出友好,有进度条和颜色
apt-get老式命令,适合脚本使用,输出稳定
apt-cache search搜索(等同于 apt search
apt-cache show查看详情(等同于 apt show

dpkg —— Debian系的底层工具

# 安装deb包
sudo dpkg -i nginx_1.18.0-1_amd64.deb

# 如果报依赖错误,用apt修复
sudo apt install -f              # fix broken dependencies

# 列出所有已安装的包
dpkg -l                           # 等同于 rpm -qa
dpkg -l | grep nginx

# 查看包安装了哪些文件
dpkg -L nginx                     # 等同于 rpm -ql

# 查看文件属于哪个包
dpkg -S /etc/nginx/nginx.conf     # 等同于 rpm -qf

# 查看包信息
dpkg -s nginx                     # 等同于 rpm -qi

dpkg四大查询对照表

功能RHEL系 (rpm)Debian系 (dpkg)
列出所有已安装包rpm -qadpkg -l
查看包的文件rpm -ql 包名dpkg -L 包名
文件属于哪个包rpm -qf 文件dpkg -S 文件
查看包信息rpm -qi 包名dpkg -s 包名

💡 想一想apt removeapt purge 有什么区别?什么时候用哪个?

答案:remove只删除程序文件,保留配置文件(方便以后重新安装时恢复设置);purge连配置文件一起删除。如果只是临时卸载用remove,彻底清理用purge。


6. Debian系:apt源管理

问题:apt默认源在国外,下载很慢,怎么换国内源?

解决:修改 /etc/apt/sources.list 文件。

sources.list 格式说明

# 格式:类型 地址 发行版代号 组件
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
# ↑   ↑                            ↑     ↑
# |   |                            |     组件(软件分类)
# |   |                            发行版代号
# |   仓库地址
# 类型:deb(二进制包)或 deb-src(源码包)

组件含义

组件说明类比
main官方支持的自由软件学校采购的"必修课教材"
restricted官方支持的非自由软件学校采购的"选修课教材"
universe社区维护的自由软件师生推荐的"课外读物"
multiverse社区维护的非自由软件"商业教辅资料"

备份并替换源

# 备份原始源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为阿里云源(Ubuntu 22.04 jammy)
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

# 更新缓存
sudo apt update

💡 想一想sources.list/etc/apt/sources.list.d/*.list 有什么区别?

答案:两者功能相同,sources.d目录下可以放多个.list文件,方便管理第三方源,不用修改主文件,更模块化。


7. 源码编译安装(通用)

问题:仓库里没有我要的软件,或者版本太旧,怎么办?

解决:从源码编译安装——这是所有发行版通用的方法。

生活类比

🍳 做菜类比

  • 包管理器安装 = 点外卖(方便快捷,但选择有限)
  • 源码编译安装 = 自己买菜做饭(麻烦,但想做什么菜都行,还能定制口味)

编译安装四步走

# 第0步:安装编译工具
# RHEL系
sudo yum groupinstall -y "Development Tools"
sudo yum install -y gcc make

# Debian系
sudo apt install -y build-essential

# 第1步:下载源码并解压
wget https://example.com/software-1.0.tar.gz
tar -xzf software-1.0.tar.gz
cd software-1.0

# 第2步:配置(检查环境、生成Makefile)
./configure --prefix=/usr/local/software
# --prefix 指定安装目录

# 第3步:编译(把源码翻译成机器语言)
make -j$(nproc)
# -j$(nproc) 使用所有CPU核心并行编译,加速编译

# 第4步:安装(把编译好的文件复制到指定位置)
sudo make install

编译安装后的善后工作

# 添加可执行文件到PATH
echo 'export PATH=/usr/local/software/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 添加库文件路径
echo '/usr/local/software/lib' | sudo tee /etc/ld.so.conf.d/software.conf
sudo ldconfig

# 创建systemd服务(可选)
sudo tee /etc/systemd/system/software.service << 'EOF'
[Unit]
Description=My Software Service
After=network.target

[Service]
ExecStart=/usr/local/software/bin/software
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now software

编译安装 vs 包管理器安装

特性包管理器源码编译
安装速度快(预编译)慢(需编译)
自动管理依赖❌ 手动解决
版本选择受限于仓库任意版本
可定制性高(编译选项)
卸载方便remove❌ 需手动删除
升级方便update❌ 需重新编译

💡 想一想:源码编译安装有什么缺点?如何弥补?

答案:缺点是没有包管理器追踪,卸载困难。可以用 checkinstall 工具把编译结果打成deb/rpm包,然后用包管理器管理。


8. Snap与Flatpak简介

问题:传统包管理器版本太旧,编译又太复杂,有没有折中方案?

解决:Snap和Flatpak——新一代"自带依赖"的包格式。

生活类比

🥡 快餐类比:传统包管理器像食堂(共享厨房和食材),Snap/Flatpak像外卖便当(自带所有食材和餐具,不依赖食堂的厨房)。

Snap(Ubuntu主推)

# 安装snapd(如果没有)
sudo apt install -y snapd         # Debian系
sudo yum install -y snapd         # RHEL系(需EPEL)

# 搜索软件
snap find vscode

# 安装软件
sudo snap install code --classic

# 列出已安装的snap包
snap list

# 更新snap包
sudo snap refresh code

# 卸载
sudo snap remove code

Flatpak(Fedora/RHEL主推)

# 安装flatpak
sudo dnf install -y flatpak       # Fedora/RHEL
sudo apt install -y flatpak       # Ubuntu/Debian

# 添加Flathub仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 安装软件
flatpak install flathub org.gimp.GIMP

# 运行软件
flatpak run org.gimp.GIMP

# 列出已安装
flatpak list

# 更新
flatpak update

# 卸载
flatpak uninstall org.gimp.GIMP

三种安装方式对比

特性传统包管理器SnapFlatpak
依赖处理共享系统库自带大部分依赖自带所有依赖
包体积中等较大
启动速度较慢较慢
跨发行版
主推者各发行版Canonical(Ubuntu)Red Hat/Fedora
沙箱隔离

💡 想一想:Snap和Flatpak的包为什么比传统包大很多?

答案:因为它们自带依赖库,不依赖系统库。好处是跨发行版兼容,坏处是浪费磁盘空间,且启动稍慢。


9. 国内镜像源配置

问题:默认的官方源在国外,下载速度只有几十KB/s,怎么办?

解决:配置国内镜像源。

主流镜像站

镜像站地址特点
阿里云mirrors.aliyun.com速度快,稳定
清华TUNAmirrors.tuna.tsinghua.edu.cn教育网首选
中科大USTCmirrors.ustc.edu.cn教育网备选
华为云mirrors.huaweicloud.com企业级
腾讯云mirrors.cloud.tencent.com速度快

RHEL系(CentOS 7)换源

# 备份
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

# 下载阿里云repo文件
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo \
  http://mirrors.aliyun.com/repo/Centos-7.repo

# 或者清华源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo \
  https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/

# 清理并重建缓存
sudo yum clean all && sudo yum makecache

RHEL系(CentOS 8 / Stream)换源

# 替换baseurl
sudo sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-*.repo
sudo sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*.repo

sudo yum clean all && yum makecache

Fedora换源

# 阿里云源
sudo sed -e 's|^metalink=|#metalink=|g' \
         -e 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.aliyun.com/fedora|g' \
         -i /etc/yum.repos.d/fedora.repo \
         -i /etc/yum.repos.d/fedora-updates.repo \
         -i /etc/yum.repos.d/fedora-modular.repo

sudo dnf clean all && dnf makecache

麒麟V10换源

# 麒麟V10基于CentOS 8,方法类似
sudo cp /etc/yum.repos.d/kylin_x86_64.repo /etc/yum.repos.d/kylin_x86_64.repo.bak

# 编辑repo文件,将baseurl改为国内镜像
sudo vi /etc/yum.repos.d/kylin_x86_64.repo

sudo yum clean all && yum makecache

Debian/Ubuntu换源

# 备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# Ubuntu 22.04 (jammy) —— 阿里云源
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
EOF

# Ubuntu 22.04 —— 清华源
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
EOF

# Ubuntu 22.04 —— 中科大源
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
EOF

# Debian 12 (bookworm) —— 阿里云源
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free
deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free
deb https://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free
EOF

# 更新缓存
sudo apt update

Kali Linux换源

# 备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 阿里云源
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
EOF

sudo apt update

一键换源脚本思路

#!/bin/bash
# 简单的换源脚本示例(Ubuntu)
MIRROR="https://mirrors.aliyun.com"
CODENAME=$(lsb_release -cs)

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

cat << EOF | sudo tee /etc/apt/sources.list
deb ${MIRROR}/ubuntu/ ${CODENAME} main restricted universe multiverse
deb ${MIRROR}/ubuntu/ ${CODENAME}-updates main restricted universe multiverse
deb ${MIRROR}/ubuntu/ ${CODENAME}-security main restricted universe multiverse
EOF

sudo apt update
echo "换源完成!当前使用:${MIRROR}"

💡 想一想:换源后 apt update 报"GPG error"怎么办?

答案:可能是镜像没有导入GPG密钥。运行 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <密钥ID> 导入密钥。


10. 版本锁定与依赖解决

问题:有些软件不能随便升级(升级后可能不兼容),怎么锁定版本?

解决:使用版本锁定功能。

RHEL系:版本锁定

# 安装插件
# CentOS 7
sudo yum install -y yum-plugin-versionlock
# CentOS 8+ / Fedora
sudo dnf install -y python3-dnf-plugin-versionlock

# 锁定nginx版本
sudo yum versionlock add nginx

# 查看锁定列表
sudo yum versionlock list

# 解锁
sudo yum versionlock delete nginx

Debian系:版本锁定

# 锁定nginx版本(hold)
sudo apt-mark hold nginx

# 查看锁定列表
sudo apt-mark showhold

# 解锁
sudo apt-mark unhold nginx

# 或者使用dpkg
echo "nginx hold" | sudo dpkg --set-selections

依赖冲突排查

# RHEL系
yum check                          # 检查依赖问题
package-cleanup --problems         # 列出问题包
package-cleanup --dupes            # 查找重复安装的包

# Debian系
sudo apt install -f                # 自动修复依赖
sudo dpkg --configure -a           # 修复未完成的配置
apt-cache depends nginx            # 查看nginx的依赖
apt-cache rdepends nginx           # 查看谁依赖了nginx(反向依赖)

降级软件(版本回退)

# RHEL系
sudo yum downgrade nginx-1.18.0    # 降级到指定版本
sudo yum history undo <ID>         # 撤销某次操作

# Debian系
sudo apt install nginx=1.18.0-1    # 安装指定版本
# 先查看可用版本
apt-cache policy nginx

💡 想一想:为什么不直接卸载冲突包?

答案:很多系统核心组件被其他包依赖,直接卸载可能导致系统功能失效甚至无法启动。应该用 remove 模拟(apt remove --simulate 包名)先看看会影响哪些包。


11. 运维常用命令精选

以下是软件包管理的日常必备操作速查。

快速诊断包问题

# RHEL系:检查系统中是否有损坏的包
sudo rpm -Va
# 输出示例:
# S.5....T.  c /etc/nginx/nginx.conf    # 表示文件被修改过

# Debian系:检查包的完整性
sudo debsums -c
# 需要先安装:sudo apt install -y debsums

一键安装常用工具包

# RHEL系
sudo yum install -y \
  vim wget curl net-tools lsof strace tcpdump \
  htop iotop iftop bash-completion \
  epel-release yum-utils

# Debian系
sudo apt install -y \
  vim wget curl net-tools lsof strace tcpdump \
  htop iotop iftop bash-completion \
  build-essential

安全更新

# RHEL系:只安装安全更新
sudo yum update --security

# Debian系:只安装安全更新
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

查看包安装时间和大小

# RHEL系:按安装时间排序
rpm -qa --last | head -20

# Debian系:按安装时间排序
ls -lt /var/lib/dpkg/info/*.list | head -20

# 查看已安装包的总大小
# RHEL系
rpm -qa --queryformat '%{SIZE}\n' | awk '{sum+=$1} END {print sum/1024/1024 " MB"}'

# Debian系
dpkg-query -W -f='${Installed-Size}\n' | awk '{sum+=$1} END {print sum/1024 " MB"}'

各发行版命令对照总表

操作RHEL系 (yum/dnf)Debian系 (apt)
安装yum install 包apt install 包
卸载yum remove 包apt remove 包
彻底卸载yum remove 包apt purge 包
搜索yum search 关键词apt search 关键词
更新全部yum updateapt upgrade
更新列表yum makecacheapt update
查看信息yum info 包apt show 包
列出文件rpm -ql 包dpkg -L 包
文件溯源rpm -qf 文件dpkg -S 文件
清理缓存yum clean allapt clean
修复依赖yum checkapt install -f
锁定版本yum versionlock add 包apt-mark hold 包

12. 趣味命令专栏

包管理不只是严肃的运维工作,也有一些好玩的工具可以安装!

🎮 nsnake —— 终端贪吃蛇

# 安装
sudo apt install -y nsnake        # Debian系
sudo dnf install -y nsnake        # Fedora

# 开始游戏
nsnake
# 用方向键控制蛇的移动,吃食物变长,不要撞墙!
# 数学老师可以让同学们用这个来理解坐标系和向量运动。

📊 nload —— 实时网络流量图

# 安装
sudo apt install -y nload         # Debian系
sudo yum install -y nload         # RHEL系(需EPEL)

# 运行
nload
# 在终端中实时显示网络流量的波形图,非常直观!
# 就像心电图一样,但是是网络流量的"心电图"。

🗺️ asciiquarium —— 终端水族馆

# 安装(需要perl和Term::Animation)
sudo apt install -y libcurses-perl
sudo cpan Term::Animation
sudo apt install -y asciiquarium  # 或从源码编译

# 运行
asciiquarium
# 终端变成水族馆,有小鱼游来游去!

🎵 cmus —— 终端音乐播放器

# 安装
sudo apt install -y cmus          # Debian系
sudo yum install -y cmus          # RHEL系(需EPEL)

# 运行
cmus
# 在终端里听歌!按 :add /path/to/music 添加音乐
# 按 Enter 播放,x 暂停,v 停止

🎲 figlet —— 生成ASCII艺术字

# 安装
sudo apt install -y figlet        # Debian系
sudo yum install -y figlet        # RHEL系

# 使用
figlet "Hello Linux"
# 输出:
#  _   _      _ _       _     _
# | | | | ___| | | ___ | |   (_)_ __  _   ___  __
# | |_| |/ _ \ | |/ _ \| |   | | '_ \| | | \ \/ /
# |  _  |  __/ | | (_) | |___| | | | | |_| |>  <
# |_| |_|\___|_|_|\___/|_____|_|_| |_|\__,_/_/\_\

# 用不同的字体
figlet -f banner "Linux"
figlet -f script "Math"

# 数学老师可以在终端展示大字标题!
figlet -f big "f(x) = x^2"

🌍 telnet towel.blinkenlights.nl —— 终端星球大战

# 确保安装了telnet
sudo apt install -y telnet        # Debian系
sudo yum install -y telnet        # RHEL系

# 观看ASCII版星球大战!
telnet towel.blinkenlights.nl
# 整个星球大战电影用ASCII字符在终端中播放!
# 这是互联网上最古老的彩蛋之一。

🔢 cal —— 终端日历

# 显示当月日历
cal

# 显示全年日历
cal -y

# 显示特定年月
cal 9 2024

# 显示儒略日(天文/数学计算常用)
cal -j

# 数学老师可以用来讲解日期计算、闰年等概念!

📝 实用技巧:用包管理器查询命令归属

# 在终端中遇到一个不认识的命令,想知道它属于哪个包?

# RHEL系
yum provides "*/命令名"
# 例:yum provides "*/htop"

# Debian系
apt-file search "命令名"
# 需要先安装和更新:sudo apt install -y apt-file && sudo apt-file update

本章小结

主题核心工具一句话记忆
RHEL系包管理yum / dnfRedHat家族的"采购部"
RPM操作rpm -ivh/-qa/-ql/-qf手动安装和查询
Debian系包管理apt / dpkgDebian家族的"采购部"
源码编译configure/make/install万能但麻烦的"DIY"
新型包格式Snap / Flatpak"自带干粮"的跨发行版方案
换源修改repo/sources.list从"海外代购"到"国内直购"
版本锁定versionlock / apt-mark hold给软件"冻结年龄"
依赖修复yum check / apt install -f解决"缺少零件"的问题