龙芯小试 —— 龙芯3A3000主机简单配置与Debian系统安装

前言

前几天在咸鱼上买到了一块龙芯的电脑主板,CPU型号是龙芯(Loongson) 3A3000,芯片组似乎是780E。回来装系统的时候遇到了不少麻烦,这里记录一下,如果能帮到后来者,那自然是最好不过。

系统选择

实际上,我仍然推荐有条件的用户,使用龙芯官方适配的操作系统Loongnix,因为这是龙芯优化过的系统。

只不过,因为mips64el架构上的Loongnix是基于Fedora发行版的,且版本古老。我个人习惯的环境是Debian,只有LoongArch上的Loongnix才是基于Debian制作的。况且,Loongnix默认带一个GUI,连服务器版都带,我不是很喜欢先装后卸,因此我还是希望安装一个相对干净的Debian系统上去。

龙芯3A3000基于mips架构,具体到Debian上,属于mips64el架构(MIPS 64-bit little-endian mode, MIPS 64位 小端序),请记住这个代号,因为我们后面会反复用到。

关于Debian的系统代号选择,在本文编写时,最新的Debain系统是Debian 11 Bullseye,使用的系统内核是Linux 5.10. 但我们目前会使用上一个版本,也就是Debain 10 Buster,具体原因下面会说明。

下面我们讨论的方法,基于狗剩百科:Debian 系发行版安装指南,并做一些自己经验的额外补充。

条件限制和实现方式

安装方式的选择

在平时x86计算机上,安装Debian的方法,首选当然是直接从Debian CD源中下载安装镜像,将镜像刻录到U盘上,引导镜像中的安装程序完成安装。这样当然是最简单的。

然而,根据我的简单测试,似乎Debian CD源中的ISO镜像,并不能顺利地在我手头上这块主板中引导。

失败的Debian安装程序引导测试

这一段是我尝试在龙芯上引导Debian安装镜像时的失败操作,或许是该镜像不具备在龙芯电脑上引导的能力,也有可能是我本身操作方法不正确。因此我将这一过程记录在此,如有谬误,还请批评指正。如果您希望参考本文进行Debian系统的安装,请略过这一段。

  1. 下载Debian CD中的安装镜像debian-11.2.0-mips64el-netinst.iso
  2. 使用dd命令,将其刻录到U盘上: dd if=debian-11.2.0-mips64el-netinst.iso of=/dev/sdb bs=8M,(其中/dev/sdb是我的U盘设备)
  3. 将U盘插入龙芯电脑,启动,提示找不到LiveCD中的一个文件。

根据上述表现,个人猜测电脑已经成功读取并加载了U盘上的引导程序,但不知为何无法加载U盘上的后续文件,无法进入安装程序。

此外,目前我个人还暂时无法确定这块龙芯主板究竟是BIOS/CSM引导模式还是EFI引导模式。BIOS设定中无对应选项可调整。

在龙芯提供的Loongnix镜像中,存在一个EFI文件夹,且引导该Loongnix镜像时,在GRUB Shell中执行echo $grub_platform,回显结果为efi。且在Loongnix LiveCD系统中,grub-install命令提示安装的平台为MIPS下的EFI平台。

但进入该LiveCD系统后,使用Loongnix的安装程序尝试安装系统时,如果磁盘为GPT分区表,会提示当前计算机运行在BIOS/CSM模式下,需要创建额外分区才能继续安装。采用MS-DOS分区表则无此问题,安装时不需要创建ESP分区也可完成安装并正常引导本地磁盘系统。这也是我电脑目前的状态。

因此,我已经无法区分这台龙芯电脑运行在何种模式下,需要进一步考察。如果您有什么看法或观点,欢迎通过邮件同我交流,我的电子邮件地址在站内可找到。

有些难办的是,mips64el的Debian源,没有GRUB2软件包提供! 这就意味着,我们需要借助其他方法,安装GRUB引导器 —— 如果没有GRUB引导器,我们是无法引导我们的系统的!

因此,我们需要另辟蹊径,分两步安装Debian系统:

  1. 安装龙芯的Loongnix系统到本地硬盘上。我选用的镜像是loongnix-20180930.iso。这一步骤主要目的是借助官方的安装程序,完成分区并将GRUB与Linux内核安装到本地硬盘。
  2. 重新进入LiveCD系统,删除本地硬盘中原有的根目录结构 (但需要保留/boot目录下的所有内容!因此建议在 第一步安装Loongnix系统时,将/boot作为一个独立的分区,空间大约1GB)
  3. 使用debootstrap工具,创建Debian根文件系统,并在此基础上,进行修改。更多相关的信息可以阅读通过 Unix/Linux 系统来安装 Debian GNU/Linux

总体而言,我们相当于借用了Loongnix系统提供的内核引导Debian系统。大部分情况下,这种方法没有问题,但也有一些情况下,系统中的部分程序要求Linux内核版本号高于一个指定版本。此时需要自行斟酌是否升级,升级到何版本。本文后面会讨论这一问题。

Debian大版本号的选择

不同Debian大版本号下,对应的Linux内核版本号也不同。原则上讲,我们使用的内核版本号应该接近Debian官方指定的内核版本号。在Debian软件源中,龙芯3代CPU使用的内核包名为linux-image-loongson-3

Debian版本号 Debian代号 软件源中使用的内核版本号
9 stretch 4.9
10 buster 4.19
11 bullseye 5.10

此外,北京龙芯也有提供一些预编译的Debian格式内核包:https://mirrors.tuna.tsinghua.edu.cn/bjlx/pool/main/l/,我目前使用的是其提供的linux-4.19.0-loongson-3下的包。暂时不清楚北京龙芯提供的内核包相对于Debian提供的包是否有特别的优化,或其他区别。

选用Linux 4.19内核的前提下,Debian 10就成为了适配的最佳选择。

过段时间我会尝试下是否能直接用Debian 11 + Linux 5.10,届时会更新后续。

后续1: 2022年4月11日下午

根据我的简单测试,Debian维护者打包的Linux 5.10内核,虽然可以正常工作,但似乎和我手上这块780E主板有点不相兼容。

具体表现为,开机后风扇非常嘈杂,怀疑是有一部分功能没能成功移交给操作系统。过段时间再试试看吧。

安装流程

准备

备份文件警告!

请务必在执行后续操作前,备份目标计算机上的所有重要文件!本人不会对您任何操作/误操作造成的损失负责!

  1. 一个空白U盘,用于刻录LiveCD镜像
  2. Loongnix LiveCD镜像,我选用的版本为loongnix-20180930.iso(实际上这个版本有些不好用,因为其基于Fedora 21构建,软件包版本非常老,如果有新版本的Loongnix LiveCD在你的电脑上可用,完全可以替换)。
  3. 有效的网络连接(这要求第二步中的镜像可以正常驱动网卡)

同时,下面的操作几乎都是在root权限中完成的。

刻录LiveCD镜像并引导

我想这一步会是大伙比较熟悉的了。

1
dd if=loongnix-20180930.iso of=/dev/sdX bs=8M

of=/dev/sdX部分,请替换成你的U盘实际设备块,如/dev/sdb。不清楚的可以使用fdisk -l查看。

写入完成后,将U盘插到龙芯电脑上,开机并从U盘引导。

安装debootstrap

进入LiveCD环境后,首先配置好网络。接着安装debootstrap。可以使用命令dnf install debootstrap从Fedora源中下载安装。如果源中的工具太老不方便,也可以直接从Debian软件源中下载debootstrap的.deb包,使用tarar将其解压即可使用该程序(在Loongnix/Fedora上也可以!)

挂载目标分区

接下来,随便在根目录下创建一个新路径,例如/deb,用于挂载我们的本地磁盘分区。

接着,将本地磁盘上,已经安装有Loongnix的根目录分区,挂载到挂载点上。但此时先不需要挂载/boot分区。如果真的需要挂载boot,请在删除时选择忽略/boot下的所有文件!

挂载之后,删除该分区下的所有文件

下面的例子,我们假设本地磁盘上,/dev/sda1/boot分区,/dev/sda2/分区,/dev/sda3是swap分区。

1
2
3
mkdir /deb
mount /dev/sda2 /deb
rm -rf /deb/*

执行安装程序

接下来,我们要用debootstrap创建一个Debian根文件系统。

1
2
debootstrap --arch mips64el buster \
/deb http://ftp.cn.debian.org/debian

最后的地址可以替换成你所在位置速度最快的Debian镜像地址。

如果debootstrap提示找不到一个名称中包含buster的配置文件,可能是当前使用的debootstrap工具版本太老(常见于使用Fedora源安装)。一种解决方法是下载新版的debootstrap工具,另一种是直接使用Debian的相对代号,如在本文编写时,Debian 10 Buster是上一个稳定版,则可以使用oldstable替代buster。同理,如果使用旧版的debootstrap安装Debian 11 Bullseye报错,也可以使用stable替代bullseye

坐下来,等一等,喝杯咖啡,根文件系统就创建好了。

基础系统配置

为了让系统能跑起来,单有个根文件系统是完全不够的。

复制内核模块

虽然这么做不知道是否合适,可以考虑试试。

将Loongnix的内核模块,复制到目标Debian系统中。

1
cp -r /lib/modules /deb/lib/

fstab文件

/etc/fstab文件指定了系统启动时挂载文件目录的规则,需要仔细配置。

编写该文件,可以自己亲历亲为,仔细编写即可。但懒人有懒人的方法,不喜欢自己写这种配置文件,怕出错的话,也完全可以用ArchLinux团队提供的genfstab脚本,自动生成配置文件。方法也非常简单,可以去人家Github主页GitHub - archlinux/arch-install-scripts: Useful scripts for installing Arch Linux 直接下载源码包,make一下就好。或者,现在包括Debian在内的发行版仓库也包含了这个脚本的可执行文件,下载解压运行一气呵成。

使用genfstab,需要在LiveCD操作系统中运行,且需要在运行前将/boot分区挂载到Debian系统的/boot上,物归原主。如果有swap分区的话,也需要确认已经启用。

1
mount /dev/sda1 /deb/boot

确认无误后,就可以使用下面的命令生成fstab文件了。

1
genfstab -U /deb > /deb/etc/fstab

-U参数是指定使用UUID作为分区识别的标准。/deb是Debian根文件系统的挂载点,最后的重定向是将输出写入到目标系统的/etc/fstab中。

建议生成后自行检查一下文件是否符合预期。

chroot环境

还需要chroot进入Debian系统,对其进行一些配置。

1
LANG=C.UTF-8 chroot /deb /bin/bash
设置root口令
1
passwd root
安装常用软件包

或许下列软件包会提供一些提示,具体是否需要可以看您的需求。

  • locales: 使用英语以外的语言必须的软件包
  • vim/emacs/nano: 文本编辑器
  • openssh-server: SSH服务器,使用SSH登录系统的必须
  • build-essential: Debian下用于构建软件包的套件,包含了gcc/g++/make等工具
  • network-manager: Network Manager工具,可以自动配置网络

安装这些软件包只要用apt工具即可。如:

1
apt install locales vim build-essential
网络配置

网络配置是一件烦人的事情,人生或许应该用在更有意义的事情上。因此我个人喜欢用Netowork Manager自动接管网络配置。

1
apt install network-manager

还有什么比开机就能看到有线网络已连接,无线网络只需要一行命令就可连接,更令人开心的事情吗?

当然,如果你喜欢其他方法,如直接编辑/etc/network/interfaces,那也可以参考对应的教程。

此外,我们还需要配置hostname,也就是本机的主机名。

1
echo myloong > /etc/hostname

完成

我想上述配置已经可以让Debain系统跑起来了。退出chroot环境,重启电脑,记得拔掉U盘,没有意外的话,就可以进入Debian系统了。

如果电脑引导卡在Loongnix字样的引导动画,不妨尝试按下 Ctrl + Alt + F2F2~F8都可以试试),看能否见到熟悉的登录界面。

更换内核

如果你阅读到这里,看起来你已经进入了Debian系统,那么先恭喜你,你的Debian系统已经可以使用了!

但问题随之而来,如果你使用的Loongnix镜像和我相同,那你一定会发现,Loongnix使用的内核版本较老,可能是3.10附近的版本。而即便使用Fedora 28,其内核版本号也约为4.4~4.9左右的版本,和Debian官方的内核版本号是不匹配的。对于强迫症来说,这样的情况不太爽, 我们得想想办法替换内核!

备份

然而,这样的操作注定是危险的,经常失败的,我想在进行下述操作前,需要先将系统备份一次。毕竟从debootstrap安装系统的流程终究繁琐,值得创建一个小小的备份帮助我们快速恢复。

具体备份的方法就不展开了。数据备份的责任在各位操作者本身!

安装新内核

安装新版本内核的方法有许多,Debian官方软件源中的会是一个选择。不过既然我没用过,那我也不具体展开介绍了。反正安装方法极为简单,apt install linux-image-loongson-3 linux-headers-loongson-3 linux-libc-dev就可以了。

我们接下来介绍怎么安装北京龙芯提供的4.19.0内核包。

下载地址位于https://mirrors.tuna.tsinghua.edu.cn/bjlx/pool/main/l/linux-4.19.0-loongson-3/,需要下载该地址下的三个文件:

可以考虑将三个文件下载到同一个文件夹中。随后进入该文件夹,执行

1
dpkg -i *.deb

即可安装三个软件包。

更新initramfs

首先安装initramfs-tools软件包

1
apt install initramfs-tools

执行下述命令,更新initramfs

1
update-initramfs -k 4.19.0-loongson-3 -u -v

这会在/boot下生成一个initrd.img-4.19.0-loongson-3文件。我们接下来配置GRUB引导项会使用到这一文件。

修改GRUB配置文件

最后一步,修改GRUB配置文件。

失败的GRUB配置生成

这一部分我也不确定最佳做法是什么,因此还请熟悉GRUB的同学批评指正!

众所周知,在x86平台下,每次更新内核后,只需要使用grub-mkconfig命令,即可自动生成正确的GRUB配置文件。

尽管Debian MIPS64EL软件源不提供GRUB2软件包,但提供了grub-common软件包,其包含了grub-mkconfig命令。因此我尝试使用该程序为新内核创建引导菜单。就生成的结果看,其生成确实正常。

但在重启引导时,GRUB提示insmod命令无法找到。

这是很奇怪的事情,因为无论是原Loongnix生成的grub.cfg还是Debian生成的grub.cfg,都使用了insmod命令。

目前我尚未弄清楚造成该问题的原因,正在比较两配置文件的差异,还请大家批评指正。

这里,我们使用的方法是,直接修改原有的/boot/grub.cfg文件,将原先引导的3.x内核文件,改为新安装的4.19内核文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
menuentry 'Loongnix GNU/Linux' --class loongnix --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinu$        set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-ieee1275='ieee1275//disk@0,msdos1' --hint-bios=hd0,msdos1 --hint-efi=hd0,msd$
else
search --no-floppy --fs-uuid --set=root b6a3a91c-82b0-4ac6-ba62-19a9d4cf63c7
fi
- echo 'Loading Linux 3.10.84-20.fc21.loongson.3.mips64el ...'
- linux /vmlinuz-3.10.84-20.fc21.loongson.3.mips64el root=/dev/sda2 ro rhgb quiet loglevel=0 LANG=zh_CN.UTF-8
- initrd /initramfs-3.10.84-20.fc21.loongson.3.mips64el.img
+ echo 'Loading Linux 4.19.0-loongson-3 ...'
+ linux /vmlinuz-4.19.0-loongson-3 root=/dev/sda2 ro rhgb quiet loglevel=0 LANG=en_US.UTF-8
+ initrd /initrd.img-4.19.0-loongson-3
boot
}

编辑后,保存该文件,重启,至少在我的电脑上,这种方法成功替换了系统内核。

目前我还没探索到更优雅地生成GRUB配置文件的方法,如果您有好的想法或见解,欢迎给我发邮件,敬请批评指正。

可能的改进方法

这部分主要是我暂时的改进想法,如果您是参考本文安装Debian系统,或许可以跳过这一段落了。

很明显,两种GRUB配置文件中,有部分insmod命令没有正常执行。

一种解决方法是,每次安装内核,都通过自己手动修改/boot/grub.cfg文件,达到引导新内核的目的,缺点是不优雅,容易出错。

另一种解决方法是,我们都知道,GRUB配置文件的生成是基于/etc/grub.d/下的模板文件的,那么可以考虑将Loongnix系统中的模板文件复制到Debian中,即可生成格式接近的配置文件,或许也可以解决问题。

但目前头疼的问题还有,Debian不提供MIPS64EL架构的GRUB2包,导致必须依赖Loongnix/Fedora安装GRUB主引导记录。我在尝试自行编译GRUB,具体测试情况可能得等下一篇博文更新了。

尾声

目前经过几天的使用, 龙芯3A3000整体还是超过了我的预期的。基本上,3A3000接近于英特尔J1900水准。据说使用LoongArch架构的3A5000性能上了几个台阶,或许今后有机会可以试试看。

我会更期待,我们有更多的实干家出现。