闲置笔记本改造成 Ubuntu 开发测试服务器
最近把一台闲置的戴尔灵越 5580 改造成了家用开发测试服务器。目标很简单:旧电脑放在家里长期运行,通过 Windows 主力电脑远程连接,用 Docker 部署一些测试服务、数据库、接口环境和练习项目。
这次没有一上来选择 Ubuntu Server,而是选择了 Ubuntu Desktop 26.04 LTS。原因是家里只有 Wi-Fi,而且我是第一次完整搭 Linux 服务器,桌面版连接 Wi-Fi、调整电源设置、排查问题都更直观。
一、硬件情况
旧电脑配置大致如下:
text
型号:Dell Inspiron 5580
内存:约 12GB
硬盘 0:1TB HDD,原 Windows 系统盘,包含 C/D/E
硬盘 1:120GB SSD,原 F 盘
网络:家里只有 Wi-Fi
主力电脑:Windows
一开始查看任务管理器时发现,Windows 系统主要装在机械硬盘上,HDD 经常 100%,这也是电脑明显卡顿的主要原因之一。

最终决定:
text
Ubuntu 安装到 120GB SSD
1TB HDD 上的 Windows 和原数据尽量保留
二、制作 Ubuntu 启动 U 盘
准备工具:
text
Ubuntu Desktop 26.04 LTS ISO
Rufus
32GB U 盘
Rufus 参数选择:
text
分区类型:GPT
目标系统:UEFI(非 CSM)
文件系统:FAT32
持久分区:0

这里有一个坑:第一次使用 ISO 镜像模式 写入后,Windows 可以正常打开 U 盘,但旧电脑的 F12 启动菜单里一直看不到 U 盘启动项。

后来用 Rufus 重新写入,并选择 DD 镜像模式,旧电脑才成功识别出启动项:
text
UEFI: VendorCoProductCode 2.00, Partition 2

经验总结:
text
如果 U 盘在 Windows 能打开,但 BIOS/F12 不显示启动项,可以尝试 DD 镜像模式。
如果仍然不行,换一个 U 盘通常更快。
三、BIOS 与 BitLocker 问题
旧戴尔电脑:
text
F12:进入启动菜单
F2:进入 BIOS
BIOS 里确认过:
text
USB Boot Support:开启
Enable External USB Port:开启
Boot List Option:UEFI
Secure Boot:保持开启

中途曾尝试关闭 Secure Boot,结果 Windows 触发了 BitLocker 恢复:

这个现象不是系统坏了,而是 Windows 检测到启动安全环境变化后,触发了 BitLocker 保护。后来重新进入 BIOS,把 Secure Boot 打开,Windows 就恢复正常了。
这次安装 Ubuntu 后面没有再关闭 Secure Boot。
四、安装 Ubuntu 到 SSD
进入 Ubuntu 安装器后,前面几项大致这样选:
text
语言:English
安装方式:Install Ubuntu
安装类型:Interactive installation
应用选择:Default selection
第三方驱动和媒体格式:勾选
时区:Asia/Shanghai

到了磁盘页面时,不能直接选 Erase disk and install Ubuntu,因为电脑里有两块硬盘,选错就可能清掉原 Windows 盘。
所以选择:
text
Manual installation

在分区页面看到的磁盘大致是:
text
sda = 1TB HDD,原 Windows 盘,不能动
sdb = 120GB Netac SSD,Ubuntu 安装目标盘
sdc = 31GB U 盘,安装介质

最终分区结果:
text
sdb1:VFAT,104MB,挂载 /boot/efi,不格式化
sdb2:Ext4,约 119GB,挂载 /,格式化
Boot loader installation:sdb Netac SSD 120GB

安装确认页中重点看这些信息:
text
Type of installation:Manual installation
Installation disk:Netac SSD 120GB sdb
sda1:Unchanged
确认没有格式化 sda 后,再点击安装。

安装完成后点击 Restart now,并按提示拔掉 U 盘。

五、开启 SSH 远程连接
进入 Ubuntu 后,先更新系统并安装 SSH。
bash
sudo apt update
意思:更新软件源信息。
bash
sudo apt upgrade -y
意思:升级已安装软件,-y 表示自动确认。
bash
sudo apt install openssh-server -y
意思:安装 SSH 服务,让 Windows 可以远程连接 Ubuntu。
bash
sudo systemctl enable --now ssh
意思:设置 SSH 开机自启,并立即启动 SSH 服务。
一开始我误输入了:
bash
apt update
结果报权限错误:
text
Permission denied
原因是更新系统需要管理员权限,前面必须加 sudo。
查看服务器 IP:
bash
ip a
当时 Wi-Fi 地址是:
text
192.168.x.xx
Windows 上可以连接:
powershell
ssh server@192.168.x.xx
六、使用 dev-server.local 代替固定 IP
因为路由器不是自己的,不方便做 DHCP 静态绑定,所以没有在路由器里固定 IP。
后来测试发现 Windows 可以解析主机名:
powershell
ping dev-server.local
所以后续优先使用:
text
dev-server.local
MobaXterm、VS Code Remote SSH 都可以直接用这个主机名连接:
text
Host:dev-server.local
Username:server
Port:22
这样即使路由器以后给服务器分配了新的 IP,只要局域网主机名解析正常,就不用重新记 IP。
七、安装 MobaXterm 和 VS Code Remote SSH
MobaXterm 用来日常管理服务器:
text
保存 SSH 连接
自带 SFTP 文件管理
可以拖拽上传文件
多标签终端方便看日志
VS Code Remote SSH 用来远程开发。连接成功后,VS Code 左下角会显示:
text
SSH: dev-server.local
这表示 VS Code 当前已经连到 Ubuntu 服务器,内置终端执行的命令也是在服务器上执行。

八、安装 Docker 和 Docker Compose
一开始尝试 Docker 官方安装脚本:
bash
curl -fsSL https://get.docker.com | sudo sh
意思:下载 Docker 官方安装脚本,并用管理员权限执行。
但中途遇到:
text
curl: (35) Recv failure: Connection reset by peer

原因是访问 download.docker.com 不稳定。解决办法是改用国内镜像源,比如清华源。
安装完成后,执行:
bash
sudo usermod -aG docker server
意思:把 server 用户加入 docker 用户组。这样以后可以不加 sudo 直接执行 Docker 命令。
bash
sudo reboot
意思:重启系统,让用户组变更生效。
重启后验证:
bash
docker --version
docker compose version

继续测试:
bash
docker run hello-world
意思:运行 Docker 官方测试镜像。如果能看到 Hello from Docker!,说明 Docker 可以正常拉取镜像、创建容器并运行。

九、运行第一个 Nginx 服务
先用单条命令测试:
bash
docker run -d --name nginx-test -p 8080:80 nginx
命令含义:
text
docker run:运行容器
-d:后台运行
--name nginx-test:容器名叫 nginx-test
-p 8080:80:服务器 8080 端口映射到容器 80 端口
nginx:使用 nginx 镜像
Windows 浏览器访问:
text
http://dev-server.local:8080
如果能看到 Nginx 欢迎页,说明旧笔记本已经可以作为局域网 Web 服务器提供服务。
十、配置合盖不断网
笔记本当服务器,合盖后不能休眠,否则 SSH 会断、服务也会停。
先在 Ubuntu 图形设置里关闭自动休眠:

然后编辑系统配置:
bash
sudo nano /etc/systemd/logind.conf
意思:用管理员权限编辑系统登录管理配置。
增加或修改:
ini
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
含义:
text
HandleLidSwitch=ignore:合盖时忽略,不休眠
HandleLidSwitchExternalPower=ignore:插电时合盖也不休眠
HandleLidSwitchDocked=ignore:外接设备时合盖也不休眠
重启相关服务:
bash
sudo systemctl restart systemd-logind
意思:重启登录管理服务,让配置生效。
最后用 Windows 持续 ping:
powershell
ping dev-server.local
合盖后仍能 ping 通,说明网络没有断。
十一、用 Docker Compose 部署一个小网页
创建项目目录:
bash
mkdir -p ~/projects/nginx-demo
cd ~/projects/nginx-demo
意思:
text
mkdir -p:创建目录,存在也不报错
cd:进入目录
创建 index.html:
html
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>dev-server</title>
</head>
<body>
<h1>Hello from dev-server</h1>
<p>这是我的旧笔记本服务器。</p>
</body>
</html>
创建 compose.yaml:
yaml
services:
web:
image: nginx:latest
container_name: nginx-demo
ports:
- "8080:80"
volumes:
- ./index.html:/usr/share/nginx/html/index.html:ro
restart: unless-stopped
含义:
text
services:定义服务
web:服务名
image:使用 nginx 镜像
container_name:容器名 nginx-demo
ports:服务器 8080 端口映射到容器 80 端口
volumes:把本地 index.html 挂载到 Nginx 默认首页
restart: unless-stopped:除非手动停止,否则重启后自动恢复
启动服务:
bash
docker compose up -d
意思:根据 compose.yaml 后台启动服务。
查看状态:
bash
docker compose ps
意思:查看当前 Compose 项目的容器状态。
浏览器访问:
text
http://dev-server.local:8080
成功看到自定义页面后,这台旧笔记本就完成了从"闲置电脑"到"局域网开发测试服务器"的最小闭环。
十二、当前成果
目前已经完成:
text
Ubuntu Desktop 26.04 LTS 已安装
默认启动 Ubuntu
Wi-Fi 可用
SSH 开机自启
MobaXterm 可远程管理
VS Code Remote SSH 可远程开发
Docker 可用
Docker Compose 可用
合盖不断网
可以通过 dev-server.local 访问
局域网 Web 服务可访问
十三、后续可以继续做什么
后续可以继续扩展:
text
安装 Dozzle:浏览器查看 Docker 容器日志
部署 MySQL / PostgreSQL / Redis:作为开发测试数据库
配置 Samba:让 Windows 直接访问 Ubuntu 文件夹
搭建 Gitea:轻量级 Git 代码仓库
搭建 Jenkins / Runner:做自动化测试或 CI
配置 Tailscale:外网安全访问家里的服务器
继续学习 Docker Compose:部署多服务项目
这次最大的收获是:旧笔记本不一定只能闲置。只要装好 Ubuntu、SSH 和 Docker,就可以变成一台很实用的开发测试服务器。
最重要的是先完成最小闭环:
text
能远程连
能跑容器
能在浏览器访问服务
能合盖稳定运行
完成这个闭环后,数据库、测试平台、自动化服务都可以慢慢往上加。