MENU

【歪门邪道】Intel NUC装机简记

August 1, 2023 • 瞎折腾

我朋友听闻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 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

12 Comments
  1. 不知道NUC在编解码方面的性能以及其性价比怎么样,我在我树莓派4B上部署了Jellyfin遇到4k电影完全推不动。。已经准备换设备了@(泪)

    1. @硫酸钡树莓派的解码性能太弱了,没办法。但是NUC最近几代的核显都非常能打。只不过只拿来用作影音中心有点浪费了,多少不得挂一个biglybt之类的软件?只不过Linux wayland的远程桌面访问我还没整明白,退而求其次的话像是transmission和qBittorrent都可以用网页版访问

    2. @天空Blond有点心动了,我在家开通了公网ip和ddns用树莓派挂了 Aria2、NextCloud和 Jellyfin,性能已经完全不够用了。另外关于wayland,我有看到过说其在某些应用上的兼容性并不理想,用这个真的没问题吗

  2. 我还有个8代i7的冥王峡谷装了黑苹果,吃灰很久了

    1. @柴可可为啥我的属地在台湾@(狂汗)

    2. @柴可可我看你ip确实是台湾家宽的ip,61.221.110.0/24

    3. @柴可可现在苹果转到自家的arm芯片了,感觉intel的黑苹果可能快要结束了

  3. 看楼主这么组,自己都像搞一台了,问下噪音是否大?
    另外12代i7绝对是性能过剩

    1. @Andy烧麦噪音不大,感觉比我笔记本的噪音还小一些

  4. 看到Gnome那个,想起来我一直在寻找比Xrdp与VNC更好的多用户远程桌面解决方案。

    Windows平台RD除了单用户的鸡肋特性,其用户体验可以把上面两者按在地上摩擦。

    1. @河童可是我感觉Windows平台除了UI好,剩下的都拉跨,尤其是遇到native开发的时候。。。

    2. @天空Blond只是在说远程桌面了,其他方面我更喜欢linux