我朋友听闻 Intel 不再做 NUC 业务了,赶紧就买了个 12 代 i7 Pro。买完之后找我帮忙配置系统,我决定将配置的思路和过程记录在本篇文章中,一方面为其他人提供一种可能的思路,另一方面也方便日后自己回顾。
说起 NUC,我一直很想要这么一个主机。我平常在笔记本上使用 Windows,但出于开发考虑(虽然我主要开发 Java),我希望有一个桌面 Linux 系统,而不只是跑在虚拟机里。迷你主机的厂商那么多,目前看只有 Intel NUC 对于 Linux 的支持最好。独立显卡不在我的需求之中,因此整个 NUC 里的硬件需要的驱动基本上都包含在 Linux 内核里了。但是出于种种原因(主要是太贵了),一直没能玩上。听闻 Intel 不再继续做 NUC 业务了,感觉甚是惋惜。听说华硕接手了 NUC 业务,但华硕家自己也有迷你主机业务,而且人家这一款明摆着只支持 Windows。不知道这一接手,是新增了 Linux 支持,还是把 Linux 搞没了。
需求展开目录
总之,这是我朋友买的 NUC:
- skyblond@【数据删除】:~> sudo neofetch
- ...... skyblond@【数据删除】
- .,cdxxxoc,. .:kKMMMNWMMMNk:. ---------------
- cKMMN0OOOKWMMXo. A ;0MWk:' ':OMMk. OS: openSUSE Tumbleweed x86_64
- ;WMK;' 'lKMMNM, :NMK' 'OMW; Host: NUC12WSHi7 M42761-303
- cMW; WMMMN ,XMK' oMM. Kernel: 6.4.3-1-default
- .MMc ''^*~l. xMN: KM0 Uptime: 1 day, 23 hours, 2 mins
- 'MM. .NMO oMM Packages: 2643 (rpm), 6 (flatpak)
- .MM, .kMMl xMN Shell: bash 5.2.15
- KM0 .kMM0' .dl>~,. .WMd CPU: 12th Gen Intel i7-1260P (16) @ 4.700GHz
- 'XM0. ,OMMK' OMMM7' .XMK GPU: Intel Alder Lake-P
- *WMO:. .;xNMMk' NNNMKl. .xWMx Memory: 2526MiB / 39609MiB
- ^ONMMNXMMMKx; V 'xNMWKkxllox0NMWk'
- ''''' ':dOOXXKOxl'
我朋友的需求比较独特。首先他想要一个插上显示器就能用的 Linux 桌面系统,其次还想要远程访问的功能,比如通过 RDP 和 SMB 之类的协议访问,后者将成为一个类似媒体中心的东西,在手机上远程访问机器上的资源什么的。最后还希望可以通过虚拟组网的方式访问这个 NUC。
原本我打算直接用 PVE 之类的系统给他来个 All in One,装一个 PVE,这样一来各自的功能可以直接放到对应的虚拟机里,就连软路由也不在话下,无论是 openwrt 还是 opnsense 都可以随便选。但是他说要一个插上显示器就能用的 Linux 桌面系统,这一下就把虚拟化的方案淘汰出局了。我想来想去,首先好像没有办法通过虚拟化透传 Intel 核显,其次就算可以好像也不能像英伟达的某些数据中心卡那样把一张显卡虚拟化传给多个虚拟机。所以思来想去,最后决定直接用普通的 Linux 发行版本来装系统。
发行版本选择展开目录
这里的发行版本选用的是 openSUSE。原本想用 openSUSE Leap,这个发行版本更新比较缓慢,但是能够达到和 SUSE 一样的二进制兼容性,换句话说就是和 SUSE 一样的稳定性,同时还有文档。但是在安装过程中发现有些软件包实在是太老了。从我的体验来看,openSUSE 并不是一个很大众的发行版本,好多社区软件在打包的时候并不会考虑 openSUSE,而是用 Debian 和 Ubuntu 更多一些,而后者在基础设施和软件包方面都更新一些,比如 glibc
,一些使用 Ubuntu 打包的 AppImage 在 openSUSE Leap 15.5 上根本没办法运行,因为人家使用了更新版本的 glibc。出于系统稳定考虑,我不太想手动升级 glibc 这样的基础库,同时使用 LD_PRELOAD
这种方法加载库好像也不是很优雅。
最终我放弃了 openSUSE Leap,转而使用 openSUSE Tumbleweed,一个相对稳定的滚动更新发行版本。安装的过程就不多说了:设定主机名、网卡启用 DHCP。出于性能和方便考虑,我禁用了 CPU 缓解和防火墙,开启了 SSH 服务。网络服务管理器当然是选用 NetworkManager,虽然我更偏向于 Wicked,但面对桌面系统,还是 NM 的兼容性更好一些。除此之外好像就没什么了。关于分区,我朋友装了一条 2TB 的 NVME 硬盘,我这里也没有过多设计,主分区使用 Btrfs,开辟了一块 2GB 的 Swap 分区,主分区启用快照,这样系统更新的时候自动打快照,不怕滚动更新滚崩了。
桌面和输入法展开目录
关于桌面,我参考了 SUSE Linux Enterprise Desktop,也选用了 GNOME 桌面(Wayland)。进入桌面的第一件事当然就是安装托盘图标的插件(Tray Icons: Reloaded
)了。我不理解为什么 GNOME 要取消托盘图标,总之我还是把它装回来了。然后就是设定 sudo,将用户组 wheel 设定为无需密码。因为朋友把 root 密码设置的特别复杂,每次 sudo 都要输入特别长的一串,因此将自己的用户加入到 wheel 组后能够免去这样的麻烦。接下来还要解决网络的事情。我选择了 clash verge 和 proxychain4,前者用于运行 clash 代理,后者用于给命令行程序挂代理。有些命令行程序并不会遵守环境变量中设定的代理,这个时候就需要用 proxychain4 给他们体面体面。
由于是桌面环境,首先离不开的是中文输入法。GNOME 默认使用 ibus,同时系统里也内置了一些输入法,但我觉得不太好用。我选用了 Rime 输入法,安装起来也不算困难,按照维基页面走就可以了。安装完成后重启 ibus 就可以在设置里添加 rime 输入法了。这里我对 Rime 做了一些配置,我使用的是朙月拼音简体字,我将 ibus rime 的候选字配置成了横向,并将朙月拼音的候选词个数改成了 7 个。其他方面就没有太大变动了。
有了中文输入法,我们就可以在 Linux 桌面上查阅资料了。接下来将安装一些专有的解码器。由于版权问题,openSUSE 默认并不包含具有专利的解码器,这就使得一些视频无法正确解码播放。但好在 packman 源里提供了这些,并且中文维基也提到了如何安装,跟着说明走就行了。
Podman 和 Cockpit 展开目录
处理完了桌面部分,接下来该考虑服务了。虽然我平时很喜欢用 docker,但给别人装系统的时候我还是希望可以尽力避开的。不像包管理器安装的软件,docker 中的镜像需要手动更新,除非安装诸如 portainer 这样的管理器。但这个管理器本身作为 docker 运行也需要手动更新。这样一来还得教会朋友怎么用 docker,万一他手一滑弄坏了,我还得修,十分麻烦。
但是麻烦归麻烦,容器确实是个好东西,尤其是配合正确的工具。这里我使用 Cockpit 来作为这个 NUC 的网页管理界面。这个管理界面不光支持基础的管理(命令行、存储、网络等),还有插件系统:配合 packagekit 能够更新软件包,配合 KVM 能够管理虚拟机,配合 pmlogger 能够记录性能信息,配合 podman 就能管理容器。现在它甚至还支持 transactional update,很厉害。当然,如果能通过网页管理 btrfs 快照就更好了。不过目前来看,我们只需要它能够管理 podman 容器就可以了。
这一需求也比较容易实现:首先按照说明安装 cockpit,启动对应的服务。然后安装 podman 软件包和 cockpit-podman 这个插件包,随后登录到 cockpit 网页端,进入 podman 选项卡,第一次会提醒你 podman 没有运行,你可以设置开机自启动。之后就可以通过网页端管理容器了。
虽然这一次没有用到容器,但这里先装上,以被后续不时之需。
媒体中心 Plex 展开目录
接下来说说关于媒体中心的选择。我朋友原本打算使用 SMB 通过手机上的 APP 来访问 NUC 上的媒体资源。openSUSE 上也对 SMB 提供了较为不错的支持,在 YaST 里简单配置一下就行了。后来我注意到 SMB 的账号密码和系统是分开的。我原本打算像 Cockpit 那样使用系统账号验证 SMB 访问,但经过一番搜索,我发现这种方式更像是一种安全隐患。SMB 协议支持加密,但本身并不要求加密,也就是说你的 SMB 访问凭证会通过明文传输。如果你把 SMB 的密码也设置成了 Linux 的密码,那么这无异于将你的账号密码拱手送人。
经过一番思索,我决定使用 Plex。在媒体中心这类软件中,主要以 Emby、Plex 和开源免费的 Jellyfin 为主。我是用 Plex 主要是因为我已经购买了 Plex 的终身会员,并且 Plex 用起来比另外两个体验都要好一些。Plex 的安装也比较简单:去官网下载对应系统的安装包,安装即可。openSUSE 使用的是 rpm 包,下载之后使用 rpm -i <file>
命令安装即可。后续有更新的话也是类似地:下载新的安装包,然后使用 rpm -U <file>
来更新。
Plex 本身的设定比较简单。12 代 Intel 处理器自带的核显比较强劲,因此我启用了硬件转码。在添加媒体库的时候,我在根目录下新建了一个 data
子卷。看起来是 /data
文件夹,但由于主分区是 Btrfs 且开启了快照,我当然不想每次打快照的时候都把庞大的媒体文件包含在列。因此通过新建子卷的方式来将媒体文件排除在快照备份之外。
在媒体库本身的设定上,我发现默认设置已经好用了,只不过在使用上需要一些注意事项。其中电影比较简单,因为大多数电影都是一个 MKV 文件,如果有外挂字幕的话就把他们放在同一个文件夹里就好了。我的资源大部分都是海盗湾或者 RARBG(注意不是 RGB,是 RBG)上下载的,因此 Plex 都能够直接识别。关于外挂字幕,例如电影文件叫做 something.mp4
,那么外挂字幕就要命名为 something.zh.ass
来表示这是电影文件的中文字幕。
电视剧和动漫就是另一回事了。我这里一共有四部电视剧和一部动漫。其中《勿言推理》、《爱,死亡和机器人》还有《疑犯追踪》都比较简单:将文件夹的名字改成电视剧的英文名加年份,例如 Person of Interest (2011)
,年份以第一季为准。然后文件夹内按照季数分别创建 Season 01
这样的文件夹,最后在每季的文件夹中,保证每一集都有对应的集数即可,例如:S01E03.mp4
。但是另一些就不太行了。比如《是,大臣》的第三季有一个圣诞特辑。我费了好大的劲才弄明白怎么匹配上。我下载时圣诞特辑作为第三季的最后一集,也就是 S03E08,可是 Plex 只能识别到前七集。我查阅了 Plex 匹配用的 TVDB,发现圣诞特辑算在特殊季,也就是 Season 00
,并且 TVDB 上还列出了两个我未曾听过的特辑。总之 TVDB 说这个要算 S00E02,那就听人劝吃饱饭,果真 Plex 识别了。
然后是动漫,动漫在大多数情况下也可以直接识别。OVA 可以根据 TVDB 上的信息编码到 Season 00,如果你还有额外的 OP、ED、访谈等,那么需要避开 Season 00 在 TVDB 上已有的编码来存放。此外在折腾动漫的时候,我发现 Plex 有时候会扫不到媒体。我百思不得其解:这文件明明就在这儿,怎么 Plex 就是看不见呢?直到我调出了日志:Permission denied。原来 Plex 运行时会使用一个单独的 plex 用户,而我复制过去的文件的所有者会变成我自己。默认情况下,位于 plex 组的 plex 用户自然无法访问属于 users 组的我的文件。解决办法嘛,每次复制完文件想着给 777 就行了。但是人总有忘记的时候,于是我就用写了一个 crontab 用来自动处理权限:
- */1 * * * * chown nobody:nobody -R /data && chmod 777 -R /data
为了避免权限纷争,我索性把 /data
目录下的所有文件都变成 nobody 的,然后再给上 777 的权限。这个命令每分钟运行一次。
当然,我也查阅到一些资料说 nobody 账户的权限应该设置为最小。同时 nobody 用户也不应该拥有任何文件,并且 nobody 用户应当只用于运行不需要特权的程序。但我认为这一点可能已经过时了 —— 用户可以管理自己名下的资源,也就是说同样使用 nobody 账户运行的两个进程可能会相互干扰。更推荐的做法是为每个程序单独设置一个用户和组,像 plex 那样。此外,这里的 /data
目录只用于存放媒体文件,我不认为这样会引发什么安全隐患。
此外这里还有一个小插曲:openSUSE 竟然不自带 crontab。不过这也好办:安装 cronie
这个包就可以了。
至于文件管理,我原本想安装一个 NextCloud,但是后来发现这东西要求一个公网指向的域名。我一想,算了,SFTP 又不是不能用。
虚拟组网和远程访问展开目录
这里我选用了 Tailscale 作为虚拟组网的解决方案。同类的方案还有很多,我选用 tailscale 主要还是因为他简单好用,同时他们公司的博客上写了好多技术文章,感觉很不错。最近他们推出了分享功能,能够将自己的机器分享给别人。默认情况下别人可以向这台分享出去的机器发起连接,而出于安全考虑,这台分享出去的机器并不能像别人的设备发起连接(否则这台机器就会成为访问别人 tailscale 网络的跳板)。
安装 Tailscale 相对简单,官方有 openSUSE 的仓库,只不过直连比较慢(大约 32KB/s),使用 proxychain4 能够大幅提升下载速度。安装完成后使用 tailscale up
即可,对于服务,我推荐使用 --unattended
来与当前 GUI 用户解耦合,这样系统启动之后,即便没有用户登录,或者用户已经登出,tailscale 仍然会在后台运行。
分享也很简单,只要在控制台上选择分享,就可以生成一个邀请链接。其他人使用邀请链接后就可以将这台机器加入到自己的控制面板中。按照文档所说,其他人的其他设备也应该能够看到这台外部设备。但我在实践的时候并没有得到类似的体验:控制台能看见,但我的所有设备都看不到。我百思不得其解,后来查看命令行选项,发现在 up 的时候可以选择 --force-reauth
,即启动 tailscale 时强制重新向控制台认证。在这个过程中会重新拉取其他设备的信息和证书,在这之后我就可以看到别人分享进来的设备了。
关于远程访问,之前提到的服务默认都是监听 0.0.0.0
的,因此可以直接通过 tailscale 访问。在管理方面,SSH 和 SFTP 都是没问题的。Wayland 下的 GNOME 桌面提供了一个 gnome-remote-desktop
包,提供了 VNC 和 RDP 访问。在 GUI 模式下,我发现必须得先登录 GUI,然后才能使用这些远程访问的功能。并且每次重启之后 RDP 的密码还都会变。我尝试按照一些帖子说的,使用 grdctl 设置对应的参数,但是发现命令行下 SSH 登录并不能解锁 GNOME 的 Keyring,通过一些办法解锁之后发现好像 grdctl 也没用。
远程桌面在尝试无果后只好作罢。
结语展开目录
至此,这台 NUC 的配置就全部完成了。经过一阵测试,在随机重启(指我突然想起来的时候)的情况下,并没有发现有哪些服务失灵。姑且就认为是没有问题了,前几天交还给朋友,前几天在 Plex 上重新看了一遍吉卜力的《红猪》,感觉还都不错。真要说的话,唯一的问题就是存储太少了。以 P 结尾的 12 代 i7 处理器竟然出乎意料地完全够用,我还以为得像是 4125 那样。看来我确实是跟不上英特尔的命名了,听说他们还要砍掉 i 系列,从 Ultra 重新编号,彳亍口巴。
总之,在安装配置的过程中遇到了不少小问题,但好在也都不算麻烦。除了在 Plex 调试媒体库的时候花费了不少时间(主要还是手动给权限总是忘),剩余的环节几乎都没花多少时间。只要耐心去 Google,总能找到解决办法。如果实在找不到解决办法,机器是死的,人是活的 —— 不用就不好了。
- 全文完 -

【歪门邪道】Intel NUC 装机简记 由 天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。
不知道 NUC 在编解码方面的性能以及其性价比怎么样,我在我树莓派 4B 上部署了 Jellyfin 遇到 4k 电影完全推不动。。已经准备换设备了 @(泪)
树莓派的解码性能太弱了,没办法。但是 NUC 最近几代的核显都非常能打。只不过只拿来用作影音中心有点浪费了,多少不得挂一个 biglybt 之类的软件?只不过 Linux wayland 的远程桌面访问我还没整明白,退而求其次的话像是 transmission 和 qBittorrent 都可以用网页版访问
有点心动了,我在家开通了公网 ip 和 ddns 用树莓派挂了 Aria2、NextCloud 和 Jellyfin,性能已经完全不够用了。另外关于 wayland,我有看到过说其在某些应用上的兼容性并不理想,用这个真的没问题吗
我还有个 8 代 i7 的冥王峡谷装了黑苹果,吃灰很久了
为啥我的属地在台湾 @(狂汗)
我看你 ip 确实是台湾家宽的 ip,61.221.110.0/24
现在苹果转到自家的 arm 芯片了,感觉 intel 的黑苹果可能快要结束了
看楼主这么组,自己都像搞一台了,问下噪音是否大?
另外 12 代 i7 绝对是性能过剩
噪音不大,感觉比我笔记本的噪音还小一些
看到 Gnome 那个,想起来我一直在寻找比 Xrdp 与 VNC 更好的多用户远程桌面解决方案。
Windows 平台 RD 除了单用户的鸡肋特性,其用户体验可以把上面两者按在地上摩擦。
可是我感觉 Windows 平台除了 UI 好,剩下的都拉跨,尤其是遇到 native 开发的时候。。。
只是在说远程桌面了,其他方面我更喜欢 linux