ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PVE下LXC容器直通硬盘搭建OMV轻量NAS完整指南

PVE下LXC容器直通硬盘搭建OMV轻量NAS完整指南 前几天我把一台闲置的迷你主机刷成PVE想把家里那几块旧硬盘统一管起来折腾了一整晚之后最终定下来的方案是PVE宿主机上开一个LXC容器在容器里装OpenMediaVault简称OMV再把一块物理硬盘以设备节点的方式直通进这个容器。这个组合看起来简单实际上有不少细节容易踩坑——尤其如果之前只折腾过KVM虚拟机的话第一次搞LXC的设备直通很容易在配置语法、权限模型、挂载行为上绕远路。这篇就把我这套方案的完整过程、配置内容、踩坑记录都写清楚给同样想用PVE跑OMV、又不愿意为一个NAS功能开整台虚拟机的朋友做个参考。为什么我说这个方案值得搞PVE本身管理虚拟机很顺手但全功能的NAS系统直接用VM跑内存和CPU开销比较大LXC容器共享宿主机内核资源占用小得多而OMV这种轻量级的NAS管理面板在容器里完全能跑。再加上一块直通的硬盘既能用OMV的WEB界面管理存储、做SMB/NFS共享又能让OMV直接读取硬盘的SMART信息。这套组合适合家里有多余硬盘、想在PVE上开一个轻量NAS、同时不希望为了存储再单独开一整台虚拟机的场景。1. 为什么是LXCOMV这套组合解决了我什么痛点1.1 LXC和KVM是两种完全不同的玩法先说个很多人容易混淆的地方PVE底层本身是Debian它既能跑KVM虚拟机也能跑LXC容器。虚拟机是一整套独立内核、独立引导、独立驱动的系统镜像容器则是直接共享宿主机内核的进程集合。同一个PVE节点上跑一个KVM虚拟机通常要吃掉2GB以上的内存而且系统盘、驱动、虚拟网卡全是模拟出来的而一个干净的LXC容器内存占用能压到几百MB启动速度接近秒开。如果你只是要跑一个管理面板、几个共享服务、偶尔挂个下载任务LXC完全够用没必要为了“看起来更隔离”而付出一台完整虚拟机的资源成本。OMV本身就是一个基于Debian的NAS管理工具它在容器里跑没有任何问题缺的只是它默认依赖systemd之类的基础服务——这些PVE的LXC模板里都有。我选择LXC还有一个很实际的理由OMV这类服务对硬件直通的要求并不高不需要显卡、不需要USB控制器它只需要看到硬盘和网络就行。那干嘛不直接用KVM加虚拟磁盘因为虚拟磁盘方案里OMV管理的是“一块虚拟出来的文件镜像”而不是真实的物理硬盘SMART检测、硬盘健康状态、拔盘迁移这些全都做不了。这就引出了第二个点。1.2 直通整个盘不是钻牛角尖大多数入门教程里在PVE里给LXC加存储的方式是加一个“挂载点”把宿主机的目录或虚拟磁盘镜像映射给容器。这种方式很省事比如在创建容器时加一个mp0把宿主机的某个存储卷挂给容器容器里直接能用。但它的问题在于OMV在WEB界面里看到的“磁盘”其实是一个普通目录不是一个物理盘。它没法格式化整盘、没法看SMART、没法做磁盘健康检查、也没法在WEB界面里直接管理分区表。对于正经想拿NAS存数据的人来说这些功能恰恰是选择OMV的理由。所以我把整块物理硬盘当成块设备直接暴露进LXC容器让OMV认为它管理的是一块真实的SATA盘。这带来的好处很直接SMART健康检测可用硬盘温度、坏道状态都能在OMV面板里看到数据盘独立于宿主机系统盘以后就算PVE系统崩了把这块硬盘插到任何一台Linux机器上都能直接读数据权限模型更清晰数据盘完全由容器内的OMV管理宿主机不会乱挂载、乱写东西。这套玩法不是“把目录塞进去”而是“把设备交进去”两者差别很大后面对配置文件的解释会体现出来。2. 建一个能用的LXC容器这几个参数别选错2.1 先准备Debian 12模板在PVE的WEB管理界面左侧选择本地存储切到“模板”标签点击“模板”在列表里找到Debian 12的模板下载。如果PVE安装时没配置好模板源可能列表是空的你需要先在“更新”里运行一次apt update或者手动检查一下/etc/apt/sources.list里的软件源是否正常。我建议用Debian 12作为OMV的宿主系统因为OMV 7官方就是基于Debian 12构建的软件源和依赖关系最成熟。下载模板大概需要几十MB速度取决于网络。下载完成后确保模板已经在“模板”列表里出现。2.2 创建容器的关键配置点击右上角“创建CT”按下面这些参数填配置项推荐值说明CT ID100用顺眼的数字后面配置文件会用到主机名omv方便识别也方便后面配置网络密码设置一个强密码容器root的登录密码SSH公钥可选如果有填上免得每次输密码模板debian-12-standard刚从模板源下载的那个磁盘8GB系统盘放OMV和系统足够CPU2核OMV不吃性能2核足够内存2048MB想省也可以1024MB但我建议2048MB心里踏实网络vmbr0静态IP给容器分配一个固定的局域网IP比如192.168.1.100DNS网关IP或公共DNS避免容器里解析不了域名注意一个重要的选项创建向导里默认勾选了“非特权容器”。我的建议是取消这个勾选也就是使用特权容器。这一步不是随便选的后面第三节会有详细解释。网络方面我强烈建议用静态IP不要用DHCP。因为后面容器IP会在浏览器里反复访问DHCP分配出的IP如果不固定每次重启都可能变会非常难受。创建完成之后先不要急着启动容器做其他操作接下来需要准备硬盘直通。2.3 关于非特权容器的一个大坑PVE默认会勾选“非特权容器”这种容器内部uid/gid会被映射到宿主机的普通用户空间安全性更高。但代价是容器内root不是真正的root对块设备的访问有天然限制。如果你要把一块完整物理硬盘直通进容器让OMV跑磁盘管理非特权容器的权限模型会让你非常崩溃——即使手动加cgroup规则设备节点在容器里能看得到open的时候也可能报Permission denied尤其是smartctl和mkfs这类直接访问设备的命令。我试过的非特权容器方案是手动在容器配置里加lxc.cgroup2.devices.allow在容器内把设备节点的uid/gid映射成容器root麻烦而且不稳定OMV的某些后台操作照样失败。所以这个场景下我直接改用特权容器。特权容器里root是真正的root对设备有完全控制权限OMV格式化硬盘、读SMART、重新挂载都没有障碍。特权容器的风险我也说清楚如果容器被人搞进去理论上能对宿主机有更大影响。但家里用PVE跑服务的场景容器本身只暴露OMV的WEB管理界面做好强密码、不随便开放公网端口风险可控。如果你特别在意隔离性那就别用这套方案老老实实上KVM虚拟机加PCIe直通那是另一种玩法了。提示特权容器创建后如果以后想改成非特权PVE不允许直接转换需要新建容器。所以一开始就决定好。3. 直通硬盘的核心配置两行配置的来龙去脉3.1 先搞清楚你直通的到底是哪个设备在宿主机上用lsblk看一下当前的磁盘布局。比如我的机器上NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 1007K 0 part ├─sda2 8:2 0 512M 0 part /boot/efi └─sda3 8:3 0 238G 0 part sdb 8:16 0 3.7T 0 disksda是PVE系统盘sdb就是我要直通给容器的数据盘。看主设备号sdb的MAJ:MIN是8:16其中8是主设备号16是次设备号这个数字后面要写进配置。如果机器上硬盘多怕搞混还有更专业的办法用ls -l /dev/disk/by-id/查看硬盘的ID比如ata-WDC_WD40EFAX-68JH4N1_XXXX这个ID和盘符一一对应绝对错不了。宿主机上盘符可能重启会变但这个by-id不会变后面避坑部分还会用到。3.2 设备节点直通 vs mp0映射我用表格说清楚在真正写配置之前先分清两种让容器用上物理盘的方式方式配置写法容器内看到什么OMV能做什么设备节点直通lxc.mount.entry: /dev/sdb dev/sdb none bind,optional,createfile看到 /dev/sdb 块设备读写完整物理盘支持SMART、格式化、分区mp0块设备映射mp0: /dev/sdb,mp/mnt/data只能看到 /mnt/data 挂载点只能得到已经挂载好的文件系统无法管理盘本身设备节点直通适合让OMV完整管理一块盘的情况这也是这篇教程的核心方案。mp0块设备映射适合“盘上已经有文件系统你只是想让容器直接用里面的目录”的场景比如直接用宿主机挂载好的一个存储卷。差别就在“让OMV管盘”还是“让盘子被用”。我选的是设备节点直通理由前面说过OMV需要SMART、需要格式化能力、需要管理物理盘。如果你只是想给容器加个存储空间mp0确实更简单但那就绕开了OMV存在的意义。3.3 最终配置长这样在宿主机上找到容器对应的配置文件/etc/pve/lxc/100.confCTID是100的话在文件末尾追加两行lxc.cgroup2.devices.allow: b 8:16 rwm lxc.mount.entry: /dev/sdb dev/sdb none bind,optional,createfile第一行的含义是允许容器访问块设备主设备号8、次设备号16的设备rwm分别代表读、写、mknod权限。注意这里第一个字母是bblock设备的意思千万别写成c字符设备写错了容器里还是会看不到设备或者无法访问。第二行的含义是把宿主机上的/dev/sdb这个设备节点绑定挂载到容器的/dev/sdb路径。optional表示源不存在时容器照常启动createfile表示目标文件不存在时自动创建设备节点文件。然后重启容器pct reboot 100完成后进入容器确认pct enter 100 lsblk如果一切正常容器里应该能看到sdb这个设备。你也可以用cat /proc/partitions验证看有没有对应的主次设备号条目。这个方案的原理其实也简单PVE里LXC的配置本质就是LXC容器运行时的参数cgroup2规则控制设备访问权限mount.entry控制设备节点的挂载映射。两者配合物理盘就“穿越”进了容器。4. 在LXC里装OMV我建议你放弃一键脚本4.1 一键脚本在容器环境下的毛病网上搜OMV安装很多人会甩给你一句wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | bash。这条命令在裸机Debian上能用但在LXC容器里会有一些不兼容的问题一是脚本会修改系统引导相关的配置编译安装内核模块或者调整grub这类操作在容器里根本不适用二是它会尝试探测物理硬件信息容器里这些信息要么不存在要么被虚拟化容易报错中断三是脚本默认帮你配置好的软件源可能和容器环境冲突后面启动OMV的服务时动不动报错。我在LXC里试过几个版本的脚本最终结论是容器里装OMV手动按官方文档来最稳。多敲几条命令但每一步都知道发生了什么出问题也知道去哪查。4.2 手动安装OMV 7的完整过程进入容器pct enter 100先更新基础系统apt update apt upgrade -y安装必要的依赖包apt install -y gnupg wget apt-transport-https添加OMV的GPG密钥mkdir -p /etc/apt/keyrings wget -O /etc/apt/keyrings/openmediavault-keyring.asc https://packages.openmediavault.org/public/archive.key添加OMV 7的软件源代号是sandwormecho deb [signed-by/etc/apt/keyrings/openmediavault-keyring.asc] https://packages.openmediavault.org/public sandworm main /etc/apt/sources.list.d/omv.list更新软件源并安装OMV本体apt update apt install --no-install-recommends openmediavault安装后初始化数据库结构omv-confdbadm populate这个初始化操作很关键它会生成OMV配置数据库的默认结构没有这一步WEB界面打开后很可能是一个空壳或者直接报错。最后确认关键服务都在运行systemctl status nginx php-fpm如果php-fpm版本号不同按实际版本调整服务名。正常情况下nginx和php-fpm都是active状态OMV的WEB界面地址就是容器IP用root和容器密码登录。4.3 装完之后的系统检查装完别急着进WEB界面先做几项检查磁盘设备仍在容器中lsblk确认sdb还在网络正常ping -c 3 网关IP不通的话后面WEB界面根本打不开时间同步正常date如果时间不对OMV的证书校验和源同步都会出幺蛾子。有一个容易忽略的点容器里如果没配好DNS解析apt update会卡住。我习惯在/etc/resolv.conf里显式写上nameserver 223.5.5.5这样的公共DNS省得被宿主机网络配置牵着鼻子走。提示容器root的密码即WEB登录密码。登录后第一件事建议去修改默认SSH端口或者直接禁用容器SSH毕竟OMV还有自己的SSH插件别留两个入口给外面。5. 在OMV后台管理直通盘一步一步做到能共享5.1 确认磁盘和SMART状态浏览器里访问http://容器IP进入OMV后台后依次点开“存储”-“磁盘”。这时候正常情况下应该能看到直通进去的sdb列表里会显示型号、容量、序列号、SMART状态。如果列表是空的试试右上角刷新或者到“存储”-“磁盘”页面点一下“重新扫描”。SMART信息能否显示是判定直通是否成功的重要标志。点开磁盘详情如果能看到温度和健康状态说明整块盘已经被OMV接管了。如果显示“Not available”或者“SMART not supported”大概率是容器里没装smartmontools或者是直通方式有问题。在容器里执行apt install -y smartmontools smartctl -a /dev/sdb如果SMART能输出数据就是OMV面板的问题通常重启一下OMV的引擎服务就好systemctl restart openmediavault-engined5.2 创建文件系统、挂载点并设置共享在OMV里磁盘要经过“创建文件系统-挂载-创建共享文件夹”这三步才能真正变成可用的共享存储。第一步在“存储”-“文件系统”页面点“创建”选择刚才的sdb文件系统我选ext4。如果你需要跨Windows和Linux共享访问也可以用exFAT但OMV对ext4的管理最顺手。等待格式化完成。第二步格式化完成后文件系统状态会变成“未挂载”点“挂载”按钮OMV会自动写入挂载配置挂载点通常在/srv/dev-disk-by-uuid-XXXX这种路径下路径由UUID自动生成不用手动指定。第三步在“存储”-“共享文件夹”页面点“创建”填写名称选择刚挂载的存储文件系统设置路径。之后这个共享文件夹就能被SMB/NFS服务使用了。我习惯把OMV默认的“用户”也配置一下到“用户”页面创建专用账号比如nasuser把权限加到对应共享文件夹的可读可写组里。别直接用root暴露给SMB权限过大而且以后改起来麻烦。5.3 快速验证一条完整的SMB链路配置好共享后到“服务”-“SMB/CIFS”-“设置”里启用SMB服务器然后到“共享”标签页把刚才创建的共享文件夹添加进来用户选择nasuser权限设成可读可写。应用配置后在Windows资源管理器里输入\\容器IP输入nasuser的密码应该能看到共享目录。验证成功之后这整套链路就算是通了物理硬盘直通到LXCOMV管理盘并共享其他设备通过网络访问数据。到这一步一个轻量NAS的核心功能已经具备。6. 实战踩坑三个让我折腾到半夜的问题6.1 容器重启后设备节点变了有一次宿主机重启发现容器里的OMV看不到直通盘了。在宿主机上一查原本的sdb变成了sdc因为系统启动时枚举磁盘的顺序变了。配置里写死了sdb设备名设备一漂移就废了。解决办法是把配置里的静态设备名换成by-id稳定链接lxc.cgroup2.devices.allow: b 8:16 rwm lxc.mount.entry: /dev/disk/by-id/ata-WDC_WD40EFAX-68JH4N1_XXXX dev/sdb none bind,optional,createfile先用ls -l /dev/disk/by-id/查到盘对应的稳定ID然后mount.entry的源路径写这个ID目标路径仍然固定为/dev/sdb。这样无论物理盘在宿主机上叫sdb还是sdc容器里始终是同一个设备节点。cgroup规则里的主次设备号有可能随着系统重启变化如果你的盘在设备ID变了的情况下进不去容器就在容器启动后根据实际MAJ:MIN更新一下。这里还有个更稳妥的思路每次宿主重启后手动检查lsblk确认设备号再启动容器。但既然有by-id方案就别委屈自己了。6.2 SMART数据不显示或者报权限错有一次在容器里跑smartctl -a /dev/sdb输出Permission denied。当时我还没意识到是cgroup规则的问题下意识去查容器里的权限折腾了大半天才反应过来设备节点能看到但open不了问题百分之百出在cgroup规则上。排查方法是确认配置文件里写的是b不是c确认主次设备号和宿主机上ls -l /dev/sdb的输出一致修改配置后必须重启容器只pct reboot是不行的要完整停止再启动让cgroup规则重新加载在宿主机上看容器的cgroup状态cat /sys/fs/cgroup/lxc/100/devices.list看看规则有没有真正生效。大部分“设备能看到但用不了”的问题最后都能归结到cgroup规则没生效或者写错了设备类型。6.3 磁盘里有旧LVM/分区表OMV建文件系统失败这件事最折腾直通进OMV之后创建文件系统一直报错提示设备忙或者不是完整的块设备。查下来发现这块盘之前做过LVM残留的LVM元数据挂在那OMV的mkfs操作根本没法干净地进行。解决办法是在宿主机上先对整盘做一次清理wipefs -a /dev/sdb这条命令会把磁盘头尾的签名全部擦掉相当于“格式化前先抹掉痕迹”之后OMV里再创建文件系统就一路顺畅了。务必确认你选的是目标数据盘而不是系统盘wipefs之后盘里的数据就全没了。这是一个真正操作前要看三遍盘符的命令。6.4 OMV-Extras插件在LXC下的兼容问题OMV有个全家桶插件叫omv-extras装上之后能一键装Docker、Docker Compose还有各种第三方软件源。裸机Debian上很好用但在LXC容器里安装时容易出幺蛾子有时候会把OMV自带的服务依赖搞乱导致WEB界面打不开。我试过在LXC里用OMV-Extras装DockerContainer里跑Docker本身没有问题但OMV-Extras的kom后面会把容器内的一些配置目录改掉导致OMV面板500错误最后只能重新安装OMV。现在我的经验是LXC里的OMV不要装OMV-Extras全家桶需要Docker直接apt install docker.io docker-compose-plugin在容器里手动装一样能用还干净得多。这也是容器环境的一个特点原本给裸机开发的自动化脚本到了容器里未必适用能手动就手动。最后想说的整套方案跑通之后最大的感受是把设备直通和目录挂载分清很多问题就迎刃而解。OMV这类NAS管理工具就是要直接管物理盘才有意义你给它一个目录它总觉得不够顺手给它一块完整的盘它才能发挥全部功能。而LXC的好处在于它用极低的资源开销就拿到了近乎原生的设备访问能力这一点KVM虚拟机很难比。如果后续你想在这个OMV容器上再扩展开Docker服务直接在容器里装Docker就能用直通的硬盘也可以继续作为Docker数据卷的存储位置。唯一要提醒自己的是直通盘在容器里可见但只在容器运行的时候被访问宿主机上的快照和备份功能对这块盘默认不生效数据备份要靠OMV自己的插件或者额外脚本去做。希望这套流程能给正在折腾PVE和OMV的你省下一点熬夜时间。
返回列表