从零到英雄:打造你的终极AI、NAS与虚拟化母舰

从零到英雄:打造你的终极AI、NAS与虚拟化母舰

引言

项目愿景

本教程旨在提供一份从零开始的、详尽的服务器部署指南。我们将以一个纯净的Ubuntu Server系统为起点,逐步将其打造成一台功能强大、性能卓越的多功能家庭服务器。这台服务器将集多种核心能力于一身:作为家庭数据中心,它将通过ZFS提供企业级的安全存储(NAS);作为影音娱乐中枢,它将提供高性能的媒体服务;作为灵活的实验平台,它将支持KVM全系统虚拟化;而最激动人心的是,它将成为一台7x24小时待命的AI推理引擎,充分释放多GPU的澎湃算力。

技术栈概览

本次部署将围绕以下经过精心挑选的核心技术构建,它们均以其稳定性、高性能和强大的社区支持而著称:

  • 操作系统: Ubuntu Server 22.04 LTS
  • 文件系统与存储: ZFS (RAID-Z)
  • 网络文件共享: Samba (SMB/CIFS)
  • 应用容器化: Docker Engine & Portainer
  • 虚拟化平台: KVM & Cockpit
  • GPU计算平台: AMD ROCm (Radeon Open Compute)
  • AI应用: Ollama

本指南面向的读者

本教程专为具备Linux命令行基础操作知识,并渴望构建一套复杂、多层级、遵循业界最佳实践的家庭服务器的用户而设计。我们将深入每个技术细节,确保您不仅能成功复现整个搭建过程,更能深刻理解其底层原理。


第零部分:系统安装 — Ubuntu Server 22.04 LTS 基础

一个稳定、纯净的操作系统是一切服务的基石。我们将从制作系统启动盘开始,完成Ubuntu Server 22.04 LTS的安装。

准备工作

  1. 获取系统镜像: 前往Ubuntu官方网站,下载Ubuntu Server 22.04.4 LTS或更新的LTS版本ISO镜像文件。
  2. 制作启动盘: 使用Rufus、Balena Etcher或Ventoy等工具,将下载的ISO镜像写入一个U盘。
  3. 最佳实践:独立的系统盘: 强烈建议为操作系统准备一块独立的、小容量的高速驱动器(如SATA SSD或NVMe SSD)。将操作系统与数据存储池物理分离,可以极大地提升系统响应速度,并简化未来的管理、备份与恢复流程,是构建可靠服务器的黄金法则。

关键安装步骤

将制作好的U盘插入服务器,开机并从U盘引导,进入Ubuntu安装程序。以下是需要特别注意的关键配置步骤:

  • 语言 (Language): 建议选择English,以避免在终端环境中可能出现的字符编码问题。
  • 键盘布局 (Keyboard layout): 保持默认的English (US)即可。
  • 网络配置 (Network configuration): 确保服务器已通过网线连接到您的路由器。安装程序会自动通过DHCP获取IP地址,这是后续进行远程管理的前提。
  • 存储布局 (Storage configuration): 这是至关重要的一步。
    • 选择 Custom storage layout(自定义存储布局)。
    • 在磁盘列表中,精确地选择您为操作系统准备的那块独立SSD。
    • 将其格式化为ext4文件系统,并挂载到根目录/
    • 请务必不要对计划用于ZFS阵列的大容量数据硬盘进行任何操作。
  • 用户配置 (Profile setup): 创建您的管理员账户。例如,用户名为spoto,并设置一个足够强度的密码。这个账户将是您未来通过SSH登录和管理服务器的唯一身份。
  • 安装OpenSSH服务 (Install OpenSSH server): 此项为必选项。 务必勾选Install OpenSSH server。这将允许您在系统安装完成后,从局域网内的任何电脑通过SSH远程连接服务器,实现“无头”(Headless)管理,不再需要为服务器长期连接显示器和键盘。
  • 预装软件 (Featured server snaps): 为保持系统纯净,此处我们不选择任何预装的snap软件包。直接按Tab键跳转到Done并回车。

完成以上步骤后,安装程序将自动进行。待进度条走完,系统会提示您移除U盘并重启。

首次启动与远程接入

服务器重启后,您会看到一个命令行的登录提示符。至此,物理层面的操作已经结束。现在,您需要找到服务器的IP地址(通常可以在路由器的管理界面中的DHCP客户端列表里找到),然后回到您的工作电脑上,打开终端或SSH客户端,使用以下命令进行连接:

1
ssh spoto@<your_server_ip>

输入您在安装时设置的密码,成功登录后,您就正式开启了这台服务器的配置之旅。


第一部分:存储基石 — ZFS部署

ZFS不仅仅是一个文件系统,它是一个集成了逻辑卷管理和文件系统的先进存储平台,以其无与伦比的数据完整性、内置RAID功能和强大的快照机制而闻名。

第一步:安装ZFS工具包

首先,更新系统软件包列表并安装zfsutils-linux,这个软件包包含了在Linux上管理ZFS所需的所有命令行工具 。

1
2
sudo apt update && sudo apt upgrade -y
sudo apt install -y zfsutils-linux

第二步:精确识别硬盘

在创建存储池之前,必须准确地识别出用于数据存储的硬盘。

lsblk -o name,size,model
这个命令会清晰地列出所有块设备及其名称、容量和型号,方便您确认目标硬盘 。

第三步:创建raidz存储池

创建ZFS存储池(zpool)是核心步骤。然而,直接使用/dev/sdX这样的设备名是一个常见的、但存在严重隐患的做法。Linux内核在每次启动时动态分配这些名称,顺序可能会因为硬件改动或启动时序的微小变化而改变,这会导致ZFS存储池导入失败,使您的数据面临风险。

专业的做法是使用持久化的设备标识符。这些标识符基于硬盘的物理属性(如序列号),永远不会改变。

查找持久化ID:

1
ls -la /dev/disk/by-id/
  1. 这个命令会列出一系列指向实际设备(如../../sdb)的符号链接。请选择那些以ata-nvme-开头的、包含了您的硬盘型号和序列号的、并且不含-partX后缀的完整ID。

使用持久化ID创建存储池: 假设您有四块8TB的硬盘,准备创建一个raidz(类似RAID 5,允许单盘故障)存储池,并将其命名为tank。命令如下(请将示例ID替换为您自己的硬盘ID):

sudo zpool create -f tank raidz /dev/disk/by-id/ata-WDC_WD80EFZZ-68BTXN0_SERIAL1 /dev/disk/by-id/ata-WDC_WD80EFZZ-68BTXN0_SERIAL2 /dev/disk/by-id/ata-WDC_WD80EFZZ-68BTXN0_SERIAL3 /dev/disk/by-id/ata-WDC_WD80EFZZ-68BTXN0_SERIAL4

  1. 下表详细解释了该命令的各个组成部分:
参数 描述
sudo zpool create 以管理员权限执行创建新ZFS存储池的命令。
-f 强制 (Force)。如果目标硬盘上存在残留的分区表或文件系统,此参数将强制覆盖。请仅在确认硬盘数据不再需要时使用。
tank 为新创建的存储池指定的名称。您可以自定义,tank是一个常用名。
raidz 指定存储池的RAID级别。raidz即RAID-Z1,提供单盘冗余。对于4块硬盘,总可用容量约为3块硬盘之和。
/dev/disk/by-id/… 构成存储池的成员硬盘列表。使用持久化ID是确保系统长期稳定运行的最佳实践。

导出到 Google 表格

第四步:检查存储池状态

创建完成后,立即使用zpool status命令检查其健康状况 。

1
sudo zpool status

一个健康的存储池会显示state: ONLINE以及errors: No known data errors。这是您需要关注的核心指标。

第五步:使用数据集与快照进行灵活管理

ZFS的强大之处在于其“数据集”(Dataset)概念。数据集可以被看作是智能的子目录或独立的文件系统,可以对每个数据集单独设置压缩、配额、加密等属性。

创建数据集: 我们将为Docker的持久化数据和媒体文件分别创建数据集。

1
2
sudo zfs create tank/docker
sudo zfs create tank/media

ZFS的“后悔药”——快照: 快照是ZFS文件系统在特定时间点的只读镜像。创建快照几乎是瞬时完成的,且初始不占用额外空间。它为您提供了一个强大的回滚机制。

sudo zfs snapshot tank/docker@initial-setup

  1. 这个命令为tank/docker数据集创建了一个名为initial-setup的快照。如果后续配置出错,可以轻松回滚到这个状态。

第二部分:网络枢纽 — SMB文件共享

Samba是在Linux系统上实现SMB/CIFS协议的标准软件,它能让您的服务器无缝地与Windows、macOS等客户端进行文件共享。

第一步:安装与配置Samba

1
2
sudo apt install -y samba
sudo nano /etc/samba/smb.conf

使用nano编辑器打开主配置文件,在文件末尾添加以下内容,来定义一个名为[media]的网络共享,它将指向我们之前创建的/tank/media数据集 。

Ini, TOML

1
2
3
4
5
6
7
8
9
[media]
comment = Server Media Files
path = /tank/media
browseable = yes
writable = yes
guest ok = no
read only = no
create mask = 0664
directory mask = 0775

下表解释了每个配置项的含义:

指令 描述
[media] - 定义了共享的名称,这将是网络上可见的文件夹名。
comment Server Media Files 对该共享的描述性注释。
path /tank/media 指定服务器上被共享的目录的绝对路径。
browseable yes 允许此共享在网络邻居中被浏览到。
writable yes 允许授权用户在此共享中创建和修改文件。
guest ok no 禁止匿名访问,用户必须提供有效的用户名和密码。
read only no 与writable = yes功能重叠,但明确表示该共享是可写的。
create mask 0664 为新创建的文件设置默认权限,即-rw-rw-r–。
directory mask 0775 为新创建的目录设置默认权限,即drwxrwxr-x。

导出到 Google 表格

第二步:管理用户与权限

Samba使用独立于Linux系统的密码数据库。我们需要将系统用户添加到Samba中,并为其设置一个专用的访问密码。

添加Samba用户: 为我们之前创建的spoto用户设置Samba密码。

1
sudo smbpasswd -a spoto
  1. 系统会提示您输入并确认该用户的Samba密码。

设置文件系统权限: 确保spoto用户对共享目录/tank/media拥有读写权限。

1
sudo chown -R spoto:spoto /tank/media

第三步:应用配置并测试

重启Samba服务使所有配置生效。

1
sudo systemctl restart smbd

现在,您可以从局域网内的任何一台Windows电脑,在文件资源管理器地址栏输入\\<your_server_ip>\media,或在macOS的Finder中使用Command+K并输入smb://<your_server_ip>/media,然后使用spoto用户名和您刚刚设置的Samba密码进行访问。


第三部分:性能核心 — 安装AMD ROCm驱动

ROCm (Radeon Open Compute) 是AMD官方的开源GPU计算平台,是让Ollama等AI应用能够利用AMD GPU进行加速运算的必要驱动和软件栈。安装过程必须严谨,遵循官方推荐流程。

第一步:系统更新与依赖准备

首先,确保系统是最新状态,并安装一些必要的辅助工具。

1
2
sudo apt update && sudo apt upgrade -y
sudo apt install -y wget gpg

第二步:添加AMD官方GPG密钥与软件源

GPU驱动这类底层软件,版本兼容性至关重要。直接从AMD的官方软件仓库安装,是确保获取最新、最稳定版本的唯一可靠方法 。脚本中简单的

apt install rocm是不完整的,正确的步骤如下:

导入AMD的GPG公钥,用于验证软件包的真实性:

1
2
wget -qO - https://repo.radeon.com/rocm/rocm.gpg.key | \
gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null

将ROCm的软件仓库地址添加到系统的apt源列表。请注意,命令中的6.1.2是编写本教程时的稳定版本号,您应访问AMD ROCm官方文档,获取当前最新的版本号进行替换。对于Ubuntu 22.04 (jammy),命令如下:

1
2
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.1.2/ jammy main" \

1
sudo tee /etc/apt/sources.list.d/rocm.list 

第三步:安装ROCm核心软件包

添加完软件源后,刷新软件包列表并安装rocm这个元软件包,它会自动处理所有相关的依赖项。

1
2
sudo apt update
sudo apt install -y rocm

第四步:配置用户权限

为了让普通用户(非root)能够调用GPU进行计算和渲染,必须将其加入rendervideo用户组。这是一个非常关键且容易被忽略的步骤 。

1
sudo usermod -a -G render,video $LOGNAME

$LOGNAME是一个环境变量,会自动替换为当前登录的用户名(例如spoto)。

第五步:重启并验证安装

驱动和权限的变更需要一次完整的系统重启才能完全生效。此步骤不可省略

1
sudo reboot

服务器重启后,重新通过SSH登录,然后使用以下两个命令来验证ROCm是否安装成功:

  1. rocminfo: 这个命令会输出大量关于系统HSA(异构系统架构)代理的详细信息,如果能看到您的GPU被列出,说明驱动已初步识别硬件。

rocm-smi: 这是AMD版的nvidia-smi,是最终的验证工具。

1
rocm-smi

如果rocm-smi成功执行并输出一个清晰的表格,列出了您所有的AMD GPU(例如三张MI50)、它们的温度、显存使用情况和功耗,那么恭喜您,最关键的驱动部分已经完美配置成功!


第四部分:应用层 — Docker与Portainer

Docker是当今最流行的容器化技术,它能将应用及其所有依赖打包到一个轻量、可移植的容器中,彻底解决了“在我电脑上能跑”的难题。Portainer则为Docker提供了一个美观、强大的Web管理界面。

第一步:安装Docker引擎

与ROCm驱动一样,我们应该使用Docker官方的软件源来安装Docker引擎(docker-ce),而不是使用Ubuntu自带仓库中可能过时的docker.io版本 。

设置Docker官方apt仓库: 这个过程包含添加GPG密钥和软件源地址,请依次执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装依赖包
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
# 添加Docker的GPG密钥
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 添加仓库到apt源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装Docker引擎: 执行以下命令安装最新版的Docker Community Edition及其相关组件 。

1
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

第二步:Docker安装后配置

默认情况下,执行docker命令需要sudo权限。为了方便日常使用,我们将当前用户添加到docker用户组 。

1
sudo usermod -aG docker $LOGNAME

为了让用户组的变更在当前SSH会话中立即生效,而无需重新登录,可以执行newgrp命令:

1
newgrp docker

第三步:部署Portainer管理面板

一行命令即可部署Portainer。

1
2
3
4
5
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest

这条命令中的-v /var/run/docker.sock:/var/run/docker.sock是关键,它将主机上的Docker守护进程套接字文件映射到Portainer容器内部,从而授权Portainer管理主机上的所有Docker活动 。

部署完成后,通过浏览器访问https://<your_server_ip>:9443,即可进入Portainer的初始化设置界面。


第五部分:Docker实战 — 部署Jellyfin并开启硬件转码

Jellyfin是一款优秀的开源媒体服务器。结合我们强大的MI50计算卡,它可以实现高性能的4K视频硬件转码,让您在任何设备上都能流畅观影。

第一步:在ZFS上准备存储目录

tank/media数据集中为不同类型的媒体创建子目录,并在tank/docker数据集中为Jellyfin的配置文件创建一个专用目录。

1
2
3
mkdir -p /tank/media/movies
mkdir -p /tank/media/tvshows
mkdir -p /tank/docker/jellyfin_config

将Docker应用的配置文件(持久化数据)存放在ZFS数据集上,有一个巨大的优势:您可以利用ZFS快照功能为应用配置提供强大的安全保障。例如,在升级Jellyfin容器版本之前,执行sudo zfs snapshot tank/docker/jellyfin_config@before-update。如果新版本出现问题,只需一条rollback命令即可将所有配置瞬间恢复到升级前的状态。

第二步:部署Jellyfin容器

执行以下docker run命令来启动Jellyfin。

1
2
3
4
5
6
7
8
docker run -d \
--name jellyfin \
-p 8096:8096 \
-v /tank/docker/jellyfin_config:/config \
-v /tank/media:/media \
--device=/dev/dri:/dev/dri \
--restart=unless-stopped \
jellyfin/jellyfin

下表对这条命令的关键参数进行了解析:

标志 参数 描述
docker run -d - 以分离(后台)模式运行容器。
–name jellyfin - 为容器指定一个易于管理的名称。
-p 8096:8096 - 将主机的8096端口映射到容器的8096端口,这是Jellyfin的默认Web端口。
-v…:/config /tank/docker/jellyfin_config:/config 数据持久化。将ZFS上的配置目录映射到容器内部,确保Jellyfin的设置和数据库在容器重启或重建后依然存在。
-v…:/media /tank/media:/media 将ZFS上的媒体库目录映射到容器内部,让Jellyfin能够扫描和索引您的电影、剧集。
–device=/dev/dri:/dev/dri - 硬件加速核心。将主机的DRI(直接渲染基础架构)设备传递给容器,这使得Jellyfin能够调用AMD GPU的VCN(Video Core Next)硬件单元进行视频的硬件解码和编码。
–restart=unless-stopped - 确保容器在服务器启动或意外崩溃后自动重启,除非被手动停止。
jellyfin/jellyfin - 指定要使用的官方Jellyfin Docker镜像。

导出到 Google 表格

第三步:初始化Jellyfin

容器启动后,在浏览器中访问http://<your_server_ip>:8096,跟随设置向导完成初始化。在添加媒体库时,请选择容器内部的路径,例如/media/movies/media/tvshows


第六部分:虚拟化平台 — KVM与Cockpit

KVM (Kernel-based Virtual Machine) 是内建于Linux内核的原生虚拟化解决方案,性能卓越。Cockpit则是一个现代化的网页版服务器管理工具,通过其cockpit-machines插件,可以非常方便地图形化创建和管理KVM虚拟机。

第一步:安装KVM及相关套件

执行以下命令安装KVM、libvirt守护进程、virt-manager(一个桌面端的虚拟机管理器,可选)以及桥接网络工具 。

1
sudo apt install -y qemu-kvm libvirt-daemon-system virt-manager bridge-utils

第二步:安装Cockpit Web控制台

安装Cockpit及其虚拟机管理插件。

1
sudo apt install -y cockpit cockpit-machines

第三步:配置虚拟网络与用户权限

启动默认虚拟网络: KVM默认会创建一个名为default的NAT网络,对于多数场景已经足够。我们需确保它已启动并设置为开机自启。

1
2
3
sudo virsh net-start default
sudo virsh net-autostart default
sudo virsh net-list --all

添加用户到权限组: 这是一个脚本中遗漏但至关重要的步骤。将您的管理用户加入libvirtkvm用户组,这样您就可以通过Cockpit或virt-manager管理虚拟机,而无需为每个操作都输入密码 。

1
sudo usermod -aG libvirt,kvm $LOGNAME
  1. 同样,您可能需要重新登录SSH会话或使用newgrp来使此变更生效。

第四步:访问Cockpit界面

在浏览器中打开http://<your_server_ip>:9090,使用您的服务器用户名(spoto)和密码登录。在左侧导航栏找到“Virtual Machines”选项卡,即可开始您的虚拟机创建之旅。


第七部分:AI释放 — Ollama与ROCm加速

Ollama是一个极简的工具,它让在本地运行开源大语言模型(LLM)变得前所未有的简单。我们的目标是配置其Docker容器,使其能够充分利用AMD GPU的ROCm计算能力,实现高速推理。

第一步:部署支持ROCm的Ollama容器

部署Ollama的关键在于将正确的GPU设备映射到容器内部。与Jellyfin不同,AI计算需要访问GPU的通用计算单元,而不仅仅是视频处理单元。

  • --device=/dev/dri:这个设备主要负责图形和视频相关的渲染任务,Jellyfin使用它进行硬件转码。
  • --device=/dev/kfdkfd (Kernel Fusion Driver) 是ROCm用于HSA异构计算的设备接口,是AI计算负载调度和执行的核心。

因此,为了让Ollama正常工作,我们需要同时传递这两个设备 。

执行以下命令部署Ollama:

1
2
3
4
5
6
7
8
docker run -d \
--device=/dev/kfd \
--device=/dev/dri \
-v ollama:/root/.ollama \
-p 11434:11434 \
--name ollama \
--restart=unless-stopped \
ollama/ollama:rocm

下表解析了这条命令的核心参数:

标志 参数 描述
docker run -d - 以分离(后台)模式运行容器。
–device=/dev/kfd - 计算核心。传递内核融合驱动设备,这是ROCm进行AI/HPC工作负载所必需的。
–device=/dev/dri - 传递直接渲染架构设备,确保全面的图形/视频兼容性,部分模型可能需要。
-v ollama:/root/.ollama - 创建一个名为ollama的Docker托管卷,用于持久化存储下载的大模型文件。
-p 11434:11434 - 映射Ollama的默认API端口到主机。
–name ollama - 为容器指定一个易于管理的名称。
ollama/ollama:rocm - 至关重要。明确指定使用带有:rocm标签的镜像,该镜像内置了ROCm所需的库,而非标准的CPU版本镜像。

导出到 Google 表格

第二步:运行大语言模型

使用docker exec命令进入正在运行的Ollama容器,并执行ollama命令来下载并运行一个模型。这里以gemma2:9b为例,这是一个性能和尺寸均衡的优秀模型。

1
docker exec -it ollama ollama run gemma2:9b

Ollama会自动下载模型文件,首次运行需要一些时间。下载完成后,您会看到一个提示符,可以开始与模型进行对话。

第三步:实时验证GPU加速

为了亲眼见证GPU加速的效果,请打开第二个到服务器的SSH连接。在第一个终端中与模型交互的同时,在第二个终端中运行以下命令:

1
watch rocm-smi

watch命令会每隔2秒刷新一次rocm-smi的输出。您将清晰地观察到:

  • 当模型加载时,其中一张GPU的VRAM(显存)占用率会急剧上升,因为整个模型被加载到了显存中。
  • 当您输入问题,模型开始生成回答时,该GPU的**GPU Use%(利用率)Pwr(功耗)**会显著飙升。

这个现象无可辩驳地证明了,从硬件、ROCm驱动、Docker容器到Ollama应用的整个技术栈已经完美打通,您的AI推理服务器正在全速运行!


结论

使命达成

至此,这台二手服务器已经脱胎换骨。从一堆高性价比的硬件,我们构建了一台功能全面、性能强大的现代化服务器。它现在是:

  • 一个由ZFS守护的、数据安全可靠的网络附加存储(NAS)
  • 一个通过Samba协议,为全家设备提供服务的文件共享中心
  • 一个具备硬件转码能力的、强大的Jellyfin媒体服务器
  • 一个可以随时创建和销毁测试环境的KVM虚拟化平台
  • 一台利用多GPU并行计算,7x24小时待命的本地AI推理服务器

Homelab的旅程

将硬件组装起来只是第一步,真正的乐趣在于通过软件配置,赋予这台机器灵魂。这个从零开始的完整部署过程,充满了挑战,但也充满了探索和学习的乐趣。希望这份详尽的教程,能为您在打造自己的家庭实验室(Homelab)之路上,提供坚实的帮助和启发。

鼓励您在此基础上继续探索,部署更多有趣的应用容器,或者在KVM中尝试不同的操作系统。您的家庭数据与计算中心,拥有无限可能。

原文链接:Ubuntu-Server系统部署: 本教程旨在提供一份从零开始的、详尽的服务器部署指南。我们将以一个纯净的Ubuntu Server系统为起点,逐步将其打造成一台功能强大、性能卓越的多功能家庭服务器。)


从零到英雄:打造你的终极AI、NAS与虚拟化母舰
https://www.qxz5637.top/2025/10/22/从零到英雄:打造你的终极AI、NAS与虚拟化母舰/
作者
文心
发布于
2025年10月22日
许可协议