☰
Ubuntu从装系统到跑服务:初始化、Docker、驱动与实战排错全攻略
2026/10/6 15:09:15 网站建设 项目流程

简介:面向Ubuntu新手与进阶开发者的一份工具型教程文档,覆盖系统安装、性能调优、开发环境与实战部署,能为读者规划从零配置到容器化项目落地的完整学习路径,兼顾入门与进阶需求。资源为单个docx文件,压缩包仅21KB,体积虽小却浓缩了安装分区方案、apt软件管理、systemd开机加速、htop监控、Docker引擎安装、Python虚拟环境、LAMP建站及Harbor私有仓库等核心操作。已有1124人学习下载,适合日常使用或计划转向开发工作的Ubuntu用户。文档从官方ISO镜像制作启动盘讲起,给出UEFI与传统BIOS的分区建议、常用apt命令与systemd服务优化等操作细节;实战部分提供Web服务器搭建、Bash自动化清理备份脚本、Docker Compose编排WordPress+MySQL等可直接参考的案例,并附官方文档、社区教程以及依赖冲突、驱动兼容等避坑指引,便于按需查阅和动手实践。

1. Ubuntu 这份资源解决的核心问题:从装完系统到跑起服务的完整链路

很多人在 Ubuntu 上的体验是这样断层的:用官方镜像装完系统,开机后只会打开 Firefox,想装个软件包报依赖错误,想跑 Docker 提示权限不够,想装 NVIDIA 驱动直接黑屏。这套教程和资源包的价值在于,它把「安装 → 初始化 → 开发环境 → 实战项目 → 排错」串成了一条完整的操作链路,而不是零散命令的拼凑。适合两类人:第一次装 Ubuntu 的新手,以及已经用了半年但总在环境配置上翻车的进阶用户。下面按我实际拆解的顺序逐章讲,每一章都能照着敲。

2. 系统安装与初始化:分区、软件源、工具链三条线一次理顺

拿官方 ISO 镜像做启动盘这一步不算难,难的是进到安装界面之后怎么选。在 VMware 虚拟机里装,或者物理机双系统装,分区逻辑是一致的。下面这三段把最容易出问题的分区、软件源、软件管理讲透。

2.1 分区方案选型:/ 30GB、/home 留空、swap 给内存两倍的理由

资源里给的分区推荐是:/(根分区)30GB、/home 分配剩余空间、swap 设为内存大小的 2 倍。这个方案看起来简单,背后有一个很实际的分工逻辑:根分区装的是系统本体和软件,/home 存的是用户数据,两者分开后,系统崩溃或者想重装时,只需要格式化根分区,/home 里的文档、代码、下载内容全部保留。

如果你打算在这台机器上做开发,我建议在分区阶段就把 /var/lib/docker 的挂载位置考虑进去,把 Docker 数据目录单独放到数据盘。原因是 Docker 默认把镜像和容器数据写在根分区,如果根分区只分了 30GB,几张大镜像就能把它撑满,后期再想迁移非常麻烦。常见做法是:在 /home 下建一个 docker-data 目录,挂载成独立分区,等装完 Docker 后把存储目录指过去。

swap 给内存两倍是传统经验值,但 16GB 内存的机器已经很普遍,两倍就是 32GB 的 swap 文件,对 SSD 来说浪费空间。我一般这样调整:内存大于 16GB 时给 8GB swap 就够用,内存小于 8GB 才按两倍给。swap 的作用是内存溢出时的兜底,不是越大越好,过大反而让系统在内存吃紧时优先往外交换,性能下降更明显。

2.2 首次配置:软件源镜像替换必须放在第一件事

装完系统第一件事不是开浏览器,而是执行资源里那两条命令:

sudo apt update && sudo apt upgrade # 更新软件源缓存并升级已安装软件包 sudo apt install build-essential # 安装编译工具链 gcc、make、g++ 等

注意 apt update 和 apt upgrade 之间的逻辑关系:update 是刷新软件源的包索引,它本身不安装任何东西;upgrade 才是根据新的索引去升级现有软件包。如果跳过 update 直接 upgrade,apt 会拿旧的索引去比对,结果是什么都升不了,或者提示部分软件包版本信息已过期。

在国内网络环境下,我建议在 update 之前先做软件源替换。默认的 archive.ubuntu.com 在部分地区连接很慢,apt update 可能要卡几分钟甚至报错。可以把 /etc/apt/sources.list 里的源地址替换成国内镜像站的地址,具体域名可以搜「Ubuntu 24.04 LTS 换国内源」,替换方法各家镜像站都有说明。替换后同样先 update 再 upgrade,索引刷新速度的区别非常明显。网络配置问题这时也会暴露出来,如果 update 一直超时,先用 ip a 确认网卡拿到了 IP,再排查 DNS 配置。

2.3 软件管理:apt 命令组合和图形化工具的分工

资源里给出的软件管理命令是三条核心:

apt search [软件名] # 在软件源中搜索包 apt install [软件名] # 安装指定包及其依赖 apt remove --purge [软件名] # 彻底卸载包,连同配置文件一起删除

这里有个容易被忽略的细节:apt remove 只会删二进制文件,配置文件会保留在 /etc 下;只有加上 --purge 才会把配置文件一起清掉。我习惯在卸载自己装过的软件时都用 --purge,因为残留的配置经常在下次安装同款软件时报奇怪冲突,清理干净能省很多事。

图形化方面,Ubuntu Software 是日常装应用的主力,适合装 Chromium、GIMP 这类桌面软件;Synaptic 则偏向系统级包管理,能看依赖树、锁定版本。我的建议是:系统级依赖用命令行 apt,日常桌面软件用 Ubuntu Software,不要混用。混用的典型翻车是:先用 Ubuntu Software 装了一个软件,之后想在命令行里升级它,apt 提示该包被其他包管理器持有,需要先解锁才能动。

3. 开发环境搭建:Docker 用户组、Python 虚拟环境、NVIDIA 驱动三件套

系统层面理顺之后,开发环境是下一个大头。这一章讲资源里覆盖的三件套:Docker 容器、Python 虚拟环境、NVIDIA 驱动与 CUDA,都是高频场景,也是翻车重灾区。

3.1 Docker 引擎安装与用户组授权的常见做法

资源里给的 Docker 安装命令是一行脚本:

curl -fsSL https://get.docker.com | sh # 一键安装 Docker 引擎 sudo usermod -aG docker $USER # 将当前用户加入 docker 组

第一行通过 curl 下载官方安装脚本并交给 sh 执行,-f 表示遇到 HTTP 错误直接失败,-sSL 分别是静默、显示错误、跟随重定向。第二行 usermod -aG 把当前用户加入 docker 组,-a 是追加,-G 是指定附加组。执行完第二行后必须重新登录或者执行 newgrp docker,否则当前会话里的用户组不会刷新,直接运行 docker ps 还是会提示权限不足。这个方式依赖官方脚本在目标网络环境的可用性,企业环境更稳妥的做法是先把官方仓库加进软件源,再 apt install docker-ce。

这里有一个很多人不知道的坑:sudo usermod 执行成功后,如果你马上在新终端里运行 docker 命令,依然会报 permission denied。原因是终端会话开启时已经读取了用户组信息,不会动态更新,解决办法是注销重登或者退出终端重开。资源里其实隐含了这个细节,只是没有单独标注,实际踩坑率非常高。

提示:执行 usermod 后需要重新登录或 newgrp docker 刷新用户组,否则当前终端仍报权限不足。

装完后验证是否成功:运行 docker run hello-world,能看到 Hello from Docker! 输出就说明引擎和用户权限都正常。如果提示 Cannot connect to the Docker daemon,优先检查 docker 服务状态 sudo systemctl status docker,服务没起来就 sudo systemctl start docker 再试。

3.2 Python 虚拟环境:venv 的创建、激活与退出

资源给出的 Python 虚拟环境命令是标准做法:

python -m venv myenv # 创建名为 myenv 的虚拟环境 source myenv/bin/activate # 激活虚拟环境

venv 的原理是生成一份独立的 Python 解释器和 site-packages 目录,之后的 pip 安装全部隔离在 myenv 里,不会污染系统 Python。创建时有个前置条件:Ubuntu 默认可能没装 python3-venv,如果提示 ensurepip is not available,要先 sudo apt install python3-venv,否则这个命令会直接报错。

激活后命令行前缀会出现 (myenv),代表当前 shell 用的不是系统 Python。这时执行 which python,路径应该指向 myenv/bin/python,如果指向的还是 /usr/bin/python,说明激活没生效,检查是不是在当前 shell 里执行的 source。退出虚拟环境用 deactivate 命令。我自己的习惯是把虚拟环境建在项目根目录下,命名为 .venv,配好 .gitignore 把它排除掉,避免虚拟环境目录被提交进仓库。

资源里没展开的一个点是虚拟环境里 pip 装包慢的问题。默认 pip 源在国外,建议在虚拟环境内执行 pip config set global.index-url 指向国内 PyPI 镜像,这个配置只对当前用户生效,不会影响系统其他用户。

3.3 显卡驱动:ubuntu-drivers autoinstall 与 CUDA 的配合

资源里提到驱动兼容问题用 sudo ubuntu-drivers autoinstall 解决。这条命令会自动检测当前机器的 GPU 型号,然后安装推荐的专有驱动。对于 NVIDIA 显卡,它会把驱动、nvidia-smi 工具链一起装好,装完重启,运行 nvidia-smi 能看到显卡型号、驱动版本、显存占用,就说明驱动正常。查看显卡驱动状态,这一条命令足够。

需要注意一个顺序问题:如果要跑 PyTorch 这类深度学习框架,先装驱动再装 CUDA Toolkit。CUDA Toolkit 里带的驱动版本如果和已装的系统驱动版本不一致,安装器会提示你 choose driver only 或者 complete installation,这时候选不装驱动、只装 Toolkit 即可。常见的翻车是反过来操作,先装 CUDA Toolkit 后装系统驱动,结果驱动被覆盖,nvidia-smi 报版本不匹配。

判断驱动和 CUDA 是否匹配,一条命令就能看出来:nvidia-smi 显示的 CUDA Version 是系统驱动支持的最高 CUDA 版本,只要这个数字大于等于你安装的 CUDA Toolkit 版本,就说明匹配。如果小于,说明驱动太旧,需要先升级驱动。

资源里扩展场景还提到两个方向:一是 Ubuntu Core 用于 IoT 设备,支持 OTA 更新和容器化应用;二是 CUDA Toolkit + PyTorch 搭建深度学习工作站,这部分依赖本节驱动环境。普通用户知道有对应的官方工具链就够了,不用急着上手。

4. 实战项目:LAMP 网站、自动化脚本与 Docker Compose 单机编排

环境搭好后要跑项目,这一章把资源里的三类实战拆开讲:LAMP 建站、Bash 自动化脚本、Docker Compose 多服务编排。

4.1 LAMP 搭建:从零部署一个可访问的 Web 服务

LAMP 是 Linux + Apache + MySQL + PHP 的组合,资源里用它来部署个人博客。安装命令是一行 apt:

sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql

装完后 Apache 默认站点根目录在 /var/www/html,浏览器访问本机 IP 能看到默认欢迎页,说明 Apache 正常。PHP 的生效依赖 libapache2-mod-php 这个模块,它让 Apache 能把 .php 文件交给 PHP 解释器处理。安装完需要重启 Apache 才能加载新模块:sudo systemctl restart apache2。

MySQL 安装后默认 root 用户只允许本地 socket 连接,直接运行 sudo mysql 就能进入不用密码。这时候建议执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码'; 给 root 设个密码,然后创建独立用户供 Web 应用使用,不要用 root 跑 Web 应用。这是资源里没展开、但我实际部署时一定会做的一步。

验证 PHP 是否正常,在 /var/www/html 下写一个探针文件:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/test.php

浏览器访问 http://你的IP/test.php,能看到 PHP 版本和配置信息就说明 LAMP 链路通了。检查完记得删掉这个文件,phpinfo 会暴露服务器配置,放在公网上等于给自己留了个后门。

4.2 自动化脚本:日志清理与备份的 Bash 写法

资源里提到用 Bash 脚本处理日志清理、备份等重复任务。这里给一个备份脚本的骨架:

#!/bin/bash BACKUP_DIR="/home/user/backups" # 备份存放目录 SOURCE_DIR="/var/www/html" # 要备份的源目录 DATE=$(date +%Y%m%d_%H%M%S) # 时间戳,用于生成唯一文件名 tar czf "$BACKUP_DIR/site_$DATE.tar.gz" "$SOURCE_DIR" find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -exec rm {} \; # 删除7天前的备份

这段脚本先定义三个变量:备份目录、源目录、时间戳格式。tar czf 生成带日期后缀的压缩包,关键在最后一行的 find:-mtime +7 匹配修改时间超过 7 天的文件,-exec rm {} ; 删除匹配结果。这样备份目录不会无限增长。

运行脚本前要确保有执行权限 chmod +x backup.sh。想让它定时跑,用 crontab -e 添加一行:0 2 * * * /home/user/backup.sh,含义是每天凌晨 2 点执行一次。判断脚本是否按预期运行,先手动执行一次,确认 tar 包生成,再看看 /var/log/syslog 里 cron 的调用记录。第一次跑 crontab 时容易漏掉一个点:脚本里用的路径必须是绝对路径,否则 cron 的环境变量和交互式 shell 不一样,相对路径会导出找不到命令的报错。

4.3 Docker Compose 单机编排:WordPress + MySQL 的 yaml 与实际端口管控

资源里给出了一个 docker-compose.yml 的简化版,只有 web 和 db 两个服务。实际部署时我会加更多配置项:

version: '3' services: web: image: nginx:latest ports: - "80:80" container_name: web_nginx restart: unless-stopped db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123 MYSQL_DATABASE: wordpress MYSQL_USER: wp_user MYSQL_PASSWORD: wp_pass ports: - "3306:3306" volumes: - db_data:/var/lib/mysql volumes: db_data:

与资源里的版本相比,我加了 container_name 指定容器名、restart: unless-stopped 让容器崩溃后自动重启、volumes 持久化 MySQL 数据。这三项缺一不可:没有 container_name,容器名会随机生成;没有 restart 策略,服务器重启后所有容器全部停止;没有 volumes,MySQL 容器一删除数据就全没了。

端口映射这里有一个安全细节值得单独说:3306 端口不要随意暴露到外网。MySQL 默认账号密码都在环境变量里明文写着,如果服务器有公网 IP,3306 暴露出去等于把数据库裸奔。compose 文件里的 db 服务可以不映射端口,只在 Docker 内网里被 web 服务访问,这样外部访问不到数据库,安全等级是直接质变。

启动命令是 docker compose up -d,-d 表示后台运行。查看运行状态用 docker compose ps,查看日志用 docker compose logs web。如果 web 服务起不来,最常见原因是 80 端口被宿主机上的 Apache 或其他服务占用,运行 sudo ss -tlnp | grep :80 能看到占用进程,先停掉冲突服务再 docker compose up -d。资源里还提到用 Harbor 搭建企业级镜像仓库,这块属于内网环境下的进阶项,单机开发用不上;团队规模起来要统一管理镜像时,再用 Harbor 替换默认的拉取地址也不迟。

5. 避坑:Ubuntu 日常使用高频故障的排查记录

这一章是我拆完资源后整理的真实踩坑记录,每条按现象、原因、解决的顺序写,其中几条直接对应资源里提到的常见问题。

5.1 依赖冲突:apt 装包报 dependency error

现象:sudo apt install 某个软件包时,终端不断提示 depends on xxx but it is not going to be installed,即使 apt upgrade 也解决不了。

原因:软件源版本混杂,比如手动加了第三方 PPA,PPA 里的包依赖了当前发行版还没有的库版本,apt 的自动解析能力不够,陷入依赖死循环。

解决:资源里提到用 aptitude 替代 apt 处理这类问题。先 sudo apt install aptitude,再运行 sudo aptitude install 软件包,aptitude 会给出保留、降级、卸载等交互式解决方案,选中拒绝升级某几个包一般能绕开冲突。如果是 PPA 导致的,先 sudo add-apt-repository --remove PPA名称 删掉源,再 sudo apt update 刷新,回到 apt 正常安装。

5.2 显卡驱动卸载不掉:nvidia-smi 消失但驱动文件还在

现象:运行 sudo apt purge nvidia-driver-XXX 后,输入 nvidia-smi 提示命令不存在,但机器重启后黑屏或登录界面卡住。

原因:驱动卸载不彻底,残留的 kernel 模块还在内核里加载,或者卸载了驱动但没卸载 CUDA Toolkit 里的配套文件。

解决:在纯命令行界面(Ctrl+Alt+F2)里登录,执行 sudo apt purge nvidia-* && sudo apt autoremove 清理所有 nvidia 前缀包和自动残留依赖,然后 reboot。重启后用 lsmod | grep nvidia 确认没有 nvidia 内核模块加载,这时再重新安装驱动。我踩过这个坑后,卸载驱动前都会先查 dpkg -l | grep nvidia 看装了哪些包,一条一条确认再动手。

5.3 环境变量配置错误:PATH 改坏导致所有命令失效

现象:在 /etc/environment 里加了 export PATH=xxx 后,重启发现 sudo、ls、vim 全部提示 command not found,连 apt 都用不了。

原因:环境变量文件里只允许写 PATH=,不允许写 export,而且用 = 赋值时如果遗漏了原来的 $PATH,会把系统默认路径整个覆盖掉。

解决:使用绝对路径 /usr/bin/vim 打开 /etc/environment 修改回来,恢复 PATH 原本内容。这个问题在资源里没有细说,但我建议改环境变量之前,先 echo $PATH 把当前值完整复制下来,改完一边用绝对路径的 bash 验证一边,确认无问题再重启。修改 /etc/environment 时只用 PATH= 语法,不要加 export 前缀。

5.4 SSH 无法连接:客户机提示 Connection refused

现象:从本机 ssh user@server 连接远程 Ubuntu 服务器,报 ssh: connect to host xxx port 22: Connection refused,ping 能通,说明网络链路正常。

原因:OpenSSH Server 没装,或者装了但 sshd 服务没启动,或者 UFW 防火墙没有放行 22 端口。

解决:先在服务器本机上执行 sudo apt install openssh-server,再 sudo systemctl enable --now ssh 开启并设为开机自启。如果还是连不上,运行 sudo ufw status 检查防火墙状态,ufw allow OpenSSH 放行再试。排查顺序我固定是:先看服务状态 sudo systemctl status ssh,再看监听端口 sudo ss -tlnp | grep 22,最后看防火墙,三个检查点能定位 80% 的 SSH 连接问题。

5.5 忘记登录密码:进入恢复模式重置

现象:开机登录界面输入密码一直报错,记不清自己改没改过密码。

原因:密码遗忘,或者键盘布局异常导致输入的密码和预期不一致。

解决:重启机器,在 GRUB 菜单里选择 Advanced options for Ubuntu,进 recovery mode,选择 root shell,执行 mount -o remount,rw / 把根分区重新挂载为可写,然后 passwd 用户名 输入新密码两次即可。注意 recovery mode 里的 root shell 默认是只读挂载,必须先 remount 才能写文件。重置完 reboot 回到正常登录。

5.6 中文输入法装不上:搜狗输入法与 fcitx 的依赖问题

现象:安装搜狗输入法后,fcitx 托盘图标不显示,或者怎么按都切不到中文。

原因:搜狗输入法依赖 fcitx 框架,但系统默认输入法框架是 ibus,两者冲突;或者 fcitx 的版本和搜狗要求的不一致,导致输入法进程启动后无法加载。

解决:先卸载 ibus,sudo apt purge ibus,再安装 fcitx:sudo apt install fcitx,然后在 /etc/environment 里补三行环境变量:GTK_IM_MODULE=fcitx、QT_IM_MODULE=fcitx、XMODIFIERS=@im=fcitx。注销重新登录后,打开 fcitx 配置界面,把搜狗输入法添加进输入法列表,图标缺失的问题一般就解决了。

6. 进阶验证:用 systemd-analyze 和 htop 给系统做体检

资源里提到开机加速和资源监控,这两块合在一起就是一套系统体检流程。我平时拿到一台新机器,会按下面的顺序过一遍。

6.1 启动耗时分析

systemd-analyze blame 是排查开机慢最直接的工具。运行后能看到每个服务的启动时间按降序排列,耗时最长的服务排在最上面。常见的开机慢元凶是 NetworkManager-wait-online.service,这个服务会等待网络完全就绪才继续启动,在 DHCP 环境里可以禁用它:sudo systemctl disable NetworkManager-wait-online.service。禁用前先确认网络配置不是静态 IP,否则开机后网卡 IP 还没配好,反而引发其他问题。

6.2 资源监控与进程排查

htop 比系统自带 top 好用,按 F5 键能切换进程树视图看进程父子关系,glances 是 htop 的升级替代,还能看磁盘 IO、网络速率。安装方式是 sudo apt install htop glances。当服务器负载突然飙升时,我先看 htop 里 CPU 占用最高的进程,再用 ps -ef --sort=-pcpu | head -20 确认进程完整信息,最后决定是 kill 还是 systemctl restart 对应服务。

6.3 用快照做后悔药

最后分享一个多年养成的习惯:每次大规模升级或者改系统级配置前,先拍一个快照再动手。在物理机上用 Timeshift 做系统快照,在虚拟机上用宿主机快照功能,在纯净系统装完必需品后也拍一张。印象最深的一次是,我给一台跑了半年的服务器换软件源并执行 apt upgrade,结果升级过程断网导致 dpkg 中断,系统处于半升级状态,连 apt 都用不了。后来恢复快照重来,把 apt upgrade 拆成小批包分次升级,再没出过同样的问题。从那以后,我每次改 /etc 配置或者执行大版本升级前都强制走一遍备份流程。这份资源把安装、开发环境、实战和避坑串成了完整链路,照着上面的步骤做一遍,你对 Ubuntu 的掌控程度会明显不一样。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询