Featured image of post CentOS 7 早期实践:最小化安装、yum 源、selinux 与密码救援

CentOS 7 早期实践:最小化安装、yum 源、selinux 与密码救援

2014-2015 年代的 CentOS 7 早期:最小化安装后的 yum 源、selinux/swap 关闭、单用户模式救场

一、为什么 2012 年要聊 CentOS 7

严格说 CentOS 7.0 正式发布是 2014-07-07,本文写于 2012-12-15,内容是基于 7.x 早期内测 / RHEL 7.0 GA(2014-06-10)的实操整理。之所以放这个时间点,是因为当时国内大量运维在测试机器上尝鲜 CentOS 7 的 init 切换(systemd 取代 init)、/etc/os-release 标准化等变化,到了 2014-07 正式发版后这些经验完全适用

CentOS 7 的"最小化安装"(Minimal Install)只给 ~200 个包,没有桌面、没有图形、连 wget / net-tools 都没有。第一次登录后第一件事往往是装上常用工具、配置国内 yum 源、关掉不需要的服务。本篇把这些零散动作整理成一份"上桌清单"。

适用版本:CentOS 7.0 ~ 7.9(2020-11 EOL,2024-06-30 进入 ELS 阶段仅安全更新)

二、查 IP、装 wget

最小化安装的机器没有 ifconfignet-tools 没了),先用 ip 命令看 IP:

1
ip addr

wget 准备下载源:

1
yum install -y wget

三、配置国内 yum 源

最小化装的机器 yum 走的是 CentOS 官方源,国内外都慢。换国内源是标准动作。

3.1 阿里云

1
2
3
4
5
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 阿里云
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache

3.2 网易 163

1
2
3
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum clean all && yum makecache

3.3 EPEL 源

EPEL(Extra Packages for Enterprise Linux)是 CentOS 之外的常用源,装 python-pip 之类要靠它:

1
2
3
yum list | grep epel-release
yum install -y epel-release
yum clean all && yum makecache

验证仓库:

1
2
yum repolist enabled    # 启用的仓库
yum repolist all        # 所有仓库

四、装常用工具

最小化安装默认没装的几个常用工具:

1
2
3
4
yum install -y vim-enhanced    # vim
yum install -y net-tools       # ifconfig / netstat
yum install -y lsof            # lsof,排查 deleted 但未释放的文件
yum install -y p7zip p7zip-plugins    # 7z 解压

五、关掉 firewalld / selinux / swap

容器化之前,传统 LAMP / LNMP 服务器的标准动作是关掉防火墙和 swap。注意:如果你准备上 Kubernetes,swap 千万不能关——kubelet 从 1.8 起会拒绝在启用 swap 的机器上启动(除非显式配置 --fail-swap-on=false)。

5.1 firewalld

1
2
3
firewall-cmd --state
systemctl stop firewalld.service
systemctl disable firewalld.service

5.2 selinux

1
2
3
4
5
6
# 查当前状态
getenforce
# 临时关闭(重启失效)
setenforce 0
# 永久关闭
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

5.3 swap

1
2
3
4
5
6
# 临时关
swapoff -a
# 永久关(注释 /etc/fstab 里所有含 swap 的行)
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 想再开回来
swapon -a

六、CentOS 7 忘记 root 密码的救援流程

这是 2012-2015 那几年最高频的运维求助场景。CentOS 7.9(2020-09 发布)的单用户模式救援流程:

  1. 重启服务器,开机引导时按 e 进入编辑

  2. 找到 linux16(早期版本是 linux)开头的那一行,把 ro 改成 rw init=/sysroot/bin/sh

  3. Ctrl + x,用单用户模式启动

  4. 切到原系统:

    1
    
    chroot /sysroot
    
  5. 改密码:

    1
    
    passwd root
    
  6. 更新 SELinux 标签(重要,不执行可能登录失败):

    1
    
    touch /.autorelabel
    
  7. 退出:

    1
    2
    
    exit
    reboot
    

坑提醒:第 6 步的 /.autorelabel 在 SELinux 开启的环境下必须执行;如果当时 setenforce 0 临时关过 SELinux,可以跳过这一步。

七、装 Docker 的早期姿势(2015-2016 年)

CentOS 7 早期装 Docker 还分两条路线:

7.1 走 get.docker.com 一键脚本

1
2
3
4
curl -sSL https://get.docker.com/ | sh
docker version
systemctl start docker
systemctl enable docker

这个脚本在 2015-2017 年是事实标准,但后来被官方移除了 docker-compose 集成。

7.2 走 yum 官方源

1
2
3
4
5
6
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker <your-user>     # 免 sudo 用 docker

想指定老版本(如 docker-ce-18.09.1):

1
2
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-18.09.1

八、Python 2 与 Python 3 共存

CentOS 7 默认 python 指向 python2.7,而 yum / firewalld 等系统工具强依赖 Python 2.7绝对不能卸载。开发用 Python 3 的标准做法是源码编译一份 /usr/local/python3,软链接 python3 出去。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
yum groupinstall "Development Tools" -y
yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel \
               ncurses-devel sqlite-devel readline-devel tk-devel \
               gdbm-devel db4-devel libpcap-devel xz-devel

wget https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz
tar -zxvf Python-3.9.10.tgz
cd Python-3.9.10
./configure --enable-optimizations --prefix=/usr/local/python3
make altinstall

ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

python3 -V

make altinstall 而不是 make install 是为了不覆盖系统 python 软链接——这点在 CentOS 7 上尤其重要。

九、SSH 允许 root 登录

1
2
3
4
5
sudo vi /etc/ssh/sshd_config
# PermitRootLogin yes
# PasswordAuthentication yes

sudo service sshd reload

生产环境强烈不推荐开启 root 远程登录,应该走 ssh-keygen + ~/.ssh/authorized_keys

十、自动时间同步

1
2
3
4
5
6
7
yum -y install ntpdate
ntpdate -u pool.ntp.org

# 加 crontab
crontab -e
*/20 * * * * /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1
service crond reload

chrony 是 CentOS 7 默认装的,但 ntpdate 在内网环境更省事。

十一、下一步

  • 想换更新的发行版(CentOS 7 已经在 2024-06-30 进入 ELS 阶段)→ 迁移到 Rocky Linux 9AlmaLinux 9(API 兼容,迁移成本最低)
  • 想做远程批量装机 → 看 PXE + kickstart,本篇不展开
  • 想用 ELRepo 升级内核 → 见 2015-03-15 CentOS 7 内核升级实战
  • 想把单用户救援流程做成一键脚本 → 用 Rescue Mode Automationgrub2-setpassword + 自定义脚本

参考资料


2024 视角:CentOS 7 已 EOL,Rocky / Alma 9 才是"未来"

本文写于 2012-12-15(实际是基于 2014-07 CentOS 7 GA 前的"早期内测"经验)。2024 视角下

一、CentOS 7 正式 EOL 2024-06-30

  • 2020-08-06:CentOS 8 提前 EOL 公告,CentOS 7 延寿到 2024-06-30
  • 2024-06-30CentOS 7 正式 EOL
  • 2024-06-30 后:进入 **ELS(Extended Lifecycle Support)**阶段,仅付费 Red Hat 客户能拿到安全更新
  • 2024-12-31:CentOS 7 ELS 阶段结束(部分渠道可付费延长到 2026-06-30)。
  • 2024 视角下新项目绝对不要再装 CentOS 7

二、CentOS 7 → Rocky / Alma 9 迁移工具

  • migrate2rocky(Rocky Linux 官方):
1
2
3
4
# CentOS 7/8 → Rocky Linux 9
curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
chmod +x migrate2rocky.sh
sudo bash migrate2rocky.sh -r
  • almalinux-deploy(AlmaLinux 官方):
1
2
sudo dnf install -y almalinux-deploy
sudo almalinux-deploy
  • elevate(CIQ 维护,CentOS 7 → Rocky Linux 8/9):
1
2
3
dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm
dnf install -y leapp-upgrade leapp-data-almalinux
leapp upgrade

三、CentOS 7 已消失的服务

  • ntpdate / ntpd:被 chronyd 取代(CentOS 7 起就是)。
  • iptables(部分):被 nftables 取代(CentOS 8 起)。
  • system-config-network-tui:被 nmtui 取代。
  • setuptool:被 system-config-* 取代。
  • Python 2.7:2020-01-01 EOL,不能装(除非装到 docker 容器)。
  • MySQL 5.x / MariaDB 5.5:EOL 多年,不能装(用 MySQL 8 / MariaDB 10.11)。

四、CentOS 7 时代的"救援模式"在 9 已不适用

本文给的"按 e → 改 rorw init=/sysroot/bin/sh“流程:

  • CentOS 9 / RHEL 9grub2 启动菜单有所变化(按 e多一步 BLSC 验证)。
  • UEFI Secure Boot 默认开启:单用户模式可能进不去
  • 2024 救援姿势
    • 方法 1:从 rescue CD / USB 启动(最稳
    • 方法 2:在云控制台用 VNC 救援连接(阿里云 / 华为云 / AWS 都支持)
    • 方法 3:临时关掉 SELinux:setenforce 0(如果能进系统)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# CentOS 9 / RHEL 9 救援模式步骤
# 1. 引导菜单按 e 进入编辑
# 2. 找到 linux 开头那行,删掉 rhgb quiet
# 3. 末尾加 rd.break
# 4. Ctrl+X 启动
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot

五、CentOS 7 → 9 的"主要 API 变化”

  • Python 3.6 → 3.12(CentOS 9 默认)。
  • systemd 219 → 252+(大量新指令)。
  • OpenSSH 7.4 → 8.x → 9.x(强制 rsa-sha2-256/512,禁 DSA)。
  • OpenSSL 1.0.2 → 3.0+(默认安全级别提高)。
  • GCC 4.8 → 11+(C++17 / C++20 默认)。
  • glibc 2.17 → 2.34(老二进制不能直接跑)。
  • firewalld 0.x → 1.x(配置变化)。

六、CentOS 7 的"运维遗物"——/etc/rc.local

2012 那篇提到 CentOS 7 早期还支持 rc.localCentOS 9 已经移除

  • 替代方案:systemd service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# /etc/systemd/system/my-startup.service
[Unit]
Description=My Startup Script
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/my-startup.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
1
systemctl enable my-startup.service

七、CentOS 7 的 EPEL 源 2024 现状

  • EPEL 7 仓库2024-06-30 停止更新
  • EPEL 9 仓库仍在持续更新
  • 迁 EPEL 配置(迁到 Rocky / Alma 9 后自动适配)。
  • 国内镜像(aliyun / 清华)2024 仍在同步 EPEL 7(用于"历史项目"),但新装不要用

八、2024 仍"在跑" CentOS 7 的真实情况

  • 中国中小企业的"老服务器":2024 还有 30-40% 跑 CentOS 7。
  • 原因:迁移成本 + 老应用兼容性 + 团队不熟悉 systemd 241+。
  • 风险
    • 无安全更新(2024-07 之后)
    • 新软件不能装(新版本需要 GLIBC 2.28+)
    • 容器运行时受限(Docker 20.10+ 不支持 CentOS 7)
  • 建议:用 migrate2rocky 迁移到 Rocky Linux 9——10 分钟搞定。

九、CentOS Stream:争议中的"未来"

  • CentOS Stream 8/9(2021+):RHEL 的"上游开发版"——比 RHEL 早 1-2 个 minor 版本。
  • 优点永远"新",能用到 RHEL 还没 GA 的特性。
  • 缺点可能不稳定(生产环境慎用)。
  • 2024 主流不用 CentOS Stream,直接用 Rocky / Alma / Oracle。
使用 Hugo 构建
主题 StackJimmy 设计