Debian GNU/Hurd

The Hurd is a set of servers running on top of the GNU Mach microkernel. Together they build the base for the GNU operating system.

Currently, Debian is only available for Linux and kFreeBSD, but with Debian GNU/Hurd we have started to offer GNU/Hurd as a development, server and desktop platform, too.

安装Debian GNU/Hurd

可以从 Index of /cdimage/ports/latest/hurd-i386 下载Debian GNU/Hurd 2019 release或更新的快照。
Index of /~sthibault/hurd-i386/installer/cdimage 提供了未经测试的每日快照,不建议使用它安装系统。
安装系统前,请务必阅读 https://cdimage.debian.org/cdimage/ports/stable/hurd-i386/README.txthttps://www.debian.org/ports/hurd/hurd-install。
安装程序中的细节:

  • 必须启用交换分区
  • 不要为/usr单独分区
  • Debain GNU/Hurd 2019 release NETINST ISO只能用来安装基本系统。最好使用DVD进行安装。
  • 安装Gnome,KDE,LXQt桌面环境时会失败,推荐使用LXDE桌面环境。

配置Debian GNU/Hurd

配置网络

安装完成后网络应该正常工作,可以通过inetutils-ping软件包提供的ping命令测试网络。如果网络不能正常工作,参见 Debian – Debian GNU/Hurd — Configuration进行手动配置。

用户权限

与Debian GNU/Linux中一样,您需要将用户加入sudo组中以允许他们使用sudo提权,操作方法是类似的。文章以下的部分将默认您为您的用户启用了sudo

配置Apt

您将需要调整/etc/apt/source.list以获得更新。如果您安装的是Debain GNU/Hurd 2019 release,建立文件/etc/apt/apt.conf.d/99ignore-valid-until,内容包括

Acquire::Check-Valid-Until "false";

然后编辑/etc/apt/source.list,使用snapshot.debian.org

deb http://snapshot.debian.org/archive/debian-ports/20190626T235959Z/ sid main
deb-src http://snapshot.debian.org/archive/debian/20190626T235959Z/ sid main
deb [trusted=yes] https://snapshot.debian.org/archive/debian-ports/20190626T235959Z/ unreleased main

最后运行

sudo apt update
sudo apt install apt-transport-https debian-ports-archive-keyring
sudo apt update

如果您安装的是较新的快照版本,编辑/etc/apt/source.list以使用deb.debian.org/debian-ports:

deb http://deb.debian.org/debian-ports unstable main
deb-src http://deb.debian.org/debian unstable main
deb http://deb.debian.org/debian-ports unreleased main

最后运行

sudo apt update
sudo apt install debian-ports-archive-keyring
sudo apt update

Hurd console

Hurd console提供虚拟终端。您可以通过检查环境变量TERM的值来判断您是否在Hurd console下。如果以伪图形界面安装,它应当自动启动,否则可以以下命令手动启动它:

sudo console -d vga -d pc_mouse --repeat=mouse -d pc_kbd --repeat=kbd -d generic_speaker -c /dev/vcs

如果没有问题,可以编辑文件/etc/default/hurd-console,将

ENABLE="false"

修改为

ENABLE="true"

以在启动时自动启动它。

X和桌面环境

使用X的前提条件是环境变量TERM的值为hurd,及文件/dev/cons/kbd/dev/cons/mouse存在。您还需要运行命令

sudo dpkg-reconfigure x11-common xserver-xorg-legacy

以允许所有用户运行Xorg。
您也需要建立文件/etc/X11/xorg.conf以启用 control-alt-backspace 快捷键:

Section "InputDevice"
   Identifier "Generic Keyboard"
   Driver "kbd"
   Option "XkbOptions" "terminate:ctrl_alt_bksp"
EndSection

最后,您需要安装相关的软件包。

  • (必须)安装软件包 xorg , rxvt
  • (必须)安装窗口管理器:
    • twm , icewm , openbox应该都能工作。
  • (可选)如果您想要让X在启动时自动启动,您还需要安装显示管理器:
    • xdm能够正常工作。
    • lightdm不能工作。
    • lxdm,gdm,sddm尚未移植。
  • (可选)您可以通过安装桌面环境来提供完整的用户界面:
    • KDE,Gnome,LXQt没有完全移植。
    • LXDE,MATE能够正常工作。
    • MATE不能正常工作。

运行命令startx /usr/bin/yourwm以启动X。如果X不能正常启动,检查日志/var/log/Xorg.0.log

关闭系统

要关闭您的系统,只需简单地使用halt,poweroffreboot。如果有时因为某些守护进程没有正确终止而导致系统挂起,你可以使用halt-hurdpoweroff-hurdreboot-hurd。它们实际上并没有关闭守护进程,而是正确地将数据同步到磁盘。

屏幕截图

问题

  • 我没有为http://deb.debian.org/debian-port找到任何镜像,因此apt使用起来非常慢
  • Gnome和KDE的部分软件已经被移植( Debian – Debian GNU/Hurd 报告称大约有3/4的软件包已经被移植),然而并不完全,因此仍然存在一些问题。
  • 是否有LXDE用户知道如何自定义LXDE桌面的壁纸?我在lxappearance程序里没有发现这一选项。
  • 包管理器前端的可用性:
    • muon:无法安装python3-xapian,依赖于python3(< 3.6)
    • apper:尚未移植
    • plasma-discover:无法安装plasma-discover-common(=5.19.5-4),software-properties-kde的依赖问题(推荐systemed :joy:)
    • synaptic:崩溃
      **
      Error:pkexec.c:719:main: assertion failed: 
      (polkit_unix_process_get_start_time) (POLKIT_UNIX_PROCESS 
      (subject)) 
      >0)
      Bail out!Error:pkexec.c:719:main: assertion failed: 
      (polkit_unix_process_get_start_time) (POLKIT_UNIX_PROCESS 
      (subject)) 
      >0)
      Aborted
      
    • gnome-software:尚未移植
  • postgres不可用:
    致命错误:对用户"postrges"的对等认证失败
    日志:对等认证在这个平台上不支持
    
  • kgpg崩溃:使用gdb调试,gdb崩溃
    /build/gdb-MOekYk/gdb-10.1/gdb/inferior.c:293: internal-error: 
    inferior* find_inferior_pid(process_stratum_target*, int): 
    Assertion `pid != 0' failed.
    A problem internal to GDB has been detected, funther debugging may prove unreliable.
    
    然后使用gdb调试gdb,得到的调用堆栈为:
    0x01e6969c in mach_msg_trap () at ./build-tree/hurd-i386-libc/mach/mach_msg_trap.S:2
    2 ./build-tree/hurd-i386-libc/mach/mach_msg_trap.S:没有那个文件或目录
    
  • texmaker无法安装:依赖于libsynctex1latex-beamer,但是这些软件包都已经不再存在。texworkstexstudio均正常工作。

:+1: 妥妥的技术贴,咋发到水贴区了

我起初只是计划写一篇Debian GNU/Hurd的安装说明,我当时不认为文章含有太多技术内容……现在我已经将这篇文章归类为技术讨论,并计划添加更多信息。

1赞

GNU/Hurd 的技术说明

Hurd 和 Mach

Hurd 首先是一个协议的集合,这些协议正式规定了不同组件的互动方式。Hurd 旨在减少参与者的相互信任要求,从而允许一个更可扩展的系统。这些协议包括操作文件和目录和解析路径名称的接口定义。这使得任何进程都可以实现一个文件系统,唯一的要求是它能够访问它的备份存储,并且启动它的主体拥有它所连接的文件系统节点。

Hurd 也是一套实现这些协议的服务器。它们包括文件系统、网络协议和身份认证。这些服务器运行在 Mach 微内核之上,使用 Mach 的 IPC 机制来传输信息。

Mach 是第一代微内核。Mach的基本抽象包括 task 形式的虚拟地址空间、线程形式的执行上下文、IPC、port 形式的 capabilities 和内存对象,这些对象实现了Mach的 external pager 机制。

控制 task、task 的虚拟地址空间、线程和 Mach 中的其他系统对象是通过使用 port 实现的,与其他内核的系统调用接口不同,几乎所有的Mach API都是通过向 port 发送消息实现的。位于内核空间的设备驱动也是由 port 控制的。

Mach 的概念

capability

一个 capability 是一个受保护的引用。作为一个引用,它指定了一个对象,但是它是受保护的,因为它不能被伪造。一个 capability 既指定了它所指向的对象,又带有操纵它的权限。

message

信息是类型化的数据集合,有一个定义的布局,其中包括一个ID。

message 不仅是不透明的数据,它们也可以包含要传递给另一个 task 的 port 权限。port 权限要么被复制,要么被移动。注意,port 接收权必须被移动而不是被复制,因为不可能有一个以上的 task 持有一个 port 的接收权。接收 task 为它收到的 port 权限创建新的本地 port 名称。

port

port 是一种 capability,它们是不可伪造的通信通道,由内核队列实现。

每个 port 都与一个接收权、一个或多个发送权和单次发送权相联系。也就是说,存在一个接收方和一个或多个发送方——一个单向的通信通道。只有拥有相应的 port 权限,才有可能访问一个 port;这一点由 Mach 强制执行。

接收权指定了一个队列,并授权持有人从队列中删除 message ,以及创建发送权和单次发送权。

发送权和单次发送权指定一个队列,并授权持有者排队等候消息(在单次发送权的情况下,是指一条消息)。一条 message 入队等同于调用一个 capability。

当没有与 port 相关联的 message 时,port 会自动销毁。

Mach知道每个 task 拥有的 port 权限。但是,在 task 上下文中运行的线程通过使用本地 port 名称命名的发送和接收权限来引用 port。这些 port 名称是普通的整数,就像 UNIX 的文件描述符一样。只有这些 port 本地名称可以被线程用来调用 port 上的操作,线程不直接处理 port 权限。

为此,每个 task 都有一个与之相关的 port 地址空间,即 port 名称空间。所有的 port 都通过这个表来寻址。因此,每个 task 都有自己的私有命名环境,用于 port 权限。

所以,Mach 中的情况是,在获得一个 port 发送权后,客户端使用一个 port 名称向该 port 发送 message ,如果是单次发送权,则正好是一条 message。这些 message (可能)在内核队列中排队。当服务器 task 试图通过让线程使用其 port 接收权来接收消息时,它就会得到消息。这就是 Mach 中的 IPC 机制。

port 权限本身也可以在 message 中被委托。当接收方将 message 出队时,该权限将被提供给它。

message 的传递是可靠的,而且是严格有序的。当一个线程发送消息1和2时,可以保证接收 task 会以同样的顺序抓住它们。当然,也可能有由其他线程发送的中间消息。

port 是由内核实现的对象,它们是受内核保护的资源:它们是不可伪造的,除非一个task 有相应的 port 权限,否则它不可能对一个 port 做任何事情。

由于这个原因,port 是全局唯一的。这使得它们成为构成全系统对象引用的理想选择。例如,GNU Hurd 所使用的 RPC 系统就是通过调用这种对象引用的方法来工作的。

在一个 port 上调用一个操作并不把当前的执行控制转移给接收者,而是一个异步操作。为此,特别是在 RPC 系统中,发送方可以使用单次发送权包含一个回复端口,并在该端口上进行通讯。

task

task 是资源的集合,包括一个虚拟地址空间和一个 port 名称空间。它们依赖于线程来执行程序代码:一个 task 本身没有办法做到这一点。

Mach task 与 UNIX 进程不同,因为 task 提供的设施较少。在进程中,有信号、进程/组/会话 ID 、文件描述符和许多其他东西。task 用于资源分配和共享;它们是资源容器。

external page

Mach 的 external pager机制用于将管理内存和管理内容分开。Mach 做前者,而用户空间程序做后者。

以下说明了该机制的基本流程:

  1. 客户端向服务器发送一个openRPC。

  2. 服务器创建一个内存对象(即一个 port 接收权),将其添加到它正在监听的 port 集,并向客户端返回一个 capability(一个 port 发送权)。

  3. 客户端试图使用 vm map RPC 将该对象映射到其地址空间。它把对服务器给它的 port 的引用传递给vm 服务器(通常是 Mach)。

  4. 由于Mach以前从未见过这个对象,它在给定的端口上入队一个 memory_object_init 以及一个发送权(内存控制 port ),供管理器用来向内核发送消息,同时也作为未来交互的认证机制:提供 port 是为了管理器能够识别给定的memory_object_* IPC是来自哪个内核。

  5. 服务器对消息进行入队,初始化内部数据结构以管理映射,然后在控制对象上调用 memory_object_ready 方法。

  6. 内核看到管理器已经准备好了,在客户的地址空间中设置了适当的映射,然后回复 vm map RPC 表示成功。

Hurd 的概念

RPC

Hurd RPC 通过 用户级的 task 实现,服务器和客户端通过 port 通讯,而该 task 持有该 port 的权限。Hurd 所有的服务都通过 RPC 实现。这使得理论上 Hurd 具有完全的网络透明性:任何计算机上的任何进程都有可能作为Hurd RPC 调用的服务器和客户端,只要它们具有它们所需要的权限。

translator

translator 是附加到文件系统节点的服务器,它们作为服务器参与 Hurd RPC。当 translator 所附加的文件节点被访问时,translator 不会直接打开一个 port ,它将对传入的请求进行处理,然后打开对应的 port。translator 可以自由地返回任何有意义的东西:一个翻译器可以在其附加的文件系统节点被cdls访问时表现得像一个目录,同时在被cat访问时表现得像一个文件。translator 不需要任何特殊特权来运行,它们仅仅需要备份存储和它们所附加到的文件系统节点。通常,translator 只能由节点所有者附加到节点。在 Unix 上,这是不可能的,因为文件系统和虚拟文件系统在内核中实现,因此具有绝对的特权。但是,由于在 Hurd 中文件系统不需要特权来实现,所以这一点不再是一个问题。

由于 translator 与任何其他用户空间应用程序没有什么不同,它可以用任何编程语言编写。唯一的限制是它必须支持 Hurd RPC。目前,translator 只有 C 语言中的实现。对于 Lisp,Perl,Java 而言,都只存在实验性的和很不完整的实现。

translator 的例子

hello

执行以下命令:

touch hello
cat hello  
settrans hello /hurd/hello  
cat hello  
settrans -g hello  
cat hello 

首先,您创建了一个空文件hello,并使用cat命令检验文件是否为空。然后,您使用命令settrans将 translator hello 附加到文件hello。之后,您再次使用命令cat命令检验文件内容,hello 将会打开一个 port进行通讯,使得文件hello似乎存在内容"Hello World!"。最后,您使用settrans -g从文件中移除 hello,同时移除所有活动的实例,这时文件hello再次不存在任何内容,因为客户端通过未经特殊处理的 port 进行通讯。

ftpfs

执行以下命令:

settrans -c ftp: /hurd/hostmux /hurd/ftpfs /

这将在ftp:设置translator hostmux,并使用/hurd/ftpfs进行辅助。
然后,您可以使用伪路径ftp:访问 ftp 服务器:

ls ftp://ftp.gnu.org/

客户端将通过 translator 间接与 ftp 服务器通讯,但是客户端无需知道这些实现细节,translator 为客户端提供的 port 就像服务器的文件在本地的文件系统中一样。

iso9660fs

可以通过以下命令挂载一个远程 ISO 文件:

settrans -c mnt /hurd/iso9660fs ftp://ftp.gnu.org/old-gnu/gnu-f2/hurd-F2-main.iso
ls mnt/

translator 将处理文件系统的实现细节;客户端只需像本地文件系统的文件一样使用标准的文件系统命令访问它们。挂载不一定需要特殊特权;它只需要一个能够实现文件系统的 translator。

您可以在您有权访问的任何节点上设置 translator ,因此即使您作为非特权用户,也可以安装任何文件系统。查看 translator (gnu.org)Debian – Debian GNU/Hurd — Documentation以了解更多信息。

您需要使用命令settrans来设置 translator ,请考虑运行命令translator --help以获得更多信息。同样,对于您不明白的任何命令,运行command --help应该会有所帮助。

常见问题解答

GNU/Hurd 有多少开发人员?

一半的人在空闲时间开发系统的核心,另外一半的人在帮助Debian GNU/Hurd 和 Arch Hurd打包。另外,还有一半的前开发者仍然可以回答技术问题,但不再参与当前的开发工作。

在过去(也就是很多年前),FSF 确实向一些全职从事 GNU Hurd 工作的开发者支付了报酬。但那只是在有限的时间内,而且很明显,这对于使系统进入生产状态来说实在是太少了。现在,它只是无偿的(除了一些捐赠)和空闲时间的志愿者工作。

与 Linux 内核相比,没有行业集团参与开发。首先,这是一件好事:我们是一个独立项目;不存在利益冲突。另一方面,这也是一件坏事:没有专门的全职工作队伍——而这一点很重要。

这也回答了另外一个问题:“为什么经过这么多年的开发,Hurd 仍然不能……?”

为什么这么少?

我们只能猜测。一个主要的问题可能是,人们普遍认为系统架构的好处是非常抽象的,没有什么实际的好处。我们目前还没有很多工具在真正利用所有的可能性。

另一个原因是,它已经花了太长时间。今天,大多数人相信它将永远不能为生产使用做好准备,因此会认为参与是浪费时间。当然,这后一点是无效的,因为学习永远不可能是浪费时间。对于GNU Hurd所提出的挑战也是如此——我们只能在工作中学习和改进。

出于同样的原因,工业界对 GNU Hurd 也不感兴趣:它的优势太过抽象和不完整,无法引起他们的兴趣。

至于科学领域,GNU Hurd 项目是关于使用微内核而不是对它们进行研究。但是,已经有一些项目和论文完成了,也有一些关于 GNU Hurd 主题的科学论文发表了,一般来说,我们对此类项目非常感兴趣。

Hurd 什么时候能够被发布?

GNU Hurd 0.9 已经于 2016/12/18 与 GNU Mach 1.8 和 GNU MIG 1.8 一同发布。

好的,但是 Hurd 什么时候能够完成呢?

Linux 内核是否已经完成?GNU/Hurd 现在可用(请参阅 GNU/Hurd 分发以获得更多信息),但是当然它可以变得更好,开始贡献和加入我们是你能够帮助我们做到这一点的最好方式。 :grinning:

为什么经过这么多年的开发,Hurd 仍然不能……?

请记住,重要的不只是花费的时间,而是花费的时间x开发人员的数量,在这方面,对 GNU Hurd 的开发投入远远低于 Linux内核 或 BSD。考虑到有多少开发者正在(或已经)为 Hurd 工作,在过去的几十年里,这么少的人取得了这么大的成就,这实际上令人印象深刻。

GNU/Hurd 分发

GNU/Hurd 分发列表

[^1]: 从操作系统参考 (GNU Guix参考手册)

Currently only the Linux-libre kernel is fully supported. Using GNU mach with the GNU Hurd is experimental and only available when building a virtual machine disk image.

GNU/Hurd 兼容层

无需特别针对 Hurd 编写软件。Hurd 提供了一个兼容层,使得编写更高层次的程序本质上是透明的。 通过 glibc,它提供了与其他类似 UNIX 的系统相同的标准接口。

Hurd子系统

子 Hurd 是一个完整的 GNU/Hurd 子系统。

快速开始

你可以下载一个 Debian/Hurd 镜像,并直接启动它。

wget --no-check-certificate https://cdimage.debian.org/cdimage/ports/latest/hurd-i386/debian-hurd.img.gz
gunzip debian-hurd.img.gz
boot --kernel-command-line="fastboot root=pseudo-root" -T typed part:1:file:debian-hurd.img

“fastboot” 对于跳过文件系统检查是必要的,因为该镜像假定根文件系统为/etc/hd0s1,所以检查会失败。一旦启动,你就可以纠正这一点:

settrans -c /dev/pseudo-root /hurd/storeio pseudo-root
echo /dev/pseudo-root / ext2 defaults 0 1 >/etc/fstab
halt

注意:您应该以root 身份执行这些命令!
从现在开始,使用命令boot -T typed part:1:file:debian-hurd.img应该就足够了。

手动创建 Hurd 子系统

要运行一个 Hurd 子系统,你需要一个额外的分区(或一个文件),并安装一个 Hurd 系统。原则上,你也可以在只读模式下使用你的主分区;但这显然会产生严重的限制。通常情况下,你会想要一个完整的独立系统。

下面的说明假定系统被安装在/dev/hd0s1上。你可以用任何分区来代替,或者事实上只是一个简单的文件,例如用 dd 创建。

创建一个文件作为 Hurd 子系统的根文件系统

要创建一个大小为2GB的my.image文件,请执行以下操作

dd if=/dev/zero of=my.image bs=1M count=1 seek=2000

(注意,目前用这种方法创建大于 2GB 的文件是有问题的。)

使用 debootstrap

Hurd 子系统是一个正常的 Hurd 安装,它也可以独立运行。你可以使用任何一种可能的安装方法,如果你已经有了几种安装方法,也可以重新使用现有的安装方法。如果使用 Debian GNU/Hurd,最简单的可能是以root身份使用 debootstrap。

mke2fs /dev/hd0s6
settrans -ca mnt /hurd/ext2fs /dev/hd0s6
debootstrap sid mnt/ http://httpredir.debian.org/debian
settrans -fga mnt

启动

如果你使用的是Hurd的最新版本(>=0.9),那么你可以简单地以非特权用户的身份启动 Hurd 子系统,方法是运行

boot /dev/hd0s6

(用你的分区或 Hurd 子系统的映像文件的名字代替 hd0s6)。
:exclamation:在你从它启动之前,该分区必须被取消挂载(或以只读方式挂载)!

网络

你可以在启动时通过-f选项为 Hurd 子系统提供一个网卡。例如,如果你在主机上有第二个网卡/dev/eth1,通过-f eth0=/dev/eth1来使它在 Hurd 子系统中作为设备eth0出现。

如果你没有第二个网卡,你可以设置eth-multiplexer来共享一个网卡。要做到这一点,请安装多路复用器

settrans -c /dev/eth0m /hurd/eth-multiplexer --interface=/dev/eth0

然后将你的 Hurd 主系统配置为使用一个虚拟网络接口(例如/dev/eth0m/0)来代替。在Debian/Hurd上,这可以通过以下方式完成

ifdown /dev/eth0
sed -i -e s#/dev/eth0#/dev/eth0m/0# /etc/network/interfaces
ifup /dev/eth0m/0

现在你可以通过-f eth0=/dev/eth0m/1来启动。

启动和关机

现在 Hurd 子系统应该像普通的 Hurd 一样直接从 GRUB 启动,最后出现一个登录提示。启动程序作为 Hurd 子系统的代理,所以你可以从你发出启动命令的终端控制它。

要退出 Hurd 子系统,请运行 halt 或 reboot 。这应该能干净地退出,但由于某些原因,它并不总是有效;有时它会输出各种错误,然后挂起。如果发生这种情况,你需要从另一个终端手动杀死启动进程。如果启动进程死亡,proc 服务器将杀死所有属于 Hurd 子系统的任务。

使用 Hurd 子系统

在Hurd 子系统,你可以做的事情基本上都和主 Hurd 系统一样。

你甚至可以设置网络。只要在Hurd 子系统像往常一样在 /servers/socket/2 上调用 settrans ,使用 /dev/eth0 ,只是使用一个与主 Hurd 系统不同的本地IP。这样,Hurd 子系统将能够用它自己的IP与外部世界进行通信——例如,允许在Hurd 子系统内进行 apt-get,或直接进入Hurd 子系统的 SSH。

如果你想从外部访问Hurd 子系统进程,例如为了调试目的(或摆脱一个没有干净退出的Hurd 子系统…),你需要找出主 Hurd 系统的 PID 与Hurd 子系统进程的对应关系:Hurd 子系统进程在主 Hurd 系统中出现(例如,使用ps -e)为未知进程,但 PID 是不同的。要知道哪个进程属于哪个系统,你可以简单地比较一下顺序——虽然数字不同,但顺序通常应该是一致的。通常,查看线程数也有帮助(例如,使用ps -l),因为许多服务器的线程数非常有特点。

Guix 也在开发 Hurd 内核的系统 下载最新版 — GNU Guix

1赞

我已经更新了有关信息,目前看来还是实验性的。

1赞

Lisp 家族实现的 GNU/Hurd 可用性

Clojure

clojure

:negative_squared_cross_mark: 依赖问题(clojure依赖于default-jre-headless,而default-jre-headless依赖于openjdk-5-jre-headless

Common Lisp

clisp

:white_check_mark: 版本2.49
:negative_squared_cross_mark: Build log for clisp (1:2.49.20180218+really2.49.92-3+b1) on hurd-i386 (debian.org)

cmucl

:negative_squared_cross_mark: 尚未移植

ecl

:white_check_mark: 版本16.1.2
:negative_squared_cross_mark: Build log for ecl (20.4.24+ds-2) on hurd-i386 (debian.org)

gcl

:white_check_mark: 版本2.6.12
:negative_squared_cross_mark: Build log for gcl (2.6.12-102) on hurd-i386 (debian.org)

sbcl

:negative_squared_cross_mark: 尚未移植

BD-Uninstallable(Package should be built,but its build dependencies cannot be fulfilled:Dependency installability problem for sbcl on hurd-i386:

Emacs Lisp

emacs

:white_check_mark: 版本27.1
:negative_squared_cross_mark: Build log for emacs (1:27.1+1-3.1+b1) on hurd-i386 (debian.org)

Scheme

chezscheme

:negative_squared_cross_mark: 尚未移植

chibi-scheme

:negative_squared_cross_mark: 尚未移植
:negative_squared_cross_mark: Build log for chibi-scheme (0.9.1-3) on hurd-i386 (debian.org)

chicken

:white_check_mark: 版本5.2.0
:white_check_mark: Build log for chicken (5.2.0-2) on hurd-i386 (debian.org)

elk

:white_check_mark: 版本3.99.8
:white_check_mark: Build log for elk (3.99.8-4.2+b1) on hurd-i386 (debian.org)

gambc

:white_check_mark: 版本4.8.8
:negative_squared_cross_mark: Build log for gambc (4.9.3-1.1) on hurd-i386 (debian.org)

gauche

:white_check_mark: 版本0.9.4
:negative_squared_cross_mark: Build log for gauche (0.9.10-3) on hurd-i386 (debian.org)

guile

:white_check_mark: 版本2.2.7
:white_check_mark: 版本3.0.5
:white_check_mark: Build log for guile-2.2 (2.2.7+1-5.4) on hurd-i386 (debian.org)
:negative_squared_cross_mark: Build log for guile-3.0 (3.0.5-4+b1) on hurd-i386 (debian.org)

mit-scheme

:negative_squared_cross_mark: 尚未移植

oaklisp

:white_check_mark: 版本1.3.7
:white_check_mark: Build log for oaklisp (1.3.7-2.1) on hurd-i386 (debian.org)

scheme2c

:negative_squared_cross_mark: 尚未移植

scheme9

:white_check_mark: 版本2018.12.05
:white_check_mark: Build log for scheme9 (2018.12.05-2) on hurd-i386 (debian.org)

scheme48

:white_check_mark: 版本1.9.2
:white_check_mark: Build log for scheme48 (1.9.2-2) on hurd-i386 (debian.org)

scm

:white_check_mark: 版本5f2
:white_check_mark: Build log for scm (5f2-2+b3) on hurd-i386 (debian.org)

sisc

:negative_squared_cross_mark: 依赖问题(sisc依赖于default-jre-headless,而default-jre-headless依赖于openjdk-5-jre-headless

stalin

:negative_squared_cross_mark: 尚未移植

tinyscheme

:white_check_mark: 版本1.42
:white_check_mark: Build log for tinyscheme (1.42.svn.2020.06.04-2) on hurd-i386 (debian.org)