1. Linux系统安装基础指南
作为一名Linux系统管理员,我经常需要在新硬件上部署操作系统。Linux安装看似简单,但其中有许多细节决定了后续使用的稳定性。这里分享我在CentOS和Ubuntu系统上的实战经验。
最关键的准备工作是硬件兼容性检查。以戴尔PowerEdge R740服务器为例,我们需要特别注意RAID卡驱动是否包含在安装镜像中。我遇到过多次因为缺少megaraid_sas驱动导致安装程序无法识别磁盘的情况。解决方法是在安装启动时添加dd参数加载额外驱动,或者使用厂商提供的定制镜像。
重要提示:企业级服务器安装前务必查阅硬件兼容列表(HCL),特别是对于HBA卡、NVMe驱动等特殊硬件。
安装介质的选择也很有讲究。对于UEFI启动的现代服务器,我推荐使用Ventoy制作多系统启动U盘。相比传统的Rufus或dd命令,Ventoy可以在单个U盘存放多个ISO文件,且支持Secure Boot。具体操作步骤:
- 下载Ventoy的Linux版本压缩包
- 解压后运行安装脚本:
bash复制sudo sh Ventoy2Disk.sh -i /dev/sdX - 将ISO文件直接拷贝到U盘第一个分区
分区方案是另一个需要精心设计的环节。对于数据库服务器,我通常采用以下分区结构:
| 挂载点 | 大小 | 文件系统 | 备注 |
|---|---|---|---|
| /boot | 1G | ext4 | 必须独立分区 |
| / | 50G | xfs | 根分区 |
| /var | 100G | xfs | 日志类数据 |
| /data | 剩余 | xfs | LVM卷便于扩展 |
这种设计将频繁写入的/var目录独立出来,避免日志文件占满根分区。使用xfs文件系统是因为其在大文件处理和高并发写入场景下的优异表现,特别适合数据库应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 软件包管理核心工具详解
Linux软件管理主要有两大体系:RPM和DEB。作为红帽系系统的核心,RPM工具链的功能远比表面看到的强大。下面以安装MySQL社区版为例,演示高级用法。
当从MySQL官网下载到mysql-community-server-8.0.33-1.el7.x86_64.rpm包时,不要直接rpm -ivh安装。正确做法是先检查依赖:
bash复制rpm -qpR mysql-community-server-8.0.33-1.el7.x86_64.rpm
这会列出所有依赖项。如果网络环境允许,应该配置官方仓库后通过yum安装,可以自动解决依赖问题。创建/etc/yum.repos.d/mysql.repo:
ini复制[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=https://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
然后执行:
bash复制sudo yum module disable mysql
sudo yum install mysql-community-server
这种方式的优势在于后续可以方便地通过yum update升级,而手动rpm安装的包不会纳入yum管理。
对于本地已下载的rpm包组,可以使用yum的localinstall功能:
bash复制yum localinstall *.rpm
这比直接rpm -ivh更智能,会自动处理包组内的依赖关系。我在部署GlusterFS集群时就深有体会,十几个互相依赖的rpm包用这个命令可以一键解决。
3. YUM仓库的深度配置实践
生产环境中,配置本地YUM仓库是必备技能。以创建CentOS 7本地仓库为例:
-
挂载ISO或同步官方镜像:
bash复制
reposync -n -r base -p /data/repos/centos7 -
创建仓库元数据:
bash复制
createrepo -v /data/repos/centos7/base -
配置客户端repo文件:
ini复制[local-base] name=Local CentOS Base baseurl=http://repo-server/centos7/base enabled=1 gpgcheck=0
我遇到过一个典型问题:createrepo生成的元数据在某些客户端上无法识别。原因是默认生成的primary.xml.gz使用了不兼容的压缩级别。解决方法是指定压缩参数:
bash复制createrepo -v --compress-type=gz --checksum=sha256 \
--database --update /data/repos/centos7/base
对于企业内部开发的软件包,建议按以下结构组织仓库:
code复制/repo
├── os # 基础系统包
├── updates # 安全更新
├── epel # EPEL扩展包
└── custom # 自研软件
├── stable # 稳定版
└── testing # 测试版
这种结构可以通过yum的priority插件实现智能优先级管理。创建/etc/yum/pluginconf.d/priorities.conf:
ini复制[main]
enabled=1
check_obsoletes=1
然后在各repo文件中添加优先级参数:
ini复制priority=1 # 数字越小优先级越高
4. 系统服务管理进阶技巧
systemd作为现代Linux的初始化系统,其功能远不止start/stop/status这么简单。以下是几个实用案例:
服务依赖调试:当nginx服务启动失败时,使用以下命令查看详细日志:
bash复制journalctl -u nginx --no-pager -n 50
如果提示端口冲突,可以用socket激活方式解决:
ini复制[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
[Service]
Type=notify
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
资源限制配置:对于Java应用,经常需要限制内存使用。在service文件中添加:
ini复制LimitNOFILE=65536
LimitMEMLOCK=infinity
LimitAS=infinity
LimitRSS=infinity
定时任务集成:替代cron的现代方案是systemd timer。创建/etc/systemd/system/backup.timer:
ini复制[Unit]
Description=Daily backup
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
对应的service文件:
ini复制[Unit]
Description=Backup service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
这种方案比cron更强大,可以精确控制任务依赖关系和资源限制。
5. 编译安装与二进制分发实践
虽然包管理器很方便,但某些场景下仍需手动编译。以安装最新版Python为例:
-
安装开发工具链:
bash复制yum groupinstall "Development Tools" yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel -
下载源码并编译:
bash复制wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz tar xzf Python-3.11.4.tgz cd Python-3.11.4 ./configure --enable-optimizations --with-lto --prefix=/usr/local/python3.11 make -j$(nproc) sudo make altinstall
关键参数说明:
--enable-optimizations:启用PGO优化,提升10-20%性能--with-lto:链接时优化altinstall:防止覆盖系统Python
对于需要分发给多台服务器的自研软件,建议制作rpm包。最简单的spec文件示例:
spec复制Name: myapp
Version: 1.0
Release: 1%{?dist}
Summary: My custom application
License: GPLv3+
URL: http://example.com
Source0: %{name}-%{version}.tar.gz
BuildRequires: gcc, make
Requires: libcurl
%description
My custom application for demo purpose.
%prep
%setup -q
%build
make %{?_smp_mflags}
%install
mkdir -p %{buildroot}%{_bindir}
install -m 755 myapp %{buildroot}%{_bindir}
%files
%{_bindir}/myapp
%changelog
* Tue Aug 01 2023 Your Name <email@example.com> - 1.0-1
- Initial package
使用rpmbuild构建:
bash复制rpmbuild -bb myapp.spec
6. 容器化环境下的软件管理
随着Docker普及,传统包管理方式也在变革。但即便是容器环境,也需要理解底层机制。
构建优化技巧:多阶段构建可以显著减小镜像大小。以Python应用为例:
dockerfile复制# 构建阶段
FROM python:3.9 as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
# 运行时阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
关键优化点:
- 使用slim基础镜像
- 分离构建和运行时阶段
- 只复制必要的依赖文件
调试容器内进程:当容器内服务异常时,可以:
bash复制docker exec -it <container> bash
ps auxf
cat /proc/<pid>/environ | tr '\0' '\n'
strace -p <pid>
对于需要持久化的配置数据,推荐使用ConfigMap方式管理:
bash复制kubectl create configmap nginx-config --from-file=nginx.conf=/path/to/nginx.conf
在部署到Kubernetes时,可以通过Init Container完成依赖安装:
yaml复制initContainers:
- name: install-deps
image: alpine
command: ["sh", "-c"]
args:
- apk add --no-cache curl jq;
curl -O https://example.com/setup.sh;
chmod +x setup.sh;
volumeMounts:
- name: shared-data
mountPath: /data
7. 安全更新与补丁管理
生产系统必须建立完善的更新机制。我采用的策略是:
-
测试环境验证:
bash复制
yum --enablerepo=updates-testing update -
分级部署:
bash复制# 第一批服务器 yum -y --security update-minimal # 观察24小时后第二批 yum -y --security update -
自动回滚准备:
bash复制dnf history list dnf history undo <ID>
对于关键安全更新,可以使用离线方案。首先在有网络的机器上下载更新包:
bash复制yum install --downloadonly --downloaddir=/tmp/updates kernel
然后制作签名清单:
bash复制createrepo -v /tmp/updates
gpg --detach-sign --armor /tmp/updates/repodata/repomd.xml
最后将整个目录拷贝到目标系统安装:
bash复制yum localupdate /tmp/updates/*.rpm
8. 性能监控与调优基础
安装后的性能调优同样重要。几个实用工具:
BPF工具集:现代性能分析利器
bash复制# 跟踪文件打开
sudo opensnoop-bpfcc
# 监控TCP重传
sudo tcpretrans-bpfcc
# 统计系统调用
sudo syscount-bpfcc
调优参数示例:/etc/sysctl.conf优化
ini复制# 提高TCP性能
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 减少交换倾向
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# 文件描述符限制
fs.file-max = 2097152
IO调度器选择:对于NVMe SSD,建议设置为none:
bash复制echo none > /sys/block/nvme0n1/queue/scheduler
对于传统磁盘,deadline通常表现更好:
bash复制echo deadline > /sys/block/sda/queue/scheduler
这些调优需要根据实际负载测试调整。建议先用基准测试工具验证:
bash复制# 内存带宽测试
sudo mbw -n 10 256
# 磁盘IO测试
sudo fio --name=randread --ioengine=libaio --iodepth=32 \
--rw=randread --bs=4k --direct=1 --size=1G --numjobs=4 \
--runtime=60 --group_reporting
9. 自动化部署实践
对于大规模部署,自动化工具必不可少。Ansible是我推荐的首选方案。
主机准备playbook示例:
yaml复制- hosts: all
become: yes
tasks:
- name: Install base packages
yum:
name: "@Development Tools,vim,htop,tmux"
state: present
- name: Configure sysctl
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
state: present
reload: yes
loop:
- {name: net.ipv4.tcp_tw_reuse, value: 1}
- {name: vm.swappiness, value: 10}
- name: Add sudo user
user:
name: deploy
groups: wheel
append: yes
password: "{{ 'password' | password_hash('sha512') }}"
- name: Deploy SSH key
authorized_key:
user: deploy
key: "{{ lookup('file', '/home/user/.ssh/id_rsa.pub') }}"
软件部署playbook:
yaml复制- hosts: db_servers
vars:
mysql_version: 8.0
mysql_password: "securepassword"
tasks:
- name: Add MySQL repo
yum_repository:
name: mysql
description: MySQL repo
baseurl: https://repo.mysql.com/yum/mysql-{{ mysql_version }}-community/el/7/$basearch/
gpgkey: https://repo.mysql.com/RPM-GPG-KEY-mysql
gpgcheck: yes
- name: Install MySQL server
yum:
name: mysql-community-server
state: present
- name: Start MySQL service
service:
name: mysqld
state: started
enabled: yes
- name: Change root password
mysql_user:
login_user: root
login_password: ""
name: root
password: "{{ mysql_password }}"
host: localhost
check_implicit_admin: yes
这种自动化方案可以将数十台服务器的部署时间从几天缩短到几小时,且保证环境一致性。
