[Feelings & Sharing] 【小知识】你的系统中有多少GNU
Tofloor
poster avatar
enforcee
deepin
2023-04-21 02:02
Author

RMS教主总是教导大家:你们用的操作系统不能叫Linux操作系统,一定要叫GNU/Linux操作系统。因为Linux只是系统的内核,而系统的名字应该是GNU。他说的话倒是有一定道理,因为当初GNU项目的目标就是要创建一个完整的操作系统,但是GNU自己的内核Hurd却迟迟不能投入实用。因此大家把发展得更好的Linux内核和其他GNU组件拼装到一起,才创造了GNU/Linux。然而多年过去了,现在大家使用的操作系统已经和以前大不相同,许多日常必用的软件工具既不是源自GNU也不是源自Linux。因此可能大家就会觉得叫他GNU/Linux有点名不副实,比起看得见摸得着的Linux内核,GNU的部分却是虚无缥缈,似乎已经是忒修斯之船,名存实亡了。这次就来给大家扒一扒,看看GNU/Linux里面还剩多少GNU的痕迹。

blush

一、 glibc(GNU C Library)

顾名思义,glibc是一个「C标准库」,提供C语言编写的程序的基础功能。大家刚开始学习C语言用的stdio.h等头文件和printf等函数均是在C标准库中实现的。glibc是内核与应用程序的中间层。由于系统中几乎所有程序都需要依靠glibc运行,因此glibc的重要不言而喻。经常有坛友升级glibc的方法不正确结果弄坏系统。

那么glibc是唯一一个能用的C标准库吗?其实不是,开源的C标准库有很多,比如也比较常见的musl等。但是我们用的发行版大多仍然选择glibc,因为如果换成另一个ABI不兼容的库,所有程序就都要重新编译,这样想分发应用就需要同时适配两种C标准库,尤其是对于一些本身就不开源的应用来说就更加艰难。简言之,glibc的「生态更好」。

glibc还包含动态库链接器ld.so。

二、GCC(GNU Compliers Collection)

教主亲手打造的传世名器。是GNU项目得到发展的关键因素之一。支持以C、C++为主的大量编程语言。当年由于各家编译器价格高昂,gcc由于自由免费的特性大杀四方,几乎一统天下。gcc虽然是GNU项目的一部分,但也支持其他操作系统,使用场景很广泛。现在虽然也有一个很强的竞品:clang + LLVM,但是仍然是由于生态的原因,多数项目还是要用gcc,对gcc编写的代码可能在clang上面不能通过编译。

GCC另外还附带实现了各种编程语言的标准库,比如系统中的C++标准库也是来自GCC项目。

另外还有gdb(GNU debugger),GNU的调试工具。

三、binutils(GNU binary utilities)

用于创建和读取二进制程序的一系列工具,包括汇编器as、链接器ld、和一系列读取信息的比如readelf等。

此外同属于GNU工具链还有bison、m4、make和一些自动构建工具等。不过make新的项目很少用了,有各种新兴的构建器比如cmake、meson + ninja等。

四、Bash

GNU系统的默认shell,命令和脚本解释器。几乎是所有发行版的默认命令行解释器。由于使用广泛,所以通常的shell脚本默认就是用bash运行。尽管现在有更多更漂亮的shell可选,比如fish、zsh,但是这些shell或多或少都与bash不兼容。为了保持脚本执行的效果,就算是使用其他shell的用户也要保留一个bash用来执行脚本。

(这里再提醒下下,debian系列的登录shell虽然默认是bash,但是他的sh命令连接的是dash,因此为bash写的脚本不能用sh做解释器。多少新手被这个设计迷惑了。)

五、coreutils(GNU core utilities)

各种命令小工具,比如说cat、ls、rm等。大家说的「学linux命令」基本上就是学这些工具和shell的用法。虽然这些程序都不大,但是对系统的意义也是很重要的,很多脚本和应用都在调用这些程序来方便地实现各种功能。

还有一些工具比如tar、wget、parted也属于GNU项目,但是由于比较零碎因此不再赘述。

六、GRUB(GNU GRand Unified Bootloader)

引导启动程序。大家已经非常熟悉了,还没进入系统的时候就能见到的操作系统选择菜单。虽然现在也有更漂亮的引导程序比如rEFInd,但是GRUB还是功能最多兼容最好的一个。

七、其他

再之外就是一些独立的程序,比如Lilypond、Octive、GIMP、emacs等,和一些隶属于GNOME的组件(除了GTK之外是否安装比较随意)

从上所述可以发现,虽然系统中的GNU组件数量不少,但是基本上都集中在比较底层的开发工具上,而桌面用户很少涉及。我们接触较多的重要架构Systemd、pulseaudio、Mesa、D-Bus、PolicyKit也都不是从GNU项目中来,而是freedesktop.org的杰作(这个组织就是各种桌面和发行版的开发者组成的,主要就是GNOME和KDE两家)。如果按照这个道理,是不是也应该说我们用的系统不应该叫GNU/Linux,应该叫freedesktop.org/GNU/Linux(当然这个名字还可以再随意增长)?楼主自己的观点是,操作系统的统称是为了方便分类,因此一个系统在不同层面上会有不同层次的名称。比如说采用dpkg包管理的系统想与rpm包管理的区分,可以采用debian系、redhat系等的称呼;又或者想包括所有Mac、BSD、GNU等类似结构的系统,可以使用类Unix的称呼。为了区分同样采用Linux内核的Android等,和使用GNU但是用Hurd内核或Linux-libre内核的系统,毕竟由于freedesktop的规范没有替代品,用GNU/Linux的称呼也是比较合适的。

另一个问题是,既然这么多GNU组件都有替代品,那能不能做一个完全没有GNU(或者不使用所有传统的GNU),只包含Linux内核的发行版呢?这也自然是已经有人去做了,比如Serpent OS、Alpine Linux和Void Linux,不过由于大家还是更习惯传统的GNU/Linux,用这些发行版的人还是不多。不过能各种折腾魔改也是自由软件的优点吧。

Reply Favorite View the author
All Replies
caoyuUU
deepin
2023-04-21 02:13
#1

涨姿势了

Reply View the author
青稚
deepin
2023-04-21 03:14
#2

必须支持啊。

Reply View the author
把爱留给小青稚
deepin
2023-04-21 03:48
#3

涨知识了。

Reply View the author
hanzn-zzx
deepin
2023-04-21 03:49
#4

like涨知识了

Reply View the author
神末shenmo
deepin
Spark-App
2023-04-21 04:52
#5

gcc似乎逐渐被淘汰了,就像apache httpd正在被nginx淘汰一样,技术换代了

Linus其实比较讨厌RMS那些人的做派,这也是为什么Linux内核仍然还在用GPL2

除此之外,还有些有趣的发行版,做到了GNU free Linux,把Gnu Coreutils换成了BSF Coreutils,使用musl libc

Reply View the author
ljq790615
deepin
2023-04-21 05:17
#6

除非程序员都不用依赖GNU的开源项目了,那就差不多了。

Reply View the author
donaldsebleung
deepin
2023-04-21 05:20
#7

感谢分享kissing_heart

怎么说呢,GNU/Linux 的崛起离不开 GNU,也离不开 Linux,但自由软件基金会有时候把自己想得太大了

Reply View the author
Amber
deepin
2023-04-21 05:44
#8

感谢分享哟like

Reply View the author
阿尼樱奈奈
Moderator
2023-04-21 08:03
#9

知道了。

Reply View the author
enforcee
deepin
2023-07-15 07:04
#10

更新一点资料:

现在来看,一些曾经标榜不用GNU的发行版也逐渐回归,我之前提到的Serpent OS之前就改回glibc了,Void Linux是可以在glibc和musl之间选择,Alpine Linux则是由于极简的特性坚持了musl和busybox的路线。他们在替换GNU时遇到了什么问题暂时还难以知晓,而GNU还会持续存在于我们的视野之中。

Reply View the author