第一次接触Linux是在2008年,当时为了搭建一个稳定的Web服务器而选择了CentOS 5。与Windows完全不同的操作方式让我手足无措,但也正是这种差异让我意识到:Linux不仅仅是一个操作系统,更是一种哲学。经过15年的运维实践,我总结出Linux最核心的三大特性:
一切皆文件的设计哲学:硬件设备、进程信息、系统配置都以文件形式存在。比如插入U盘后,你会发现它被映射为/dev/sdb1这样的设备文件,而CPU信息则保存在/proc/cpuinfo中。这种统一接口让系统管理变得异常简洁。
权限控制的精确性:每个文件都有严格的rwx(读写执行)权限设置,配合用户组机制,可以实现精细的访问控制。记得有次公司内网被入侵,正是因为某个配置文件的权限被误设为777(所有用户可读写执行)。
强大的命令行生态:Linux下90%的管理工作都可以通过命令行完成。比如要批量查找并替换项目中的代码,一条命令就能搞定:
bash复制find . -type f -name "*.php" -exec sed -i 's/old_string/new_string/g' {} +
面对数百种Linux发行版,新手常会陷入选择困难。根据我的经验,可以按使用场景这样选择:
| 使用场景 | 推荐发行版 | 优势特点 |
|---|---|---|
| 服务器环境 | CentOS/RHEL | 长期支持,企业级稳定性 |
| 开发环境 | Ubuntu/Debian | 软件包丰富,社区支持完善 |
| 嵌入式开发 | OpenWRT/Yocto | 资源占用低,定制化程度高 |
| 桌面日常使用 | Linux Mint | 开箱即用,对新手友好 |
重要提示:生产环境务必选择LTS(长期支持)版本,避免使用滚动更新的发行版如Arch Linux
合理的分区方案能显著提升系统安全性和维护便利性。这是我为数据库服务器设计的典型分区方案:
使用fdisk进行分区的实操命令:
bash复制fdisk /dev/sda # 进入分区工具
n # 新建分区
p # 主分区
1 # 分区编号
+1G # 分配1GB空间
w # 写入更改
这些命令构成了Linux日常操作的骨架:
文件操作:
bash复制cp -a source_dir dest_dir # 保留属性的完整复制
find / -name "*.conf" -mtime -7 # 查找7天内修改过的配置文件
文本处理三剑客:
bash复制grep -rin "error" /var/log # 递归搜索日志中的错误
awk '{print $1,$3}' access.log # 提取日志特定列
sed -i 's/127.0.0.1/localhost/g' *.conf # 批量替换配置
系统监控:
bash复制top -c -u mysql # 监控MySQL进程资源占用
iostat -x 1 # 实时磁盘IO监控
一个完整的备份脚本示例:
bash复制#!/bin/bash
# 定义备份目录和日志
BACKUP_DIR="/backups"
LOG_FILE="/var/log/backup_$(date +%Y%m%d).log"
# 检查目录是否存在
[ -d $BACKUP_DIR ] || mkdir -p $BACKUP_DIR
# 主备份函数
backup_files() {
tar -czf $BACKUP_DIR/web_$(date +%Y%m%d).tar.gz \
--exclude="*.tmp" \
/var/www/html 2>> $LOG_FILE
# 验证备份完整性
if [ $? -eq 0 ]; then
echo "[$(date)] Backup succeeded" >> $LOG_FILE
else
echo "[$(date)] Backup failed!" >> $LOG_FILE
exit 1
fi
}
# 执行备份并清理旧文件
backup_files
find $BACKUP_DIR -type f -mtime +30 -delete
现代Linux发行版都采用systemd作为初始化系统。关键操作包括:
查看服务依赖关系:
bash复制systemctl list-dependencies nginx.service
自定义服务单元示例(/etc/systemd/system/myapp.service):
ini复制[Unit]
Description=My Custom Application
After=network.target
[Service]
Type=simple
User=appuser
ExecStart=/usr/local/bin/myapp --daemon
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
日志查看技巧:
bash复制journalctl -u nginx --since "2023-08-01" --until "2023-08-02"
除了经典的crontab,更推荐使用systemd timer实现精确调度:
创建定时器单元(/etc/systemd/system/backup.timer):
ini复制[Unit]
Description=Daily backup timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
关联服务单元(/etc/systemd/system/backup.service):
ini复制[Unit]
Description=Database backup service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_script.sh
修改/etc/ssh/sshd_config的关键参数:
conf复制Port 2222 # 修改默认端口
PermitRootLogin no # 禁止root直接登录
MaxAuthTries 3 # 限制尝试次数
ClientAliveInterval 300 # 超时断开设置
AllowUsers admin@192.168.1.* # IP白名单控制
使用firewalld的推荐配置:
bash复制firewall-cmd --permanent --new-zone=webserver
firewall-cmd --permanent --zone=webserver --add-service=http
firewall-cmd --permanent --zone=webserver --add-service=https
firewall-cmd --permanent --zone=webserver --add-port=2222/tcp
firewall-cmd --permanent --zone=webserver --add-source=192.168.1.0/24
firewall-cmd --reload
/etc/sysctl.conf关键配置:
conf复制# 提高TCP连接性能
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 文件系统优化
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 10
# 网络缓冲区设置
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
针对不同存储设备的优化方案:
SSD固态硬盘:
bash复制echo noop > /sys/block/sda/queue/scheduler
机械硬盘(数据库场景):
bash复制echo deadline > /sys/block/sdb/queue/scheduler
查看当前调度策略:
bash复制cat /sys/block/sd*/queue/scheduler
当系统无法启动时,可以:
在GRUB菜单按e编辑启动参数,在linux行末尾添加:
code复制systemd.unit=rescue.target
进入救援模式后检查:
bash复制journalctl -xb # 查看启动日志
fsck /dev/sda1 # 检查文件系统
mount -o remount,rw / # 重新挂载为可写
| 问题现象 | 排查命令 | 可能原因 |
|---|---|---|
| 磁盘空间不足 | df -h du -sh * |
日志文件过大 |
| 内存泄漏 | free -m ps aux --sort=-%mem |
应用程序bug |
| CPU负载高 | top pidstat 1 |
死循环进程 |
| 网络连接失败 | ping traceroute ss -tulnp |
防火墙阻止 |
构建C/C++开发环境:
bash复制# Ubuntu/Debian
sudo apt install build-essential cmake gdb
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install cmake3 gdb
推荐使用pyenv管理多版本Python:
bash复制curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install 3.9.12
pyenv global 3.9.12
python -m venv myproject
source myproject/bin/activate