Ubuntu 从入门到精通
Ubuntu 从入门到精通
本指南涵盖从系统安装到高级运维的完整知识体系,适合 Linux 初学者及希望深入掌握 Ubuntu 系统的用户。
目录
- 准备工作与环境选择
- 系统安装与初始配置
- 基础命令与文件系统
- 软件包管理
- 用户与权限管理
- 网络配置与远程访问
- 存储管理与文件系统
- 系统服务与进程管理
- Shell 脚本编程
- 系统监控与性能调优
- 安全加固与防火墙
- 故障排查与恢复
一、准备工作与环境选择
1.1 Ubuntu 版本选择
Ubuntu 提供多个官方版本,根据使用场景选择:
| 版本 | 适用场景 | 支持周期 |
|---|---|---|
| Ubuntu Desktop | 个人电脑、开发工作站 | 9个月(LTS为5年) |
| Ubuntu Server | 服务器、云计算 | 5年(LTS) |
| Ubuntu LTS | 生产环境、企业部署 | 5年(可扩展至10年) |
推荐策略:
- 个人学习:选择最新的 LTS 版本(如 22.04 LTS 或 24.04 LTS)
- 生产服务器:必须使用 LTS 版本
- 开发测试:可使用非 LTS 版本体验新特性
1.2 硬件要求
最低配置:
- CPU:2 GHz 双核处理器
- 内存:4 GB RAM
- 存储:25 GB 可用空间
- 网络:互联网连接(用于更新)
推荐配置:
- CPU:64 位四核处理器
- 内存:8 GB 或更高
- 存储:SSD,50 GB 以上
- 显卡:支持 OpenGL 的 GPU(桌面版)
1.3 安装介质准备
下载官方 ISO 镜像:
# 通过命令行下载(示例为 22.04 LTS)wget https://releases.ubuntu.com/22.04/ubuntu-22.04.4-desktop-amd64.iso
# 验证校验和sha256sum ubuntu-22.04.4-desktop-amd64.iso
制作启动盘(在 Linux 上):
```bash# 插入 USB 设备,确认设备名(如 /dev/sdb,务必确认正确)sudo fdisk -l
# 卸载设备sudo umount /dev/sdb*
# 写入镜像(谨慎操作,会清空 U 盘数据)sudo dd if=ubuntu-22.04.4-desktop-amd64.iso of=/dev/sdb bs=4M status=progress二、系统安装与初始配置
2.1 安装过程关键步骤
-
启动方式选择
- UEFI 模式(推荐):支持 Secure Boot,启动更快
- Legacy BIOS:兼容旧硬件
-
分区方案
推荐方案(桌面版):
/boot/efi 512 MB EFI 系统分区/boot 1 GB 引导分区(可选)/ 50 GB+ 根分区(ext4)/home 剩余空间 用户数据分区swap 4-8 GB 交换分区(或 swapfile)服务器推荐方案:
/boot 1 GB/ 100 GB 系统与应用程序/var 50 GB 日志与数据/home 单独分区 用户数据隔离/tmp 10 GB 临时文件(noexec 挂载) -
安装类型选择
- 清除整个磁盘并安装:适合新电脑
- 与其他系统共存:双系统方案
- 手动分区:高级用户自定义
2.2 首次启动配置
更新系统至最新状态:
sudo apt update && sudo apt upgrade -y安装必要工具:
sudo apt install -y \ build-essential \ curl \ wget \ git \ vim \ htop \ net-tools \ software-properties-common \ apt-transport-https \ ca-certificates \ gnupg \ lsb-release配置时区与区域设置:
# 查看当前时区timedatectl status
# 列出可用时区timedatectl list-timezones | grep Shanghai
# 设置时区sudo timedatectl set-timezone Asia/Shanghai
# 启用 NTP 时间同步sudo timedatectl set-ntp true三、基础命令与文件系统
3.1 Linux 文件系统层次标准(FHS)
/ 根目录├── /bin 基本用户命令(二进制文件)├── /boot 引导加载程序文件├── /dev 设备文件├── /etc 系统配置文件├── /home 用户主目录├── /lib 共享库文件├── /media 可移动媒体挂载点├── /mnt 临时挂载点├── /opt 可选应用软件包├── /proc 进程信息虚拟文件系统├── /root root 用户主目录├── /run 运行时变量数据├── /sbin 系统管理命令├── /srv 服务数据├── /sys 系统信息虚拟文件系统├── /tmp 临时文件├── /usr 用户程序│ ├── /bin 非基本用户命令│ ├── /lib 非基本共享库│ └── /local 本地安装软件├── /var 可变数据文件│ ├── /log 日志文件│ └── /spool 任务队列3.2 文件与目录操作
基础导航:
# 查看当前目录pwd
# 切换目录cd /path/to/directorycd ~ # 回到家目录cd - # 回到上次目录cd .. # 上级目录
# 列出目录内容ls -la # 详细列表,包含隐藏文件ls -lh # 人类可读的文件大小ls -lt # 按时间排序ls -ltr # 反向时间排序文件操作:
# 创建文件touch filename.txt> filename.txt # 清空或创建空文件
# 查看文件内容cat file.txt # 显示全部内容less file.txt # 分页查看(可向前翻页)more file.txt # 分页查看head -n 20 file.txt # 前 20 行tail -n 20 file.txt # 后 20 行tail -f /var/log/syslog # 实时跟踪日志
# 复制、移动、删除cp source.txt dest.txt # 复制文件cp -r source_dir/ dest_dir/ # 递归复制目录mv oldname.txt newname.txt # 重命名/移动rm file.txt # 删除文件rm -r directory/ # 递归删除目录rm -rf directory/ # 强制递归删除(谨慎使用)
# 创建目录mkdir newdirmkdir -p path/to/nested/dir # 递归创建父目录
# 查找文件find /path -name "*.txt" # 按名称查找find /path -type f -size +100M # 查找大于 100MB 的文件find /path -mtime -7 # 7 天内修改的文件locate filename # 快速定位(需 updatedb)3.3 文本处理工具
grep:文本搜索
# 基础搜索grep "pattern" file.txt
# 常用选项grep -i "pattern" file.txt # 忽略大小写grep -r "pattern" /path/ # 递归搜索grep -n "pattern" file.txt # 显示行号grep -v "pattern" file.txt # 反向匹配(排除)grep -E "pattern1|pattern2" # 扩展正则表达式grep -C 3 "pattern" file.txt # 显示上下文 3 行
# 管道组合ps aux | grep nginxcat /var/log/syslog | grep error | tail -20sed:流编辑器
# 替换文本sed 's/old/new/' file.txt # 每行首次替换sed 's/old/new/g' file.txt # 全局替换sed -i 's/old/new/g' file.txt # 直接修改文件(原地编辑)
# 删除行sed '/pattern/d' file.txt # 删除匹配行sed '2,5d' file.txt # 删除 2-5 行
# 高级用法sed -n '10,20p' file.txt # 打印 10-20 行sed 's/^/# /' file.txt # 行首添加注释awk:文本处理语言
# 基础用法(按空格分割,打印第 1、3 列)awk '{print $1, $3}' file.txt
# 指定分隔符awk -F: '{print $1}' /etc/passwd
# 条件过滤awk '$3 > 100 {print $1}' file.txt
# 计算总和awk '{sum += $1} END {print sum}' numbers.txt
# 复杂处理ps aux | awk '/nginx/ && !/awk/ {print $2, $11}'四、软件包管理
4.1 APT 包管理系统
APT(Advanced Package Tool)是 Ubuntu 的核心包管理工具。
基础命令:
# 更新包列表sudo apt update
# 升级已安装包sudo apt upgrade # 安全升级sudo apt full-upgrade # 完整升级(可能删除依赖包)sudo apt dist-upgrade # 发行版升级
# 安装软件sudo apt install package_namesudo apt install pkg1 pkg2 pkg3 # 批量安装
# 删除软件sudo apt remove package_name # 保留配置文件sudo apt purge package_name # 完全删除(包括配置)
# 清理系统sudo apt autoremove # 删除未使用的依赖sudo apt clean # 清理下载的包缓存
# 搜索与信息apt search keyword # 搜索包apt show package_name # 显示包信息apt list --installed # 列出已安装包apt list --upgradeable # 列出可升级包软件源管理:
# 查看当前源cat /etc/apt/sources.listls /etc/apt/sources.list.d/
# 更换国内镜像源(以阿里云为例)sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 编辑源列表(Ubuntu 22.04 Jammy 示例)sudo tee /etc/apt/sources.list << 'EOF'deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverseEOF
sudo apt update4.2 Snap 与 Flatpak
Snap(Ubuntu 主推):
# 基础命令sudo snap install package_namesudo snap remove package_namesnap list # 列出已安装snap find keyword # 搜索包sudo snap refresh # 更新所有sudo snap revert package_name # 回滚版本
# 常用软件安装sudo snap install code --classic # VS Codesudo snap install chromiumsudo snap install dockerFlatpak(跨发行版):
# 安装 Flatpaksudo apt install flatpak
# 添加 Flathub 仓库sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 安装软件sudo flatpak install flathub com.spotify.Clientflatpak run com.spotify.Client4.3 从源码编译安装
当需要特定版本或自定义编译选项时:
# 1. 安装编译依赖sudo apt build-dep package_name
# 2. 下载源码wget https://example.com/software-1.0.tar.gztar -xzf software-1.0.tar.gzcd software-1.0
# 3. 编译安装(经典三步)./configure --prefix=/usr/localmakesudo make install
# 或使用 CMakemkdir build && cd buildcmake ..makesudo make install五、用户与权限管理
5.1 用户管理基础
用户类型:
- root:超级管理员(UID 0)
- 系统用户:运行服务(UID 1-999)
- 普通用户:交互式登录(UID 1000+)
用户管理命令:
# 创建用户sudo adduser username # 交互式(推荐)sudo useradd -m -s /bin/bash username # 非交互式sudo passwd username # 设置密码
# 修改用户sudo usermod -aG sudo username # 添加到 sudo 组sudo usermod -l newname oldname # 重命名sudo usermod -d /new/home -m username # 修改主目录
# 删除用户sudo deluser username # 删除用户sudo deluser --remove-home username # 同时删除主目录
# 查看用户信息id usernamewhoamiwho # 当前登录用户w # 登录用户及活动last # 登录历史5.2 组管理
# 创建组sudo groupadd groupname
# 管理组成员sudo usermod -aG groupname username # 添加用户到组sudo gpasswd -d username groupname # 从组移除用户
# 查看组信息groups usernamegetent group groupnamecat /etc/group | grep groupname5.3 文件权限系统
权限表示:
-rwxr-xr-x 1 user group 1234 Jan 1 12:00 file.sh│└┬┘└┬┘└┬┘│ │ │ └── 其他用户权限 (rwx)│ │ └───── 所属组权限 (rwx)│ └──────── 所有者权限 (rwx)└────────── 文件类型 (- 文件, d 目录, l 链接)权限数值:
| 权限 | 数值 | 说明 |
|---|---|---|
| r(读) | 4 | 查看内容 |
| w(写) | 2 | 修改内容 |
| x(执行) | 1 | 执行文件/进入目录 |
常用权限组合:
- 755(rwxr-xr-x):可执行文件、目录
- 644(rw-r—r—):普通文件
- 700(rwx------):私有文件
- 777(rwxrwxrwx):开放权限(尽量避免)
权限管理命令:
# 修改权限chmod 755 file.shchmod u+x file.sh # 给所有者添加执行权限chmod go-w file.txt # 移除组和其他人的写权限chmod -R 755 directory/ # 递归修改
# 修改所有者sudo chown user:group file.txtsudo chown -R user:group directory/sudo chgrp groupname file.txt # 仅修改组
# 特殊权限chmod u+s /usr/bin/passwd # SUID(以所有者权限执行)chmod g+s /shared/dir # SGID(新建文件继承组)chmod +t /tmp # Sticky Bit(仅删除自己的文件)5.4 sudo 与权限委派
配置 sudo 权限:
# 编辑 sudoers 文件(必须使用 visudo)sudo visudo
# 添加自定义规则username ALL=(ALL:ALL) ALL # 完全权限%admin ALL=(ALL) NOPASSWD: ALL # 免密码 sudousername ALL=(root) /usr/bin/apt, /usr/bin/systemctl # 限定命令sudo 使用技巧:
sudo -i # 切换到 root 环境sudo -u www-data whoami # 以特定用户执行sudo !! # 以 sudo 执行上条命令sudo -l # 查看当前用户 sudo 权限六、网络配置与远程访问
6.1 网络基础配置
查看网络信息:
# IP 地址ip addr showip -4 addr show eth0
# 路由表ip route show
# DNS 配置cat /etc/resolv.confsystemd-resolve --status
# 网络统计ss -tuln # 监听端口netstat -tulpn # 类似功能(需安装 net-tools)Netplan 配置(Ubuntu 18.04+):
# 配置文件位置/etc/netplan/00-installer-config.yaml
# 静态 IP 配置示例sudo tee /etc/netplan/01-static.yaml << 'EOF'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.114EOF
sudo netplan apply6.2 SSH 远程管理
安装与基础配置:
sudo apt install openssh-serversudo systemctl enable sshsudo systemctl start ssh安全配置(/etc/ssh/sshd_config):
# 关键安全设置Port 2222 # 修改默认端口PermitRootLogin no # 禁止 root 登录PasswordAuthentication no # 禁用密码认证(使用密钥)PubkeyAuthentication yes # 启用密钥认证MaxAuthTries 3 # 最大尝试次数ClientAliveInterval 300 # 心跳检测ClientAliveCountMax 2AllowUsers user1 user2 # 白名单用户
# 重启服务sudo systemctl restart sshd密钥认证配置:
# 生成密钥对ssh-keygen -t ed25519 -C "your_email@example.com"# 或传统 RSAssh-keygen -t rsa -b 4096
# 复制公钥到服务器ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
# 手动添加公钥cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 设置权限(服务器端)chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keysSSH 客户端技巧:
# 配置文件 ~/.ssh/configHost myserver HostName 192.168.1.100 User admin Port 2222 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60
# 使用别名连接ssh myserver
# 代理转发ssh -A user@jump-server
# 本地端口转发ssh -L 8080:localhost:80 user@remote-server
# 远程端口转发ssh -R 9090:localhost:3000 user@remote-server6.3 防火墙配置(UFW)
# 基础操作sudo ufw enable # 启用sudo ufw disable # 禁用sudo ufw status verbose # 查看状态
# 规则管理sudo ufw default deny incoming # 默认拒绝入站sudo ufw default allow outgoing # 默认允许出站
# 添加规则sudo ufw allow 22/tcp # 允许 SSHsudo ufw allow 80/tcp # HTTPsudo ufw allow 443/tcp # HTTPSsudo ufw allow from 192.168.1.0/24 # 允许特定网段
# 删除规则sudo ufw delete allow 80/tcpsudo ufw reset # 重置所有规则
# 高级规则sudo ufw allow proto tcp from any to any port 10000:20000七、存储管理与文件系统
7.1 磁盘分区与格式化
查看磁盘信息:
lsblk # 列出块设备fdisk -l # 详细分区信息df -h # 磁盘使用情况du -sh /path # 目录大小分区操作(fdisk/gdisk):
# MBR 分区(fdisk,最大 2TB)sudo fdisk /dev/sdb# 常用命令:n(新建), d(删除), p(打印), w(写入), q(退出)
# GPT 分区(gdisk,推荐用于大磁盘)sudo gdisk /dev/sdb
# 非交互式分区(parted)sudo parted /dev/sdb mklabel gptsudo parted -a optimal /dev/sdb mkpart primary ext4 0% 100%文件系统创建:
# 创建 ext4 文件系统sudo mkfs.ext4 /dev/sdb1sudo mkfs.ext4 -L "DataDisk" /dev/sdb1 # 添加标签
# 创建 XFS(大文件性能更好)sudo apt install xfsprogssudo mkfs.xfs /dev/sdb1
# 检查文件系统sudo fsck /dev/sdb1sudo e2fsck -f /dev/sdb1 # 强制检查 ext 系列7.2 挂载与自动挂载
手动挂载:
sudo mkdir /mnt/datasudo mount /dev/sdb1 /mnt/datasudo mount -o remount,ro /mnt/data # 重新挂载为只读配置 /etc/fstab 实现开机挂载:
# 获取 UUIDsudo blkid /dev/sdb1
# 编辑 fstabsudo vim /etc/fstab
# 添加条目(使用 UUID 更可靠)UUID=xxxxx-xxxx-xxxx-xxxx-xxxxxxxx /mnt/data ext4 defaults,noatime,nofail 0 2
# 字段说明:# <file system> <mount point> <type> <options> <dump> <pass># noatime: 减少写操作,提升性能# nofail: 启动时若磁盘不存在不报错# 0 2: 不备份,开机检查顺序(根分区为 1,其他为 2,0 为不检查)验证配置:
sudo mount -a # 挂载所有条目sudo systemctl daemon-reload # 重新加载 systemd7.3 LVM 逻辑卷管理
LVM 提供灵活的磁盘空间管理,支持动态调整大小。
基础概念:
- PV(Physical Volume):物理卷
- VG(Volume Group):卷组
- LV(Logical Volume):逻辑卷
操作步骤:
# 1. 创建物理卷sudo pvcreate /dev/sdb /dev/sdc
# 2. 创建卷组sudo vgcreate vg_data /dev/sdb /dev/sdc
# 3. 创建逻辑卷sudo lvcreate -L 50G -n lv_www vg_data # 固定大小sudo lvcreate -l 100%FREE -n lv_backup vg_data # 使用全部剩余空间
# 4. 创建文件系统sudo mkfs.ext4 /dev/vg_data/lv_www
# 5. 挂载使用sudo mkdir /var/wwwsudo mount /dev/vg_data/lv_www /var/www
# 扩展逻辑卷(在线扩容)sudo lvextend -L +20G /dev/vg_data/lv_wwwsudo resize2fs /dev/vg_data/lv_www # ext4# 或 xfs_growfs /mnt/point # XFS
# 查看信息sudo pvs, vgs, lvs # 简要信息sudo pvdisplay, vgdisplay, lvdisplay # 详细信息7.4 RAID 配置
软件 RAID(mdadm):
sudo apt install mdadm
# 创建 RAID 1(镜像)sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 创建 RAID 5(至少需要 3 块盘)sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd[bcd]1
# 查看状态cat /proc/mdstatsudo mdadm --detail /dev/md0
# 保存配置sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.confsudo update-initramfs -u
# 创建文件系统并挂载sudo mkfs.ext4 /dev/md0八、系统服务与进程管理
8.1 systemd 系统管理
systemd 是 Ubuntu 15.04+ 的初始化系统和服务管理器。
服务管理:
# 服务控制sudo systemctl start service_namesudo systemctl stop service_namesudo systemctl restart service_namesudo systemctl reload service_name # 重新加载配置(不中断服务)sudo systemctl status service_name
# 开机自启sudo systemctl enable service_namesudo systemctl disable service_namesudo systemctl is-enabled service_name
# 查看所有服务systemctl list-units --type=service --state=runningsystemctl list-unit-files --type=service
# 查看启动耗时systemd-analyzesystemd-analyze blame # 各服务耗时日志管理(journald):
# 查看日志sudo journalctl # 所有日志sudo journalctl -u nginx # 特定服务sudo journalctl -f # 实时跟踪sudo journalctl --since "1 hour ago"sudo journalctl --since "2024-01-01" --until "2024-01-31"sudo journalctl -p err # 错误级别日志
# 日志维护sudo journalctl --vacuum-time=7d # 保留 7 天sudo journalctl --vacuum-size=500M # 限制大小8.2 进程管理
查看进程:
ps aux # 详细进程列表ps aux | grep nginxps -ef --forest # 显示进程树pstree # 树形显示
# 动态监控tophtop # 需安装,更友好
# 进程信息pidof nginx # 获取进程 IDpgrep nginx # 类似功能进程控制:
# 终止进程kill PIDkill -9 PID # 强制终止killall process_name # 按名称终止pkill process_name
# 调整优先级(nice 值 -20 到 19,越小优先级越高)nice -n 10 command # 以低优先级启动sudo renice -n -5 -p PID # 调整运行中进程
# 后台与前台command & # 后台运行Ctrl+Z # 暂停当前进程bg # 后台运行暂停的进程fg # 前台运行jobs # 查看后台任务8.3 定时任务(cron)
系统级定时任务:
# 编辑 crontabsudo crontab -e
# 格式:分 时 日 月 周 命令# 每天凌晨 3 点备份0 3 * * * /usr/local/bin/backup.sh
# 每 5 分钟检查服务*/5 * * * * /usr/local/bin/check_service.sh
# 每周日清理日志0 0 * * 0 /usr/local/bin/cleanup.sh >> /var/log/cleanup.log 2>&1特殊时间字符串:
@reboot:开机时@yearly:每年 1 月 1 日 0:00@monthly:每月 1 日 0:00@weekly:每周日 0:00@daily:每天 0:00@hourly:每小时 0 分
用户级定时任务:
crontab -e # 编辑当前用户任务crontab -l # 列出任务crontab -r # 删除所有任务anacron(适合非 24 小时运行的机器):
sudo apt install anacron# 配置文件 /etc/anacrontab# 格式:周期 延迟 标识 命令7 5 cron.weekly run-parts /etc/cron.weekly九、Shell 脚本编程
9.1 Bash 基础语法
脚本结构:
#!/bin/bash# 描述: 系统备份脚本# 作者: Your Name# 日期: 2024-01-01
set -euo pipefail # 严格模式# -e: 命令失败立即退出# -u: 使用未定义变量报错# -o pipefail: 管道中任一命令失败则整体失败
# 变量定义BACKUP_DIR="/backup"DATE=$(date +%Y%m%d)LOG_FILE="/var/log/backup_${DATE}.log"
# 函数定义log_message() { local level="$1" local message="$2" echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" | tee -a "$LOG_FILE"}
# 主逻辑main() { log_message "INFO" "开始备份..."
if [[ ! -d "$BACKUP_DIR" ]]; then mkdir -p "$BACKUP_DIR" log_message "INFO" "创建备份目录: $BACKUP_DIR" fi
# 备份操作 tar -czf "${BACKUP_DIR}/backup_${DATE}.tar.gz" /etc /home 2>/dev/null
if [[ $? -eq 0 ]]; then log_message "SUCCESS" "备份完成" else log_message "ERROR" "备份失败" exit 1 fi}
# 执行主函数main "$@"条件判断:
# 文件测试[[ -e file.txt ]] # 存在[[ -f file.txt ]] # 是普通文件[[ -d directory ]] # 是目录[[ -r file.txt ]] # 可读[[ -w file.txt ]] # 可写[[ -x script.sh ]] # 可执行[[ -s file.txt ]] # 非空[[ file1 -nt file2 ]] # file1 比 file2 新
# 字符串比较[[ "$str1" == "$str2" ]][[ "$str1" != "$str2" ]][[ -z "$str" ]] # 空字符串[[ -n "$str" ]] # 非空字符串[[ "$str" =~ regex ]] # 正则匹配
# 数值比较(使用 (( )) 或 -eq 系列)[[ $num1 -eq $num2 ]] # 等于[[ $num1 -ne $num2 ]] # 不等于[[ $num1 -gt $num2 ]] # 大于[[ $num1 -lt $num2 ]] # 小于[[ $num1 -ge $num2 ]] # 大于等于[[ $num1 -le $num2 ]] # 小于等于
# 逻辑运算[[ condition1 && condition2 ]][[ condition1 || condition2 ]][[ ! condition ]]流程控制:
# if 语句if [[ condition ]]; then # ...elif [[ condition ]]; then # ...else # ...fi
# case 语句case "$VAR" in start) echo "Starting..." ;; stop) echo "Stopping..." ;; restart) echo "Restarting..." ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;;esac
# for 循环for i in {1..10}; do echo $idone
for file in /var/log/*.log; do echo "Processing: $file"done
# while 循环counter=0while [[ $counter -lt 10 ]]; do echo $counter ((counter++))done
# until 循环until [[ -f /tmp/signal ]]; do sleep 1done
# 读取文件while IFS= read -r line; do echo "$line"done < file.txt9.2 高级脚本技巧
参数处理:
#!/bin/bash
# 获取参数echo "脚本名: $0"echo "第一个参数: $1"echo "参数个数: $#"echo "所有参数: $@"echo "所有参数(单字符串): $*"
# getopts 处理选项while getopts ":u:p:h" opt; do case $opt in u) USERNAME="$OPTARG" ;; p) PASSWORD="$OPTARG" ;; h) show_help; exit 0 ;; \?) echo "无效选项: -$OPTARG" >&2; exit 1 ;; :) echo "选项 -$OPTARG 需要参数" >&2; exit 1 ;; esacdoneshift $((OPTIND-1))
# 使用:./script.sh -u admin -p secret arg1 arg2数组操作:
# 定义数组fruits=("apple" "banana" "cherry")
# 访问元素echo "${fruits[0]}" # 第一个元素echo "${fruits[-1]}" # 最后一个元素echo "${fruits[@]}" # 所有元素echo "${#fruits[@]}" # 数组长度
# 遍历数组for fruit in "${fruits[@]}"; do echo "$fruit"done
# 关联数组(Bash 4.0+)declare -A useruser[name]="John"user[age]=30echo "${user[name]}"for key in "${!user[@]}"; do echo "$key: ${user[$key]}"done错误处理与调试:
#!/bin/bash
# 错误处理函数error_handler() { local line_no=$1 local error_code=$2 echo "错误发生在第 $line_no 行,退出码: $error_code" >&2 # 清理操作 cleanup exit $error_code}
trap 'error_handler ${LINENO} $?' ERR
# 调试模式set -x # 开启调试(显示执行的每条命令)set +x # 关闭调试
# 或在脚本头部指定#!/bin/bash -x
# 更精细的调试[[ "${DEBUG:-0}" == "1" ]] && set -x# 运行:DEBUG=1 ./script.sh十、系统监控与性能调优
10.1 系统监控工具
综合监控:
# htop(交互式进程查看器)sudo apt install htophtop
# glances(全能系统监控)sudo apt install glancesglances
# vmstat(系统整体状态)vmstat 1 10 # 每秒采样,共 10 次
# iostat(IO 统计)sudo apt install sysstatiostat -x 1 # 扩展统计,每秒刷新
# sar(系统活动报告)sar -u 1 5 # CPU 使用率sar -r 1 5 # 内存使用率sar -d 1 5 # 块设备活动网络监控:
# iftop(实时带宽监控)sudo apt install iftopsudo iftop -i eth0
# nethogs(按进程查看带宽)sudo apt install nethogssudo nethogs eth0
# netstat/ssss -s # 套接字统计ss -tuln # 监听端口ss -tp # 显示进程
# tcpdump(抓包分析)sudo tcpdump -i eth0 -w capture.pcapsudo tcpdump -i eth0 port 8010.2 性能分析
CPU 分析:
# 查看 CPU 信息lscpucat /proc/cpuinfo
# 负载分析uptimecat /proc/loadavg
# perf 性能分析sudo apt install linux-tools-commonsudo perf top # 实时热点函数sudo perf record -a -g -- sleep 10 # 记录 10 秒sudo perf report # 查看报告内存分析:
# 内存使用情况free -hcat /proc/meminfo
# 查看内存占用最高的进程ps aux --sort=-%mem | head -10
# slab 分配器信息cat /proc/slabinfoslabtop
# 查找内存泄漏(valgrind)sudo apt install valgrindvalgrind --leak-check=full ./program磁盘 IO 分析:
# IO 延迟ioping -c 10 /path
# 实时 IO 监控iotop # 需 root 权限
# blktrace(块层跟踪)sudo apt install blktracesudo blktrace -d /dev/sda -o - | blkparse -i -10.3 内核参数调优
sysctl 配置:
# 查看当前参数sysctl -a | grep net.coresysctl vm.swappiness
# 临时修改sudo sysctl vm.swappiness=10
# 永久修改(/etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf)sudo tee /etc/sysctl.d/99-performance.conf << 'EOF'# 网络优化net.core.somaxconn = 65535net.core.netdev_max_backlog = 65535net.ipv4.tcp_max_syn_backlog = 65535net.ipv4.tcp_fin_timeout = 10net.ipv4.tcp_keepalive_time = 1200net.ipv4.tcp_tw_reuse = 1
# 内存优化vm.swappiness = 10vm.dirty_ratio = 15vm.dirty_background_ratio = 5
# 文件描述符fs.file-max = 2097152fs.nr_open = 2097152EOF
sudo sysctl --system # 重新加载资源限制(ulimit):
# 查看限制ulimit -a
# 临时修改(当前会话)ulimit -n 65535 # 文件描述符ulimit -u 4096 # 最大进程数
# 永久修改(/etc/security/limits.conf)* soft nofile 65535* hard nofile 65535* soft nproc 4096* hard nproc 4096root soft nofile 65535root hard nofile 65535十一、安全加固与防火墙
11.1 基础安全加固
账户安全:
# 删除无用账户sudo deluser gamessudo deluser irc
# 锁定 root 密码(强制使用 sudo)sudo passwd -l root
# 设置密码策略(/etc/security/pwquality.conf)minlen = 12minclass = 3maxrepeat = 2
# 密码过期策略(/etc/login.defs)PASS_MAX_DAYS 90PASS_MIN_DAYS 7PASS_WARN_AGE 14文件权限检查:
# 查找 SUID/SGID 文件find / -perm -4000 -type f 2>/dev/null
# 查找无属主文件find / -nouser -o -nogroup 2>/dev/null
# 查找全局可写文件find / -type f -perm -002 2>/dev/null
# 修复权限sudo chmod u-s /path/to/suspicious/filesudo chown root:root /path/to/file11.2 Fail2ban 入侵防御
sudo apt install fail2ban
# 配置(/etc/fail2ban/jail.local)sudo tee /etc/fail2ban/jail.local << 'EOF'[DEFAULT]bantime = 3600findtime = 600maxretry = 3backend = systemd
[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 86400
[nginx-http-auth]enabled = truefilter = nginx-http-authport = http,httpslogpath = /var/log/nginx/error.logEOF
sudo systemctl restart fail2bansudo fail2ban-client status sshd11.3 审计与日志
auditd 系统审计:
sudo apt install auditd
# 监控文件变更sudo auditctl -w /etc/passwd -p wa -k identity_changessudo auditctl -w /etc/nginx/nginx.conf -p wa -k nginx_config
# 查看审计日志sudo ausearch -k identity_changessudo aureport --login --summary -i
# 永久规则(/etc/audit/rules.d/audit.rules)-w /etc/passwd -p wa -k identity_changes-w /etc/group -p wa -k identity_changes-a always,exit -F arch=b64 -S setuid -S setgid -k privilege_escalation日志集中管理(rsyslog):
# 客户端配置(发送日志到中央服务器)sudo tee -a /etc/rsyslog.d/99-forward.conf << 'EOF'*.* @log-server.example.com:514EOF
sudo systemctl restart rsyslog
# 服务器配置(接收日志)sudo tee -a /etc/rsyslog.d/10-server.conf << 'EOF'$ModLoad imudp$UDPServerRun 514$ModLoad imtcp$InputTCPServerRun 514
$template RemoteLogs,"/var/log/remote/%fromhost-ip%/%programname%.log"*.* ?RemoteLogs& stopEOF十二、故障排查与恢复
12.1 启动故障修复
GRUB 修复:
# 使用 Live USB 启动,选择 "Try Ubuntu"sudo add-apt-repository ppa:yannubuntu/boot-repairsudo apt updatesudo apt install boot-repairsudo boot-repair
# 或手动修复sudo mount /dev/sda2 /mnt # 根分区sudo mount /dev/sda1 /mnt/boot/efi # EFI 分区(如果是 UEFI)sudo mount --bind /dev /mnt/devsudo mount --bind /proc /mnt/procsudo mount --bind /sys /mnt/syssudo chroot /mntgrub-install /dev/sdaupdate-grubexitsudo reboot单用户模式(恢复模式):
- 启动时按住 Shift 或 Esc 进入 GRUB 菜单
- 选择 “Advanced options for Ubuntu”
- 选择 “Recovery mode”
- 选择 root 进入命令行
文件系统修复:
# 卸载分区(或从 Live USB 启动)sudo umount /dev/sda1
# 检查并修复sudo fsck -y /dev/sda1 # 自动修复sudo fsck -n /dev/sda1 # 只检查不修复
# 针对 ext 系列sudo e2fsck -f /dev/sda1sudo e2fsck -p /dev/sda1 # 自动修复
# 针对 XFSsudo xfs_repair /dev/sda1 # 必须卸载sudo xfs_repair -L /dev/sda1 # 强制修复(可能丢失数据)12.2 网络故障排查
诊断流程:
# 1. 检查物理连接ethtool eth0dmesg | grep eth
# 2. 检查 IP 配置ip addr showcat /etc/netplan/*.yaml
# 3. 检查路由ip route showping -c 4 8.8.8.8 # 测试外网连通性traceroute 8.8.8.8
# 4. 检查 DNScat /etc/resolv.confnslookup google.comdig google.com
# 5. 检查端口ss -tulntelnet host portnc -zv host port
# 6. 抓包分析sudo tcpdump -i any -w debug.pcap# 使用 Wireshark 分析12.3 数据恢复
误删除文件恢复:
# 立即停止写入,卸载分区sudo umount /dev/sda1
# 安装工具sudo apt install testdisk photorec
# TestDisk(分区表恢复)sudo testdisk
# PhotoRec(文件恢复,按签名)sudo photorec /dev/sda1
# ext4 专用(extundelete,需未覆盖)sudo apt install extundeletesudo extundelete /dev/sda1 --restore-file /path/to/deleted/filesudo extundelete /dev/sda1 --restore-all备份策略:
# rsync 增量备份rsync -avz --delete --exclude='*.tmp' /source/ /backup/
# 使用 borgbackup(重复数据删除)sudo apt install borgbackupborg init --encryption=repokey /path/to/repoborg create /path/to/repo::backup-{now} /home /etcborg list /path/to/repoborg extract /path/to/repo::backup-2024-01-01
# 自动化备份脚本(结合 cron)#!/bin/bash# /usr/local/bin/backup.shDATE=$(date +%Y%m%d_%H%M%S)borg create --stats --progress \ /backup/borg::auto-${DATE} \ /home \ /etc \ /var/www \ --exclude '/home/*/.cache'borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 /backup/borg附录:常用速查表
A. 快捷键
| 快捷键 | 功能 |
|---|---|
Ctrl + C | 终止当前进程 |
Ctrl + Z | 暂停当前进程 |
Ctrl + D | 退出当前 shell(EOF) |
Ctrl + L | 清屏(类似 clear) |
Ctrl + A | 光标移到行首 |
Ctrl + E | 光标移到行尾 |
Ctrl + R | 反向搜索历史命令 |
Ctrl + U | 删除光标前所有字符 |
Ctrl + K | 删除光标后所有字符 |
Ctrl + W | 删除前一个单词 |
Tab | 自动补全 |
!! | 执行上一条命令 |
!$ | 上一条命令的最后一个参数 |
!n | 执行历史记录第 n 条命令 |
!string | 执行最近以 string 开头的命令 |
B. 重要文件路径
| 路径 | 说明 |
|---|---|
/etc/passwd | 用户账户信息 |
/etc/shadow | 用户密码(加密) |
/etc/group | 组信息 |
/etc/hosts | 静态主机名解析 |
/etc/resolv.conf | DNS 配置 |
/etc/ssh/sshd_config | SSH 服务配置 |
/etc/crontab | 系统级定时任务 |
/var/log/syslog | 系统日志(Ubuntu) |
/var/log/auth.log | 认证日志 |
/var/log/nginx/ | Nginx 日志 |
/proc/cpuinfo | CPU 信息 |
/proc/meminfo | 内存信息 |
/proc/loadavg | 系统负载 |
C. 推荐学习资源
-
官方文档
-
在线资源
- Linux Foundation
- Arch Wiki(技术细节极佳)
-
认证考试
- Linux Foundation Certified System Administrator (LFCS)
- CompTIA Linux+
- Red Hat Certified System Administrator (RHCSA)
结语
掌握 Ubuntu 需要理论与实践相结合。建议:
- 搭建实验环境:使用虚拟机(VirtualBox/VMware)或云服务器(AWS/Azure/阿里云)进行练习
- 从桌面版开始:熟悉图形界面后逐步转向命令行和服务器版
- 阅读 man 手册:
man command是最权威的帮助文档 - 参与社区:Ubuntu 中文论坛、Stack Overflow、GitHub 开源项目
- 建立知识库:使用笔记软件记录遇到的问题和解决方案
Linux 系统的学习是一个持续的过程,保持好奇心和动手能力,你将逐步从入门走向精通。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时









