标签 内核 下的文章

Docker 桌面管理工具对大公司不再免费

Docker 平台有许多组件,大部分都是开源的,但 Docker 桌面管理工具不是,它用于管理各种 Docker 组件和功能。Docker 公司将限制只让个人或小型企业可以免费使用其 Docker 桌面管理工具。现在要求拥有 250 名或以上员工,或年收入超过 1000 万美元的企业,必须付费使用它:分别是 5 美元/月的专业版和 7 美元/月的团队版订阅,以及新的 21 美元/月的商业版订阅。

这是 Docker 公司也在寻求可持续发展的道路。

因错误包含一些非自由的代码,GNU Linux-libre 重新发布

基于最近发布的 Linux 5.14 上游内核,今天 GNU Linux-libre 5.14-gnu 内核发布了。GNU Linux-libre 内核剥离了非自由的二进制固件、微代码二进制大对象和其他非自由软件组件。但是事实证明这个“100% 自由软件”的内核中错误地留下了一些非自由的内核代码,所以之前的 GNU Linux-libre 版本也不得不重新发布。

虽然剥离一些非自由组件会损失一些支持,但是总该有一个这样偏执于自由的内核。

网络攻击者现在正悄悄地卖掉受害者的网络带宽

周二思科的研究人员说,“代理软件”正被网络犯罪分子用于非法目的,成为犯罪分子从受害者身上获取收入的又一途径。这种所谓的“代理软件”,也被称为互联网共享应用程序,允许用户为其他设备分享部分互联网连接带宽。这是一种合法服务,可以在每次有别的用户连接到它时就可以为他们提供收入。攻击者在受害者的电脑上安装这种软件,并在攻击者的账户下注册该软件,因此任何收入都会被发送到攻击者手中。

真是无孔不入啊。

Linux 内核今年 30 岁了。

 title=

Linux 内核今年 30 岁了。这开创性的开源软件的三个十年,让用户能够运行自由软件,让他们能从运行的应用程序中学习,让他们能与朋友分享他们所学到的知识。有人认为,如果没有 Linux 内核,我们如今所享受的 开源文化 和自由软件的累累硕果,可能就不会应时而出现。如果没有 Linux 作为催化剂,苹果、微软和谷歌所开源的那些就不可能开源。Linux 作为一种现象,对开源文化、软件开发和用户体验的影响,是怎么强调都不为过的,但所有这一切,都滥觞于一个 Linux 内核。

Linux 内核是启动计算机、并识别和确保计算机内外所连接的所有组件之间通信的软件。这些对于大多数用户从未想过,更不用说能理解的代码,Linux 内核有很多令人惊讶的地方。以下是 Linux 内核在其三十年生命中每一年的一件事。顺序无关。

  1. Linux 是第一个具有 USB 3.0 驱动的操作系统。Sarah Sharp 在 2009 年 6 月 7 日宣布她的 USB 3.0 设备的驱动程序可以使用了,她的代码被包含在内核 2.6.31 版本中。
  2. 当某些事件发生时,内核会将自己标记为“受污染”,这在以后的故障排除中可能有用。运行一个“被污染”的内核并不是什么问题。但如果出现错误,首先要做的是在一个没有被污染的内核上重现该问题。
  3. 你可以指定一个主机名或域名作为 ip= 内核命令行选项的一部分,Linux 会保留它,而不是用 DHCP 或 BOOTP 提供的主机名或域名来覆盖它。例如,ip=::::myhostname::dhcp 设置主机名 myhostname
  4. 在文本启动过程中,可以选择显示黑白的、16 色的或 224 色的 Tux 徽标之一。
  5. 在娱乐业中,DRM 是一种用来防止访问媒介的技术。然而,在 Linux 内核中,DRM 指的是 直接渲染管理器 Direct Rendering Manager ,它指的是用于与对接显卡的 GPU 的库(libdrm)和驱动程序。
  6. 能够在不重启的情况下给 Linux 内核打补丁。
  7. 如果你自己编译内核,你可以将文本控制台配置为超过 80 列宽。
  8. Linux 内核提供了内置的 FAT、exFAT 和 NTFS(读和写)支持。
  9. Wacom 平板电脑和许多类似设备的驱动程序都内置在内核中。
  10. 大多数内核高手使用 git send-email 来提交补丁。
  11. 内核使用一个叫做 Sphinx 的文档工具链,它是用 Python 编写的。
  12. Hamlib 提供了具有标准化 API 的共享库,可以通过你的 Linux 电脑控制业余无线电设备。
  13. 我们鼓励硬件制造商帮助开发 Linux 内核,以确保兼容性。这样就可以直接处理硬件,而不必从制造商那里下载驱动程序。直接成为内核一部分的驱动程序也会自动从新版本内核的性能和安全改进中受益。
  14. 内核中包含了许多树莓派模块(Pi Hats)的驱动程序。
  15. netcat 乐队发布了一张只能作为 Linux 内核模块 播放的专辑。
  16. 受 netcat 发布专辑的启发,人们又开发了一个 把你的内核变成一个音乐播放器 的模块。
  17. Linux 内核的功能支持许多 CPU 架构:ARM、ARM64、IA-64、 m68k、MIPS、Nios II、PA-RISC、OpenRISC、PowerPC、s390、 Sparc、x86、Xtensa 等等。
  18. 2001 年,Linux 内核成为第一个 以长模式运行的 x86-64 CPU 架构
  19. Linux 3.4 版引入了 x32 ABI,允许开发者编译在 64 位模式下运行的代码,而同时只使用 32 位指针和数据段。
  20. 内核支持许多不同的文件系统,包括 Ext2、Ext3、Ext4、JFS、XFS、GFS2、GCFS2、BtrFS、NILFS2、NFS、Overlay FS、UDF 等等。
  21. 虚拟文件系统 Virtual File System (VFS)是 Linux 内核中的一个软件层,为用户运行的应用程序提供文件系统接口。它也是内核的一个抽象层,以便不同的文件系统实现可以共存。
  22. Linux 内核包括一个实体的盲文输出设备的驱动程序。
  23. 在 2.6.29 版本的内核中,启动时的 Tux 徽标被替换为 “Tuz”,以提高人们对当时影响澳大利亚的 塔斯马尼亚魔鬼 Tasmanian Devil (即袋獾)种群的一种侵袭性癌症的认识。
  24. 控制组 Control Groups (cgroups)是容器(Docker、Podman、Kubernetes 等的基础技术)能够存在的原因。
  25. 曾经花了大量的法律行动来解放 CIFS,以便将其纳入内核中,而今天,CIFS 模块已被内置于内核,以实现对 SMB 的支持。这使得 Linux 可以挂载微软的远程共享和基于云的文件共享。
  26. 对于计算机来说,产生一个真正的随机数是出了名的困难(事实上,到目前为止是不可能的)。hw_random 框架可以利用你的 CPU 或主板上的特殊硬件功能,尽量改进随机数的生成。
  27. 操作系统抖动 是应用程序遇到的干扰,它是由后台进程的调度方式和系统处理异步事件(如中断)的方式的冲突引起的。像这些问题在内核文档中都有详细的讨论,可以帮助面向 Linux 开发的程序员写出更聪明的代码。
  28. make menuconfig 命令可以让你在编译前使用 GUI 来配置内核。Kconfig 语言定义了内核配置选项。
  29. 对于基本的 Linux 服务器,可以实施一个 看门狗 系统来监控服务器的健康状况。在健康检查间隔中,watchdog 守护进程将数据写入一个特殊的 watchdog 内核设备,以防止系统重置。如果看门狗不能成功记录,系统就会被重置。有许多看门狗硬件的实现,它们对远程任务关键型计算机(如发送到火星上的计算机)至关重要。
  30. 在火星上有一个 Linux 内核的副本,虽然它是在地球上开发的。

via: https://opensource.com/article/21/8/linux-kernel

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Google 安全团队称 Linux 内核开发需要改进流程和更多人手

在 Google 安全博客上,安全工程师 Kees Cook 称,修正 bug 的稳定版内核每周包含了近百个修正,这给 Linux 供应商施加了压力,迫使他们“只选择最重要的补丁”。他说 Google 的模糊测试工具目前报告 Linux 内核有 1000 个潜在问题,一年内能修复大约 400 个,但随着新问题的发现问题的数量每年会增加 100 个。

Cook 提出了多个建议,包括放弃基于电邮的工作流,引入更多自动化测试和模糊测试,让开发流程更有效率,需要增加至少 100 名工程师。

作为最大的软件开发项目,Linux 内核的开发在繁荣之下,也存在一些隐忧,这包括先进流程的采纳和吸纳更多的新开发者。

2020 年打印用纸数量减少了 4500 亿张

因为新冠疫情打乱了世界各地的工作模式,2020 年打印用纸数量减少了 4500 亿张。2020 年的打印用纸总数为 2.8 万亿张,比 2019 年下降了 14%。激光打印用纸数量下降了 16%,但喷墨打印用纸增加了 4%,喷墨打印机在疫情之前主要是个人使用。惠普商用打印设备销售收入在 2020 财年下降了 22%,但消费者打印设备销售收入增长了 21%。

这算是疫情带来的不多的正面副作用了。

以太坊重磅伦敦硬分叉升级完成

北京时间 8 月 5 日晚 8 点 33 分,以太坊网络区块高度到达 12965000,迎来以太坊伦敦硬分叉升级。本次升级中,有 5 个社区提案(EIP)被加入到以太坊网络的代码。其中具有里程碑式意义的 EIP-1559 是关于以太坊网络交易定价机制的解决方案,它大幅改变了交易费计算方式,使以太坊区块链上的交易费用更可预测、更加便宜。在升级完成后,半天内已经燃烧销毁了 3200 ETH,将会促进 ETH 的通缩。本次升级是以太坊迭代到以太坊 2.0 之前最关键的一次升级。

这样大的升级,居然没有出现引发出硬分叉,可见社区共识相当一致。

编者按:近些年来 Rust 语言由于其内存安全性和性能等优势得到了很多关注,尤其是 Linux 内核也在准备将其集成到其中,因此,我们特邀阿里云工程师苏子彬为我们介绍一下如何在 Linux 内核中集成 Rust 支持。

2021 年 4 月 14 号,一封主题名为《Rust support》的邮件出现在 LKML 邮件组中。这封邮件主要介绍了向内核引入 Rust 语言支持的一些看法以及所做的工作。邮件的发送者是 Miguel Ojeda,为内核中 Compiler attributes、.clang-format 等多个模块的维护者,也是目前 Rust for Linux 项目的维护者。

Rust for Linux 项目目前得到了 Google 的大力支持Miguel Ojeda 当前的全职工作就是负责 Rust for Linux 项目。

长期以来,内核使用 C 语言和汇编语言作为主要的开发语言,部分辅助语言包括 Python、Perl、shell 被用来进行代码生成、打补丁、检查等工作。2016 年 Linux 25 岁生日时,在对 Linus Torvalds 的一篇 采访中,他就曾表示过:

这根本不是一个新现象。我们有过使用 Modula-2 或 Ada 的系统人员,我不得不说 Rust 看起来比这两个灾难要好得多。

我对 Rust 用于操作系统内核并不信服(虽然系统编程不仅限于内核),但同时,毫无疑问,C 有很多局限性。

在最新的对 Rust support 的 RFC 邮件的回复中,他更是说:

所以我对几个个别补丁做了回应,但总体上我不讨厌它。

没有用他特有的回复方式来反击,应该就是暗自喜欢了吧。

目前 Rust for Linux 依然是一个独立于上游的项目,并且主要工作还集中的驱动接口相关的开发上,并非一个完善的项目。

项目地址: https://github.com/Rust-for-Linux/linux

为什么是 Rust

Miguel Ojeda 的第一个 RFC 邮件中,他已经提到了 “Why Rust”,简单总结下:

  • 安全子集 safe subset 中不存在未定义行为,包括内存安全和数据竞争;
  • 更加严格的类型检测系统能够进一步减少逻辑错误;
  • 明确区分 safeunsafe 代码;
  • 更加面向未来的语言:sum 类型、模式匹配、泛型、RAII、生命周期、共享及专属引用、模块与可见性等等;
  • 可扩展的独立标准库;
  • 集成的开箱可用工具:文档生成、代码格式化、linter 等,这些都基于编译器本身。

编译支持 Rust 的内核

根据 Rust for Linux 文档,编译一个包含 Rust 支持的内核需要如下步骤:

  1. 安装 rustc 编译器。Rust for Linux 不依赖 cargo,但需要最新的 beta 版本的 rustc。使用 rustup命令安装:
rustup default beta-2021-06-23
  1. 安装 Rust 标准库的源码。Rust for Linux 会交叉编译 Rust 的 core 库,并将这两个库链接进内核镜像。
rustup component add rust-src
  1. 安装 libclang 库。libclangbindgen 用做前端,用来处理 C 代码。libclang 可以从 llvm 官方主页 下载预编译好的版本。
  2. 安装 bindgen 工具,bindgen 是一个自动将 C 接口转为 RustFFI 接口的库:
cargo install --locked --version 0.56.0 bindgen
  1. 克隆最新的 Rust for Linux 代码:
git clone https://github.com/Rust-for-Linux/linux.git
  1. 配置内核启用 Rust 支持:
Kernel hacking
  -> Sample kernel code
    -> Rust samples
  1. 构建:
LIBCLANG_PATH=/path/to/libclang make -j LLVM=1 bzImage

这里我们使用 clang 作为默认的内核编译器,使用 gcc 理论上是可以的,但还处于 早期实验 阶段。

Rust 是如何集成进内核的

目录结构

为了将 Rust 集成进内核中,开发者首先对 Kbuild 系统进行修改,加入了相关配置项来开启/关闭 Rust 的支持。

此外,为了编译 rs 文件,添加了一些 Makefile 的规则。这些修改分散在内核目录中的不同文件里。

Rust 生成的目标代码中的符号会因为 Mangling 导致其长度超过同样的 C 程序所生成符号的长度,因此,需要对内核的符号长度相关的逻辑进行补丁。开发者引入了 “大内核符号”的概念,用来在保证向前兼容的情况下,支持 Rust 生成的目标文件符号长度。

其他 Rust 相关的代码都被放置在了 rust 目录下。

在 Rust 中使用 C 函数

Rust 提供 FFI( 外部函数接口 Foreign Function Interface )用来支持对 C 代码的调用。Bindgen 是一个 Rust 官方的工具,用来自动化地从 C 函数中生成 Rust 的 FFI 绑定。内核中的 Rust 也使用该工具从原生的内核 C 接口中生成 Rust 的 FFI 绑定。

quiet_cmd_bindgen = BINDGEN $@
      cmd_bindgen = \
    $(BINDGEN) $< $(shell grep -v '^\#\|^$$' $(srctree)/rust/bindgen_parameters) \
        --use-core --with-derive-default --ctypes-prefix c_types \
        --no-debug '.*' \
        --size_t-is-usize -o $@ -- $(bindgen_c_flags_final) -DMODULE

$(objtree)/rust/bindings_generated.rs: $(srctree)/rust/kernel/bindings_helper.h \
    $(srctree)/rust/bindgen_parameters FORCE
    $(call if_changed_dep,bindgen)

ABI

Rust 相关的代码会单独从 rs 编译为 .o,生成的目标文件是标准的 ELF 文件。在链接阶段,内核的链接器将 Rust 生成的目标文件与其他 C 程序生成的目标文件一起链接为内核镜像文件。因此,只要 Rust 生成的目标文件 ABI 与 C 程序的一致,就可以无差别的被链接(当然,被引用的符号还是要存在的)。

Rust 的 alloccore

目前 Rust for Linux 依赖于 core 库。在 core 中定义了基本的 Rust 数据结构与语言特性,例如熟悉的 Option<>Result<> 就是 core 库所提供。

这个库被交叉编译后被直接链接进内核镜像文件,这也是导致启用 Rust 的内核镜像文件尺寸较大的原因。在未来的工作中,这两个库会被进一步被优化,去除掉某些无用的部分,例如浮点操作,Unicode 相关的内容,Futures 相关的功能等。

之前的 Rust for Linux 项目还依赖于 Rust 的 alloc 库。Rust for Linux 定义了自己的 GlobalAlloc 用来管理基本的堆内存分配。主要被用来进行堆内存分配,并且使用 GFP_KERNEL 标识作为默认的内存分配模式。

不过在在最新的 拉取请求 中,社区已经将移植并修改了 Rust的 alloc 库,使其能够在尽量保证与 Rust 上游统一的情况下,允许开发者定制自己的内存分配器。不过目前使用自定义的 GFP_ 标识来分配内存依然是不支持的,但好消息是这个功能正在开发中。

“Hello World” 内核模块

用一个简单的 Hello World 来展示如何使用 Rust 语言编写驱动代码,hello_world.rs:

#![no_std]
#![feature(allocator_api, global_asm)]

use kernel::prelude::*;

module! {
    type: HelloWorld,
    name: b"hello_world",
    author: b"d0u9",
    description: b"A simple hello world example",
    license: b"GPL v2",
}

struct HelloWorld;

impl KernelModule for HelloWorld {
    fn init() -> Result<Self> {
        pr_info!("Hello world from rust!\n");

        Ok(HelloWorld)
    }
}

impl Drop for HelloWorld {
    fn drop(&mut self) {
        pr_info!("Bye world from rust!\n");
    }
}

与之对应的 Makefile

obj-m := hello_world.o

构建:

make -C /path/to/linux_src M=$(pwd) LLVM=1 modules

之后就和使用普通的内核模块一样,使用 insmod 工具或者 modprobe 工具加载就可以了。在使用体验上是没有区别的。

module! { }

这个宏可以被认为是 Rust 内核模块的入口,因为在其中定义了一个内核模块所需的所有信息,包括:AuthorLicenseDescription 等。其中最重要的是 type 字段,在其中需要指定内核模块结构的名字。在这个例子中:

module! {
    ...
    type: HelloWorld,
    ...
}

struct HelloWorld;

module_init()module_exit()

在使用 C 编写的内核模块中,这两个宏定义了模块的入口函数与退出函数。在 Rust 编写的内核模块中,对应的功能由 trait KernelModuletrait Drop 来实现。trait KernelModule 中定义 init() 函数,会在模块驱动初始化时被调用;trait Drop 是 Rust 的内置 trait,其中定义的 drop() 函数会在变量生命周期结束时被调用。

编译与链接

所有的内核模块文件会首先被编译成 .o 目标文件,之后由内核链接器将这些 .o 文件和自动生成的模块目标文件 .mod.o 一起链接成为 .ko 文件。这个 .ko 文件符合动态库 ELF 文件格式,能够被内核识别并加载。

其他

完整的介绍 Rust 是如何被集成进内核的文章可以在 我的 Github 上找到,由于写的仓促,可能存在一些不足,还请见谅。


作者:苏子彬,阿里云 PAI 平台开发工程师,主要从事 Linux 系统及驱动的相关开发,曾为 PAI 平台编写 FPGA 加速卡驱动。

使用 AI 给游戏配音,引来配音演员强烈不满

《巫师 3:狂猎》MOD 的开发者用 CyberVoice 软件对《巫师 3》主角的配音演员的声音进行训练,然后生成了几乎以假乱真的新台词语音。部分配音演员对这一结果表达了强烈不满

AI 终究会取代大部分工作,即便是一些需要专业技能的工作。

微软承认曾向包含恶意驱动程序提供签名

自 Windows Vista 以来,任何在内核模式下运行的代码都需要在公开发布前进行测试和签名,没有微软证书的驱动程序默认不能安装。这个名为“Netfilter”的驱动程序实际上是一个 rootkit,它被观察到与一个位于中国的命令与控制 IP 进行通信,该威胁行为者主要针对中国的游戏行业。

这家开发包含恶意行为的软件公司像任何正常公司一样,仅仅通过遵循正常程序提交了驱动程序进行认证,就击穿了微软的安全防线。到目前为止,还没有证据表明使用了被盗的代码签名证书。

这一特殊事件暴露了合法代码签名过程中的弱点,威胁者利用这些弱点获得了微软的签名代码,而没有破坏任何证书。

Linux Kernel 5.13 发布

Linus Torvalds 今天发布了 Linux Kernel 5.13。新版内核添加了对 M1 芯片的初步支持,不过目前还没有加速图形支持。其主要变化可以参见我们昨天的介绍。Torvalds 说,“5.13 的总体规模实际上是相当大的。事实上,它是较大的 5.x 版本之一,有来自 2000 多名开发者的超过 16000 个提交(如果算上合并,则超过 17000个)。”

我更期待的是下一个版本,慢慢已经习惯了 Linux 内核不断的滚动新版本。

华为工程师向 Linux 内核提出一项“华为摘要列表”功能建议

功能作为核内数据库来存储文件和元数据摘要。预期用于完整性测量(IMA)和通过 SecurityFS 将数据库暴露给用户空间。其数据可能包括 RPM 头文件和 Debian 存储库元数据信息。华为将其设计为核内数据库以便其驻留在内核内存中,不容易受到用户空间的攻击。目前该功能已经在 openEuler Linux 发行版中使用。当前的实现只有不到四千行的代码。

不管该功能是否能被内核接纳,但这种上游优先的做法是值得赞赏的。

Rocky Linux 8.4 正式发布

Rocky 企业软件基金会宣布了 Rocky Linux 8.4 的第一个通用版本。很多大公司都依赖于 CentOS,这包括迪斯尼、GoDaddy、Rackspace、丰田和 Verizon 等,据说他们对 RedHat 结束 CentOS Linux 的决定不满意。事实证明,Rocky Linux 很受欢迎。除了迅速为该项目建立起数百名贡献者的大军外,Rocky Linux 8.4 在发布后的半天内被下载了至少 1 万次,这还不算镜像下载量,可能至少是这个数字的 3-4 倍。Rocky Linux 项目的创始人表示,“Rocky Linux 可能很快就会成为企业和云计算中使用最多的 Linux 操作系统!”

一个纯正的 CentOS 替代品接过了 CentOS Linux 退出后留下的市场,不知道这是不是红帽所希望的呢?

Fedora 35 将自动启用最佳加密扇区大小

在今年秋天发布的 Fedora 35 中,对于那些采用 LUKS/dm-crypt 加密并使用基于 4K 扇区大小的存储的用户来说可以带来更好的性能。目前,当在磁盘上安装 Fedora Linux 并使用 LUKS 加密时,无论基础磁盘的物理扇区大小如何,都会使用 512 字节的扇区大小。但现在最新的 cryptsetup 版本提供了一个选项,能够自动确定最佳扇区大小,Fedora 35 正计划跟随启用这个选项。

Fedora 在实验新特性方面总是比较及时,所以我不明白的是,为什么还要有 CentOS Stream。