跨越时代的存储

在不支持NVMe启动的平台上启动NVMe存储器的思路

Posted by Bob Guo on May 24, 2020

0x01 缘起

还记得我这篇文章吗?本来我的想法是再买一套X79作为主力工作站使用,但后来翻遍咸鱼也找不到高质量的X79平台,加上我现在也并不特别急需软路由,这个想法就暂且搁置,T1700仍然作为我的主力机继续服役。而由于我手上本来给Linux用的、格式化成EXT4的那张2.5寸机械盘似乎已经有问题了,我就打算直接换成3.5寸的全尺寸机械盘。而由于SFF机箱的体积限制,一旦放下全尺寸机械盘就无法再放2.5英寸SSD,只能忍痛割爱,将本来用于连接WiFi模块的PCIEx4接口用于NVMe转换板。我使用的转换板还可以额外增添一个NGFF SATA固态硬盘,也可以有效利用我主机上第三个SATA接口。而我使用的硬盘则是Old School的NVMe MLC SSD,三星SM961 256G版。这张盘从2017年起一直是我的主力固态,即使256G的容量有点捉襟见肘,但它的性能即使以今天的眼光来看仍然是第一梯队,能与之匹敌的也就只有极少数固态硬盘中的佼佼者而已。 然而,固态虽好,但由于T1700 SFF使用的芯片组是商务机专用的Q87,它并不支持直接从NVMe启动。如果只是拿高速固态做缓存或从盘,这倒也没什么,毕竟你仍然可以在操作系统里直接找到它,读写文件或者mkfs.ext4也都没有问题。但,如果你把/boot丢在NVMe盘上面并打算从BIOS里设置启动项,你会发现戴尔的BIOS设置界面里根本找不到你的NVMe盘。所以,经过不断的摸索和练习,以及查阅各式资料,我整理出三种可能可以使用的方法去启动NVMe盘。不过,如果你的设备根本无法使用NVMe盘那得另当别论,不过如果你的平台连使用NVMe盘都无法做到,我实在不知道你为什么要用NVMe配它使用。SATA不香吗?

0x10 注入NVMe驱动

这种方法是最有效、最省事(使用者角度)的。只要修改BIOS插入NVMe驱动,封装,刷入,就可以毫无异常地使用NVMe磁盘了。只不过,这种魔改需要用户对BIOS文件位置等知识不说了如指掌也得略知一二;如果使用第三方封装好的文件总会有安全问题-毕竟,BIOS层级可以说是用户可以接触到的最底层的东西。如果是论坛大手手制那还好说,那些淘宝闲鱼明码标价的BIOS文件,你敢用吗?我反正是不敢;而且,BIOS的烧写仍然是个问题。我的P775在烧写BIOS的时候确实砖过,幸亏在动手之前我就准备好了备用机和CH341a,拆机直接动BIOS芯片即可。BIOS这东西一旦烧写失败必砖,而且由于是用户自己手贱,厂商基本不会为刷BIOS刷砖的主板提供保修服务,而大部分用户手上也不会正好有CH341a和第二台备用电脑。如果是像部分具有双BIOS芯片一个烧坏可以用第二个芯片上的数据复写的主板可能还好,但如果是其他主板那可能只有送修一条路可以选择了。而且,如果你的电脑不使用普通厂商的主板而是品牌机的主板或像我这样的品牌机主板,要么根本找不到BIOS文件,要么它们可能是加了密的,基本没法使用这种方式。

0x11 使用第三方bootloader

这个方法是最通用(任何支持NVMe硬盘的设备都可以使用)但后期维护重装会比较困难的。这个方法的思路其实很简单也很直接,既然无法从放在NVMe盘上的/boot启动,那就把/boot放到能够启动的盘上,从那个盘引导进入Bootloader,然后再从Bootloader上引导kernel不就大功告成了吗?我现在在T1700上使用NVMe磁盘也是基于这个思路。还记得我开头提到的那块2TB机械盘吗?没错,我从它身上划走200M左右的空间,把GRUB整个挪了进去,保存重启,正常进入操作系统。Bootloader的选择按照你个人的习惯和偏好来,如果是黑苹果用户那就直接使用Clover,如果是纯Linux用户比如我就可以使用GRUB。具体的设置会根据你使用的Bootloader不同和发行版而有所区别,我这里就只讲GRUB和Arch Linux。

0x01 复制分区

制作ArchLinux安装U盘,从U盘启动进入ArchLinux Shell界面这些不用多讲,进入Shell之后先分区,然后输入

dd if=/dev/sda2 /dev/nvme0n1p1

如果你原来的系统盘不是sda2,或者你有多个分区的,把它们一个一个给复制过去,然后就可以处理Bootloader了。

0x10 安装GRUB

在机械硬盘(或任何直接可以启动的硬盘上)划分出一个100-500m左右的分区,然后用

mkfs.vfat

将其格式化。然后,输入以下指令将不同的系统分区挂载上去:

mount /dev/nvme0n1p1 /mnt # 挂载根目录
mount /dev/sda1 /mnt/boot # 挂载/boot
mount /dev/nvme0n1p2 /mnt/home # 挂载/home

然后就可以开始设立分区表并安装GRUB了。

rm /mnt/etc/fstab && genfstab -U /mnt » /mnt/etc/fstab # 删除原有分区表并重新建立新分区表
arch-chroot /mnt # 进入已经安装好的Arch Linux环境
grub-install –target=x86_64-efi –efi-directory=/boot –bootloader-id=archLinux_NVMe –recheck # 安装GRUB
grub-mkconfig -o /boot/grub/grub.cfg # 生成GRUB配置文件

0x11 重启进入Arch Linux

退出环境,重启进入BIOS。在选择启动项界面确认你的archLinux_NVMe确实存在并把它调整到第一项。如果你在之前复制了你原来的/boot分区到新的地方,也一定要重新建立Grub配置文件和分区表,某种意义上真的不如砍掉重练来得痛快。选择使用archLinux_NVMe启动,然后你应该就能看到熟悉的登陆器界面了。