
简介这份资源是面向Ubuntu新手与进阶用户的系统学习与实战指南覆盖从安装配置到开发环境搭建的完整路径。内容按新手入门、进阶优化、实战项目与资源导航分层展开入门部分讲解ISO镜像制作启动盘、UEFI与传统BIOS分区方案、apt软件源更新与终端常用命令进阶部分涉及systemd开机加速、htop资源监控、Docker容器化部署与Python虚拟环境创建实战环节给出LAMP个人博客搭建、Bash自动化脚本、Docker Compose多服务编排及Harbor私有仓库等具体案例并附官方文档、社区教程与依赖冲突、显卡驱动等常见问题处理思路。资源包为1个docx文档约21KB结构清晰、便于按需查阅。目前已有1124人学习适合希望系统掌握Ubuntu日常使用与开发环境配置的读者参考实践。1. 从一台裸机到能跑 Docker这份 Ubuntu 资源包到底装了什么很多人第一次装 Ubuntu卡住的地方根本不是分区而是装完之后不知道下一步该干什么。ISO 写进 U 盘、系统起来、能进桌面然后呢软件源没换、开发工具链没装、显卡驱动是开源 nouveau、Docker 装完还得手动加组这些事没人一次性讲清楚。这份《Ubuntu 使用教程与资源指南》就是冲着这个断层来的它把新手入门、性能调优、开发环境搭建、LAMP 部署、Docker Compose 编排、Harbor 私有仓库串成一条线从裸机安装一路铺到能跑容器化应用。适合两类人刚接触 Linux 想少走弯路的以及已经会用 Ubuntu 但环境搭得零零散散、想系统化补一遍的。下面按我实际拆包的顺序把每一步的命令、参数和翻车点讲透。2. 安装与首次配置分区方案、软件源和开发工具链2.1 分区方案怎么定/、/home、swap 的取舍资源里给的推荐方案是/30GB、/home剩余空间、swap内存的 2 倍。这个方案在 2025 年需要按场景微调。/给 30GB 是底线如果你要装 CUDA Toolkit、PyTorch 这类大块头/usr和/opt会迅速膨胀建议/给到 50GB 以上。swap给内存 2 倍是传统机械盘时代的经验现在内存普遍 16GB 起步swap 给 8GB 到 16GB 足够除非你要用休眠功能那 swap 必须大于等于内存容量。/home单独分区的价值在于重装系统时数据不丢这一点在资源里没展开但它是新手最该养成的习惯。UEFI 和传统 BIOS 的区别也要注意。UEFI 模式下需要额外分一个 512MB 的 EFI 系统分区格式选 FAT32挂载点/boot/efi。传统 BIOS 不需要这个分区但需要留 1MB 到 2MB 的保留空间给 GRUB。制作启动盘用 Rufus 时分区类型选 GPT 对应 UEFI选 MBR 对应传统 BIOS选错了机器直接不认盘。提示分区操作前先在虚拟机里走一遍确认分区表和引导模式匹配再上真机。2.2 首次配置更新源、装工具链、配中文输入法系统装完第一件事不是装软件是更新软件源。资源里给的命令是对的但没讲清楚为什么先 update 再 upgrade。sudo apt update sudo apt upgrade -y # update 刷新软件包索引upgrade 执行实际升级 # -y 自动确认批量操作时省去逐条回车apt update只更新索引不装任何东西apt upgrade才根据新索引升级已装包。跳过 update 直接 upgrade可能因为索引过期导致依赖解析失败。国内网络环境下默认源速度可能不理想常见做法是换成国内镜像源编辑/etc/apt/sources.list把archive.ubuntu.com替换为对应镜像地址然后重新apt update。接着装开发工具链sudo apt install build-essential -y # 包含 gcc、g、make、libc6-dev 等编译基础组件 # 装 CUDA、编译内核模块、pip 装带 C 扩展的包都依赖它build-essential是元包它本身不包含代码只是一组依赖的集合。很多人pip install某个包时报gcc: command not found根因就是没装这个。中文输入法方面搜狗输入法在 Ubuntu 22.04 之后的兼容性时好时坏常见做法是先用系统自带的 IBus 拼音稳定后再考虑第三方方案。装完输入法要检查/etc/environment里的GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS三个变量是否配置正确配错了表现为能切换但打不出字。2.3 软件管理apt 与图形化工具的边界资源里列了apt search、apt install、apt remove --purge三条命令这里补一个容易被忽略的点--purge和普通remove的区别。sudo apt remove --purge [软件名] # remove 只删二进制保留配置文件 # --purge 连配置文件一起删重装时不会继承旧配置 sudo apt autoremove # 清理不再被依赖的孤儿包释放磁盘空间--purge在排查配置冲突时特别有用。比如你改坏了某个服务的配置文件想回到出厂状态remove再install是没用的旧配置还在必须--purge才能彻底重置。图形化的 Ubuntu Software 和 Synaptic 适合浏览和搜索但批量操作和精确控制还是命令行更可靠。Synaptic 的优势在于能可视化依赖树排查依赖冲突时比纯命令行直观。3. 性能调优与开发环境从开机加速到 Docker 隔离3.1 开机加速systemd-analyze 定位耗时服务资源里给的systemd-analyze blame是排查开机慢的入口命令但光看 blame 不够得配合 critical-chain 才能找到真正的瓶颈。systemd-analyze blame # 按耗时降序列出所有服务的启动时间 systemd-analyze critical-chain # 显示关键启动链标出阻塞点blame列出的是每个服务自身耗时但有些服务是并行启动的单独看它耗时长不代表它拖慢了整体。critical-chain显示的是串行依赖链链上任何一个环节慢整体就慢。常见做法是先用 blame 找到耗时 top 5 的服务再用 critical-chain 确认它是否在关键路径上。确认后禁用sudo systemctl disable [服务名] # 禁止开机自启但不停止当前运行实例 sudo systemctl mask [服务名] # 彻底屏蔽连手动启动都不行适合确认永远不需要的服务disable和mask的区别在于disable只是去掉开机自启的软链接服务仍可手动startmask是创建一个指向/dev/null的链接任何启动尝试都会被拒绝。不确定是否永久需要时先用disable。3.2 Docker 安装与用户组配置资源里的一键安装脚本curl -fsSL https://get.docker.com | sh能用但生产环境我更倾向分步装方便控制版本。sudo apt install docker.io -y # 从 Ubuntu 官方源装版本可能略旧但经过兼容性测试 sudo usermod -aG docker $USER # 把当前用户加入 docker 组避免每条命令都 sudo newgrp docker # 刷新当前 shell 的组身份不重新登录就生效usermod -aG里的-a是关键漏掉它会把你从其他附加组里踢出去。加完组必须重新登录或newgrp才生效很多人加完组发现还是 permission denied就是没刷新会话。验证安装docker run hello-world # 拉取测试镜像并运行输出欢迎信息说明引擎正常 docker info | grep -i root # 确认 Docker Root Dir 位置默认 /var/lib/docker如果hello-world报错Cannot connect to the Docker daemon先检查systemctl status docker大概率是服务没起来或者 socket 权限不对。3.3 Python 虚拟环境venv 的创建、激活与依赖隔离资源里给了python -m venv myenv和source myenv/bin/activate这两条是基础但 venv 的坑在于系统 Python 版本和 pip 源。python3 -m venv myenv # 用系统 python3 创建隔离环境myenv 是目录名 source myenv/bin/activate # 激活后命令行前缀出现 (myenv)pip 和 python 指向环境内 pip install --upgrade pip # 先升级 pip旧版 pip 解析依赖可能出问题 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 换国内源加速下载venv 创建的环境默认不包含系统 site-packages这是好事依赖完全隔离。但如果你需要访问系统级的包比如 apt 装的 python3-numpy创建时要加--system-site-packages。退出环境用deactivate别直接关终端否则下次可能忘了自己在哪个环境里。pip freeze requirements.txt导出依赖清单换机器时pip install -r requirements.txt复现这是基本习惯。4. 实战项目LAMP 部署、Docker Compose 编排与 Harbor 仓库4.1 LAMP 栈搭建Apache、MySQL、PHP 的安装顺序与验证LAMP 是 Linux Apache MySQL PHP 的缩写资源里提到用它部署个人博客。安装顺序有讲究先装 Apache 再装 PHP 再装 MySQL因为 PHP 的 Apache 模块依赖 Apache 已存在。sudo apt install apache2 -y # 装完自动启动浏览器访问 localhost 应看到默认页 sudo apt install mysql-server -y # 装完运行安全脚本设 root 密码、删匿名用户 sudo mysql_secure_installation sudo apt install php libapache2-mod-php php-mysql -y # libapache2-mod-php 让 Apache 能解析 PHP # php-mysql 提供 PHP 连 MySQL 的驱动验证 PHP 是否被 Apache 正确解析在/var/www/html/下建一个info.php?php phpinfo(); ?浏览器访问localhost/info.php如果直接下载文件而不是渲染页面说明 PHP 模块没加载检查a2enmod php8.x是否执行。MySQL 8.0 默认 root 用户用 auth_socket 插件认证命令行sudo mysql能进但 PHP 用密码连会失败。需要改认证方式ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;4.2 Docker Compose 单机编排WordPress MySQL 的配置要点资源里给了一个 Compose 片段我把它补完整并加上关键参数说明。version: 3 services: web: image: nginx:latest ports: - 80:80 volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123 MYSQL_DATABASE: wordpress volumes: - db_data:/var/lib/mysql volumes: db_data:depends_on只保证启动顺序不保证 db 完全就绪后 web 才启动。MySQL 初始化需要几秒web 可能在 db 还没 ready 时就尝试连接。常见做法是在应用层加重试逻辑或者用healthcheck配合condition: service_healthy。volumes里的db_data是命名卷数据持久化在 Docker 管理的区域docker compose down不会删数据但down -v会。生产环境别把 root 密码明文写在 compose 文件里用.env文件加env_file指令。4.3 Harbor 私有仓库企业级镜像存储的部署前提Harbor 不是单个二进制它本身是一组容器。部署前需要 Docker 和 Docker Compose 都已就绪然后下载 Harbor 的离线安装包解压后编辑harbor.yml。tar xzvf harbor-offline-installer-v2.x.x.tgz cd harbor cp harbor.yml.tmpl harbor.yml # 编辑 harbor.yml改 hostname、harbor_admin_password、data_volume sudo ./install.sh # 安装完成后 docker compose ps 应看到多个容器 runninghostname必须改成实际访问地址不能是localhost或127.0.0.1否则客户端推送镜像时解析不到。Harbor 默认用 HTTPS需要自签证书或正式证书跳过这步会导致docker login报 x509 错误。推送镜像前先打 tagdocker tag myapp:latest your-harbor-host/library/myapp:latest docker push your-harbor-host/library/myapp:latest5. 避坑与排查依赖冲突、驱动问题和环境变量5.1 apt 依赖冲突aptitude 的替代方案现象apt install报unmet dependencies提示一堆包互相冲突apt --fix-broken install也修不好。原因通常是混用了不同来源的源或者手动dpkg -i装过包导致依赖树断裂。解决用aptitude替代 apt它会给出多个解决方案让你选。sudo apt install aptitude -y sudo aptitude install [冲突的包名] # 它会列出接受/拒绝方案的选项按提示选择降级或替换aptitude 的优势在于它能做更复杂的依赖求解比如自动降级某个包来满足依赖。apt 遇到冲突直接报错aptitude 会尝试给出可行路径。5.2 NVIDIA 驱动ubuntu-drivers 自动安装与残留清理现象装完 NVIDIA 驱动后进不了桌面或者nvidia-smi报Driver/library version mismatch。原因通常是驱动版本和内核模块不匹配或者之前手动装过驱动没清干净。解决ubuntu-drivers devices # 列出推荐驱动版本 sudo ubuntu-drivers autoinstall # 自动安装推荐版本 sudo apt remove --purge nvidia-* # 如果之前手动装过先彻底清除 sudo apt autoremoveautoinstall选的是 Ubuntu 测试过的稳定版本不一定是最新。如果你需要特定 CUDA 版本对应的驱动得手动指定。装完必须重启不重启内核模块加载的还是旧版本。nvidia-smi和nvcc --version显示的版本可能不同前者是驱动版本后者是 CUDA Toolkit 版本两者不需要一致。5.3 环境变量配置错误PATH 覆盖与 profile 加载顺序现象改完/etc/environment或~/.bashrc后新终端里命令找不到或者 PATH 被覆盖成只剩一两个目录。原因通常是PATH写成了覆盖而不是追加或者改错了文件导致加载顺序混乱。解决追加 PATH 必须用export PATH$PATH:新路径不能直接PATH新路径。加载顺序上/etc/environment最早然后是/etc/profile再到~/.profile、~/.bashrc。改完用source刷新当前会话新开终端验证。echo $PATH # 确认当前 PATH 完整 source ~/.bashrc # 刷新当前 shell不重启终端5.4 忘记登录密码GRUB 恢复模式重置现象Ubuntu 登录密码忘了进不去系统。原因不用多说。解决开机按住 Shift 或 Esc 进 GRUB 菜单选 recovery mode进 root shell。mount -o remount,rw / # recovery 模式默认只读先改读写 passwd 用户名 # 重置密码 reboot如果是全盘加密或者 UEFI 安全启动开启recovery 模式可能受限需要先关安全启动。这个操作在物理机上有效虚拟机里同样适用。5.5 显卡驱动卸载不掉runfile 与 apt 的冲突现象apt remove nvidia-*执行完nvidia-smi还能跑或者报错说驱动正在使用。原因是用 NVIDIA 官方 runfile 装过驱动它不走 apt 的包管理apt 删不掉。解决用 runfile 自带的卸载参数。sudo /usr/bin/nvidia-uninstall # runfile 安装的驱动用这个卸载 sudo apt autoremove # 清理 apt 残留判断驱动是 apt 装的还是 runfile 装的看/usr/bin/nvidia-uninstall是否存在。存在就是 runfile 装的apt 管不了它。6. 进阶技巧用 systemd 服务固化你的自动化脚本资源里提到用 Bash 脚本做日志清理和备份但没讲怎么让它可靠地定时跑。cron 是最简单的方案但 cron 的环境变量和日志排查是黑匣子。我更推荐用 systemd timer它和系统日志集成排查方便。先写一个清理脚本/usr/local/bin/clean-logs.sh#!/bin/bash # 清理 /var/log 下 7 天前的 .log 文件 find /var/log -name *.log -mtime 7 -delete # -mtime 7 表示修改时间超过 7 天 # -delete 直接删除测试时先用 -print 确认范围给它执行权限然后创建 service 和 timer# /etc/systemd/system/clean-logs.service [Unit] DescriptionClean old log files [Service] Typeoneshot ExecStart/usr/local/bin/clean-logs.sh# /etc/systemd/system/clean-logs.timer [Unit] DescriptionRun clean-logs daily [Timer] OnCalendardaily Persistenttrue [Install] WantedBytimers.targetOnCalendardaily表示每天零点触发Persistenttrue保证如果机器在触发时间关机开机后会补跑一次。启用sudo systemctl daemon-reload sudo systemctl enable --now clean-logs.timer systemctl list-timers | grep clean # 确认 timer 已激活并查看下次触发时间排查时用journalctl -u clean-logs.service看每次执行的输出比翻/var/log/syslog里 cron 的碎片记录清晰得多。验证脚本逻辑时先把-delete换成-print确认找到的文件列表符合预期再真正删除。这个习惯我每次写清理脚本都强制走一遍删错文件的后悔药可不好找。从那以后我每次配定时任务都先用-print跑一遍确认范围再换成实际动作最后用 systemd timer 固化。希望帮到你。本文还有配套的精品资源点击获取