解决 MSI 主板上安装 ArchLinux 时 UEFI 下 GRUB 启动项失效的问题

背景

过年这几天升级了一下家里的软路由 & NAS,从之前 ASRock 的 H81 MATX 主板换成了新的 MSI B460 TORPEDO,新主板是 ATX 有 2.5G 网口还有更多的 M.2 / PCI-E / SATA 口,做 All in one server 的扩展性已经足够了。

迁移系统的时候发现新买的十代 CPU (i5-10105T) 上面想用集显就必须用 UEFI 启动(不然会报错,说集显没有对应的 VBIOS 无法在 CSM 下启动)。不知道是不是我买了个 QS 散片的原因;但不管怎么样我必须要把之前的 ArchLinux BIOS/MBR 启动方式改为 UEFI/GPT 了

MBR 换成 GPT 我直接用的 DiskGenius 软件,想着按照 Arch Wiki 里面介绍 GRUB 安装 的说明一步一步走就可以了,没想到一直出错……就有了这篇文章。

问题

尝试按照 Arch Wiki 流程安装 GRUB,进入 Arch Installation Media,chroot 后运行下面的命令:

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

提示安装成功。在安装环境下运行 efibootmgr 也可以看到确实成功添加了启动项,但是重启之后完全找不到启动项,主板 BIOS 页面甚至不允许添加这块硬盘作为启动设备,GRUB 的安装是失败的。

解法1

TL;DR

核心原因是 MSI 主板需要 EFI 文件在 EFI 的特定路径上。Arch 的 GRUB 会默认安装到 {ESP}/EFI/GRUB/grubx64.efi 上,但主板启动时希望的地方是 {ESP}/EFI/BOOT/BOOTx64.efi

因此根据 wiki 有两种办法:一个是安装时增加参数

# grub-install --target=x86_64-efi --efi-directory=esp --removable

另外也可以 grub-install 之后再把安装好的 efi 启动程序复制 / 移动到目标位置上

# mv esp/EFI/grub esp/EFI/BOOT
# mv esp/EFI/BOOT/grubx64.efi esp/EFI/BOOT/BOOTX64.EFI

这个问题在很多其他的设备上也存在,根据 Arch Wiki,看起来联想和部分 Thinkpad 的型号也有一样的问题

解法2(当时折腾的过程)

当时折腾的时候并没发现有这样的解法,而是绕了些弯路:进入 EFI Shell 手动去添加启动项。

当时的思路是在 Arch Media 里面 efibootmgr 宣称安装成功了,但重启后却失败,可能是因为 Arch Media 读写 UEFI 启动项位置 NVRAM 的过程是有问题的,所以得想办法换个方式写启动项。没什么思路,感觉只能靠 EFI Shell 了:

UEFI 方式启动的 Arch Installation Media

用 UEFI 启动 Arch Installation Media 的时候有一个选项是 UEFI Shell,进入之后可以看到类似下面的界面

直接敲 help 可以看到命令列表。这里输入 alias 命令可以看到 UEFI Shell 里找到的 EFI 分区(一般至少找到两个,有一个是安装镜像自带的)的 Mapping Table,根据对应的文字说明找到真正需要启动的分区 FS[n]: 假设是 FS1

首先的操作类似 DOS,先输入 FS1: 回车进入对应的分区

之后可以通过 cd ls 等命令看到自己的 EFI 文件,也可以间接检查自己是否进入了正确的分区。注意,在这里启动器安装好的 EFI 文件是可以直接运行的,运行对应的 .EFI 文件就进入安装好的启动器了。(手动进入 grubx64.efi 之后,我才确认 GRUB 的安装完全没问题,单纯是引导项的问题)

之后用 bcfg 命令(参见文档)确认启动项

Shell> bcfg boot dump -v 

添加启动项,EFI 文件的路径可以是相对或者绝对路径

Shell> bcfg boot add 1 FS0:\EFI\GRUB\grubx64.efi "GRUB"

到这里重启就发现确实成功添加了启动项,主板 BIOS 里也能看到刚才添加的 GRUB 启动条目了。

这么做其实很折腾而且在我的系统上依旧不稳定,硬盘分区大小发生变化都会导致主板上的启动项丢失,需要重新添加。

结论 & 遗留问题

  1. 看起来这个问题在很多设备上都出现过,并非不常见,这么看来以后安装时应该默认安装到这个 fallback 路径下(EFI/BOOT/BOOTX64.EFI)才合理吧。
  2. 如果 UEFI 只认固定路径的 EFI 文件,那么在 UEFI Shell 里通过 bcfg 命令的方法,我不确定在其他设备上是否也成立;
  3. bcfg 添加启动项的方法在我的微星主板上是一个不稳定的方法,更换硬盘,甚至调整分区大小后这个启动项都会消失,需要再次手动重新添加,因此还是少折腾,直接把 EFI 文件放在正确的位置吧。
  4. 你可千万不要像隔壁叔叔一样,大年初二还在修电脑.jpg

重新开了 Blog

毕业之后其实有无数次产生重新开 Blog 的念头,然而由于行动力的原因根本不想动。

另外更重要的原因是之前 Blog 的备份不见了,其实很早就找不到了但一直没死心,最近下定决心去翻自己没整理的备份,终究是没能找到。

然而戏剧性的事情是,今天在重新搞域名搞 VPS 的同时,意外地发现 Internet Archive 上面有自己之前 Blog 的历史记录。重新审视自己近十年前的文字竟然有些怀念和陌生,思考着不如手动导入一些文章。后面会人工选择一些旧的内容(多数是 2011~2012 年的文字)导入到这里。

历史一直在用的域名 atarss.com 已经不再使用了(我没有继续续费),换了这个新的域名,顺便搞了一个短域名备用。

整个事情教训还是很疼的,一些东西就是需要长期维持,否则前面坚持的努力都会白费。当然也可以骗自己这些记录完全不重要,然而十年后的今天发现这些内容对自己来说还是有着些许的价值。在今天之前的很长时间里我都会非常失落。

后面或许会写一些文章,但至少会先努力维持这个网站的运行状态。

Building Caffe on Windows

这并不是教程,只是个备忘录,希望能帮助到有需要的人,然而不对能否解决问题做任何保证

开个坑,终于成功把 Caffe 在 Windows 上跑起来了(其实我也不知道到底对不对,至少编译是过了),暂时没有 data_layer 和 GPU 支持,也就是说并不能在 Windows 上训练,最多只能手动输入图片测试。

环境是Visual Stuido 2013 Community,各种依赖的头文件直接放进Additional Include Directories里面即可,在这里说些链接库的问题:

  • Boost:使用官方的pre-built版本(http://sourceforge.net/projects/boost/files/boost-binaries/),非常好用,把头文件放置好即可,VS会自动寻找.lib的位置;
  • OpenCV:官方Windows版本即可,现在用的是2.4.11。需要手动在项目属性->Configuration Properties->Linker->General->Additional Library Directories里添加库的文件夹,在…->Input->Additional Dependencies里面添加库的文件名,后面的依赖库都要用这种方式去解决;
  • BLAS库我用的是OpenBLAS,特意装了个MinGW环境去编译,装好MinGW下的gcc和gfortran之后直接make && make PREFIX=/path/to/install/dir install即可,编译生成的是liboepnblas.dll和libopenblas.dll.a,注意.dll文件要放进系统PATH环境变量下的位置,.dll.a文件就是交给VS去用的库文件(添加到Additional Dependencies里);
  • google-glog:github上的源码里面就有VS的.sln项目文件,直接build即可,生成的库文件扔进Additional Dependencies里;
  • protobuf:跟glog一样可以直接用官方提供的.sln文件,然而注意需要使用protoc.exe用来生成caffe.pb.cc和caffe.pb.h两个重要的源码。
  • gflags:使用cmake-gui生成VS项目文件,然后在VS里面Build即可;
  • snappy:使用了kmanley的snappy-msvc项目(https://github.com/kmanley/snappy-msvc),里面的.sln文件可以直接用,如果出现ssize_t类型定义的问题的话可以手动指定:typedef __int64 ssize_t;
  • HDF5:使用官方的CMake安装说明即可,编译好之后复制库和头文件到项目设定好的位置即可。

解决依赖后需要手动通过 protoc.exe 把源代码里面的 caffe.proto 转换为 caffe.pb.cc 和 caffe.pb.h,之后把 caffe 的源代码直接添加到项目里面即可(Add->Existing Item)。

源代码很多地方需要修改,折腾了好长时间很多地方都忘了,说一些能记住的吧:

  • 因为是 CPU_ONLY,注意在项目属性里预先定义 CPU_ONLY 这个 flag;
  • io.cpp 里面用到了 posix 的 open 和 close 函数,还好 VS 提供了对这两个函数的支持,添加 #include<io.h> 即可(参考这里:Using File Descriptors in Visual Studio 2010 and Windows);
  • io.hpp 头文件里面的 MakeTempFilename 和 MakeTempDir 两个 inline 函数我直接注释掉了,因为发现这两个函数只在 runtest 部分才会用到;
  • 好多可执行文件的源码里似乎都有 namespace 的问题,需要手动添加 caffe:: 和 boost:: 的 namespace;
  • ……(记不住了)

二次元的走马灯,三年来的流水账

迁移自 renren: http://www.renren.com/feed/23295718702/297020421

【Part 0】

难得写点什么,开头有些话可能会说得很直白,或者很过分,可能一不小心就把不该说的都说出来了,反正是自己的视角的流水账,主要还是给自己回忆用的,不过既然下决心多写点就不在乎这些了。

本来这暑假过两天就该去上海了, Jayo 酱乐队的第一次在帝都外的演出。蠢P大大最开始管张罗的这件事,结果这货在我们都开始排练之后还一次没来过,跑沈阳勾搭妹子去了(其实在沈阳找到工作了)。

没办法,正好趁着沈阳 8 月初有漫展回了趟沈阳,结果我都要回帝都了蠢P的行程还是没定下了,到7月31号晚上乐队这帮想去的就急了,直接上 Plan B,想着蠢P来不了的情况下我们也要上,小球跟打了鸡血似的把能揽的活全揽过去了,为了都能上也换了不少老歌,各种公关,联系主办,最后群里算是达成一致肯定能去了。看到这结果我肯定挺开心,毕竟这很可能是自己在这个乐队的毕业典礼,我这辈子又没去过南方,能去一定得去啊。当天讨论得挺晚,第二天还有沈阳一年一度的漫展,那一晚都没咋睡。

第二天,8月1号主要是漫展,上午去得稍晚靠黄牛票才进去还好没假票,下午陪从帝都来的 luolicon和浩洋玩,顺便去了西塔的棒子KTV唱宅歌,没想到在那里点的てんしにふれたよ!就成了最大的 Flag 。。。。。。晚上坐卧铺回帝都,火车开得不快,一路上手机都有信号,上着Q看着乐队的群,一堆人还讨论管我要蠢P的沈阳的手机号,准备催他赶紧定机票。那晚上睡得还挺不错,盖着被吹空调也不咋冷。

结果一觉醒来,8月2号早上六点多钟,再去看Q上的乐队群,直接定晚上6点去吃饭,再往前看消息记录,大家全都不去了。你们的干劲呢?明明之前定的那么好,备选方案都出来了,最后咋就不去了?说好回北京排练最后就成吃散伙饭了,感情我要晚回来一天连这顿饭都吃不上?当时真的特别生气和难受,现在想想心也疼,不管过程咋样结果太让人难受了 在学校一上午都刷着人人啥都没干,一下午都在听之前排练过的曲子,整天啥都没吃,晚上就成散伙饭+给 Spa 送行了。真的太伤感,不知道用什么词句来描述自己的心情和想法。能去的都去了,最后给喝多了的 Spa 送回到交大的宿舍,羊羊跟 Spa 都哭成啥样就不说了,这么好的一个乐队的同学,不敢说是朋友,但也是最熟的熟人了。以后每次路过各种 Spa 和拉稀的时候都会想起你的。

晚上从交大走的时候也就刚过十点,我羊羊猫哥仨人打车沿北三环往回走,心里实在难受就稍微早点在蓟门桥西下了,往学校走了二十分钟,在没啥人的蓟门桥上边哭边唱对我来说乐队的第一首歌Butterfly…………無限大な夢のあとの やるせない世の中じゃ…………就跟走马灯一样一点一点地去回忆自己在乐队的点点滴滴。晚上回来 Spa 这傻逼又 TM 发个自己吹的口琴的(他妈写到这自己又掉眼泪了妈蛋 Spa 就赖你),不让人好好睡觉。。。嗯虽说这次说再见了以后一定还能再见到的,一定。

于是就是第3号凌晨睡得特晚(感谢承泽的电话,真谢谢你),下午去囧神布展。4号一天囧神累成狗还被主办弄得没卖出去啥(活该让你坑自己人),确实说好了今年干完这场就不干了,专心考研。5号去中关村看了下相机结果没找到想要的样机,一直到现在接下来就是认认真真地回顾自己的二次元种种经历。

【Part 1】

自己入宅其实应该是高三开始的,之前高二准备考少年班结果没考上,高三暑假跟大家复习反倒没啥压力。高三的暑假老师白天上课,晚上就是找别的老师来帮忙看晚自习,毕竟不是太熟的老师不怎么管所以就拿手机上网,当时就知道了伪基百科,上面的恶搞风格在我不怎么上网的情况下很合我口味,就在上面知道了好多二次元的词汇,萝莉,正太,御姐(也包括好多糟糕的东西),另外这网站正好在那个暑假用手机上不去了,我从而了解了 GFW 的存在性。

之后高三下学期大家也经常用教室前面的多媒体看海贼王,那个时候还有每周一次从信息中心一楼阅览室领的电脑报,估计那时候游戏版里面多了好多死宅,就记住了里面推荐的夜明前的琉璃色和 CLANNAD,分别是我高考后玩的第一款 Gal 和看的第一部动漫。但实际上让我入宅的第一部动漫是蔷薇少女,因为某次上网查动漫壁纸,看到一张觉得非常不错想知道是哪里的角色,正好图片(这张图我相册里有)里有下面有小字 ROZEN MAIDEN,就花了一中午的时间看手机版的百度百科(当时写百科的应该是一群高贵冷艳的中二少女们吧)。再后来没忍住把这片子从头到尾补了一遍,又去下相关的专辑,不过那东西里面有些曲子还真是没法听。。。

之后高考完事了,成绩虽然没想要的高但有自主招生不至于没学上。整个暑假主要就是宅着,仔细想想一暑假也没看啥东西,把 CLANNAD 第一季(第一次被动画感动的掉眼泪)和 EVA 看完了,打了款小黄游,看了两本奥威尔的书奠定了基本人生观。不过后来才发现 10 年夏天好看的动画倒是不少,笨测,神知,当时都不知道日本动画是按季度出每周一集的事情,只会去找那些流传最广的东西。现在看看,那时的自己还不如现在的低端宅。快开学的时候试着上了 Twitter,上面也有很多有趣的人,结果被人骗去打 osu,不小心入了音游大坑。

【Part 2】

上了大学之后发现自己果然是班上年龄最小的,对学生会感兴趣最后也就去科技部打了个酱油,学 AE 什么的倒也符合自己技术宅的特点,不过在院科技部能认识这么多志同道合的人倒确实非常开心,基本到现在也都是熟人的关系。毕竟课业压力不大,也是趁没事补了下网上说的好看的动画,看 CLANNAD 的 After Story 和 Angel Beats 真的不知道掉了多少眼泪,自己也傻逼非得找虐受催泪的地方看了好几遍。

Angel Beats 倒是起到了丰富我人生观的作用,让我觉得“经历比结果重要的多”,之后我的很多决定都是因为觉得做这些没做过的会有趣。这里得提下我的室友神龙同学,中学的时候是个死宅,移动硬盘里不知道藏了多少里番,结果上大学装得跟个人似的,要不是我常在宿舍看动画估计我到现在都不会知道他曾经是个死宅,就是这个人告诉了我 bilibili 这个弹幕网站和极影 bt 站,估计没有他我应该不会入宅得这么深吧。

大一的寒假也基本宅着(不得不自黑这时看成绩单真的是我成绩最好的时候,再往后成绩就没法看了)。一月份的时候第一次尝试追番,看的是 Level-E 和宽叔神作(误) Fractale。大年三十那天无聊打开了B站上的音乐区,点开了某个标题类似“动漫XXX神曲XX合集XX”之类的时频,结果就跟 AB 的 GDM 一起入了动漫音乐的大坑,知道了不只有麻枝准大魔王能写出催泪曲。顺便提一下,Crow Song 是第一首我尝试去扒谱的歌。记得大一下的时候还找过神龙同学去挨个问某 100 神曲时频里每首歌的出处,现在想想没有这些经历的话我也不至于今年在漫展上一共卖了不少钱吧(大雾)。

其实这段时间我整体还是很孤独的……毕竟从一个很好的中学到一个一般的学校心理落差实在是太大,我觉得我从心里最底层还是抗拒着这个环境;另一方面自己的社交能力是在太差,毕竟比别人小两岁,从小又内向,跟另外一群人在一起刚开始肯定显得不会说话,所以某种程度上我也愿意承认我跟室友或者同班同学的关系不算好,只是说不差的程度。相对而言我跟学生会科技部的一群技术宅倒是更有共同话题。

【Part 3】

大一上的时候在宏福时看到动漫社贴在楼底下的二小姐的海报,当时还不认识这人,不过打过 osu 觉得这人在 Bad Apple 视频里面出现过。看海报上写着不管加不加动漫社都可以加群就顺手加了下(当时还是ドキドキ的心情),结果一学期没在群里说过什么话,放映也没去过,倒是收了一学期的福利群邮件。到了大一下,收到了一封乐队招键盘的群邮件,毕竟之前对动漫音乐一直感兴趣,架子鼓技能还没丢所以心里还是有个小小的演奏动漫音乐的梦想的,所以就手贱问了下“男鼓手求加入”(特意去查了下群邮记录防止脑补),然后人就同意了,从此加入 Jayo 酱乐队。

刚开始的半年虽然没现在这么开心,但是第一次在学校大扇演出,还有穿着北高校服的黑历史,每周一次的排练,第一次合宿,去人大临界结果被舞台设备坑,认识了好多好多在学校认识不到的同好(仔细想想只是自己懒得去参加动漫社的活动罢了),自己当时都不敢想象能经历这么多。在学生会科技部只是做一些幕后的工作,但是在乐队却能成为独一无二不可缺少的一员,人生中真的是第一次体会到如此的归属感。

当时五一第一次去了漫展,记得是在国贸的第一届 CGU,还面基到了星云蘑菇桑。之后军训的时候天天坐在办公室里吸引仇恨,认识了好多有趣的人,还有熬夜补完鲁鲁修的经历。同时快到期末看了命运石之门和魔法少女小圆,一直觉得前者综合素质甩后面的三条街和人气竟然差这么多真心没法理解,暑假的时候看了寒蝉出题篇和解题篇,所以之后看到《源代码》这样的电影时心里就嘀咕“这样的电影究竟哪里好看了,剧情渣得没法看啊”。至此宅的生活算是踏上正轨。

【Part 4】

大二上的时候经历了第一次在 Livehouse 举办的 Live —— AM3,前一天还在麻雀瓦舍附近的宾馆合宿了一晚上。印象中那次 Live 我们乐队特别燃,Go!!!、瞬間センチメタル、裏表ラバーズ,大家都很努力也都很满意,估计那次是我们最成功的一次演出吧。面对着大量的观众,大家在一起真的非常开心,也算是第一次体会到了“祭りの後”失落的心情。哦如果没记错的话 Spa 还写了篇日志是要给 inory 表白是吧。

之后估计因为回到了本部,跟本部动漫社的人渐渐熟了起来,也通过这个认识了好多有趣的人。不过就像我曾经说过的,我这个奇葩是先加的乐队认识了一堆外校的,回来才跟学校动漫社的人熟悉起来的。可惜一直有着在本部科学会堂举办 Live 的设想可惜一直没法实现,乐队的熟人都走了,估计以后越来越难了吧。倒是学校这边我又参加了一个乐队,演出逐渐多了起来。

其实这一整年并没有什么特别的事情,Live 以大概 4 个月一次的频率举办着,场地一直在变,不断地有新人进来,不断地有老人离开,但是总的人数一直没少过。自己也一直追着新番,补着大量的动漫歌曲,强迫症让我硬盘上的动漫音乐整理得非常整齐。大二上学了半年日语,到今天也就只是能推 totono 生肉的程度。

【Part 5】

到了大三,乐队的这些人逐渐的占领我的日常生活,跟乐队的几个人一起出去聚餐也逐渐成了家常便饭,乐队的人逐渐被了解,但是乐队的事情却没什么可谈的了(其实是流水账扯不动了…熬夜码了三个多小时了……),这也好理解为什么队长最开始就不想去上海。乐队更像是一个逃避现实的避风港,每次排练之后总要在蛇穴外面的 KFC 或者蓝蓝路坐上好久。

大三上快结束的时候从土匪那知道了不少 CD 的事情,算是我这半年漫展的必要条件吧。去了不少漫展,每次回来看场照顺手加好友(可能这习惯不好),也让我人人上有了二次元的好友圈,因为这些在三次元认识了些以前绝不可能见到的人吧(认识好多大大真开心,真的很开心)。可惜人人上我发的东西确实没啥跟 coser 相关的,之后就等着被删吧……

大三下因为学生会那边没什么事情了,追求各式经历的自己又去 byrTeam 打了不到两个月的工,结果被累成狗弄得以后再也不想敲代码,也因为同时期漫展的收成不错,之后就没怎么在 byrTeam 干。又经过了几个高校的演出,就到了现在。

【Episode】

再看看发现自己真的写了好多不该写出来的东西,不过毕竟突然地离别心情实在不好,估计写出来心情会好一些。一晚上码了这么多字,一抬头发现天都快亮了,实在是懒得去校对,上午的事情不得不推到下午去了。这三年的二次元经历,两年多的乐队给了我最大的归属感。我也算是明白了人际关系真的很难维持,估计半年后即使我还在乐队里人都已经完全不一样了吧。。。

之前提过在KTV点的天使にふれたよ!再加上刚入宅的时候听哭了无数遍的一番の宝物,形容现在的心境实在是最恰当不过了。贴两段歌词吧

駅のホーム 河原の道
離れてても同じ空見上げて
ユニゾンで歌おう
でもね 会えたよ すてきな天使に
卒業は終わりじゃない これからも仲間だから
大好きって言うなら 大大好きって返すよ
忘れ物もうないよね ずっと永遠に一緒だよ

巡って流れて 時は移ろいだ
もう何があったか 思い出せないけど
目を閉じれ見れば みんなの笑い声
なぜかそれが今一番の宝物

能认识你们真的太棒了,可以的话以后考完研还要继续搅基继续做朋友。最后引用天元突破的台词吧

今度こそ、本当にあばよだ。行けよ、兄弟!
あばよじゃねぇよ、一緒だろう

2013年8月6日 凌晨2点~5点