了解和认识 Gentoo Linux 和 LoongArch

认识 Gentoo Linux

Gentoo Linux 是一个 Linux 发行版,是目前少有的、几乎所有软件都从源码构建的 Linux 发行版(当然,大家应该注意的是,目前 Gentoo 已经提供了二进制安装方式),借助于 Gentoo 设计的 portage 包管理以及 USE 策略,Gentoo 成为一个非常优秀的可定制、易维护的 Linux 发行版。

认识 LoongArch

龙芯自从 3A5000 开始,从原先的 MIPS 架构转向了 LoongArch 架构,LoongArch 作为后浪,继承了很多 x86,ARM,MIPS,RISCV 的优势。精简指令集,支持 64 和 32 位,小端序,支持虚拟化。

结合曾经写过的 3A5000 和 3A6000 的微架构对比和认识一文,我们大致重申一些比较重要的问题:

  • 精简指令集;
  • 龙芯 3A5000 微架构名称叫做 LA464;龙芯 3A6000 微架构叫做 LA664。LA 的意思是 LoongArch 的所写,464 的意思是4发射,64位;664 的意思是 6发射64位。
  • 指令集包括且未来不限于(目前开源并且文档中能够找到的):cpucfg lam ual fpu lsx lasx crc32 complex crypto lvz lbt_x86 lbt_arm lbt_mips;
  • 猜测:3A5000 和 3A6000 的指令集都一样,有可能管线方面后者增加了,另外是超线程技术;
  • 3A6000 是6发射,3A5000 是4发射;
  • lsx lasx lvz lbt 都是扩展指令集。lsx 和 lasx 是向量扩展指令集,前者是 128 位,后者是 256 位;lvz 是虚拟化相关指令集;lbt 是转译指令集,目前从 3A5000 来看,支持,x86 ,arm,mips 转译

更多内容大家可以参考白老师曾写过的非官方 LoongArch 但很全面的分析

LoongArch 商业发行版中有一个叫做 LATX 的转译层,目前借助转译层,能够在 LBT 指令集加成下,“高效”转译 x86 上的程序,并在 LoongArch 上运行。

我们必须了解一个问题,LATX 这个东西只存在于 LoongArch 的商业发行版中,没有提供明确的授权声明,存在于经常提到的旧世界操作系统,包括了 Loongnix ,统信的 UOS,麒麟,它们基于旧世界的系统构建了 LATX,配合转译指令集运行 x86 的程序。那么旧世界的东西和新世界是完全不兼容的,虽然都叫做 LoongArch ,但是本质完全不同,所以如果玩家期待能够在新世界上使用 LATX,需要新世界完全构建完成后,相关环境满足后,才能够在商业发行版中白嫖到,或许有机会能够在开源社区通过二进制分发获得使用的支持。 也可以通过将旧世界的 rootfs 打包并利用相应环境在容器下运行 LATX。

那么截至当前,能够使用到 latx 二进制分发的发行版有:

  • AOSC
  • Archlinux 通过 LAUR

所以在近两年内,如果需要在社区新世界发行版中使用到 LATX,并且想借助二进制转译功能使用 x86 软件的玩家或者开发者,个人认为除了期待社区,还需要看龙芯官方的态度。

如果谈到 Gentoo ,我和白老师的态度应该不会对 LATX 进行整活的,首先没有确切的授权方式;其次官方不提供新世界的二进制版本,或者不开源,我们也不打算去折腾,毕竟目前 LoongArch 的新世界生态,已经满足我们日常使用,另外我们也有本职工作,现实世界的生活更加重要。

安装 Gentoo Linux

支持的硬件:

3A5000 系列,包括台式机、服务器,部分笔记本。笔记本要特殊一些,毕竟这些笔记本需要刷新世界的 BIOS,否则只能还是使用商业发行版的操作系统;

3A6000 系列,目前还没有服务器和笔记本。只有台式机的主板。

下载镜像:

下载一个方便构建 Gentoo 系统的 LoongArch 新世界镜像;目前可以使用发行版有很多,这里推荐使用 Archlinux 和 AOSC 的镜像,主要原因是方便和简单,并且还有图形化界面。

下载地址分别是:

安装(以 Archlinux 为例):

将 Archlinux 的 ISO 用 dd 命令写入到一个空的 USB 中:

sudo dd if=xxx.iso of=/dev/xxx status=progress bs=1M; sudo sync ,命令中特别要注意的是 /dev/xxx 是你的 U 盘,后面不要带数字。将 USB 插入已经刷好新世界固件的龙芯计算机中,开机后选择 F12 使用 USB 引导启动

选择第一个启动项

如上图所示,启动龙芯,随后会看到 LiveCD 的启动画面:


随后就可以开始安装 Gentoo 系统了。整个过程其实完全可以参考之前写过的一篇博文——Gentoo 安装,这里就简要叙述,并将特别要强调的部分写一下,以下内容均在 root 权限下执行,并且全程联网。

1、准备磁盘

(1)假设有一块磁盘,通过 lsblk 或者 df -h 可以查看到,它的名字叫做 /dev/sda ,这里以这个硬盘为例作为安装盘

(2)将 /dev/sda 分区,使用 cfdisk 这个命令,不过在使用之前,请确定这块硬盘曾经没有使用过 lvm 做过逻辑磁盘,否则需要按照 lvm 先从逻辑组中删除才能真正开始分区、格式化,否则都会遇到一切问题。

(3)cfdisk -z /dev/sda 使用这个命令开始分区,首先选择 GPT 磁盘分区列表。分区根据需要进行,以下是最简单的方法。

以上只是我在虚拟机中的示例,目的是让大家知道在 LoongArch Gentoo 中只需要这三个分区就是最简化的分区方式了。其中第一个分区适用于内核和启动用的,2G已经足够了;第二分区用来做根目录 / ,第三个分区作为 swap ,个人认为可以分大一些,比如说4G以上都可以。毕竟有些朋友用的是 3A6000 ,最多支持到32G内存,那么多分配一些 swap 在编译的使用也是可以的。后续选择写入,退出即可完成分区。

(4)分区完成就可以开始格式化分区,各位根据自己的习惯格式化,这里我需要强调的是,第一个分区,用 vfat 文件格式,其他的大家随意。我个人喜欢使用 mkfs.vfat 等进行格式化。

(5)格式化完成后,通过如下命令将三个分区挂载好。

mkdir -p /mnt/gentoo
mount /dev/sda2 /mnt/gentoo
mkdir -p /mnt/gentoo/boot
mount /dev/sda1 /mnt/gentoo/boot
mkswap /dev/sda3
swapon /dev/sda3

(6)随后使用 lsblk 查看挂载情况。

(7)到 /mnt/gentoo/ 目录下,开始整活。

cd /mnt/gentoo/
#进入 /mnt/gentoo/ 目录
wget https://mirrors.ustc.edu.cn/gentoo/releases/loong/autobuilds/current-stage3-loong-systemd-mergedusr/stage3-loong-systemd-mergedusr-xxxxxxxx.tar.xz
#下载最新的 stage3 包
tar -xpvf stage3-loong-systemd-mergedusr-xxxxxxxx.tar.xz
#解压 tar.xz 包到当前目录

(8)chroot

cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc /proc /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /tmp /mnt/gentoo/tmp
mount --bind /run /mnt/gentoo/run
chroot /mnt/gentoo /bin/bash
source /etc/profile

2、开始下一步配置

我们需要了解以下必要的知识,这些知识估计是 x86_64 位机型安装 Gentoo 一般不会涉及到的内容。

Gentoo 的两个特性是普通用户需要,也是必须了解的。

  • 操作系统完全从源代码编译
  • USE 功能可以为编译提供定制,使操作系统非常灵活

所以,后面的配置过程是一个非常漫长,也是考验耐心的过程,结合目前 LoongArch 并不是所有软件都兼容,很多软件在安装过程中都会遭遇提示被 mask,这就需要用户大胆打开相关限制,测试是否能够正常编译。

再加上国内网络限制,很多 Gentoo overlay 在 github 上,国内用户很难或者有一定难度同步到这些 overlay ,测试和使用过程就雪上加霜。

下面,如果你准备好和我以前挑战,就来吧~

首先,和我一起认识以下几个目录和文件:

/etc/portage/package.use/
/etc/portage/package.mask/
/etc/portage/make.conf
/etc/portage/package.accept_keywords/
/etc/portage/patches/

第一个目录用于定义 USE ,USE 我们可以理解为一个开关,每一个软件都可以通过打开或者关闭 USE 从而简化、增强亦或是扩展功能,如果定义后续在使用中慢慢朋友们就能体会到;

第二个目录用于定义 MASK ,当一个不需要某个软件或者不需要更新某个特定版本的软件的时候,可以在这里定义;

第三个make.conf 配置文件,这里面已经提供了默认的内容:

# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
COMMON_FLAGS=" -pipe -O2"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

# WARNING: Changing your CHOST is not something that should be done lightly.
# Please consult https://wiki.gentoo.org/wiki/Changing_the_CHOST_variable before changing.
CHOST="loongarch64-unknown-linux-gnu"

# NOTE: This stage was built with the bindist Use flag enabled

# This sets the language of build output to English.
# Please keep this setting intact when reporting bugs.
LC_MESSAGES=C.utf8

以上内容是原版的 make.conf 内容,内容大概大家都能大致明白,我这里强调下 COMMON_FLAGS=" -pipe -O2" 部分,根据前段时间我查阅 gcc 文档针对 LoongArch 的编译选项。

我们可以把 3A5000 原始的 COMMON_FLAGS=" -pipe -O2" 修改为:COMMON_FLAGS="-march=la464 -pipe -O2" 它的意义在于,可以获得 3A5000 处理器的另外4个扩展指令集的加成(不过编译时间需要增加,这个后面再聊)。

在配置文件末位添加如下内容:

MAKEOPTS="-j4" #根据你实际的显成熟修改,如果内存足够大,可以全部写上去
GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/" #这里也同样定义了镜像源地址
EMERGE_DEFAULT_OPTS="--keep-going --with-bdeps=y --autounmask-write=y --quiet-build=y --jobs=x -l" #这里定义默认 emerge 的选项,--keep-going 在编译中出错,仍然继续编译其它不依赖于此包的软件;--quiet-build 是编译时是否滚屏输出,个人偏好不要滚屏输出,看着酷,其实需要消耗处理器资源,毫无意义;--jobs=x 定义 emerge 并行数,个人认为如果内存不够大就尽量定义成“1”,如果内存足够大,假如说32G的内存,个人建议定义成“2”就好,别心急吃不了热豆腐。
ACCEPT_KEYWORDS="~loong" #打开测试和稳定分支的 LoongArch 架构支持
ACCEPT_LICENSE="*"
L10N="en-US zh-CN en zh"
LINGUAS="en_US zh_CN en zh"
GRUB_PLATFORMS="efi-64"
INPUT_DEVICES="libinput evdev joystick"
VIDEO_CARDS="amdgpu radeonsi"
LLVM_TARGETS="LoongArch AMDGPU"

所以普通用户或者测试编译、软件运行的朋友就不用太修改其他配置了。当然,这里有朋友会问,3A6000 这里是不是应该修改成 la664,这里至少目前是不需要的,首先目前我们从公开文档或者公开信息中并没有了解到 3A6000 是否增加了扩展指令集,在默认(我们认为的)没有添加的情况下,其实仅仅是4发射到6发射和超线程的功能增强,而没有指令集增加的情况下,我们仍然可以将这个微架构填写到 3A6000 中。所以,我个人认为在 3A5000 和 3A6000 中,这里是通用的。

第四个目录,这个目录至关重要,也是我们在安装 Gentoo 系统到 x86 上几乎用不到的功能,就是允许某些我们认为可能不兼容 LoongArch 程序在 LoongArch 上进行编译测试。

这里举个例子,假设 xxx-xxx/xxx 这个软件在你安装过程中提示被 mask 了(即我们普遍认为的不兼容 LoongArch ),那么在这个 /etc/portage/package.accept_keywords/ 目录下新建一个文件 xxx ,将刚才那个“不兼容”的软件名写入,格式可以写成:

xxx-xxx/xxx ~*
<xxx-xxx/xxx-9999 **

以上两种格式都是可以,不过 Gentoo Dev 们更推荐第一种。就可以正常安装了,当然还有些功能还是不能打开,比方说 KDE 中的 qtwebengine 目前是无法编译通过的,会从更底层配置文件 mask 掉,这个需要后续用户根据自己的测试需求再进一步解锁。于是,经验告诉我们不仅仅是一两个软件会出现被 mask 的情况,而是很多软件都会遇到类似问题,我们需要一个、一个写进去配置文件,最后再测试软件是否能够在 LoongArch 下正常编译和使用。

第五个目录,是用来放用户补丁的,是用户和测试人员放置补丁,测试软件是否能够在 LoongArch 上运行。目录结构按照 Gentoo 官方 Wiki 中的规则建立,只需要将补丁放置好就可以了。

那么有了这些心理预期,放弃还来得及,如果你确定要接受挑战,就继续往下。

我个人是将下载源代码和同步 ebuild 的源定义在 USTC 中国科技大学镜像源,需要通过以下命令实现:

mkdir -p /etc/portage/repos.conf
#创建 /etc/portage/repos.conf 目录
nano /etc/portage/repos.conf/gentoo.conf
#编辑源配置文件

#将以下内容复制粘贴进去
[gentoo]
location = /var/db/repos/gentoo
sync-type = rsync
sync-uri = rsync://rsync.mirrors.ustc.edu.cn/gentoo-portage/
auto-sync = yes

完成以上这些过程,我们就可以开始同步源和编译了。

emerge-webrsync #同步镜像源快照及签名信息
emerge --sync #同步镜像源 ebuild
eselect profile list #列出支持的构建目标系统
eselect profile set X #选择自己想要构建的目标系统的编号
emerge --avulDN @world #开始在 chroot 环境下开始第一次系统更新,这里会根据你的自定义、硬件情况、网络情况花费不少时间。假设在更新中出现问题,最好的方法是将这些错误代码上报给 Gentoo Bugzilla,或者你有 Telegram ,可以加入 Gentoo-zh 社区,上传日志并汇报以便我们协助和分析。

第一次更新会非常漫长。如果一切顺利通过了第一次更新,我们就开始下一步——继续完善系统构建

emerge -avl sys-fs/btrfs-progs networkmanager app-admin/sysklogd sys-process/cronie sudo grub dev-vcs/git dracut gentoo-sources
#安装系统必须的一个软件

passwd
#修改 root 密码

ln -sf /proc/self/mounts /etc/mtab
systemd-machine-id-setup
systemctl enable NetworkManager sshd
ln -sf ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
eselect locale list
eselect locale set X
#一些小修改和tips,方便我的个人需求

3、编译内核

eselect kernel list
# 列出已有的内核源码

eselect kernel set x
# 选择要编译的内核

cd /usr/src/linux
# 进入内核源码目录

cp arch/loongarch/config/loongson3_defconfig .config
# 复制默认 LoongArch 内核配置文件到内核源码根目录下

make menuconfig
# 配置内核

make -jX
make install
make modules_install
dracut '' <内核名称,会在安装完 modules_install 最后出现>
# 编译内核完成后,安装内核和模块,最后用 dracut 生成内核启动镜像。需要注意的是配置内核的时候,建议在处理器特性中,将扩展指令集打开。

grub-install --efi-directory=/boot --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg
# 安装 Grub 引导程序,并配置启动内核镜像。

4、完成安装

  • 完善 /etc/fstab ,在非 chroot 环境中输入如下命令,利用 Archlinux 提供给我们优秀工具实现一键生成,genfstab -U /mnt/gentoo>/mnt/gentoo/etc/fstab
  • 完善 root 密码,记住在 chroot 环境中设置好 root 密码
  • 查看 /boot 目录下是否有内核镜像等文件

结语

  • 更新日期 2024年2月24日
  • 完成安装后,根据你个人用户习惯开始安装桌面环境和各种工具
  • 做一个全新的架构,LoongArch 还有很多路要走,还有很多补丁要打才能更好的运行新世纪的软件。
  • 如有任何问题,请留言。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注