周四下午四点多,群里有个人问 linux 服务器是用什么语言写的。手边正好有一台 Rocky Linux 9.4 的测试机,顺手翻了一遍。

先看内核本体。

$ uname -r
5.14.0-427.13.1.el9_4.x86_64
$ file /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
/boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64: Linux kernel x86 boot executable bzImage, version 5.14.0-427.13.1.el9_4.x86_64 (mockbuild@x64-builder01.build.rhel9.osbuild.org) #1 SMP PREEMPT_DYNAMIC Fri Apr 19 06:16:48 EDT 2024, RO-rootFS, swap_dev 0X8, Normal VGA

file 只认得出 bzImage,认不出语言。内核主体是 C,汇编只在内核入口和少量架构相关代码里。

用户态的基础库更值得看。

$ rpm -qi glibc | head -4
Name        : glibc
Version     : 2.34
Release     : 100.el9_4.3
Size        : 6.6 M

glibc 是 C。字符串里能翻到证据:

$ strings -a /lib64/libc.so.6 | grep -c 'GCC:'
47

47 条 GCC 的版本注释。clang 编出来的库这里翻不到。

老机器上 systemd 带过一堆 Python 辅助脚本,先查了 systemd 本体。

$ file /usr/lib/systemd/systemd
/usr/lib/systemd/systemd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e2a1c7b6f3d04e9a5c8b2017d6f4a3e9c1b8d5a7, for GNU/Linux 3.2.0, stripped

ELF,systemd 主体是 C。

服务层就杂了。sshd 是 C,dnf 是 Python,cloud-init 是 Python,node_exporter 是 Go 编出来的静态二进制。

$ head -1 /usr/bin/dnf
#!/usr/bin/python3
$ file /usr/bin/node_exporter
/usr/bin/node_exporter: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=sV3k9..., stripped

静态链接加 Go BuildID,Go 的产物。

$ file /usr/sbin/sshd
/usr/sbin/sshd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4c9f2a1e8d7b6c5a3f0e9d8c7b6a5f4e3d2c1b0a, for GNU/Linux 3.2.0, stripped

想找有没有 Rust 写的,把这个发行版自带的集合翻了一遍,没翻到。Coreutils 那一层还是 C。

回群里答了一句:内核和 coreutils 这一层是 C,往上是哪门语言写的都有,取决于装了哪些包。

那台测试机后来没删,留着当参照。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。