天空 Blond - NUC
type: channel
link: https://www.skyblond.info/tag/NUC/
items: 【歪门邪道】使用NUT在Linux上管理UPS
items: 【歪门邪道】探究Linux为什么突然死机 & 为NUC更换SSD
items: 【歪门邪道】使用Intel NUC作为Linux桌面主机
items: 【歪门邪道】Intel NUC装机简记

【歪门邪道】使用NUT在Linux上管理UPS
type: item
date: 2024-06-02T15:35:18+08:00
description: 之前下雨的时候家里又跳闸了。想来想去，去京东买了个APC的BK650M2-CH的UPS。本文记述如何让NUC在UPS电量低的时候自动关机。前言因为Linux在我的印象中一直是很脆弱的那种角色（它很强大，但也很脆弱），尤其是ext4时代经常有人说突然掉电之后会有什么文件系统损毁之类的事情。虽然Btrfs已经不会出现这个问题了，但我对突然掉电还是耿耿于怀。前几天我家又停电了，于是便考虑买个UPS。我买的型号是APC的BK650M2-CH，特征就不介绍了。我这边测试让NUC跑满s-tui，保持CPU使用率100%，从UPS满电到UPS自动关机，一共能坚持35分钟。我想这35分钟怎么都够我找到新的电源了。就算找不到，我也有时间保存我的工作进度。再不济我直接进入挂起模式，只给内存供电，按照这个功耗那跟定比35分钟要多。于是问题来了：我睡觉的时候停电了怎么办？得想个办法能够让NUC在最坏情况下保护工作进度。关机是不现实的，因为有些软件并不会自动保存。那么挂起是一个措施，但谁来触发呢？我发现gnome桌面能够自动识别到UPS，但经过我的实际测试，就算是UPS低电量自动关机，就算是在此之前gnome也会提示UPS电量低，但他就是不会自动关机。我猜测可能还是UPS和电池供电不同吧。最开始我尝试了apcupsd，这个是专门给APC的UPS准备的。但我发现BK650M2-CH和他不兼容，具体表现是acpaccess读取不出来当前UPS的状态。只能作罢，后来看到一个叫做NUT的东西，叫Network UPS Tools，它可以监控UPS的状态，并通过网络将UPS的状态发送出去。这样一来，如果你有10台服务器都接在一个UPS上，那我们只需要将UPS连接到一台服务器上，然后其他服务器通过网络即可查询到UPS的状态，并实现自动关机。由于我目前的设备比较简单，只有NUC是没有内置电池的，所以本文使用standalone模式。安装配置NUT的安装很是方便：sudo zypper in nut安装完成后可以查询APC的UPS应该用哪些driver：cat /usr/share/nut/driver.list | grep "APC""APC" "ups" "3" "Back-UPS (USB)" "USB" "usbhid-ups"由于我的型号是使用USB进行通讯的，因此driver填写usbhid-ups就可以了。修改配置文件/etc/ups/ups.conf：[apc-bk650m2-ch] driver = usbhid-ups port = auto desc = "APC BK650M2-CH"然后修改/etc/ups/nut.conf：MODE=standalone这样我们就无需启动服务器和客户端了。由于我们不需要服务端，因此也无需修改upsd.conf和upsd.users文件。但我们还需要修改upsmon.conf：MONITOR apc-bk650m2-ch@localhost 1 upsmaster @UPSD_INITIAL_MASTER_PASSWORD@ master SHUTDOWNCMD "/usr/bin/systemctl suspend" SHUTDOWNEXIT no配置文件中默认的名字是myups，我们需要将MONITOR改成我们对应的。后面的数字1表示供电数量，由于这个UPS只提供只向我们系统提供1路供电。同时我们希望挂起系统而不是关闭系统，所以我们还要修改关机的命令（SHUTDOWNCMD）。同时因为是挂起，所以我们不希望NUT发出关机指令后退出，而是保持运行，所以还要调整SHUTDOWNEXIT。一切调整妥当之后：systemctl enable nut-driver-enumerator systemctl enable nut.target --now upsc apc-bk650m2-ch第一行用来启动一个叫做nut-driver-enumerator的服务，它的作用是根据ups.conf中定义的设备来拉起对应的driver。第二行用来启动nut服务，第三行用来查询测试nut服务是否和apc连接正常。如果正常的话，第三行会打印出：skyblond@crescent-rose:~> upsc apc-bk650m2-ch battery.charge: 100 battery.charge.low: 93 battery.mfr.date: 2001/01/01 battery.runtime: 3011 battery.runtime.low: 120 battery.type: PbAc battery.voltage: 13.6 battery.voltage.nominal: 12.0 device.mf…

【歪门邪道】探究Linux为什么突然死机 & 为NUC更换SSD
type: item
date: 2024-05-01T01:54:00+08:00
description: 上一篇文章介绍了我购买并配置Intel NUC13Pro的过程。在使用过程中，我发现有时候开机会找不到启动盘，有时候系统会突然卡死。本文将记述我逐步排查问题，并最终更换SSD的过程。SSD掉盘的三种形式其实在最开始的一周，这块金士顿的SSD并没有表现出太多的问题。偶尔在打开IDEA的时候会卡顿，有时候会直接导致系统卡死。我一开始以为是Swap的原因，因为Swap给的太小了，我平时工作需要开40多个Chrome标签，还有2个左右的IDEA，整体不够用。后来紧急从京东下单了一条DDR4 32GB的内存条，变成了8+32的配置，内存就赋予了很多，现在基本上日常占用在20GB左右，因此也就不着急升级到32+32了。但这个时候系统卡顿的情况还是会偶尔发生，但不是很频繁，我就没在意。第一次系统卡死发生后我就开启了Sysrq，这样我就可以通过REISUB来安全的重启系统了。但后来我发现了两个现象：首先就是卡死后重启有机率找不到SSD，表现形式就是BIOS提示A bootable drive has not been detected，进入bios后发现NVMe槽是空的，和没插盘是一样的。其次就是我注意到在按下Alt+PrtScr+R之后，输出会被强制切换到控制台，这个时候有机会能看到NVMe相关的报错，主要有三条：第一条的具体报错记不清了，大概就是Btrfs进行IO操作的时候因为超时失败了第二条也记不清了，大意是NVMe没有及时响应系统的请求，内核尝试reset控制器第三条则是一个Abort status: 0x371但大部分情况都能在重启后解决，于是我就没有当回事。直到周五晚上我打开IDEA，系统突然崩溃——和卡死不同，鼠标和UI都是有响应的，但任何从硬盘读数据的行为都会被阻塞（事后才知道，这个时候盘已经掉了，ui还能响应全靠内存的缓存）。于是我便重启了，重启之后看到控制台询问我的luks密码，我就按了电源键关机，睡觉去了。可等到周六我再开机，那盘就再也没出现过了。当时我想可能是因为金手指接触不良，我拆开擦擦就是了。结果拆开再装回去，还是不识别。我就很奇怪，于是就保持后盖打开，装好SSD，再开机——识别了。好的，那我们把后盖合上，然后再开机——系统找不到盘。我：？？？此时我心中有了一些假设，因为刚才拆下来擦金手指的时候我就觉得这块盘的做工极差——像是三星和西数的SSD，你轻微施力掰它，它的PCB是比较硬的，这种手感的回馈就是告诉你不要掰；而金士顿这块硬盘的PCB很薄，也很软，你轻微施力掰它，它就随着你用力而弯曲，没有太多的抵抗。而NUC为了节省空间，它的SSD并不是贴在主板上的，反而是悬空的。在垂直方向，先是网卡在主板上，然后是SSD摞在网卡上。所以我推测会不会是背盖上的散热条把SSD压弯了，导致M.2接口接触不良呢？针对这个假设，我做了一个实验：不装背盖：可以检测到盘装上背盖，但不拧螺丝：可以检测到盘装上背盖，用手旋紧螺丝：有机率可以检测到盘。如果遇到掉盘，拆下背盖后重新安放、拧紧装上背盖，用螺丝刀拧紧螺丝：我试了好几次，就是检测不到盘虽然不能确定就是散热条把SSD压弯了导致接触不良，但从结果来看，螺丝的松紧程度确实能够影响盘能不能被识别到。因此我想到了一个很简易的办法：把纸叠起来，垫在ssd底下。因为叠起来的纸有弹性，所以可以确保把SSD压在散热条上，这样就可以保证它处于正确的位置了。经过这样一番折腾，我成功地解决了PCB太软的问题。但这还并不是问题的全部。周六中午我在进行网络冲浪的时候，突然发现浏览器崩溃了，而且没有崩溃报告，同时所有需要从硬盘读数据的操作都卡住了。我很自然地按下Alt+PrtScr+R，看到了先前说的几条报错信息。于是我就去网络上搜索了一下，大部分结果都指向一个叫做APST的东西。这东西全称Autonomous Power State Transition，中文叫自动电源状态转换。这个功能的主要目的就是在你不使用或轻度使用NVMe盘时自动缩减功耗，从而为移动设备争取一些续航。但这种缩减功耗带来的就是响应延迟的上升，而这里我确实在控制台上看到一个timeout，所以我觉得有戏。根据ArchWiki)所说，Linux内核对于Power State最大延迟设置是25ms，任何超过25ms的硬盘都应该通过内核参数手动调整这个值，来避免Linux误认为NVMe盘出问题了。于是我通过sudo nvme id-ctrl /dev/nvme0n1查看了一下我这个盘的延迟：ps 0 : mp:5.00W operational enlat:0 exlat:0 rrt:0 rrl:0 rwt:0 rwl:0 idle_power:- active_power:- active_power_workload:- ps 1 : mp:3.…

【歪门邪道】使用Intel NUC作为Linux桌面主机
type: item
date: 2024-04-24T21:02:05+08:00
description: 之前写过一篇帮朋友配置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更新。一开始我还担心…

【歪门邪道】Intel NUC装机简记
type: item
date: 2023-08-01T13:31:00+08:00
description: 我朋友听闻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硬盘，我这里也没有…