1. 为什么要在生产环境里做最小化安装移动云的大云操作系统底层用的是 BCLinux-for-Euler-22.10 这个版本内核基线是 Euler 22.10软件包集合用的是 everything 全量镜像。很多同行拿到 everything 镜像的第一反应就是全量装完再说反正盘够大。但我在实际交付项目里踩过几次坑之后现在一律走最小化安装路线原因很实在。全量安装最直接的问题不是磁盘占用而是攻击面。everything 镜像里打包了上千个 RPM包括各种开发工具链、调试工具、图形组件、甚至一些老版本的网络服务。这些东西装完之后默认不一定启动但只要有依赖被拉起或者某个服务被 systemd 的 socket 激活机制唤醒就会在ss -tlnp里冒出来一个你没预期过的监听端口。我在一次安全扫描里就遇到过全量安装的机器上多出来一个 111 端口的 rpcbind排查了半天才发现是某个 NFS 相关包被间接装上了。第二个原因是依赖污染。全量安装会把很多库的多个版本同时塞进系统后续你自己编译或者装第三方软件时ldconfig的缓存里可能命中一个你根本没打算用的 so 版本。这种问题在排查时极其恶心因为rpm -qa | grep出来的结果一大堆你很难快速定位到底是谁把那个库带进来的。第三个原因是升级和补丁管理成本。最小化安装的包数量通常在 200 到 400 之间全量安装轻松破 1500。每次做安全基线核查、打补丁、做 CVE 比对的时候包越少越省事。尤其是移动云这种要过等保的场景基线核查表里每一项都要有明确的已安装/未安装结论包少意味着核查工作量直接砍半。所以这篇内容适合两类人看一类是刚接触 BCLinux-for-Euler 体系、需要在一台干净机器上从零搭出可用系统的运维另一类是已经在用这个系统、但想把手上的全量机器重做成最小化基线的工程师。下面我会把整个流程拆开讲包括镜像获取、安装时的取舍、装完之后的必要补装、以及几个我踩过的具体坑。2. 镜像获取与安装介质的准备细节2.1 everything 镜像和 minimal 镜像的区别到底在哪BCLinux-for-Euler-22.10-everything-x86_64-230316 这个命名里everything是关键。它表示这个 ISO 里包含了该发行版仓库中的所有软件包安装时你可以自由勾选任意包组。对应的还有minimal或者netinst版本前者只带最基础的包后者只带安装器、所有包都从网络仓库拉。我选 everything 镜像做最小化安装而不是直接用 minimal 镜像理由是离线可控。移动云的项目现场经常是内网环境没有外网源minimal 镜像装完之后你想补装一个chrony或者firewalld都得自己想办法搞包。everything 镜像虽然大通常 10G 以上但它本身就是一个完整的本地仓库装完之后可以直接把 ISO 挂载成 repo 用补装任何包都不依赖网络。提示everything 镜像的 SHA256 校验一定要做。我遇到过下载过程中断导致 ISO 尾部损坏的情况安装到一半报 RPM 校验失败排查起来很浪费时间。校验命令是sha256sum BCLinux-for-Euler-22.10-everything-x86_64-230316.iso和官方公布的哈希值逐位比对。2.2 制作启动盘时容易被忽略的两个点用dd写 U 盘是最稳的方式但有两个细节很多人不注意。第一是块大小默认dd的 512 字节块写 10G 镜像会非常慢加上bs4M能快好几倍命令是dd ifxxx.iso of/dev/sdX bs4M statusprogress oflagsync。oflagsync这个参数很重要它保证数据真正落盘再返回否则你看到命令结束了拔盘实际还有缓存没写完做出来的盘启动会报错。第二是目标设备别搞错。/dev/sdX一定要确认是 U 盘而不是你的系统盘我见过同事手一抖写到/dev/sda上直接把工作机的系统干掉了。写之前先lsblk看清楚设备大小和挂载点U 盘通常是可移动设备且没有挂载到/。如果是通过 BMC 的虚拟光驱安装那就更简单直接把 ISO 挂上去就行。但要注意移动云某些机型的 BMC 虚拟光驱对大于 8G 的 ISO 支持不好上传会超时。这种情况我的做法是把 ISO 放到内网 HTTP 服务器上用 PXE 或者 iPXE 引导或者干脆用dd写到 U 盘插到机器上装。2.3 安装引导参数的取舍在 GRUB 引导界面按e可以编辑内核参数。对于最小化安装我一般会加两个参数inst.text强制文本安装界面避免图形界面在某些显卡上花屏ipdhcp让安装器自动获取网络配置省得手动填。如果现场有多个网卡ipdhcp可能会绑错网卡这时候改成ipeth0:dhcp明确指定。还有一个参数inst.ks可以指定 Kickstart 文件做自动化安装。如果你要批量部署几十台机器强烈建议做 KS 文件把分区、网络、包选择、root 密码、SSH 密钥全部写进去一台机器从引导到装完 10 分钟搞定而且配置完全一致。KS 文件里%packages段只写^minimal-environment加上你确实需要的几个包这就是最小化的核心。3. 安装过程中的分区与包选择决策3.1 分区方案别用默认的 LVM 自动分区安装器默认会给你搞一套 LVM 自动分区把/和/home都塞进一个卷组里。这个方案在测试环境无所谓但生产环境我不推荐原因是后期扩容和快照的灵活性。移动云的云盘扩容之后如果/在 LVM 上你得先pvresize再lvextend再xfs_growfs三步走如果/直接是 XFS 裸分区扩容后一条xfs_growfs /就完事。我的标准分区方案是这样的挂载点大小文件系统说明/boot1Gxfs内核和 initramfs独立出来避免根分区满导致无法升级内核/boot/efi512MvfatUEFI 启动必需BIOS 启动可省略/剩余全部xfs根分区XFS 对大数据量和小文件混合场景表现均衡swap内存的 50%swap内存大于 64G 时可设为 16G 固定值/boot单独分 1G 是有讲究的。Euler 22.10 的内核包加上 initramfs 一个版本大概占 100 多 M系统默认保留 3 个旧内核1G 能撑住好几轮内核升级。我见过/boot只给 200M 的机器升级两次内核就满了yum update直接报错。swap 的大小现在争议比较大。我的经验是如果这台机器跑的是内存密集型服务比如 Redis、JVM 应用swap 给内存的 50% 但不超过 32G如果是纯计算节点swap 给 8G 意思一下就行。Euler 22.10 默认的vm.swappiness是 30比传统 CentOS 的 60 要保守对 SSD 云盘比较友好。3.2 包选择只勾 minimal其他全部手动补安装界面的软件选择页面直接选Minimal Install不要勾任何附加组件。这一步是整篇内容的核心选完之后装出来的系统大概只有 300 个左右的包rpm -qa | wc -l出来的数字会让你很舒服。那 Minimal 里到底有什么基础的systemd、bash、coreutils、dnf、kernel、grub2、openssh-server、NetworkManager、firewalld、chrony这些都在。也就是说装完之后你至少能 SSH 登录、能配网络、能配防火墙、能同步时间基本运维能力是齐的。缺的是什么vim、wget、curl、tar、net-tools、lsof、tcpdump、sysstat这些常用工具默认都不在。这些我建议装完之后按需补而不是在安装时勾Standard或者Development Tools包组。因为包组会带进来一堆你不需要的依赖比如Development Tools会装 gcc、make、各种 devel 库几百兆就没了而你可能只是想要个vim。注意Minimal 安装默认不带tar这个有点反直觉。如果你装完发现tar命令找不到别慌dnf install tar就行。我第一次遇到的时候还以为是 PATH 问题排查了半天。3.3 网络配置装的时候就配好别等装完安装界面里可以直接配网络我强烈建议在这里就把静态 IP、网关、DNS 配好。原因是装完之后如果网络不通你连补装包都做不了内网环境没有本地源的话。配置的时候注意两点一是网卡名Euler 22.10 用的是ens192、ens224这种可预测命名别按eth0去找二是 DNS移动云内网一般有 100.125.1.250 这样的内网 DNS配上之后解析内网域名会快很多。如果现场是 DHCP 环境那更简单装完直接能通。但生产服务器我一般还是配静态 IPDHCP 租约到期续约的瞬间如果有网络抖动可能影响业务。配静态 IP 的时候记得把BOOTPROTO改成none或者staticONBOOT改成yes否则重启后网卡不自动起来。4. 装完之后的必要补装与基线加固4.1 挂载 ISO 做本地源解决离线补包最小化装完之后第一件事是把 everything ISO 挂载成 repo这样后续补包不用愁。操作步骤mkdir -p /mnt/iso mount -o loop /path/to/BCLinux-for-Euler-22.10-everything-x86_64-230316.iso /mnt/iso然后创建 repo 文件/etc/yum.repos.d/local-iso.repo[local-iso] nameBCLinux Local ISO baseurlfile:///mnt/iso enabled1 gpgcheck0gpgcheck0是因为本地 ISO 的 GPG key 可能没导入内网环境信任本地介质即可。如果要做严格校验把 ISO 里的 RPM-GPG-KEY 导入再开gpgcheck1。配好之后dnf clean all dnf makecache然后就能dnf install任何包了。这个本地源在系统装完初期非常有用等你把需要的包都补完可以把它 disable 掉避免误装。4.2 我必装的工具清单下面这些是我每台最小化机器装完必补的按优先级排基础工具vim-enhanced、wget、curl、tar、unzip、rsync、tree网络排查net-tools要 ifconfig/netstat、lsof、tcpdump、telnet、bind-utilsnslookup/dig、traceroute、mtr性能观测sysstatsar/iostat/mpstat、iotop、htop、nload系统管理chronyMinimal 可能已带、firewalld可能已带、policycoreutils-python-utilssemanage 等 SELinux 工具开发相关gcc、make、git按需不是每台都要一次性装完的命令dnf install -y vim-enhanced wget curl tar unzip rsync tree \ net-tools lsof tcpdump telnet bind-utils traceroute mtr \ sysstat iotop htop nload policycoreutils-python-utils装完之后rpm -qa | wc -l大概在 400 出头依然很精简。4.3 SSH 安全基线三件事必须做第一禁用 root 直接登录。编辑/etc/ssh/sshd_config设PermitRootLogin no然后创建一个普通用户做 sudo。这一步在等保核查里是硬性要求。第二改默认端口。虽然改端口不能真正提升安全性端口扫描照样能发现但能挡掉 99% 的自动化爆破脚本日志会干净很多。改完记得semanage port -a -t ssh_port_t -p tcp 你的端口否则 SELinux 会拦。第三配密钥登录。ssh-keygen生成密钥对公钥放到~/.ssh/authorized_keys权限设 600然后PasswordAuthentication no关掉密码登录。改完 sshd 配置后别急着重启 sshd。先开另一个终端用新配置登录测试确认能登上再重启否则你把自己关在门外就只能走 BMC 了。这个坑我踩过血的教训。4.4 时间同步和时区Euler 22.10 默认用 chrony。检查/etc/chrony.conf里的 server 配置移动云内网一般有 NTP 服务器配上之后systemctl enable --now chronyd。时区用timedatectl set-timezone Asia/Shanghai设成东八区。时间不同步的后果比想象中严重。我遇到过一台机器时间漂了 5 分钟导致它和数据库之间的 TLS 证书校验失败应用连不上库排查了半天才发现是时间问题。所以chronyc sources -v确认同步状态是装完必做的检查项。5. 几个我实际踩过的坑和排查过程5.1 最小化装完没有 ifconfig误以为网卡没起来第一次做最小化安装的时候装完登录进去敲ifconfig报 command not found我第一反应是网卡驱动没装。后来ip addr一看网卡好好的只是net-tools没装。这个坑的本质是习惯依赖——用惯了 CentOS 的ifconfig到了新系统没反应过来ip命令才是原生的。排查链路其实很简单ip addr看网卡状态ip route看路由ping测连通性。这三个命令在 Minimal 里都有不依赖net-tools。所以遇到网络问题先别急着装工具用ip系列命令确认底层状态。5.2 firewalld 默认开着端口不通排查半天Minimal 安装默认会装并启用 firewalld。我部署一个服务的时候服务本身ss -tlnp看是监听着的但外部就是连不上。排查顺序应该是先firewall-cmd --list-all看当前 zone 放行了哪些端口再systemctl status firewalld确认服务状态。放行端口的命令是firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload。注意--permanent和--reload的配合只加 permanent 不 reload 不生效只加运行时不改 permanent 重启就丢。如果确认是 firewalld 拦的但你又不想开这个端口那就得回头想清楚这个服务到底该不该对外。安全基线的原则是默认拒绝按需放行别图省事直接systemctl stop firewalld那是给自己埋雷。5.3 SELinux 导致的权限拒绝日志里全是 deniedEuler 22.10 默认 SELinux 是 enforcing 模式。我遇到过把网站根目录改到/data/www之后nginx 死活读不了文件ls -l权限明明是对的。这时候要看/var/log/audit/audit.log里面会有avc: denied的记录。解决办法不是setenforce 0关掉 SELinux而是用semanage fcontext给新目录打上正确的上下文标签semanage fcontext -a -t httpd_sys_content_t /data/www(/.*)? restorecon -Rv /data/wwwsemanage命令来自policycoreutils-python-utils包Minimal 默认没装这就是为什么我前面把它列进必装清单。关 SELinux 是最偷懒也最不负责任的做法生产环境千万别这么干。5.4 内核升级后 /boot 满了前面说/boot给 1G但如果你的机器频繁升级内核旧内核不会自动删。dnf有个配置项installonly_limit默认是 3意思是保留 3 个内核版本。但如果某次升级因为/boot空间不足失败了可能会留下半拉子状态。检查命令是df -h /boot和rpm -qa | grep kernel。清理旧内核用dnf remove kernel-版本号或者直接package-cleanup --oldkernels --count2需要yum-utils包。我一般保留当前运行的内核加一个备用两个足够。6. 最小化基线的长期维护思路6.1 把补装清单固化成脚本每次手动敲一堆dnf install容易漏我的做法是写一个post-install.sh把补装、SSH 加固、时间同步、防火墙规则全部写进去。新机器装完直接跑一遍脚本5 分钟达到标准基线。脚本里用set -e保证出错就停避免半拉子状态。脚本里还可以加一个rpm -qa | sort /root/package-baseline.txt把当前包列表存下来。以后做变更审计的时候diff一下就知道多了哪些包非常方便。6.2 定期做包更新但别盲目全量升级最小化的好处是包少dnf update的风险也小。但生产环境我建议分批升级先升安全相关的包dnf update --security观察几天没问题再升其他。Euler 22.10 的仓库更新频率还可以安全补丁一般能及时跟上。升级前一定要dnf check-update看看到底要升哪些如果里面有内核或者 glibc 这种底层包安排在维护窗口做升完重启验证。别在业务高峰期手贱敲dnf update -y我见过升级 glibc 导致正在运行的服务崩溃的案例。6.3 用 ansible 做批量基线管理机器多了之后一台台手动配不现实。我的做法是用 ansible 写 playbook把包安装、配置文件分发、服务启停全部编排起来。ansible 本身用dnf install ansible就能装或者用 pip 装更新的版本。playbook 里针对 BCLinux-for-Euler 的适配点主要是包名和路径比如 firewalld 的 zone 文件路径、chrony 的配置路径这些和标准 RHEL 系基本一致迁移成本很低。写好的 playbook 可以纳入 git 管理每次基线调整都留痕审计的时候直接看 commit 记录。6.4 监控基线漂移最小化基线最怕的是漂移——今天装个包明天改个配置几个月后机器又变回全量状态了。我的做法是定期跑一个检查脚本比对当前包列表和基线列表的差异有新增包就告警。配置文件的漂移用aide或者简单的md5sum比对也能发现。这套机制听起来麻烦但真出问题的时候能帮你快速定位是谁在什么时候改了什么。尤其是多人协作的环境没有基线管理就是一笔糊涂账。7. 关于 everything 镜像的额外用法everything 镜像除了装系统还有几个实用场景。一是做本地仓库服务器把 ISO 挂到内网 HTTP 服务器上所有机器都指向这个源比每台机器挂 ISO 方便。二是做离线救援系统起不来的时候用 ISO 引导进 rescue 模式挂载原系统分区修复。三是提取单个 RPM有时候只需要一个包直接mountISO 然后从Packages目录里cp出来就行不用装整个仓库。我个人的习惯是每个项目现场都留一份 everything ISO 的副本放在内网文件服务器上。这东西平时用不上但真到需要的时候没有它你会很被动。尤其是内网环境外网源不通本地又没有镜像那就只能干瞪眼。最后说一个我自己的体会最小化安装不是目的可控才是目的。你知道系统里装了什么、开了什么端口、跑了什么服务出了问题能快速定位这才是最小化真正的价值。everything 镜像给了你全部的选择权而最小化安装是你主动做出的选择这个选择背后是对系统的理解和掌控。