概述

在选择了合适的 Linux 发行版之后,系统管理员面临的下一个关键任务就是完成系统的安装和初始化配置。这个过程看似简单,但实际上涉及众多技术细节和最佳实践,直接影响系统的安全性、稳定性和可维护性。一个标准化的安装和初始化流程,是构建企业级 IT 基础设施的基石。

根据行业统计数据,超过 60% 的系统安全漏洞源于初始配置不当,包括默认密码未修改、不必要的服务未关闭、防火墙规则配置错误等。同时,缺乏标准化的初始化流程会导致系统环境不一致,增加自动化运维的难度,提高故障排查的复杂性。

为什么系统安装与初始化如此重要

装机决策

  1. 安全基线建立:初始化阶段是建立系统安全基线的最佳时机。包括禁用不必要的服务、配置防火墙规则、设置强密码策略、启用安全审计等。这些措施如果在初始阶段就实施,成本远低于后期补救。

  2. 标准化环境:通过标准化的安装和初始化流程,可以确保所有生产环境的服务器具有一致的配置,这对于大规模运维和自动化管理至关重要。

  3. 合规性要求:许多行业标准和法规(如 PCI DSS、HIPAA、ISO 27001)对系统配置有明确要求,初始化阶段就需要考虑这些合规性要求。

  4. 性能优化基础:合理的分区方案、文件系统选择、内核参数调优等,都需要在安装阶段就规划好,后期调整往往代价高昂。

  5. 运维效率提升:完善的初始化配置包括自动化工具的安装、监控代理的部署、日志收集的配置等,为后续的运维工作打下良好基础。

主要应用场景

  • 新服务器上架:物理服务器或虚拟机首次部署时的完整初始化流程
  • 系统重建:服务器故障后的系统重装和配置恢复
  • 环境复制:开发、测试、生产环境的标准化复制
  • 批量部署:大规模服务器集群的自动化安装和配置
  • 云实例初始化:公有云/私有云实例的首次启动配置

学习目标

通过本文的学习,您将能够:

  1. 掌握主流 Linux 发行版的安装方法和步骤
  2. 理解磁盘分区、文件系统选择的原理和最佳实践
  3. 完成系统初始化配置,包括网络、安全、时区等基础设置
  4. 建立标准化的系统初始化检查清单
  5. 使用自动化工具实现批量系统部署

核心概念

安装介质与启动方式

安装介质与启动方式

启动方式

1. 安装介质类型

现代 Linux 系统支持多种安装介质,每种介质适用于不同的场景:

ISO 镜像(最常用)

  • 可刻录到 DVD 或制作成 USB 启动盘
  • 适用于物理服务器和虚拟机
  • 支持离线安装

网络安装(NetInstall)

  • 最小化启动镜像,从网络下载软件包
  • 镜像体积小(通常 < 500MB)
  • 始终获取最新软件包版本
  • 需要稳定的网络连接

PXE 网络启动

  • 无需物理介质,通过网络直接启动安装程序
  • 适用于大规模服务器批量部署
  • 需要配置 PXE 服务器(DHCP + TFTP)
  • 是数据中心自动化部署的标准方案

云镜像

  • 预配置的虚拟机镜像(QCOW2、VMDK、AMI 等格式)
  • 针对云平台优化,包含 cloud-init 初始化工具
  • 支持首次启动时的自动配置

2. 启动方式演进

TEXT
传统 BIOS → UEFI → 安全启动 (Secure Boot)

BIOS(Basic Input/Output System)

  • 传统的固件接口,已使用数十年
  • 16 位实模式,限制较多
  • 最大支持 2.2TB 磁盘
  • 使用 MBR 分区表

UEFI(Unified Extensible Firmware Interface)

  • 现代固件标准,替代 BIOS
  • 支持 32/64 位模式
  • 支持超过 2.2TB 的大容量磁盘
  • 使用 GPT 分区表
  • 支持 Secure Boot 安全启动

Secure Boot

  • UEFI 的安全特性
  • 只允许加载经过签名的操作系统引导程序
  • 防止恶意软件在启动阶段植入
  • 某些 Linux 发行版需要禁用 Secure Boot 或导入自定义密钥

磁盘分区方案

磁盘分区与文件系统方案

分区方案

1. 分区表类型

MBR(Master Boot Record)

  • 传统分区表格式
  • 最多支持 4 个主分区(或 3 主分区 + 1 扩展分区)
  • 最大支持 2TB 磁盘
  • 兼容性好,但功能受限

GPT(GUID Partition Table)

  • 现代分区表标准
  • 支持最多 128 个分区
  • 支持超过 2TB 的磁盘(理论上限为 9.4 ZB)
  • 包含备份分区表,更可靠
  • 需要 UEFI 或支持 GPT 的 BIOS

2. 推荐分区方案

基础方案(适用于测试/开发环境)

TEXT
/       - 根分区,包含所有数据
swap    - 交换分区(可选,或使用交换文件)

标准方案(适用于生产服务器)

TEXT
/boot       - 500MB-1GB,存放引导文件
/           - 根分区,操作系统和应用程序
/home       - 用户数据(可选,视需求而定)
/var        - 日志和可变数据
/tmp        - 临时文件(可选,可挂载为 tmpfs)
swap        - 交换分区(或交换文件)

高级方案(适用于高安全要求环境)

TEXT
/boot       - 1GB,引导分区
/           - 20-50GB,系统文件
/var        - 单独分区,日志隔离
/var/log    - 日志分区,防止日志占满根分区
/var/tmp    - 临时文件,重启不清除
/tmp        - 临时文件,重启清除(tmpfs)
/home       - 用户数据
/opt        - 第三方软件
/usr/local  - 本地安装软件
swap        - 交换分区

3. 分区大小建议

分区 最小大小 推荐大小 说明
/boot 500MB 1GB 存放内核和引导文件
/ 20GB 50-100GB 系统文件和应用程序
/var 10GB 50GB+ 日志文件,视日志量而定
/var/log 5GB 20GB+ 系统日志隔离
/tmp 2GB 10GB 临时文件,可设为内存盘
/home 视需求 视需求 用户数据
swap 2GB 4-8GB 或 内存的 0.5-1 倍 交换空间

文件系统选择

1. 主流文件系统对比

文件系统 特点 适用场景 默认发行版
ext4 成熟稳定,性能好 通用服务器 Debian、Ubuntu、CentOS
XFS 大文件性能好,可在线扩展 大数据、数据库 RHEL、CentOS、Rocky
Btrfs 快照、压缩、校验和 桌面、开发环境 openSUSE、Fedora
ZFS 高级卷管理、数据完整性 NAS、存储服务器 FreeBSD、Ubuntu(可选)

2. 文件系统选择建议

ext4(推荐用于大多数场景)

  • 最成熟、最稳定的 Linux 文件系统
  • 良好的性能和可靠性
  • 广泛的工具支持
  • 适合 Web 服务器、应用服务器等通用场景

XFS(推荐用于大文件和数据库)

  • 优秀的并行 I/O 性能
  • 支持在线扩展(无需卸载)
  • 适合数据库服务器、文件服务器、大数据应用

Btrfs(适合需要快照功能的场景)

  • 内置快照和子卷功能
  • 支持透明压缩
  • 数据校验和自动修复
  • 适合桌面系统和开发环境

初始化配置核心要素

系统初始化配置基线

初始化基线

1. 网络配置

基础网络参数

  • 主机名(Hostname)
  • IP 地址(静态/DHCP)
  • 子网掩码/前缀长度
  • 网关地址
  • DNS 服务器
  • 域名搜索顺序

网络管理工具演进

TEXT
ifconfig/route → ip 命令 → NetworkManager/systemd-networkd

2. 安全基线配置

账户安全

  • root 密码策略
  • 普通用户创建
  • sudo 权限配置
  • SSH 安全配置

系统安全

  • 防火墙启用(iptables/nftables/firewalld)
  • SELinux/AppArmor 配置
  • 不必要的服务禁用
  • 自动更新配置

审计和日志

  • 系统日志配置(rsyslog/systemd-journald)
  • 审计规则配置(auditd)
  • 日志轮转策略

3. 时间和区域配置

时区设置

  • 硬件时钟设置(UTC/本地时间)
  • 系统时区配置
  • 夏令时处理

时间同步

  • NTP 客户端配置
  • 时间同步服务(ntpd/chronyd/systemd-timesyncd)
  • 内部 NTP 服务器配置

4. 软件源和包管理

软件源配置

  • 官方源镜像选择
  • 内部镜像源配置
  • 安全更新源配置

基础软件安装

  • 系统工具(vim、curl、wget、net-tools 等)
  • 监控代理
  • 安全配置工具
  • 自动化工具

生产安装设计

生产系统安装不能只看“能不能装完”。安装前要先决定系统角色、生命周期、网络位置、磁盘布局、安全等级、备份方式和交付责任。否则安装过程看似顺利,后续却会出现磁盘不可扩展、网络配置不可追溯、SSH 策略不统一、日志占满根分区、补丁窗口无人负责等问题。

第一,明确系统角色。Web/API 节点、数据库节点、监控节点、跳板机、Kubernetes 节点、文件服务器、工业现场采集节点,对分区、安全、网络和初始化工具的要求不同。不要用同一份“最小安装脚本”覆盖所有场景。最小安装可以作为基础层,但角色相关配置必须通过角色基线叠加。

第二,明确安装来源。物理机和虚拟机可以使用 ISO、PXE、Kickstart、Preseed、Autoinstall 或镜像克隆;云实例常用官方云镜像和 cloud-init;大规模环境通常需要内部镜像和自动化流水线。安装来源决定了可重复性。手工 ISO 安装适合少量测试,生产批量交付应逐步转向自动化。

第三,明确磁盘策略。普通应用服务器可以使用简单 LVM;数据库、日志、备份缓存和容器节点需要单独规划数据盘。根分区过大并不能解决所有问题,关键是把增长最快的路径识别出来,例如 /var/log、数据库目录、容器镜像目录、应用上传目录和备份缓存目录。分区设计的目标不是复杂,而是让故障影响可控。

第四,明确网络策略。安装阶段就应确定静态 IP、DNS、NTP、默认网关、管理网段、防火墙入口和主机名规范。远程服务器最危险的操作之一是在没有回滚通道时修改网络配置。因此初始化流程要包含控制台入口、带外管理、临时回滚计划和连通性验证。

第五,明确安全策略。root 是否允许直接登录,SSH 是否只允许密钥,sudo 如何授权,防火墙默认策略是什么,SELinux/AppArmor 是否启用,自动安全更新是否开启,审计日志是否采集,这些都应在初始化阶段完成。等系统承载业务后再补安全基线,代价会高得多。

初始化顺序

初始化顺序建议遵循“先可达、再可控、再可观测、再可恢复”的原则。

先保证可达。主机名、IP、路由、DNS、NTP、SSH 和控制台访问必须优先验证。网络不稳定时,不要继续安装复杂业务组件。基础连通性没有证据,后面的自动化失败也很难定位。

再保证可控。创建个人管理员账号、配置 sudo、禁用不必要服务、设置防火墙、确认软件仓库和包管理状态。可控意味着系统进入管理员的管理边界,不再依赖安装器默认值。

然后保证可观测。安装监控代理、日志采集、基础告警、时间同步检查和容量监控。没有可观测性,系统上线后只能等业务报错才知道问题存在。

最后保证可恢复。配置备份、快照、配置归档和初始化记录。对虚拟机来说,首次初始化完成后可以创建基线快照;对物理机来说,应确保带外管理、备份和重装流程可用。恢复能力是初始化是否合格的重要标准。

远程初始化的安全边界

远程初始化尤其要谨慎。不要一次性修改 SSH、防火墙、网络和 sudo 规则。建议分阶段执行,每一步都保留当前会话并开新会话验证。比如修改 SSH 配置后,不要马上退出旧连接;先用新终端确认能登录,再重启或 reload 服务。修改防火墙规则后,也要先确认 SSH 端口仍然允许。

网络配置同理。Ubuntu Server 常见 Netplan 配置,RHEL/Rocky 常见 NetworkManager 和 nmcli。无论使用哪种工具,都要先记录当前配置,再准备回滚文件。如果有带外控制台,可以在维护窗口内执行;如果没有带外控制台,应该避免远程直接替换默认路由、DNS 和主网卡配置。

远程初始化还要避免把危险命令写进不可中断脚本。例如 dd 写盘、批量修改 /etc/sudoers、直接覆盖网络配置、清空防火墙规则、重启关键服务,都应有前置检查和失败处理。初始化脚本应该分模块执行,并在每一步输出明确状态,便于中断后恢复。

验收和交接

系统初始化完成后,不能只交付一个 IP 地址。交接至少包括主机名、IP、发行版版本、内核版本、分区布局、文件系统、时区、NTP、DNS、软件源、管理员账号、sudo 规则、防火墙策略、SSH 策略、监控状态、日志采集状态、备份策略、快照状态和初始化日期。

交接还要包含异常处理入口。例如网络不可达时通过哪个控制台登录,sudo 失效时如何恢复,磁盘满了先看哪些目录,防火墙误封后如何回滚,系统启动失败时是否有救援模式或快照。没有这些信息,系统虽然安装完成,但并没有进入可运维状态。

多环境一致性

Linux 安装初始化经常跨开发、测试、预生产和生产环境。多环境不是简单复制虚拟机,而是要明确哪些配置必须一致,哪些配置允许不同。基础安全、账号策略、日志、监控、备份、时间同步、软件仓库结构应尽量一致;IP 地址、主机名、容量、访问控制、业务数据和外部依赖则按环境区分。

一致性最容易被破坏的地方是手工修改。开发环境临时加了一个仓库,测试环境手工装了一个依赖,生产环境为了排障改了一个内核参数,如果没有记录,几个月后就会出现“同样脚本在不同环境表现不同”的问题。初始化流程应把这些差异收敛到配置变量,而不是让管理员逐台修改。

可以使用如下思路维护变量:

text
base:
  timezone: Asia/Shanghai
  ntp_servers: [ntp1.company.local, ntp2.company.local]
  ssh_password_login: false
  monitoring: enabled

env:
  dev:
    dns: [192.168.10.10]
    backup_policy: none
  prod:
    dns: [192.168.20.10, 192.168.20.11]
    backup_policy: daily
    firewall_policy: strict

这种变量化方式可以用于 Ansible inventory、cloud-init user-data、Terraform 变量或内部装机平台。关键不是工具,而是让“环境差异”可见、可审计、可复用。

安装记录如何使用

安装记录不是为了填表,而是后续运维、审计和故障恢复的依据。每台生产服务器都应有一份初始化记录,至少包含以下信息:

类别 内容
基础信息 主机名、IP、用途、负责人、环境、创建日期
系统信息 发行版、版本、内核、架构、镜像来源
存储信息 磁盘、分区、文件系统、LVM、挂载点
网络信息 网卡、IP、路由、DNS、NTP、防火墙
安全信息 root 策略、sudo 规则、SSH 策略、SELinux/AppArmor
运维信息 监控、日志、备份、告警、资产编号
验收信息 验收人、验收时间、遗留问题、下次复核

记录要和实际配置保持同步。若系统后续改了 IP、扩了磁盘、调整了 sudo、切换了软件源或新增了备份策略,记录也要更新。否则安装记录会变成“上线当天的快照”,无法支撑长期运维。

安装记录最好进入 CMDB 或知识库,并与自动化流程关联。自动化装机完成后自动写入基础字段,人工验收补充业务负责人和例外说明。这样既减少手工录入,又能保证信息完整。

初始化后的观察期

新服务器初始化完成后,建议设置一段观察期。观察期通常为三到七天,重点查看时间同步是否稳定、磁盘增长是否异常、日志是否持续写入、监控代理是否在线、防火墙是否误拦截、自动安全更新是否按策略运行、业务服务是否存在启动失败或重启循环。

观察期还要复核初始化脚本是否留下临时文件、默认密码、测试账号、临时防火墙规则和调试端口。很多安全问题不是安装器造成的,而是管理员在排障阶段临时放开的配置没有收回。把观察期纳入交付流程,可以在业务正式接入前清理这些隐患。

如果服务器属于批量部署,观察期数据还可以反向改进标准镜像。比如某个包每次都要补装,说明镜像基线缺失;某个日志目录增长过快,说明分区方案需要调整;某个监控项频繁误报,说明告警阈值需要按角色优化。

观察期结束后,服务器才应正式进入生产资产台账和运维责任清单管理。


实战操作

环境准备

1. 准备安装介质

下载 ISO 镜像

以 Ubuntu Server 22.04 LTS 为例:

bash
# 从官方镜像站下载
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

# 或使用国内镜像加速
wget https://mirrors.aliyun.com/ubuntu-releases/22.04/ubuntu-22.04.3-live-server-amd64.iso

验证镜像完整性

bash
# 下载校验文件
wget https://releases.ubuntu.com/22.04/SHA256SUMS
wget https://releases.ubuntu.com/22.04/SHA256SUMS.gpg

# 验证签名(可选,但推荐)
gpg --verify SHA256SUMS.gpg SHA256SUMS

# 校验镜像
sha256sum -c SHA256SUMS 2>&1 | grep ubuntu-22.04.3-live-server-amd64.iso

制作 USB 启动盘(Linux)

bash
# 插入 USB 设备,确认设备名(如 /dev/sdb,注意不是分区如 /dev/sdb1)
lsblk

# 卸载设备(如果已挂载)
sudo umount /dev/sdb*

# 写入镜像(危险操作,请确认设备名正确!)
sudo dd if=ubuntu-22.04.3-live-server-amd64.iso of=/dev/sdb bs=4M status=progress

# 同步缓存
sudo sync

制作 USB 启动盘(Windows)

2. 虚拟机环境准备

如果使用虚拟机进行测试,推荐以下配置:

VMware/VirtualBox/Proxmox

  • CPU:2 核或以上
  • 内存:4GB 或以上
  • 磁盘:40GB 或以上
  • 网络:桥接模式或 NAT 模式

KVM/QEMU 命令行创建

bash
# 创建磁盘镜像
qemu-img create -f qcow2 /var/lib/libvirt/images/test-vm.qcow2 40G

# 使用 virt-install 创建虚拟机
virt-install \
  --name test-vm \
  --ram 4096 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/test-vm.qcow2,format=qcow2 \
  --cdrom /path/to/ubuntu-22.04.3-live-server-amd64.iso \
  --network bridge=br0 \
  --graphics vnc \
  --noautoconsole

系统安装步骤

步骤 1:启动安装程序

  1. 将安装介质插入服务器或挂载到虚拟机
  2. 开机并进入 BIOS/UEFI 设置(通常按 Del、F2、F10 或 F12)
  3. 设置启动顺序,将安装介质设为第一启动项
  4. 保存并退出,系统将自动从安装介质启动

步骤 2:选择语言和键盘布局

TEXT
Language: English / 中文(简体)
Keyboard layout: US / Chinese

步骤 3:配置网络

Ubuntu Server 安装界面

TEXT
Network configuration:
- DHCP 自动获取(默认)
- 或手动配置静态 IP

Example static configuration:
  Subnet: 192.168.1.0/24
  Address: 192.168.1.100
  Gateway: 192.168.1.1
  Name servers: 8.8.8.8, 114.114.114.114

配置主机名

TEXT
Hostname: server01

步骤 4:配置代理(可选)

如果需要通过代理访问互联网:

TEXT
Proxy address: http://proxy.company.com:8080

步骤 5:配置 Ubuntu 存档镜像

选择软件源镜像,推荐使用国内镜像加速:

TEXT
Mirror: http://mirrors.aliyun.com/ubuntu
# 或
Mirror: http://mirrors.tuna.tsinghua.edu.cn/ubuntu

步骤 6:磁盘分区

选项 1:使用整个磁盘(推荐新手)

TEXT
Storage configuration:
- Use an entire disk
- 选择目标磁盘
- 确认分区方案

选项 2:自定义分区(推荐生产环境)

ASCII
Storage configuration:
- Custom storage layout

分区示例(40GB 磁盘):
├─ /boot    1GB    ext4
├─ /        20GB   ext4
├─ /var     10GB   ext4
├─ /tmp     4GB    ext4
└─ swap     4GB    swap

步骤 7:创建用户账户

TEXT
Profile setup:
  Your name: Admin User
  Your server's name: server01
  Username: admin
  Password: ********
  Confirm password: ********

重要:不要使用弱密码!生产环境应使用强密码策略。

步骤 8:安装 OpenSSH 服务器

TEXT
SSH Setup:
- [x] Install OpenSSH server
- [ ] Import SSH identity (可选)

步骤 9:选择预装软件(可选)

TEXT
Featured Server Snaps:
- [ ] docker
- [ ] microk8s
- [ ] kubectl
- [ ] ...

步骤 10:开始安装

确认配置无误后,开始安装:

TEXT
Confirm destructive action:
- Continue

安装过程通常需要 10-30 分钟,取决于硬件性能和网络速度。

步骤 11:安装完成

安装完成后,系统会提示移除安装介质并重启:

TEXT
Installation complete!
- Reboot Now

系统初始化配置

1. 首次登录和基础检查

登录系统

bash
# 使用安装时创建的用户登录
ssh admin@192.168.1.100

# 或使用本地控制台登录

检查系统信息

bash
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -a

# 查看磁盘使用情况
df -h

# 查看内存使用情况
free -h

2. 网络配置验证和调整

检查网络配置

bash
# 查看 IP 地址
ip addr

# 或传统命令(如已安装)
ifconfig

# 查看路由表
ip route

# 测试网络连通性
ping -c 4 8.8.8.8
ping -c 4 www.baidu.com

配置静态 IP(如需要)

Ubuntu 22.04 使用 Netplan 管理网络:

bash
# 编辑网络配置文件
sudo nano /etc/netplan/00-installer-config.yaml

配置文件示例:

yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 114.114.114.114
        search:
          - company.local

应用配置:

bash
sudo netplan apply

3. 更新系统和安装基础软件

更新软件包列表

bash
sudo apt update

升级已安装软件包

bash
sudo apt upgrade -y

安装常用工具

bash
sudo apt install -y \
  vim \
  curl \
  wget \
  net-tools \
  htop \
  tree \
  unzip \
  software-properties-common \
  apt-transport-https \
  ca-certificates \
  gnupg \
  lsb-release

4. 配置时区和时间同步

设置时区

bash
# 查看当前时区
timedatectl

# 列出可用时区
timedatectl list-timezones | grep Shanghai

# 设置时区为上海(中国标准时间)
sudo timedatectl set-timezone Asia/Shanghai

配置时间同步

Ubuntu 22.04 默认使用 systemd-timesyncd:

bash
# 检查时间同步状态
timedatectl status

# 启用 NTP 同步
sudo timedatectl set-ntp true

# 编辑 NTP 配置(可选,使用国内 NTP 服务器)
sudo nano /etc/systemd/timesyncd.conf

配置示例:

ini
[Time]
NTP=ntp.aliyun.com ntp.tencent.com
FallbackNTP=time1.cloud.tencent.com time2.cloud.tencent.com

重启服务:

bash
sudo systemctl restart systemd-timesyncd

5. 配置防火墙

启用 UFW 防火墙

bash
# 检查 UFW 状态
sudo ufw status

# 默认拒绝所有传入连接
sudo ufw default deny incoming

# 默认允许所有传出连接
sudo ufw default allow outgoing

# 允许 SSH 连接(重要!避免自己被锁定)
sudo ufw allow ssh
# 或指定端口
sudo ufw allow 22/tcp

# 启用防火墙
sudo ufw enable

# 查看状态
sudo ufw status verbose

添加其他规则(根据需求)

bash
# 允许 HTTP/HTTPS
sudo ufw allow http
sudo ufw allow https

# 允许特定端口
sudo ufw allow 8080/tcp

# 允许特定 IP
sudo ufw allow from 192.168.1.0/24

# 允许特定 IP 访问特定端口
sudo ufw allow from 192.168.1.10 to any port 3306

6. SSH 安全配置

编辑 SSH 配置文件

bash
sudo nano /etc/ssh/sshd_config

推荐配置

bash
# 禁用 root 登录
PermitRootLogin no

# 仅允许密钥认证(如果使用密钥)
# PasswordAuthentication no
# PubkeyAuthentication yes

# 更改默认端口(可选,增加安全性)
# Port 2222

# 限制允许登录的用户
AllowUsers admin

# 禁用空密码
PermitEmptyPasswords no

# 设置空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2

重启 SSH 服务

bash
sudo systemctl restart sshd

重要:在禁用密码认证前,确保已经配置好 SSH 密钥登录!

7. 配置自动安全更新

安装 unattended-upgrades

bash
sudo apt install -y unattended-upgrades

配置自动更新

bash
sudo dpkg-reconfigure -plow unattended-upgrades
# 选择 "Yes" 启用自动更新

自定义配置(可选)

bash
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

配置示例:

bash
// 自动移除无用的依赖
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// 自动重启(如果需要)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

// 发送邮件通知(需要配置邮件)
// Unattended-Upgrade::Mail "admin@company.com";

8. 配置日志管理

日志轮转配置

bash
# 查看当前日志轮转配置
ls /etc/logrotate.d/

# 自定义日志轮转(如需要)
sudo nano /etc/logrotate.d/custom

配置 systemd-journald(持久化日志)

bash
# 创建日志目录
sudo mkdir -p /var/log/journal

# 编辑配置
sudo nano /etc/systemd/journald.conf

配置示例:

ini
[Journal]
Storage=persistent
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxFileSec=1week

重启服务:

bash
sudo systemctl restart systemd-journald

9. 配置 Swap(如使用交换文件)

如果使用交换文件而非交换分区:

bash
# 创建交换文件(例如 4GB)
sudo fallocate -l 4G /swapfile
# 或
sudo dd if=/dev/zero of=/swapfile bs=1G count=4

# 设置权限
sudo chmod 600 /swapfile

# 设置为交换空间
sudo mkswap /swapfile

# 启用交换
sudo swapon /swapfile

# 验证
sudo swapon --show
free -h

配置开机自动挂载

bash
sudo nano /etc/fstab

添加:

TEXT
/swapfile none swap sw 0 0

10. 配置主机名和 hosts

设置主机名

bash
# 临时设置(立即生效,重启后失效)
sudo hostname server01

# 永久设置
sudo hostnamectl set-hostname server01

配置 hosts 文件

bash
sudo nano /etc/hosts

配置示例:

TEXT
127.0.0.1       localhost
127.0.1.1       server01.company.local server01

# 内部服务器
192.168.1.10    db-server
192.168.1.11    web-server
192.168.1.12    app-server

配置示例

完整的初始化脚本

以下是一个完整的 Ubuntu Server 初始化脚本,可根据实际需求修改:

bash
#!/bin/bash
# Ubuntu Server 初始化脚本
# 适用于 Ubuntu 20.04/22.04 LTS

set -e

# 配置变量
HOSTNAME="server01"
TIMEZONE="Asia/Shanghai"
NTP_SERVER="ntp.aliyun.com"
ADMIN_USER="admin"
SSH_PORT="22"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${GREEN}=== Ubuntu Server 初始化脚本 ===${NC}"

# 1. 更新系统
echo -e "${YELLOW}[1/10] 更新系统...${NC}"
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y

# 2. 设置主机名
echo -e "${YELLOW}[2/10] 设置主机名...${NC}"
sudo hostnamectl set-hostname "$HOSTNAME"

# 3. 配置时区
echo -e "${YELLOW}[3/10] 配置时区...${NC}"
sudo timedatectl set-timezone "$TIMEZONE"
sudo timedatectl set-ntp true

# 4. 安装常用工具
echo -e "${YELLOW}[4/10] 安装常用工具...${NC}"
sudo apt install -y \
    vim \
    curl \
    wget \
    net-tools \
    htop \
    tree \
    unzip \
    git \
    software-properties-common \
    apt-transport-https \
    ca-certificates \
    gnupg \
    lsb-release

# 5. 配置防火墙
echo -e "${YELLOW}[5/10] 配置防火墙...${NC}"
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow "$SSH_PORT/tcp"
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
echo "y" | sudo ufw enable

# 6. 配置 SSH
echo -e "${YELLOW}[6/10] 配置 SSH...${NC}"
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sudo sed -i 's/#ClientAliveInterval 0/ClientAliveInterval 300/' /etc/ssh/sshd_config
sudo sed -i 's/#ClientAliveCountMax 3/ClientAliveCountMax 2/' /etc/ssh/sshd_config
sudo systemctl restart sshd

# 7. 配置自动更新
echo -e "${YELLOW}[7/10] 配置自动更新...${NC}"
sudo apt install -y unattended-upgrades
sudo bash -c 'cat > /etc/apt/apt.conf.d/20auto-upgrades << EOF
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
EOF'

# 8. 配置日志持久化
echo -e "${YELLOW}[8/10] 配置日志持久化...${NC}"
sudo mkdir -p /var/log/journal
sudo bash -c 'cat >> /etc/systemd/journald.conf << EOF

[Journal]
Storage=persistent
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxFileSec=1week
EOF'
sudo systemctl restart systemd-journald

# 9. 禁用不必要的服务
echo -e "${YELLOW}[9/10] 禁用不必要的服务...${NC}"
sudo systemctl disable bluetooth 2>/dev/null || true
sudo systemctl stop bluetooth 2>/dev/null || true

# 10. 清理
echo -e "${YELLOW}[10/10] 清理...${NC}"
sudo apt autoremove -y
sudo apt autoclean

echo -e "${GREEN}=== 初始化完成!===${NC}"
echo "请检查以下配置:"
echo "- 主机名: $(hostname)"
echo "- 时区: $(timedatectl | grep 'Time zone')"
echo "- 防火墙状态:"
sudo ufw status

Cloud-init 配置(云平台自动化)

自动化初始化与验证闭环

自动化闭环

对于云平台部署,可以使用 cloud-init 进行自动化初始化:

yaml
#cloud-config
hostname: server01
fqdn: server01.company.local
manage_etc_hosts: true

timezone: Asia/Shanghai

users:
  - name: admin
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1... your-key

package_update: true
package_upgrade: true

packages:
  - vim
  - curl
  - wget
  - htop
  - tree
  - git
  - ufw

runcmd:
  # 配置防火墙
  - ufw default deny incoming
  - ufw default allow outgoing
  - ufw allow 22/tcp
  - ufw allow 80/tcp
  - ufw allow 443/tcp
  - echo "y" | ufw enable

  # 配置 SSH
  - sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
  - systemctl restart sshd

  # 配置自动更新
  - apt install -y unattended-upgrades

  # 重启以应用所有更改
  - reboot

Ansible Playbook(批量部署)

对于大规模服务器部署,推荐使用 Ansible:

yaml
---
- name: Linux Server Initialization
  hosts: all
  become: yes

  vars:
    timezone: "Asia/Shanghai"
    admin_user: "admin"

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Upgrade all packages
      apt:
        upgrade: yes
        autoremove: yes

    - name: Set timezone
      timezone:
        name: "{{ timezone }}"

    - name: Install common packages
      apt:
        name:
          - vim
          - curl
          - wget
          - htop
          - tree
          - git
          - ufw
          - unattended-upgrades
        state: present

    - name: Configure UFW
      ufw:
        state: enabled
        policy: deny

    - name: Allow SSH through UFW
      ufw:
        rule: allow
        port: "22"
        proto: tcp

    - name: Configure SSH
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: "{{ item.regexp }}"
        line: "{{ item.line }}"
      with_items:
        - { regexp: "^#?PermitRootLogin", line: "PermitRootLogin no" }
        - { regexp: "^#?PermitEmptyPasswords", line: "PermitEmptyPasswords no" }
        - { regexp: "^#?ClientAliveInterval", line: "ClientAliveInterval 300" }
      notify: restart sshd

    - name: Enable automatic updates
      copy:
        content: |
          APT::Periodic::Update-Package-Lists "1";
          APT::Periodic::Unattended-Upgrade "1";
          APT::Periodic::AutocleanInterval "7";
        dest: /etc/apt/apt.conf.d/20auto-upgrades

  handlers:
    - name: restart sshd
      service:
        name: sshd
        state: restarted

验证方法

基础验证检查清单

系统初始化验证与排障清单

验证排障

1. 系统信息验证

bash
# 检查操作系统版本
cat /etc/os-release

# 预期输出包含:
# NAME="Ubuntu"
# VERSION_ID="22.04"
# VERSION="22.04.3 LTS"

# 检查内核版本
uname -r
# 预期输出:5.15.0-XX-generic 或更高

2. 网络配置验证

bash
# 检查 IP 地址
ip addr show

# 检查路由
ip route | grep default

# 测试网络连通性
ping -c 4 8.8.8.8
ping -c 4 www.baidu.com

# 检查 DNS 解析
nslookup www.baidu.com

3. 磁盘和分区验证

bash
# 检查分区挂载
df -h

# 检查分区表
lsblk

# 检查文件系统类型
findmnt

4. 时区和时间验证

bash
# 检查时区
timedatectl | grep "Time zone"
# 预期输出:Time zone: Asia/Shanghai

# 检查时间同步状态
timedatectl | grep "NTP enabled"
# 预期输出:NTP enabled: yes

# 检查当前时间
date

5. 防火墙验证

bash
# 检查防火墙状态
sudo ufw status verbose

# 预期输出包含:
# Status: active
# Default: deny (incoming), allow (outgoing)
# 22/tcp  ALLOW IN  Anywhere

# 测试端口监听
sudo ss -tlnp | grep :22

6. SSH 配置验证

bash
# 检查 SSH 服务状态
sudo systemctl status sshd

# 验证 SSH 配置
sudo sshd -t
# 预期输出:无错误信息

# 测试 SSH 连接(从另一台机器)
ssh admin@server-ip

7. 安全更新验证

bash
# 检查 unattended-upgrades 状态
sudo systemctl status unattended-upgrades

# 检查自动更新配置
cat /etc/apt/apt.conf.d/20auto-upgrades

# 手动测试更新检查
sudo apt update
sudo apt list --upgradable

自动化验证脚本

bash
#!/bin/bash
# 系统初始化验证脚本

ERRORS=0

check_command() {
    if eval "$2" > /dev/null 2>&1; then
        echo "✅ $1"
    else
        echo "❌ $1"
        ERRORS=$((ERRORS + 1))
    fi
}

echo "=== 系统初始化验证 ==="

check_command "操作系统版本" "grep 'VERSION_ID=\"22.04\"' /etc/os-release"
check_command "主机名配置" "hostname | grep -q 'server'"
check_command "网络连通性" "ping -c 1 8.8.8.8"
check_command "DNS 解析" "nslookup www.baidu.com"
check_command "时区配置" "timedatectl | grep -q 'Asia/Shanghai'"
check_command "NTP 同步" "timedatectl | grep -q 'NTP enabled: yes'"
check_command "防火墙启用" "ufw status | grep -q 'Status: active'"
check_command "SSH 服务运行" "systemctl is-active sshd"
check_command "Root 登录已禁用" "grep -q 'PermitRootLogin no' /etc/ssh/sshd_config"

echo ""
if [ $ERRORS -eq 0 ]; then
    echo "✅ 所有检查通过!"
    exit 0
else
    echo "❌ 发现 $ERRORS 个问题,请检查配置"
    exit 1
fi

故障排查

问题 1:无法连接网络

症状:安装后无法访问互联网

排查步骤

bash
# 1. 检查网络接口状态
ip link

# 2. 检查 IP 地址配置
ip addr

# 3. 检查路由表
ip route

# 4. 测试本地回环
ping 127.0.0.1

# 5. 测试网关
ping <gateway-ip>

# 6. 检查 DNS 配置
cat /etc/resolv.conf

解决方案

  • 检查网线/网络连接
  • 重新配置 Netplan:
bash
sudo nano /etc/netplan/00-installer-config.yaml
sudo netplan apply

问题 2:SSH 连接被拒绝

症状:无法通过 SSH 连接到服务器

排查步骤

bash
# 在服务器上检查
sudo systemctl status sshd
sudo ss -tlnp | grep :22
sudo cat /var/log/auth.log | grep ssh

解决方案

  • 确保 SSH 服务运行:sudo systemctl start sshd
  • 检查防火墙规则:sudo ufw allow 22/tcp
  • 检查 SELinux/AppArmor(如启用)

问题 3:磁盘空间不足

症状:安装过程中提示磁盘空间不足

排查步骤

bash
# 检查磁盘使用情况
df -h

# 检查大文件
sudo du -sh /* 2>/dev/null | sort -hr | head -20

解决方案

  • 清理不必要的包:sudo apt autoremove -y
  • 清理下载缓存:sudo apt autoclean
  • 调整分区大小(LVM 环境下)

安装决策与风险处理

1. 应该选择物理分区还是 LVM?

A: 推荐在生产环境使用 LVM(逻辑卷管理),原因如下:

  1. 灵活性:可以在线扩展/缩小分区,无需停机
  2. 快照功能:支持创建文件系统快照,便于备份
  3. 存储池化:多个物理磁盘可以组成卷组,灵活分配

适用场景

  • LVM:生产服务器、需要频繁调整存储的环境
  • 标准分区:测试环境、简单应用、对性能敏感的场景(LVM 有轻微性能开销)

安装时选择 LVM

  • Ubuntu:安装时选择 "Use LVM with the new Ubuntu installation"
  • CentOS/RHEL:安装时选择 "LVM" 分区方案

2. 交换分区(swap)应该多大?

A: 交换分区大小取决于系统内存和使用场景:

内存大小 推荐 Swap 大小 说明
< 2GB 内存的 2 倍 小内存系统需要更多交换
2-8GB 等于内存大小 通用服务器推荐
8-64GB 内存的 0.5 倍 大内存系统
> 64GB 4-8GB 或根据实际需求

特殊场景

  • 数据库服务器:建议禁用 swap 或设置很小的 swap(1-2GB),避免数据库使用交换内存
  • 桌面系统:建议保留 swap,用于休眠功能
  • 容器主机:建议配置 swap,但限制容器使用

使用交换文件替代交换分区: 现代 Linux 支持使用交换文件,灵活性更高:

bash
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

3. 如何自动化大规模服务器部署?

A: 大规模部署推荐使用以下方案:

方案 1:PXE + Kickstart/Preseed(裸机部署)

  • 配置 PXE 服务器(DHCP + TFTP)
  • 创建无人值守安装配置文件
  • 服务器网络启动后自动完成安装

方案 2:云平台镜像 + Cloud-init

  • 创建预配置的系统镜像
  • 使用 cloud-init 进行首次启动配置
  • 支持 AWS、Azure、阿里云等主流云平台

方案 3:Ansible + 模板镜像

  • 创建最小化基础镜像
  • 使用 Ansible Playbook 进行配置管理
  • 适合虚拟机环境

方案 4:容器化部署

  • 使用 Docker/Podman 运行应用
  • 操作系统层面保持最小化
  • 适合微服务架构

4. 安装后如何修改分区大小?

A: 取决于使用的分区类型:

LVM 分区(推荐方式)

bash
# 扩展逻辑卷
sudo lvextend -L +10G /dev/ubuntu-vg/ubuntu-lv

# 扩展文件系统
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
# 或 XFS
sudo xfs_growfs /

标准分区(较复杂)

  • 需要卸载分区或使用 Live CD
  • 使用 GParted 等工具调整
  • 风险较高,建议先备份数据

5. 如何确保初始化配置的安全性?

A: 遵循以下安全最佳实践:

  1. 最小化安装

    • 只安装必要的软件包
    • 禁用不必要的服务
  2. 及时更新

    • 启用自动安全更新
    • 定期检查漏洞公告
  3. 访问控制

    • 禁用 root 远程登录
    • 使用 SSH 密钥认证
    • 配置 sudo 权限
  4. 网络安全

    • 启用防火墙,默认拒绝所有入站
    • 只开放必要的端口
    • 使用 Fail2ban 防止暴力破解
  5. 日志和审计

    • 启用系统审计
    • 配置集中日志收集
    • 定期审查日志
  6. 使用安全扫描工具

    bash
    # Lynis 安全审计
    sudo apt install lynis
    sudo lynis audit system
    
    # OpenSCAP 合规检查
    sudo apt install libopenscap8
    

6. 如何处理云实例的初始化?

A: 云平台实例使用 cloud-init 进行初始化:

AWS EC2 示例

bash
# 创建 user-data 脚本
cat > user-data.txt << 'EOF'
#!/bin/bash
apt update
apt install -y nginx
systemctl enable nginx
EOF

# 启动实例时指定
eaws ec2 run-instances \
  --image-id ami-xxxxx \
  --user-data file://user-data.txt \
  ...

阿里云 ECS 示例

bash
# 在控制台创建实例时,在"高级选项"中粘贴 cloud-init 配置
# 或使用 API 指定 UserData

常见 cloud-init 模块

  • users:创建用户和 SSH 密钥
  • package_update/package_upgrade:更新系统
  • packages:安装软件包
  • runcmd:运行自定义命令
  • write_files:写入配置文件
  • power_state:配置完成后重启

7. 系统初始化后如何创建快照/备份?

A: 根据环境选择备份方案:

虚拟机快照

  • VMware:创建虚拟机快照
  • KVM:使用 virsh snapshot-create
  • Proxmox:通过 Web 界面创建快照

LVM 快照

bash
# 创建快照(只读)
sudo lvcreate -L 10G -s -n root-snapshot /dev/vg0/root

# 恢复快照
sudo umount /dev/vg0/root
sudo lvconvert --merge /dev/vg0/root-snapshot

文件级备份

bash
# 使用 tar 备份关键配置
tar czvf /backup/config-$(date +%Y%m%d).tar.gz \
  /etc/ssh/sshd_config \
  /etc/netplan/ \
  /etc/ufw/ \
  /etc/hosts

# 使用 rsync 同步
rsync -avz /etc/ user@backup-server:/backups/server01/etc/

系统级备份工具

  • Timeshift:基于快照的系统备份(适合桌面)
  • BorgBackup:增量备份工具
  • Veeam Agent:商业备份方案

8. 如何验证初始化脚本是否执行成功?

A: 使用以下方法验证:

方法 1:检查日志

bash
# 查看 cloud-init 日志(云平台)
cat /var/log/cloud-init.log
cat /var/log/cloud-init-output.log

# 查看系统日志
cat /var/log/syslog | grep cloud-init

方法 2:使用验证脚本

bash
# 运行前面提供的验证脚本
./verify-init.sh

方法 3:检查配置状态

bash
# 检查各项配置是否生效
timedatectl status
ufw status
systemctl status sshd
cat /etc/ssh/sshd_config | grep PermitRootLogin

方法 4:使用配置管理工具

bash
# Ansible 检查模式
ansible-playbook --check init-playbook.yml

# 测试执行
ansible-playbook init-playbook.yml

9. 不同发行版的初始化有何差异?

A: 主要差异如下:

配置项 Ubuntu/Debian CentOS/RHEL/Rocky openSUSE
包管理 apt/dpkg yum/dnf/rpm zypper
网络配置 Netplan NetworkManager/配置文件 NetworkManager/Wicked
防火墙 ufw firewalld firewalld
SELinux 默认启用 可选
自动更新 unattended-upgrades dnf-automatic zypper 定时任务
时区配置 timedatectl timedatectl timedatectl

CentOS/RHEL 初始化示例

bash
# 更新系统
sudo yum update -y

# 安装常用工具
sudo yum install -y vim curl wget net-tools htop

# 配置 firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

# 配置自动更新
sudo yum install -y dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

10. 如何建立标准化的初始化流程?

A: 建立标准化流程的步骤:

步骤 1:制定标准文档

  • 编写详细的初始化操作手册
  • 定义基线配置要求
  • 建立检查清单

步骤 2:版本控制

  • 将初始化脚本存入 Git 仓库
  • 使用标签管理版本
  • 记录变更历史

步骤 3:自动化测试

  • 在测试环境验证脚本
  • 使用 CI/CD 流水线自动测试
  • 定期进行安全扫描

步骤 4:建立基线镜像

  • 创建预配置的系统镜像
  • 定期更新镜像(安全补丁)
  • 版本化管理镜像

步骤 5:监控和审计

  • 记录所有初始化操作
  • 定期检查配置漂移
  • 建立合规性报告

示例:标准初始化检查清单模板

markdown
# 服务器初始化检查清单

## 基础信息
- [ ] 主机名:_____________
- [ ] IP 地址:_____________
- [ ] 操作系统:_____________
- [ ] 初始化日期:_____________

## 网络配置
- [ ] 静态 IP 配置正确
- [ ] DNS 解析正常
- [ ] 网关可达
- [ ] 防火墙规则配置

## 安全配置
- [ ] Root 登录已禁用
- [ ] SSH 密钥已配置
- [ ] 自动更新已启用
- [ ] 不必要的服务已禁用

## 签名
初始化人员:_____________ 日期:_____________
审核人员:_____________ 日期:_____________

总结

系统安装与初始化是 Linux 系统管理的基础环节,直接影响后续运维工作的效率和质量。本文详细介绍了:

  1. 安装介质和启动方式:ISO、PXE、云镜像等多种安装方式的选择
  2. 磁盘分区方案:MBR vs GPT、分区大小规划、文件系统选择
  3. 完整的安装步骤:从启动到完成安装的详细流程
  4. 初始化配置:网络、安全、时区、防火墙、SSH 等核心配置
  5. 自动化工具:脚本、cloud-init、Ansible 等批量部署方案
  6. 验证方法:系统化的检查和故障排查

关键要点回顾

  • 生产环境推荐使用 LVM 和 ext4/XFS 文件系统
  • 安全基线必须在初始化阶段就建立
  • 标准化流程是规模化运维的基础
  • 自动化工具可以大幅提升部署效率

下一步学习: 在掌握了系统安装和初始化之后,建议继续学习《用户与权限管理》,深入了解 Linux 的安全访问控制机制。

参考资料



本文最后更新于 2026-05-02