之前写过一篇帮朋友配置Intel NUC的文章,没想到今天我也有自己的NUC了。本篇记述我为这个NUC安装和配置系统的全过程。
硬件选取
本来一开始是没打算买主机的,因为我家这边夏天经常停电,不过不搭配UPS使用的话,频繁的突然断电早晚会把文件系统弄坏。但这次下定决心买NUC,主要还是因为发工资了,并且工作用的电脑一直没到,开虚拟机笔记本又过热,笔记本一过热电池就鼓包,活生生变成一个安全隐患。
所以想来想去,不如买一个永除后患。说起mini主机,我第一个想到的就是Intel NUC。现在这个赛道,Intel NUC已经卖给华硕了,国产品牌也有不少后起之秀,比如零刻,价格便宜,性能更好。不过我买都买了,也就不多说什么了。我觉得Intel虽然把NUC卖给了华硕,但两家毕竟都是大厂,最基本的保障还是有的。而且我买NUC的目的主要是运行Linux,虽然零刻那边价格便宜,但是不知道Linux支持怎么样。如果到时候又得关安全启动,又得调着调那,最后还有一堆东西不兼容,那就麻烦了。
好消息:Intel NUC用到现在,安全启动不用关,什么也不用调,装出来的系统直接就能用,也没发现有什么硬件不兼容的问题。特别好。
这里要点名批评雷蛇:都什么年代了,还在BIOS里偷工减料。我买你们家的笔记本,在上面跑个Linux怎么了?且不说Linux支持有多差,甚至哟肚饿发行版本跑都跑不起来,电池还老鼓包。什么玩意儿啊,呸。
至于型号,我买的是NUC13ANHi7,就是i7厚款。京东买的,自带16GB内存和500GB的NVMe固态。本来想买裸机然后回来自己插,这样的话钱不会差太多,但东西更好。可是裸机京东没货了,迫不得已只能买了个16GB内存的版本。好在对于Linux来说,500GB的固态算是够用,目前只是工作使用,未来打算将除了打游戏之外的需求都搬到NUC上,不过那是之后的事情了。内存只有16GB,对于Linux本身还是够用的,不过大家从我之前的文章也看出来了,我是写Java的,那IDEA开起来,Gradle daemon后台一跑,再来几个数据库的Docker,还有Chrome,开他十几个标签,直接给16GB的内存干满了——浏览器用掉了一半的内存,Java用掉了剩下的一半。数据库和Linux系统只能在swap中夹缝求生。所以下个月发了工资第一件事就是升级一下内存,直接干到64GB拉满。
在存储方面我也考虑了一下,原本打算做个Btrfs的RAID 1,但是后来发现有点亏。虽然说我这个NUC能插三个盘:一个NVMe固态,尺寸是2280,一个M.2 B key的SATA固态(NGFF),但尺寸是2242,还有一个就是2.5英寸的SATA硬盘位。
第一个槽位的NVMe暂且好办——买来的时候已经插上了,暂时不需要更换。虽然是金士顿的,但总不能刚到手就暴毙吧。第二个NGFF的就不好办了——我目前没找到哪个大牌子还在做这个协议的硬盘。淘宝上能找到的全都是杂牌子,2TB的硬盘能卖到726,这价格我真的有点不敢碰。最后SATA的盘位也好办,京东上随便找个三星镁光之类的冲就完了。所以归根结底,我觉得Intel NUC这个2242的B key槽位就很鸡肋,哪怕你整一个2242的NVMe呢?所以之后升级的话我可能就要考虑放弃这个槽位,只扩容SATA盘位了。
如果硬要扩展的话也不是不行。所有数据都放在主盘上,然后可以重建的数据放在SATA盘上,比如BT下载之类的,总之就是丢了可以在下回来的。至于2242那个盘,那就只能存放一些本地有备份的,比如有些电影想拿出来再看一遍,那就放到这个盘上,万一崩盘了也不会造成任何麻烦。
至于性能,我这个型号的NUC用的CPU是13代I7 1360P。从跑分来看这个CPU甚至要比我现在笔记本的i7 10875H还要高。不过实际使用来看,可能是内存不够吃,浏览器反而有卡顿的感觉。不过以现代CPU的性能来看,只要不是土豆,只要你不跑高性能运算,大部分情况下,包括开发,都是够用的。瓶颈和限制都在外部:比如电源功率上不去,散热跟不上,内存频率低/不够用。。。
反正我觉得Intel NUC对我来说是够用的。那么决定好硬件之后,京东下单从上海调货,花费5299,后来想起来自己没有USB鼠标,只有键盘,又跑去戴尔那边买了个20块钱的光学鼠标。
装系统
一如既往地,我选择了openSUSE。这次也一样,在Leap和Tumbleweed之间纠结了一下,最后选择了风滚草。
由于买的是带硬盘的配置,所以硬盘上带了个Windows 11,但是我不想折腾这个东西,但也不想放过这个机会,所以为了以备不时之需,我选用CloneZilla搞了个整盘克隆。如果之后有需要的话可以通过这个克隆文件把Windows 11还原回去。克隆完毕之后我又去华硕的官网搜索我这个NUC的型号,找到对应的BIOS更新。一开始我还担心这玩意儿别是非得进Windows才能更新吧,后来我看提供了一个CAP文件。开机按F7就可以直接从U盘里读这个文件进行BIOS更新。体验极佳,这里要点名表扬Intel。
一切都准备妥当之后,烧写openSUSE的镜像,保持安全启动打开(当然还顺手跳了一下散热设置,然风扇转的更激进一些),开始安装。
有些老生常谈的项目就不多说了,什么插根网线调成DHCP、配置主机名之类的,这些就略过了。桌面我选的GNOME,抽象,但是好用。至于分区加密,我这次选上了启用LVM。这次读了wiki才知道,如果你不启用LVM就开启加密,那开机一次要输入好几次密码才能解锁全部分区。如果启用了LVM,那么每次开机只需要输入一次密码,就能够解锁全部分区了。非常好。
关于这个LVM还得多说几句。LVM全称叫做Linux逻辑卷管理。它是从硬件层面,也就是块设备的层面,将不同的硬盘统一进行抽象,这样当你配置全盘加密或者软件RAID的时候就不用触及Linux的fstab了,只需要在LVM里修改设备就好了。不过这里我还在想,LVM的功能是不是会和Btrfs重复?因为Btrfs也能提供类似软件RAID的功能,同时也不需要触及fstab,只要把硬盘加进存储池里就好了。后来我的老板给出了一个不同的见解:他说LVM从块设备级别提供了更灵活的硬盘管理方式。你可以使用LVM创建一个大的存储池,然后将上面的逻辑卷格式化成不同的分区,然后挂载;而Btrfs只能是Btrfs。假如你需要再加一个swap分区,如果有LVM的话,你只需要新增一块硬盘,然后在上面划分一个逻辑卷,mkswap就可以了。但Btrfs就做不到,因为它只是一个文件系统。所以如果后续不出意外的话,大家可能会看到一篇我写LVM扩容的文章。
至于文件系统的配置,主文件系统当然是Btrfs,它的快照还是比较好用的。使用独立的交换分区,但大小只有2GB,一开始我寻思这16GB的内存还能不够吃?意思意思得了。现在看来,还真不够。如果后续不打算加内存的话,交换分区还是得大一点。虽然这个后期可以调,但是调就意味着你得先缩小一个分区,然后把这个分区的容量加给swap。有些文件系统不支持缩小,那就麻烦了。
最后就是其他的杂项了,什么开启安全启动、CPU缓解策略(这个本来想禁用的,后来想想,为了工作的信息安全,还是开开吧)、防火墙、ssh什么的就不多说了。并不是什么很重要的事,全看个人需求,你开了也罢,关了也好,看着来。
配置系统
完事之后就是配置系统了。从哪里开始呢?从开机开始。
开机问题
因为目前我的NUC独占一个外接显示器,而我的笔记本在支架上。我目前使用的蓝牙键鼠可以配对多个设备,并且可以切换。所以我就没把键盘再拿出来,怪麻烦的。但这样有个问题:我的键盘是蓝牙的,但蓝牙到系统启动之后才有,可是要启动系统就得先输入密码解锁LUKS。可是要输入密码,就得现有蓝牙,要有蓝牙就得先进系统,要进系统就得解锁LUKS,要解锁LUKS就得……
看到问题了吧?我这个蓝牙键盘不能解锁全盘加密。也就是说这个NUC只要关了,我再开就不行了,因为输不了密码。怎么办呢?我咨询了群友,群友说有一种很高级的蓝牙适配器,能够记住曾经配对过的键盘,并把它作为普通键盘呈现。我虽然没有听过这种蓝牙适配器,不过我推断这应该是以前的老黄历了。你想啊,这都2024年了,怎么会有这么好心的蓝牙适配器?我灵机一动,想了个土办法:把装系统用的薄膜键盘放在旁边备着。等需要开机输密码了就插上,不用的时候就拔了搁一边。反正是之前买东西送的,个儿不大,也不占地方。不过这个键盘不知道咋回事,输密码的时候自动开启Fn,导致键盘右边的字母全都变成小键盘的数字了。刚开始装完系统重启后输入密码,直接给我干到GRUB的启动界面了,我一想,坏了,别是我安装的时候输错密码了吧。就当我想输入reboot的时候,看到屏幕上写了个reb66t
,我一看,啊?左思右想,原来是Fn开了,那输密码的时候按着Fn就行了。
其实这个问题我还有一个解决方案,就是利用TPM。使用fde-tools可以把LUKS的加密密钥封进TPM里,开机就可以自动解密了。就算之后因为系统更新导致解密失败,也可以手动输入密码,然后重新密封密钥。可是正当我准备跟着Wiki走的时候却发现,pcr-oracle这个包更新了,更新之后改了命令行,导致fde-tools对它调用失败。我寻思这种破坏式更新不是应该提升大版本号吗?哎,没办法,人家的项目,人家爱干啥干啥,我也管不了。不过我看4月19日fde tools的维护者已经把新的patch提交到openSUSE的工厂了。估计下次风滚草打包的时候就可以用了吧。如果之后可以了,我会在另写一篇文章的。
上网问题
众所周知,国内的网络质量一直一言难尽。而要想痛快地使用Linux,一个好的网络连接必不可少。之前在虚拟机里的时候我是用tailscale,我专门组了一台德国的服务器来帮我做流量中转。可是放到NUC上就不行了。不使用出口代理就能和节点UDP直连;可是只要一使用出口代理,节点立马不可达,只能用中继。中继就慢了啊,能跑到500KB每秒都算烧高香了。我一想这不行,还得是专业的软件做专业的事。
软件就不介绍了,我相信各位读者各有神通。这里我介绍介绍怎么给Linux配置代理。我使用的是GNOME桌面,所以很自然地,就可以通过GNOME的设置来配置。其次就是修改/etc/sysconfig/proxy
,这里面提供了一个比较方便的系统级代理,大概是SUSE才有的?当然,如果你用的不是SUSE,那传统的环境变量http_proxy
和https_proxy
也是一种办法。
如果以上两个还不行,我们还可以借助第三方软件,一个叫做proxychains
的软件(软件包proxychains-ng
),它可以利用库注入来劫持应用的网络请求,让它强行通过代理。比如proxychains4 rclone copy ...
,这样就可以让rclone在自身不吃代理的情况下,让它发出的流量走代理。当然了,各个软件都有自己的代理配置方法,比如Gradle、Git这些。关于Git要说一句,如果你使用ssh的话,那轻易是没法走代理的,如果使用http或者https克隆和推送,那可以直接走http和https代理。
最后如果还是不行的话,那就只能祭出最终的大杀器了:软路由以旁路路由的身份提供透明代理。
使用的是NekoRay,这个软件在openSUSE上有个很奇怪的问题,就是默认情况下找不到openssl。由于新版本的openssl和1.1版本不兼容,所以需要手动安装openssl 1.1的包,不然更新订阅的时候就会提示TLS握手失败。
GNOME托盘图标
处理完网络就可以开始说正事了。不知道GNOME这帮人怎么想的,把托盘图标给弄没了。这一个桌面管理器做的越来越抽象。好看到是好看,可是太抽象了容易耽误事儿。没有托盘图标,不说别的,就JetBrains那个ToolBox,开机自启之后就是运行在托盘里。没有托盘图标,你叫我怎么升级和更新IDE?
好在并不是我一个人嫌弃没有托盘图标。就连Ubuntu都嫌弃,所以他们搞了一个插件,叫AppIndicator and KStatusNotifierItem Support。它的主要功能之一就是把托盘图标给整回来了。
中文输入法
GNOME倒是自带几种中文输入法,但我觉得都不好用。所以我选了Rime。由于GNOME上继承的输入法框架是iBus,你当然可以用fcitx,但是还是集成的用起来好一些吧。所以要安装的包有两个:rime
和ibus-rime
,安装之后记得先重启一下,不然刚装完进去GNOME的输入法设置是找不到Rime的。
在GNOME里启用Rime之后,还需要一些配置。比如把候选字从竖着的调成横着的,把繁体中文调成简体中文。
要调整候选字方向,在~/.config/ibus/rime/ibus_rime.custom.yaml
文件中这样写:
patch:
"style/horizontal": true
要调整候选字的个数,在~/.config/ibus/rime/default.custom.yaml
里这样写:
patch:
"menu/page_size": 7
配置文件调整完成之后,可以去托盘那里找到输入法的选项,选择部署即可读取最新的配置文件。
要调整简体中文,在输入法激活时按F4,选择“朙月拼音·简体字”即可。
备份
如一开始所说,由于存储接口的不同,组软件RAID 1并不会带来特别大的好处,反而可能会导致性能较差的硬盘拖慢整个RAID的性能。但是没有RAID来提供冗余性,那该怎么保证数据的安全性呢?我想到了我之前一直在用的一个备份软件:Duplicati。
这个软件支持多种后端存储,可以通过增量备份的形式保存不同时间的备份。我之前一直使用这个软件来备份我的Windows笔记本。刚好,这个软件也支持Linux。下载RPM包安装后发现缺少依赖,经过一番搜索,只需要手动安装gtk-sharp
就好了。但是问题又来了:有些要备份的数据需要root权限才能读取,这该怎么办呢?
搜索了半天,最后发现其实Duplicati的源码中包含了一个Service,但不知何故这个service文件并没有进到安装包里,我们手动配置一个就好了(/etc/systemd/system/duplicati.service
):
[Unit]
Description=Duplicati web-server
After=network.target
[Service]
Nice=19
IOSchedulingClass=idle
EnvironmentFile=-/etc/sysconfig/duplicati
ExecStart=/usr/bin/duplicati-server
Restart=on-failure
[Install]
WantedBy=multi-user.target
配置完成后重载systemd并启用服务:
sudo systemctl daemon-reload
sudo systemctl enable --now duplicati
由于Duplicati运行在root权限,因此建议只将webui暴露给localhost。之后打开浏览器,访问http://127.1:8200
即可打开网页端了。
关于存储后端,我使用的是BackBlaze的B2,我单独创建了一个桶用来存备份的东西,也不需要额外配置其他的什么锁和加密之类的。加密的部分我们使用Duplicati在上传之前完成即可。
关于备份的内容,我目前备份了如下文件夹:
/etc
:系统的所有自定义配置/home
:用户数据/opt
:没有使用包管理器安装的软件/root
:根用户的数据/srv
:和当前服务器有关的特定数据,虽然我这不是服务器,但也备份上了/usr/local/bin/
:用户自行安装的软件/usr/local/sbin
:用户自行安装的特权软件/var/log
:系统日志,以备系统崩溃时使用/var/opt
:给opt下的软件用的var文件夹/var/spool
:未完成的打印队列等/var/crash
:崩溃日志/var/container-data
:我自己偏好的容器数据文件夹
其中关于/var
是最难搞的,因为它里面有些数据值得备份,有些不值得,你得自己慢慢择。
备份频率是每两小时备份一次,备份的保留策略我选的智能,因为我也不知道我要什么,所以就全自动了。目前来看价格上应该不会特别贵。B2存储每月每TB价格6美元,赠送2倍还是3倍月均存储的下载流量,不过我暂时用不上。这种能够随时存取的级别,这个价格就不算贵了,隔壁AWS差不多要20多美元一个月。我这块盘一共就500G,就算占满了,里面的数据天天变,还能变出10TB不成?我觉得成本上来看问题不大。
结束语
至此就算是全部都配置完了。至于后续的使用就全看个人了。像是我就安装了JetBrains ToolBox来管理写代码用的IDE,后来也安装了Docker,而且新版本的Docker也支持给cli挂代理了。所以整体还是比较顺利地,跟着官方文档走就可以了,也没有坑,因此这里也就不再详细介绍了。
今天写完文章看了一眼,新快照出来了,fde-tools
也更新了,新版本兼容了新的pcr-oracle
。本来想跟着流程走一走,但没想到它要LUKS2,这玩意儿还是实验性功能。我一想,这也实验那也实验,万一哪天盘炸了,那我也就实验了。所以最终决定还是不要乱搞了,开机插键盘输入个密码也挺好。之后我打算买个小的UPS,断电了就直接进挂起,只有内存需要供电,那应该也能撑好久呢。除非是什么大的系统更新,不然应该不会需要频繁的重启输入密码。
回想文章开头,说买NUC主要还是为了减轻笔记本的压力,不让电池过热鼓包。但是当我今天发现笔记本的触摸板按不下去的时候,我就知道,这电池又他妈鼓包了。操。
至此之前欠下的债就算是还完了。虽然没有正式约定过每月一更,但是我还是希望保持这个更新频率。现在有了工作那肯定是得优先保证工作。如果像之前那样托更了的话,我会试图在几个月之内补上的。如果没补上的话,那就是真的鸽了。
--全文完--
【歪门邪道】使用Intel NUC作为Linux桌面主机 由 天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。
生命在于折腾
后续在使用的时候遇到一个问题,就是系统莫名其妙的就卡住了,或者开机的时候提示没有启动盘。一开始我以为是盘坏了,但没想到是OEM的盘太便宜了,导致底盖拧紧的时候,散热用的胶会把硬盘压成凹状,导致m2接口接触不良。这种时候如果是刚开机就是找不到启动盘,如果已经开机了那表现就是系统卡住。这个时候再用Sysrq进行REISUB操作,重启后就会出现找不到盘。
解决办法也没啥,就是找几张纸给它垫起来,不要让它往主板的方向凹。盘是金士顿的,很廉价,PCB很灵活的那种廉价,手感比三星差远了。我是没条件了,京东没货。如果各位有条件的话最好买裸机,然后回来自己配硬盘和内存条。
对了,内存也不够,内存不够导致频繁swap,风扇会经常转。我换成了8+32的,内存充足,风扇也很安静。
感觉amd的迷你主机更有性价比一点,例如7840hs的,还有个不错的核显可以玩玩网游
确实,Intel NUC最缺的就是性价比。不过买都买了,也就这个了。