分类 技术 下的文章

按照本指南,在 Windows 和 Linux 上用 Linux Mint 轻松创建立付 USB。

Linux Mint 是 初学者的最佳 Linux 发行版选择 之一。它基于 Ubuntu ,但有些人认为 Linux Mint 比 Ubunutu 更好

如果你想尝试使用 Linux Mint,你可以 在 VirtualBox 内安装 Linux Mint。 这是体验 Linux Mint 的方法之一。

另一种方法是创建 Linux Mint 的 立付 Live USB。这样,你就可以从 USB 启动,在实时会话中体验 Linux Mint。它不会干扰你当前的操作系统,无论是 Windows 还是 Linux。

LCTT 译注:关于我们将 “Live” 翻译为 “立付” 的原因,请参照 此文 说明。简单概括:

Live 原意多指“现场”、“实时”,在计算机环境中使用时也多引用此意。但对它的翻译就颇费神,因为无论是在 Live Patch,还是更多见的 Live USB/CD、Live Session,其实都不好翻译为“现场”、“实时”。推荐使用“立付”,在照顾发音的同时,取其“立时交付”之意。而对于 Live Stream,提议者建议依旧翻译为“直播”、“实时流”。对于 Live Patch,还是采用 “热补丁” 这样的意译。

如果你喜欢它并选择安装至硬盘上,可以使用同一个立付 USB 来进行。创建立付 USB 是安装 Linux Mint 的第一步。

准备工作

如果需要制作一个 Linux Mint 立付 USB,你需要:

  • 一个 USB 驱动器(可以是 U 盘、移动硬盘等),至少需要 8GB 的空间;
  • 一个可以使用的互联网连接,以便下载 Linux Mint ISO;
  • 一个帮助你制作立付 USB 的写盘工具。
? 你可以在一个系统上创建立付 USB,然后在其他电脑上使用。

第一步:下载 Linux Mint ISO

这一 ISO 文件是包含 Linux Mint 系统的镜像文件,它将会被写入至 USB 驱动器上。

Linux Mint 有三种 桌面环境 版本:Cinnamon 旗舰版本、MATE 以及 XFCE 的变体。

这些 ISO 文件包括了你可以找到 最佳的桌面环境Cinnamon 是最流行的版本,建议选择它以获得最佳的 Linux Mint 体验,但你也可以尝试其他版本。

不管你选择的是什么版本,ISO 文件的大小都约为 2.7GB

你可以前往 官方下载页面 获取上述的 ISO 文件。你可以选择直接下载或使用 Torrent 种子文件下载。

Linux Mint 下载

获得 ISO 文件后,你需要一个专用工具将 ISO 映像写入到 USB 驱动器上。我推荐使用 Etcher。

? 有些人喜欢对下载的 ISO 文件 进行完整性校验。这是一种确保 ISO 文件在下载过程中不会损坏的方法(可能会因为网络不稳定等因素而损坏)。

第二步:安装 Etcher 以制作立付 USB

对于 Windows 用户来说,Rufus 是一款出色的工具。可惜 Linux 用户无法使用。

为了让本教程简洁明了,我将使用 Etcher。它是 Rufus 的替代品,可用于 Linux 与 Windows。

这样,你就可以在 Windows 和 Linux 平台上使用相同的步骤创建 Linux Mint 立付 USB。唯一不同的是安装 Etcher 的步骤。

Windows 教程

官方网站 下载 Etcher。建议你下载完整的安装程序,除非你真的需要便携式文件。

你会找到一个 .exe 文件。只需要双击安装程序,然后同意说明条款并按照窗口内的步骤进行安装即可。

然后,你可以从搜索菜单中搜索并启动该程序。

Linux 教程

对于 Linux 用户来说,可以从 官网 下载 Etcher 的 AppImage 可执行文件。

你可以参考我们的 AppImage 指南,了解如何将文件作为可执行文件运行。

使用 AppImage 文件,你不需要 安装 Etcher,而是在直接运行它。

第三步:使用 Etcher 将 Linux Mint ISO 写入到 USB 驱动器

插入 USB 驱动器,并运行上一步安装的 Etcher 工具。

现在,考虑到你已经下载了 Linux Mint ISO,点击 “ 从文件烧录 Flash from file ” 选项,如下图所示。

然后使用文件管理器选择 Linux Mint 的 ISO 文件。

选择 ISO 文件后,需要选择要将要刷入的 USB 驱动器。如果只有一个,Etcher 会自动选择。但仍要确保在 Etcher 中选择了正确的 USB 驱动器。

现在,你只需点击 “ 现在烧录 Flash ”,等待程序完成。

你将收到接受命令行进程的提示,并选择 “Yes” 以启动刷入进程。

完成后,它将自动验证刷入的 USB 驱动器是否完整,然后你就可以开始了!

第四步:从 USB 驱动器启动

你通过上述方法所制作的 Linux Mint 立付 USB 驱动器应适用于任何具有 UEFI 启动功能的计算机。

当系统启动并显示制造商徽标时,按 F2F10F12 键,即可访问 UEFI 启动设置

访问启动设置后,将启动顺序更改为先从 USB 驱动器启动。

不同的电脑有不同的 BIOS 设置,因此我无法分享此步骤的明确截图。

? 在极少数情况下,安全启动可能不允许启动。这时可以禁用安全启动。

接下来怎么办?

如果你喜欢立付环境下的 Linux Mint,可以使用立付 USB 删除 Windows 来安装 Mint。

或者,你也可以选择 Linux Mint 和 Windows 双系统共存 ,在同一台电脑中同时运行两个操作系统。

? 我希望本教程对你创建 Linux Mint 立付 USB 有帮助。请在评论区告诉我你的问题和建议。

(题图:MJ/a7bdf228-4928-4171-9250-58ce1ba7545c)


via: https://itsfoss.com/linux-mint-live-usb/

作者:Ankush Das 选题:lujun9972 译者:GenshinMinecraft 校对:wxy

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

一份让你深入体验最新 Linux 内核编译过程的实操指南。

出于各种原因,自行编译 Linux 内核可能引起你的兴趣。这些原因可能包括但不限于:

  • 测试一个比你目前的 Linux 发行版更新的内核版本
  • 采用一组不同的配置选项、驱动来构建内核
  • 学习者的好奇心 ?

此指南将一步步指导你如何亲自编译 Linux 内核,包括你该运行哪些命令,为什么运行这些命令以及这些命令的执行效果。本文篇幅较长,所以请做好准备!

? 诸如 Ubuntu 这样的发行版提供了更简单地安装主线 Linux 内核的方式。但本教程目标是从源码手动完成所有工作。此教程需要你付出时间、耐心以及丰富的 Linux 命令行使用经验。本文更注重亲身实践的体验。不管怎么说,我仍建议你在虚拟机或备用系统中尝试此冒险,而非在你的主系统上进行。

前置准备

在软件领域,构建任何事物都有两个基本要求:

  1. 源代码
  2. 构建依赖

因此,作为预备环节,我们需要下载 Linux 内核的源码压缩包,并安装一些能让我们成功构建 Linux 内核的依赖项。

Linux 版本导览

在任何时刻,Freax Linux 内核都有四种“版本”。

Linux 的这些 “版本”,按照开发流程的顺序是:

  1. linux-next 树: 所有准备合并到 Linux 代码库的代码首先被合并到 linux-next 树。它代表的是 Linux 内核最新也是“最不稳定”的状态。大多数 Linux 内核开发者和测试人员使用这个来提高代码质量,为 Linus Torvalds 的后续提取做准备。请谨慎使用!
  2. 发布候选版(RC) / 主线版: Linus 从 linux-next 树抽取代码并创建一个初始发布版本。这个初始发布版本的测试版称为 RC( 发布候选 Release Candidate )版本。一旦 RC 版本发布,Linus 只会接受对它的错误修复和性能退化相关的补丁。基础这些反馈,Linus 会每周发布一个 RC 内核,直到他对代码感到满意。RC 发行版本的标识是 -rc 后缀,后面跟一个数字。
  3. 稳定版: 当 Linus 觉得最新的 RC 版本已稳定时,他会发布最终的“公开”版本。稳定发布版将会维护几周时间。像 Arch Linux 和 Fedora Linux 这样的前沿 Linux 发行版会使用此类版本。我建议你在试用 linux-next 或任何 RC 版本之前,先试一试此版本。
  4. LTS 版本: 每年最后一个稳定版将会再维护 几年。这通常是一个较旧的版本,但它会 会积极地维护并提供安全修复。Debian 的稳定版本会使用 Linux 内核的 LTS 版版本。

若想了解更多此方面的知识,可参阅 官方文档

本文将以当前可用的最新稳定版为例,编写此文时的 Linux 内核版本是 6.5.5

系统准备

由于 Linux 内核使用 C 语言编写,编译 Linux 内核至少需要一个 C 编译器。你的计算机上可能还需要其他一些依赖项,现在是安装它们的时候了。

? 这个指南主要聚焦于使用 GNU C 编译器(GCC)来编译 Linux 内核。但在未来的文章中(可能会深入介绍 Rust 的支持),我可能会介绍使用 LLVM 的 Clang 编译器作为 GCC 的替代品。

不过,请注意,MSVC 并不适用。尽管如此,我仍期待有微软的员工为此发送修补程序集。我在瞎想啥?

对于 Arch Linux 以及其衍生版本的用户,安装命令如下:

sudo pacman -S base-devel bc coreutils cpio gettext initramfs kmod libelf ncurses pahole perl python rsync tar xz

对于 Debian 以及其衍生版本的用户,安装命令如下:

sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils

对于 Fedora 以及其衍生版本的用户,安装命令如下:

sudo dnf install binutils ncurses-devel \
    /usr/include/{libelf.h,openssl/pkcs7.h} \
    /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}

下载 Linux 内核源码

请访问 kernel.org,在页面中寻找第一个 稳定 Stable 版本。你不会找不到它,因为它是最显眼的黄色方框哦 ?

点击访问 kernel.org

通过点击黄色的方框,你就可以下载 Tar 文件。同时,也别忘了下载相匹配的 PGP 签名文件,稍后我们需要用到它来验证 Tar 文件。它的扩展名为 .tar.sign

校验 Tar 文件的完整性

你如何知道刚下载的 Tar 文件是否被损坏?对于个人来说,一个损坏的 Tar 文件只会浪费你的宝贵时间,如果你是在为一个组织工作,那么可能会危及到组织的安全(这时你可能还有更大的问题需要担忧,但我们并不想让所有人都产生创伤后应激障碍!)。

为了验证我们的 Tar 文件的完整性,我们需要先解压它。目前,它是使用 XZ 压缩算法压缩的。因此,我将使用 unxz 工具(其实就是 xz --decompress 的别名)来解压 .tar.xz 格式的压缩文件。

unxz --keep linux-*.tar.xz

解压完成后,我们需要获取 Linus Torvalds 和 Greg KH 使用的 GPG 公开密钥。这些密钥用于对 Tar 文件进行签名。

gpg2 --locate-keys [email protected] [email protected]

你应该可以得到一个与我在我的电脑上看到的类似的结果:

$ gpg2 --locate-keys [email protected] [email protected]
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created
gpg: key 38DBBDC86092693E: public key "Greg Kroah-Hartman <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: key 79BE3E4300411886: public key "Linus Torvalds <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1
pub   rsa4096 2011-09-23 [SC]
      647F28654894E3BD457199BE38DBBDC86092693E
uid           [ unknown] Greg Kroah-Hartman <[email protected]>
sub   rsa4096 2011-09-23 [E]

pub   rsa2048 2011-09-20 [SC]
      ABAF11C65A2970B130ABE3C479BE3E4300411886
uid           [ unknown] Linus Torvalds <[email protected]>
sub   rsa2048 2011-09-20 [E]

在导入 Greg 和 Linus 的密钥后,我们可以使用 --verify 标志来验证 Tar 的完整性,操作如下:

gpg2 --verify linux-*.tar.sign

如果验证成功,你应该会看到如下的输出信息:

$ gpg2 --verify linux-*.tar.sign
gpg: assuming signed data in 'linux-6.5.5.tar'
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

务必查看是否存在 gpg: Good signature 的提示,然后再继续!

? 你可以忽略以下警告:WARNING: This key is not certified with a trusted signature! There is no indication that the signature belongs to the owner.

我们已根据 Linus 和 Greg 的邮件地址获取了公开密钥,并无需对此警告感到担忧。

解压 Tar 文件

如果你顺利的进行到这里,意味着你的 Tar 文件完整性检查已经成功完成。接下来,我们将从 Tar 文件中解压出 Linux 内核的源码。

The "TAR" xkcd comic: https://xkcd.com/1168/

这个步骤十分简单,只需对 Tar 文件执行 tar -xf 命令,如下:

tar -xf linux-*.tar

在这里,-x 选项表示解压,-f 选项则用来告诉 Tar 文件的文件名。

这个解压过程可能需要几分钟时间,你可以先放松,耐心等待一下。

配置 Linux 内核

Linux 内核的构建过程会查找 .config 文件。顾名思义,这是一个配置文件,用于指定 Linux 内核的所有可能的配置选项。这是必需的文件。

获取 Linux 内核的 .config 文件有两种方式:

  1. 使用你的 Linux 发行版的配置作为基础(推荐做法
  2. 使用默认的,通用的配置
? 也有第三种方法,也就是从零开始,手动配置每一个选项,但注意,这需要配置超过 12,000 个选项。并不推荐这种方式,因为手动配置所有选项将花费大量的时间,并且你还需要理解每个启用和禁用选项的含义。

使用发行版提供的配置

使用你的 Linux 发行版提供的配置是一个安全的选择。 如果你只是跟随这个指南测试一个不是你的发行版提供的新内核,那么这就是推荐的方式。

你的 Linux 发行版的 Linux 内核配置文件会在以下两个位置之一:

  • 大多数 Linux 发行版,如 Debian 和 Fedora 及其衍生版,将会把它存在 /boot/config-$(uname -r)
  • 一些 Linux 发行版,比如 Arch Linux 将它整合在了 Linux 内核中。所以,可以在 /proc/config.gz 找到。
? 如果两者都有,建议使用 /proc/config.gz。这是因为它在只读文件系统中,所以是未被篡改的。

进入含有已经解压出的 Tar 文件的目录。

cd linux-*/

接着,复制你的 Linux 发行版的配置文件:

### Debian 和 Fedora 及其衍生版:
$ cp /boot/config-"$(uname -r)" .config

### Arch Linux 及其衍生版:
$ zcat /proc/config.gz > .config
更新配置文件

一旦完成这些步骤,接下来就需要“更新”配置文件了。因为你的发行版提供的配置很可能比你正在构建的 Linux 内核版本要旧。

? 这同样适用于像 Arch Linux 和 Fedora 这样前沿的 Linux 发行版。 它们并不会因为有新版本可用就立刻发布更新。他们会进行一些质量控制工作,这必然会花费些时间。因此,即便是你的发行版提供的最新内核,相较于你在 kernel.org 上获取的版本也会滞后几个小版本。

要更新一个已有的 .config 文件,我们使用 make 命令搭配 olddefconfig 参数。简单解释一下,这个命令的意思是使用 旧的、默认的、配置

这将使用“旧的配置文件”(当前保存为 .config,这是你发行版配置的一份直接副本),并检查从上一版本以来 Linux 代码库中新加的任何配置选项。如果找到任何新的、未配置 的选项,该选项的默认配置值会被使用,并会对 .config 文件进行更新。

原来的 .config 文件将被重命名为 .config.old 进行备份,并将新的更改写入至 .config 文件。

make olddefconfig

以下是我机器上的输出:

$ file .config
.config: Linux make config build file, ASCII text

$ make olddefconfig
    HOSTCC  scripts/basic/fixdep
    HOSTCC  scripts/kconfig/conf.o
    HOSTCC  scripts/kconfig/confdata.o
    HOSTCC  scripts/kconfig/expr.o
    LEX     scripts/kconfig/lexer.lex.c
    YACC    scripts/kconfig/parser.tab.[ch]
    HOSTCC  scripts/kconfig/lexer.lex.o
    HOSTCC  scripts/kconfig/menu.o
    HOSTCC  scripts/kconfig/parser.tab.o
    HOSTCC  scripts/kconfig/preprocess.o
    HOSTCC  scripts/kconfig/symbol.o
    HOSTCC  scripts/kconfig/util.o
    HOSTLD  scripts/kconfig/conf
.config:8593:warning: symbol value 'm' invalid for USB_FOTG210_HCD
.config:8859:warning: symbol value 'm' invalid for USB_FOTG210_UDC
#
# configuration written to .config
#
针对 Debian 及其衍生版用户

Debian 及其衍生版为内核模块使用一个签名证书。默认情况下,你的计算机并不包含这个证书。

我推荐关闭启用模块签名的选项。具体如下所示:

./scripts/config --file .config --set-str SYSTEM_TRUSTED_KEYS ''
./scripts/config --file .config --set-str SYSTEM_REVOCATION_KEYS ''

如果你不这么做,在后面你进行 Linux 内核构建时,可能会导致构建失败。要注意这点。

使用自定义配置

如果你出于学习内核开发的目的学习如何构建 Linux 内核,那你应该这样做。

? 请注意,偏离你的 Linux 发行版的配置可能无法在实体硬件上“正常”工作。问题可能是特定硬件无法工作、Linux 内核无法启动等。

因此,我们只建议在虚拟机中使用。

你可以通过查看 make help 的输出 来查看 所有 可用的选项,但我们主要关注三个 make 目标:

  • defconfig: 默认配置。
  • allmodconfig: 根据当前系统状态,尽可能地把项目构建为可加载模块(而非内建)。
  • tinyconfig: 极简的 Linux 内核。

由于 tinyconfig 目标只会构建少数项目,构建时间将会缩短。我个人选择它的原因主要有:

  1. 检查我在代码/工具链中做的修改是否正确,以及代码是否可以编译。
  2. 在虚拟机中只进行少数选项的测试。

? 在为 ARM 或 RISC-V 机器构建 Linux 内核时,你可能需要 DTB(设备树的二进制文件)。使用 tinyconfig 目标将不会启用构建 DTB 的选项,你的内核很可能无法启动。

当然,你可以用 QEMU 在没有任何 DTB 的情况下启动 Linux 内核。但这篇文章并不会聚焦在此。或许你可以通过评论,让我在之后的时间里覆盖这个话题 ?

除非你确切地知道自己在做什么,否则你应当使用 defconfig 目标。 以下是我在我的电脑上运行的效果:

$ make defconfig
    HOSTCC  scripts/basic/fixdep
    HOSTCC  scripts/kconfig/conf.o
    HOSTCC  scripts/kconfig/confdata.o
    HOSTCC  scripts/kconfig/expr.o
    LEX     scripts/kconfig/lexer.lex.c
    YACC    scripts/kconfig/parser.tab.[ch]
    HOSTCC  scripts/kconfig/lexer.lex.o
    HOSTCC  scripts/kconfig/menu.o
    HOSTCC  scripts/kconfig/parser.tab.o
    HOSTCC  scripts/kconfig/preprocess.o
    HOSTCC  scripts/kconfig/symbol.o
    HOSTCC  scripts/kconfig/util.o
    HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'defconfig'
#
# configuration written to .config
#

修改配置

无论你是使用 Linux 发行版的配置并更新它,还是使用 defconfig 目标创建新的 .config 文件,你都可能希望熟悉如何修改这个配置文件。最可靠的修改方式是使用 menuconfignconfig 目标。

这两个目标的功能是相同的,只不过提供给你的界面有所不同。这是这两者间唯一的区别。我个人更偏向于使用 menuconfig 目标,但近来我发现 nconfig 在搜索选项时似乎更具直观性,所以我逐渐转向使用它。

首先,带着 menuconfig 目标运行 make 命令:

$ make menuconfig
    HOSTCC  scripts/kconfig/mconf.o
    HOSTCC  scripts/kconfig/lxdialog/checklist.o
    HOSTCC  scripts/kconfig/lxdialog/inputbox.o
    HOSTCC  scripts/kconfig/lxdialog/menubox.o
    HOSTCC  scripts/kconfig/lxdialog/textbox.o
    HOSTCC  scripts/kconfig/lxdialog/util.o
    HOSTCC  scripts/kconfig/lxdialog/yesno.o
    HOSTLD  scripts/kconfig/mconf

在此界面,你可以根据各选项的类型来进行切换操作。

有两类可切换选项:

  • 布尔状态选项:这类选项只能关闭([ ])或作为内建组件开启([*])。
  • 三态选项:这类选项可以关闭(< >)、内建(<*>),或作为可加载模块(<M>)进行构建。

想要了解更多关于某个选项的信息,使用上/下箭头键导航至该选项,然后按 <TAB> 键,直至底部的 < Help > 选项被选中,然后按回车键进行选择。此时就会显示关于该配置选项的帮助信息。

在修改选项时请务必谨慎。

当你满意配置后,按 <TAB> 键直到底部的 < Save > 选项被选中。然后按回车键进行选择。然后再次按回车键(记住,此时不要更改文件名),就能将更新后的配置保存到 .config 文件中。

构建 Linux 内核

构建 Linux 内核实际上十分简单。然而,在开始构建之前,让我们为自定义内核构建添加一个标签。我将使用字符串 -pratham 作为标签,并利用 LOCALVERSION 变量来实施。你可以使用以下命令实现配置:

./scripts/config --file .config --set-str LOCALVERSION "-pratham"

这一命令将 .config 文件中的 CONFIG_LOCALVERSION 配置选项设为我在结尾指定的字符串,即 -pratham。当然,你也不必非得使用我所用的名字哦 ?

LOCALVERSION 选项可用于设置一个“本地”版本,它会被附加到通常的 x.y.z 版本方案之后,并在你运行 uname -r 命令时一并显示。

由于我正在构建的是 6.5.5 版本内核,而 LOCALVERSION 字符串被设为 -pratham,因此,对我来说,最后的版本名将会是 6.5.5-pratham。这么做的目的是确保我所构建的自定义内核不会与发行版所提供的内核产生冲突。

接下来,我们来真正地构建内核。可以用以下的命令完成此步骤:

make -j$(nproc) 2>&1 | tee log

这对大部分(99%)用户来说已经足够了。

其中的 -j 选项用于指定并行编译任务的数量。而 nproc 命令用于返回可用处理单位(包括线程)的数量。因此,-j$(nproc) 其实意味着“使用我拥有的 CPU 线程数相同数量的并行编译任务”。

2>&1 会将 STDOUT 和 STDIN 重定向到相同的文件描述符,并通过管道传输给 tee 命令,这会将输出存储在一个名为 log 的文件,并且在控制台打印出完全相同的文本。如果你在构建时遇到错误,并希望回顾日志来检查出了什么问题,这将会十分有用。遇到那种情况,你只需要简单执行 grep Error log 命令就能找到线索。

自定义 make 目标

在 Linux 内核的源文件夹中,make 命令有一些自定义的目标可供执行各种操作。这些主要作为开发者的参考。如果你的唯一目标是安装一个比你当前发行版更新的 Linux 内核,那么你完全可以跳过这部分内容 ?

构建目标

作为一名开发者,你可能只想构建 Linux 内核,或者只想构建模块,或者只想构建设备树二进制(DTB)。在这种情况下,你可以指定一个构建目标,然后 make 命令只会构建指定的项目,而不会构建其他的。

以下是一些构建目标:

  • vmlinux:纯粹的 Linux 内核。
  • modules:可加载模块。
  • dtbs:设备树二进制文件(主要用于 ARM 和 RISC-V 架构)。
  • all:构建所有被标记了星号 * 的项目(从 make help 的输出中可以查看)。

通常情况下,你并不需要指定构建目标,因为它们都已经在构建列表中。所列出的目标是在你只想要测试某一个构建目标,而不是其他目标时的情况。

依据你的 计算机架构,构建完成的 Linux 内核镜像(存放在 /boot 目录)的名称会有所不同。

对于 x86_64,Linux 内核的默认镜像名称是 bzImage。因此,如果你只需要构建引导所需的 Linux 内核,你可以像下面这样设定 bzImage 为目标:

### 对于 x86_64
$ make bzImage

“那么如何在我的架构上找到用来调用 make 的目标名称呢?”

有两种方法。要么你可以执行 make help 之后查找在 Architecture specific targets 下,第一个前面带有星号 * 的选项。

或者,如果你希望自动完成,你可以利用 image_name 目标得到镜像的完全路径(相对路径),选择性地添加 -s 标志来获得有用的输出。

以下是我拥有的三台电脑的输出,一台是 x86_64,另一台是 AArch64,还有一台是 riscv

### x86_64
$ make -s image_name
arch/x86/boot/bzImage

### AArch64
$ make -s image_name
arch/arm64/boot/Image.gz

### RISC-V
$ make -s image_name
arch/riscv/boot/Image.gz

现在,要只构建 Linux 内核镜像,你可以这样进行:

make $(make -s image_name | awk -F '/' '{print $4}')
清理目标

如果你需要清理构建产生的文件,你可以用以下的目标来实现你的需求:

  • clean:除了 .config 文件外,删除几乎所有其他内容。
  • mrproper:执行了 make clean 的所有操作外,还会删除 .config 文件。
  • distclean:除了执行 make mrproper 的所有操作外,还会清理任何补丁文件。

安装

一旦成功编译了 Linux 内核,接下来就是启动安装一些东西的时候了。“一些 东西?” 没错,我们至少构建了两种不同的东西,如果你使用的是 ARM 或 RISC-V 架构,那就有三种。我会在以下内容中详细解释。

? 虽然我将告诉你不同的安装方式,尤其是关于如何改变默认安装路径的方法,但如果你不确定自己在做什么,那么我不建议你这么做! 请慎重考虑,如果你决定走自定义的路线,那你需要自己负责后果。默认设置之所以存在,是因为它们有其特殊的原因 ?

安装内核模块

Linux 内核有部分在系统启动时并非必需的。这些部分被构建为可加载模块,即在需要时才进行加载和卸载。

所以,首先需要安装这些模块。这可以通过 modules_install 目标完成。必须使用 sudo,因为模块会被安装在 /lib/modules/<kernel_release>-<localversion> 这个需要 root 权限的路径下。

这个过程不仅会安装内核模块,还会对其进行签名,所以可能需要一些时间。好消息是你可以通过之前提到的 -j$(nproc) 选项来并行执行安装任务,这样会快一些。?

sudo make modules_install -j$(nproc)

给开发者的提示: 你可以通过设定 INSTALL_MOD_PATH 变量来指定一个不同的路径存放 Linux 模块,而不用默认的 /lib/modules/<kernel_release>-<localversion>,具体如下:

   sudo make modules_install INSTALL_MOD_PATH=<path>
另一个给开发者的提示: 你可以使用 INSTALL_MOD_STRIP 变量来决定是否需要剥离模块的调试符号。如果未设定该变量,调试符号不会被剥离。当设为 1 时,符号信息将会被使用 --strip-debug 选项剥离,随后该选项会传递给 strip(或者在使用 Clang 的时候传递给 llvm-strip)工具。

(可选)安装 Linux 内核头文件

如果你打算使用这个内核来支持树外模块,比如 ZFS 或英伟达 DKMS,或者打算尝试自行编写模块,你可能会需要 Linux 内核提供的头文件。

可以通过以下方式使用 headers_install 目标来安装 Linux 内核头文件:

sudo make headers_install

应使用 sudo 命令,因为这些头文件会被安装到 /usr 目录。同时还会在 /usr 目录内创建子目录 include/linux,然后将头文件安装到 /usr/include/linux 内。

给开发者的提示: 通过设定 INSTALL_HDR_PATH 变量,你可以修改 Linux 内核头文件的安装路径。

安装 DTB(只针对 ARM 和 RISC-V)

如果你使用的是 x86\_64 架构,那么你可以跳过此步骤!

如果你针对 ARM 或者 RISC-V 构建了内核,那么在运行 make 的过程中,设备树的二进制文件可能已经被编译出来了。你可以通过在 arch/<machine_architecture>/boot/dts 目录查找 .dtb 文件来确认这一点。

这里提供了一个快速检查的技巧:

### 对于 AArch32
$ find arch/arm/boot/dts -name "*.dtb" -type f | head -n 1 > /dev/null && echo "DTBs for ARM32 were built"

### 对于 AArch64
$ find arch/arm64/boot/dts -name "*.dtb" -type f | head -n 1 > /dev/null && echo "DTBs for ARM64 were built"

### 对于 RISC-V
$ find arch/riscv/boot/dts -name "*.dtb" -type f | head -n 1 > /dev/null && echo "DTBs for RISC-V were built"

如果你看到出现 DTBs for <arch> were built 的消息,那么你可以开始安装 DTB。这可以通过 dtbs_install 目标来实现。

需要使用 sudo,因为它们会被安装在 /boot/dtb-<kernel_release>-<localversion> 中,而这个目录是由 root 所拥有的。

sudo make dtbs_install
给开发者的提示: 就像安装模块一样,你可以使用 INSTALL_DTBS_PATH 变量指定一个自定义的路径来安装设备树二进制文件。

安装 Linux 内核

最后,我们来安装 Linux 内核本身!这可以通过 install 目标来完成,就像这样:

sudo make install

在这里必须使用 sudo,因为 Linux 内核将被安装在 /boot 目录,而这个目录不允许普通用户写入。

? 一般来讲,install 目标也会更新引导加载程序,但是如果它没有成功,那可能是不支持你使用的引导加载程序。如果你没有使用 GRUB 作为你的引导加载程序,请一定要阅读你引导加载程序的使用手册 ?
给开发者的提示: 并不奇怪,INSTALL_PATH 变量被用来设定 Linux 内核的安装位置,而非默认的 /boot 目录。

针对 Arch Linux 用户的说明

如果你尝试执行了 make install 命令,可能已经注意到产生了错误。错误如下:

$ sudo make install
    INSTALL /boot
Cannot find LILO.

要在 Arch Linux 上实际完成 Linux 内核的安装,我们需要手动复制 Linux 内核镜像文件。别担心,如果你使用的是 Arch Linux,手动操作应该是家常便饭了。( ͡° ͜ʖ ͡°)

可以使用以下命令完成这个步骤:

sudo install -Dm644 "$(make -s image_name)" /boot/vmlinuz-<kernel_release>-<localversion>

因为我编译的是 6.5.5 版本的内核,所以我将会执行下面这条命令,你可以根据你的实际情况进行适当调整:

sudo install -Dm644 "$(make -s image_name)" /boot/vmlinuz-6.5.5-pratham

虽然不是必须的,但最好复制一份名为 System.map 的文件。既然你已经在操作了,一并也复制了 .config 文件吧 ?

sudo cp -vf System.map /boot/System.map-<kernel_release>-<localversion>
sudo cp -vf .config /boot/config-<kernel_release>-<localversion>
生成初始 RAM 磁盘

当你安装 Arch Linux 时,可能已经了解过 mkinitcpio 这个工具。现在,我们将使用它来创建初始的 RAM 磁盘。

首先,我们需要创建一个预设文件。向 /etc/mkinitcpio.d/linux-<localversion>.preset 文件中添加以下内容,根据实际需要来替换 <kernel_release><localversion>

ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-<kernel_release>-<localversion>"

PRESETS=('default' 'fallback')

default_image="/boot/initramfs-<kernel_release>-<localversion>.img"
fallback_options="-S autodetect"

配置完成后,执行下面的命令来生成初始 RAM 磁盘:

sudo mkinitcpio -p linux-<localversion>

我自己的电脑上得到的输出如下,你的结果应该会类似!

$ sudo mkinitcpio -p linux-pratham
==> Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: 'default'
==> Using configuration file: '/etc/mkinitcpio.conf'
    -> -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img
==> Starting build: '6.5.5-pratham'
    -> Running build hook: [base]
    -> Running build hook: [udev]
    -> Running build hook: [autodetect]
    -> Running build hook: [modconf]
    -> Running build hook: [kms]
    -> Running build hook: [keyboard]
==> WARNING: Possibly missing firmware for module: 'xhci_pci'
    -> Running build hook: [keymap]
    -> Running build hook: [consolefont]
==> WARNING: consolefont: no font found in configuration
    -> Running build hook: [block]
    -> Running build hook: [filesystems]
    -> Running build hook: [fsck]
==> Generating module dependencies
==> Creating zstd-compressed initcpio image: '/boot/initramfs-6.5.5-pratham.img'
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: 'fallback'
==> Using configuration file: '/etc/mkinitcpio.conf'
==> WARNING: No image or UKI specified. Skipping image 'fallback'

初始 RAM 磁盘已成功生成,现在我们可以进入下一步,更新引导加载器!

更新 GRUB

一旦所有必要的文件已成功复制到其对应的位置,接下来,我们将进行 GRUB 的更新。

使用以下命令对 GRUB 引导加载器进行更新:

sudo grub-mkconfig -o /boot/grub/grub.cfg
? 如果你使用的引导加载器不是 GRUB,请参看 Arch Wiki 中相关的引导加载器文档。

注意,更新 GRUB 并不会直接使新的内核版本设为默认启动选项。在引导时,请在启动菜单中手动选择新的内核版本。

你可以通过选择 Advanced options for Arch Linux 菜单,并在随后的菜单中选择 Arch Linux, with Linux <kernel_release>-<localversion> 来启用新版的 Linux 内核。

重启电脑

恭喜你!你已经完成了获取 Linux 内核源代码、进行配置、构建以及安装等所有步骤。现在只需要通过重启电脑并进入新构建和安装的 Linux 内核,就可以开始享受你的努力成果了。

启动时,请确保从引导加载器中选择正确的 Linux 内核版本。系统启动后,运行 uname -r 命令来确认你正在使用预期的 Linux 内核。

以下是我自己的电脑输出的内容:

$ uname -r
6.5.5-pratham

是时候开始庆祝了! ?

卸载操作

? 提示:在删除当前正在使用的内核版本之前,你应该首先切换至较旧的内核版本。

可能你的 Linux 发行版所使用的 Linux 内核版本就是你手动编译的版本,或者你自行编译了新的内核并注意到应卸载旧的内核以节省空间,于是你开始想如何才能卸载。当然,虽然我们无法简单地运行 make uninstall 命令,但这并不代表没有其他的方法!

我们清楚各个文件的安装位置,因此删除它们相对简单。

### 删除内核模块
$ rm -rf /lib/modules/<kernel_release>-<localversion>

### 删除设备树二进制文件
$ rm -rf /boot/dtb-<kernel_release>-<localversion>

### 删除 Linux 内核本身
$ rm -vf /boot/{config,System,vmlinuz}-<kernel_release>-<localversion>

总结

这个过程不是一次简单的旅程,是吧?但是现在,我们终于抵达了终点。我们一起学习了手动编译 Linux 内核的全过程,包括安装依赖、获取和验证源码、解压源码、配置 Linux 内核、构建内核以及安装内核。

如果你喜欢这个详细的步骤指南,请给我留言反馈。如果在操作过程中遇到问题,也欢迎提出,让我知道!

(题图:MJ/853481c5-87e3-42aa-8ace-e9ddfa232f75)


via: https://itsfoss.com/compile-linux-kernel/

作者:Pratham Patel 选题:lujun9972 译者:ChatGPT 校对:wxy

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

这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始,Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。

以防你忘记,这是系列文章中的前一篇:Btrfs 详解:基础概念

简介

子卷 Subvolume 允许将一个 Btrfs 文件系统划分成多个独立的子文件系统。这意味着你可以从 Btrfs 文件系统挂载子卷,就好像它们是独立的文件系统。除此之外,例如,你还可以通过 限额组 qgroup (我们将在本系列的另一篇文章里介绍)定义子卷能够占据的最大空间,或者用子卷去包含或排除快照中的文件(我们会后面的文章中会讲到)。自 Fedora Linux 33 后每个 Fedora Workstation 和 Fedora Silverblue 默认安装过程中会利用子卷。在这篇文章中我们会介绍它是如何工作的。

下面你会找到很多关于子卷的例子。如果你想跟着操作,你必须拥有访问某些 Btrfs 文件系统的权限和 root 权限。你可以通过下面命令来验证你的 /home/ 目录是否是 Btrfs 。

$ findmnt -no FSTYPE /home
btrfs

这个命令会输出你 /home/ 目录的文件系统名。如果它是 btrfs,那就可以了。让我们创建一个新的目录去做实验:

$ mkdir ~/btrfs-subvolume-test
$ cd ~/btrfs-subvolume-test

在下面的文本中,你会看到很多像上面显示的那样的命令输出框。请在阅读/比较命令输出时请记住,框中的内容在行末会被换行。这使得识别跨多行的长行变得困难,降低了可读性。如果有疑问,试着调整浏览器窗口的大小,看看文本的变化!

创建和使用子卷

我们可以通过以下命令创建一个 Btrfs 子卷:

$ sudo btrfs subvolume create first
Create subvolume './first'

当我们检查当前目录,我们可以看到现在有一个名为 first 的新目录。注意到下面输出的第一个字符 d

$ ls -l
total 0
drwxr-xr-x. 1 root root 0 Oct 15 18:09 first

我们可以像常规目录一样操作它:我们可以重命名它,移动它,在里面创建新文件和目录,等等。注意到目录属于 root,所以我们必须以 root 身份去做这些事情。

如果它表现和看起来就像个目录,那我们如何知道这是不是一个 Btrfs 子卷呢?我们可以使用 btrfs 工具去列出所有子卷:

$ sudo btrfs subvolume list .
ID 256 gen 30 top level 5 path home
ID 257 gen 30 top level 5 path root
ID 258 gen 25 top level 257 path root/var/lib/machines
ID 259 gen 29 top level 256 path hartan/btrfs-subvolume-test/first

如果你安装的是最新的 Fedora Linux,且未修改过,你很可能会看到和上面一样的输出。我们会在之后检查 homeroot ,还有全部数字的含义。现在,我们看到在我们指定的路径下有一个子卷。我们可以将输出限制在我们当前位置下面的子卷:

$ sudo btrfs subvolume list -o .
ID 259 gen 29 top level 256 path home/hartan/btrfs-subvolume-test/first

让我们重命名子卷:

$ sudo mv first second
$ sudo btrfs subvolume list -o .
ID 259 gen 29 top level 256 path home/hartan/btrfs-subvolume-test/second

我们还可以嵌套子卷:

$ sudo btrfs subvolume create second/third
Create subvolume 'second/third'
$ sudo btrfs subvolume list .
ID 256 gen 34 top level 5 path home
ID 257 gen 37 top level 5 path root
ID 258 gen 25 top level 257 path root/var/lib/machines
ID 259 gen 37 top level 256 path hartan/btrfs-subvolume-test/second
ID 260 gen 37 top level 259 path hartan/btrfs-subvolume-test/second/third

我们也可以移除子卷,就像移除目录一样:

$ sudo rm -r second/third

或者通过特殊的 Btrfs 命令:

$ sudo btrfs subvolume delete second
Delete subvolume (no-commit): '/home/hartan/btrfs-subvolume-test/second'

像单独的文件系统一样操作子卷

前面的简介里说 Btrfs 子卷就好像单独的文件系统。这意味着我们可以挂载子卷并且传递一些挂载选项给它。我们先创建一个小的目录结构去更好的理解发生了什么:

$ mkdir -p a a/1 a/1/b
$ sudo btrfs subvolume create a/2
Create subvolume 'a/2'
$ sudo touch a/1/c a/1/b/d a/2/e

这就是目录结构的样子:

$ tree
.
└── a
    ├── 1
    │   ├── b
    │   │   └── d
    │   └── c
    └── 2
        └── e

4 directories, 3 files

验证现在这里有一个新的 Btrfs 子卷:

$ sudo btrfs subvolume list -o .
ID 261 gen 41 top level 256 path home/hartan/btrfs-subvolume-test/a/2

为了挂载子卷,我们必须知道 Btrfs 子卷所在的块设备路径。下面的命令会告诉我们:

$ findmnt -vno SOURCE /home/
/dev/vda3

现在我们挂载子卷。确保你将参数替换成你 PC 上的:

$ sudo mount -o subvol=home/hartan/btrfs-subvolume-test/a/2 /dev/vda3 a/1/b

观察到我们使用 -o 参数去提供额外的选项去挂载程序。在这里我们告诉它挂载在设备 /dev/vda3 上 btrfs 文件系统里名为 home/hartan/btrfs-subvolume-test/a/2 的子卷。这是 Btrfs 特有的选项,在其他文件系统里没有的。

我们可以看到目录结构变化了:

$ tree
.
└── a
    ├── 1
    │   ├── b
    │   │   └── e
    │   └── c
    └── 2
        └── e

4 directories, 3 files

现在文件 e 出现了两次, d 不见了。我们现在可以用两个不同的路径访问相同的 Btrfs 子卷。在一个路径的所有变化会被立刻反应在其他的位置:

$ sudo touch a/1/b/x
$ ls -lA a/2
total 0
-rw-r--r--. 1 root root 0 Oct 15 18:14 e
-rw-r--r--. 1 root root 0 Oct 15 18:16 x

让我们尝试更多的挂载选项。例如我们可以像这样以只读方式挂载子卷到 a/1/b(插入你 PC 的参数):

$ sudo umount a/1/b
$ sudo mount -o subvol=home/hartan/btrfs-subvolume-test/a/2,ro /dev/vda3 a/1/b

我们和上面使用相同的命令,除了我们加上了 ro 在末尾。现在我们不能在这个挂载点上创建文件:

$ sudo touch a/1/b/y
touch: cannot touch 'a/1/b/y': Read-only file system

但直接访问子卷仍然像之前一样:

$ sudo touch a/2/y
$ tree
.
└── a
    ├── 1
    │   ├── b
    │   │   ├── e
    │   │   ├── x
    │   │   └── y
    │   └── c
    └── 2
        ├── e
        ├── x
        └── y

4 directories, 7 files

在下一步之前不要忘记进行清理:

$ sudo rm -rf a
rm: cannot remove 'a/1/b/e': Read-only file system
rm: cannot remove 'a/1/b/x': Read-only file system
rm: cannot remove 'a/1/b/y': Read-only file system

天啊,发生了什么?噢,因为我们在上面挂载只读子卷,所以不能删除它。从文件系统的角度来看,删除是一种写入操作:为了删除 a/2/b/e,我们从父目录 a/1/b 的内容中删除目录项 e。换句话来说,我们必须 写入 a/1/b 去表明 e 不复存在。所以我们先卸载子卷,然后移除目录:

$ sudo umount a/1/b
$ sudo rm -rf a
$ tree
.

0 directories, 0 files

子卷 ID

还记得 btrfs subvolume list 命令的第一次输出吗?那包含了很多数字,让我们看看这些究竟什么。我在这里复制了输出,以便再次查看:

ID 256 gen 30 top level 5 path home
ID 257 gen 30 top level 5 path root
ID 258 gen 25 top level 257 path root/var/lib/machines
ID 259 gen 29 top level 256 path hartan/btrfs-subvolume-test/first

我们看到有三列数字,每个前面有一些字母来描述它们的作用。第一列是子卷 ID 。子卷 ID 在 Btrfs 文件系统是唯一的,而且唯一地标识子卷。这意味着名为 home 的子卷也可以用它的 ID 256 来引用。之前的挂载命令是这样写的:

$ sudo mount -o subvol=hartan/...

另外一个完全合法的选择是使用子卷 ID :

$ sudo mount -o subvolid=...

子卷 ID 从 256 开始,每创建一个子卷依次递增 1 。但是在这里有一个例外:文件系统的根的子卷名称总是为 /,并且子卷 ID 是 5 。没错,即使文件系统的根技术上也是一个子卷。这是不言而喻的,因此不会出现在 btrfs subvolume 的输出列表里。如果你没有用 subvolsubvolid 参数去挂载一个 Btrfs 文件系统,subvolid=5 的顶级子卷就是默认的挂载对象。下面我们会看到一个想要显式挂载文件系统根的例子。

第二列的数字是生成号,并且在每次 Btrfs 事务中递增。这几乎是一个内部的计数器,我们不会在这里讨论。

最后,第三列数字是 子卷的子卷 ID。在上面的输出我们可以看到子卷 homeroot 的父子卷 ID 都是 5。记住 ID 5 的特殊含义:这是文件系统的根。所以我们知道 homeroot 都是顶级子卷的子卷。另一方面 hartan/btrfs-subvolume-test.first 是子卷 ID 256(也就是 home)的子卷。

在下一节我们会看看子卷 roothome 是怎么来的。

检查 Fedora Linux 的默认子卷

当你从头创建一个新的 Btrfs 文件系统,里面是没有子卷的(当然,除了顶级子卷)。所以 Fedora Linux 里的 homeroot 子卷是哪里来的?

它们是安装程序在安装时创建的。传统的安装经常会为 //home 目录包含单独的文件系统分区。在启动时,它们通过恰当的挂载组成一个完整的文件系统。但这个方法有一个问题:除非你使用像 lvm 这样的技术,想在将来改变分区的大小是非常难的。因而你可能出现 //home 用完空间的情况,然而还有很多其他没被使用的分区和空间剩余。

因为 Btrfs 子卷全都是相同文件系统的一部分,它们共享底层文件系统提供的空间。还记得我们在上面创建的子卷吗?我们从未告诉 Btrfs 它们多大:一个子卷可以占据文件系统拥有的全部空间,默认是不会阻止这种行为的。但是,我们 可以 通过 Btrfs 的 限额组 qgroup 动态地约束其大小,同时也可以在运行时修改(我们将在后续的文章中了解如何做的)。

另外一个分离 //home 的优势是我们可以分别进行 快照 。子卷是快照的边界,对一个子卷的快照永远不会包含该子卷下面的其他子卷的内容。快照的更多细节会在后续的文章中介绍。

理论已经足够了!我们来看看这是怎么回事。首先确保你的根文件系统类型是 Btrfs :

$ findmnt -no FSTYPE /
btrfs

然后我们获取它所在的分区:

$ findmnt -vno SOURCE /
/dev/vda3

记住我们可以通过特殊的子卷 ID 5 挂载文件系统的根(适应文件系统分区!):

$ mkdir fedora-rootsubvol
$ sudo mount -o subvolid=5 /dev/vda3 ./fedora-rootsubvol
$ ls fedora-rootsubvol/
home  root

而且还有 Fedora Linux 安装的子卷!但 Fedora Linux 是如何知道子卷 root 属于 / ,而 home 属于 /home 的呢?

文件 /etc/fstab 包含了所谓的文件系统的静态信息。简而言之,在你系统启动的时候会一行一行地读取这个文件,然后挂载那里列出的所有文件系统。在我的系统上,这个文件长这样:

$ cat /etc/fstab
# [ ... ]
# /etc/fstab
# Created by anaconda on Sat Oct 15 12:01:57 2022
# [ ... ]
#
UUID=5e4e42bb-4f2f-4f0e-895f-d1a46ea47807 /                       btrfs   subvol=root,compress=zstd:1 0 0
UUID=e3a798a8-b8f2-40ca-9da7-5e292a6412aa /boot                   ext4    defaults        1 2
UUID=5e4e42bb-4f2f-4f0e-895f-d1a46ea47807 /home                   btrfs   subvol=home,compress=zstd:1 0 0

(注意上面的 “UUID” 开头行的内容被换行成两行)

每行开头的 UUID 用于标识你系统上的硬盘和文件系统分区(大概相当于我在上面使用的 /dev/vda3 )。第二列是文件系统应该挂载在文件系统树上的路径。第三列是文件系统类型。我们可以看到 //home 都是 btrfs 类型,正如我们期望的那样!最后,第四列是:这些是挂载选项,这里说通过 subvol=root 选项去挂载 / 。这正是我们一直在 btrfs subvolume list / 里看到的输出!

有了这些信息,我们可以重新构建创建这个文件系统项的 mount 命令

$ sudo mount -o subvol=root,compress=zstd:1 UUID=5e4e42bb-4f2f-4f0e-895f-d1a46ea47807 /

(再次,上面的 “UUID” 开头行的内容被换行成两行)

这就是 Fedora Linux 如何使用 Btrfs 子卷!如果你对好奇 Fedora Linux 为什么选择 Btrfs 作为默认的文件系统,请参阅下面链接的更改提议 [1]

Btrfs 子卷的更多内容

Btrfs 维基提供了关于子卷的更多信息,其中最重要的是可应用于 Btrfs 子卷的挂载选项。有些选项,比如 compress 只能应用到文件系统的层面,因而会影响一个 Btrfs 文件系统的所有子卷。你可以通过下面的链接找到entry [2]

如果你对哪些目录是普通目录和哪些是子卷有困惑,你可以对你的子卷采用特殊的命名约定。例如,你可以给子卷名加上 @ 前缀去方便区分。

现在你知道子卷表现得就像文件系统,有人可能会问如何才能最好地将子卷放置在特定位置。比如你想要一个 Btrfs 子卷在 ~/games 下面,然而你的主目录(~)本身就是一个子卷,你该如何实现呢?鉴于上面的例子,你可以使用像 sudo btrfs subvolume create ~/games 的命令。这样,你创建了所谓的 嵌套 子卷:在你的子卷 ~ 里,有一个子卷 games 。这正是一种达成目的的方法。

其他有效的方法就是如同 Fedora 默认行为那样:在根子卷下创建所有子卷(也就是它们的父子卷 ID 是 5 ),然后挂载它们到特定的位置。Btrfs 维基有这些方法的概述和对于各自文件系统管理影响的简短讨论 [3]

总结

在本文中,我们探索了 Btrfs 子卷,它们像是 Btrfs 文件系统内部的独立的 Btrfs 文件系统。我们学习了如何创建、挂载和删除子卷。最后,我们探讨了 Fedora Linux 如何在我们完全没有注意到的情况下使用子卷。

本系列的下一篇文章将讨论:

  • 快照 - 回到过去
  • 压缩 - 透明地节省存储空间
  • 配额组 - 限制文件系统大小
  • RAID - 替代 mdadm 配置

如果你还想了解与 Btrfs 相关的其他主题,请查看 Btrfs 维基 [4] 和文档 [5] 。不要忘记查看本系列的第一篇文章(如果你还没有看过的话)!如果你认为本系列文章缺少了一些内容,请在下面的评论中告诉我们。再会!

参考资料

  1. https://fedoraproject.org/wiki/Changes/BtrfsByDefault#Benefit_to_Fedora ↩︎
  2. https://btrfs.readthedocs.io/en/latest/Subvolumes.html ↩︎
  3. https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Layout ↩︎
  4. https://btrfs.wiki.kernel.org/index.php/Main_Page ↩︎
  5. https://btrfs.readthedocs.io/en/latest/Introduction.html ↩︎

(题图:MJ/f047ea87-2490-40e5-9f91-d48d236675e5)


via: https://fedoramagazine.org/working-with-btrfs-subvolumes/

作者:Andreas Hartmann 选题:lujun9972 译者:A2ureStone 校对:wxy

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

尝试添加一个 PPA,却在 Ubuntu 中收到 “无法添加 PPA: 此 PPA 不支持 xyz” 的错误?下面是解决这一错误的方法。

这是一个场景。你正在尝试使用 PPA 在 Ubuntu 中安装软件。

你使用 sudo add-apt-repository 添加 PPA 仓库,当它更新包缓存时,会出现错误:

Cannot add PPA: "This PPA does not support xyz

其中 “xyz” 是 你正在使用的 Ubuntu 版本的代号

? 这就是发生这种情况的原因以及你可以采取的措施:

  • PPA 不适用于你正在使用的 Ubuntu 版本
  • 你应该寻找其他来源来安装该应用
  • 如果绝望了,你可以从 PPA 网页下载 .deb 文件

我将详细讨论以上所有内容。

检查 PPA 是否适用于你的 Ubuntu 版本

首先,在终端中使用以下命令获取 Ubuntu 版本和代号的详细信息:

lsb_release -a

输出将包含详细信息:

Here, I am using Ubuntu version 23.04 that case codename lunar

现在,访问托管所有 PPA 的 Ubuntu 的 Launchpad 网站:

进入 Launchpad PPA

在这里,查找困扰你的 PPA。为此,你必须使用 PPA 维护者的名字。

例如,如果 ppa:jstaf/onedriver 造成问题,请搜索维护者 jstaf

Enter the PPA's maintainer name and search for it

一名维护者可能拥有多个软件仓库。单击你要安装的那个。

在里,你应该在 “ 发布于 Published in ” 旁边的下拉按钮选择 “ 所有系列 Any Series ”。

Click on Any series dropdown button to see the supported Ubuntu versions

检查你是否看到你正在使用的 Ubuntu 版本的代号。如果不存在,那么此 PPA 不适用于你的 Ubuntu 版本。

如果 PPA 不支持你的 Ubuntu 版本,你该怎么办

你会看到,开发人员(或维护人员)创建一个仓库并使该软件可用于他们正在使用的 Ubuntu 版本。

随着时间的推移,Ubuntu 发布了更新的版本。现在,一位活跃的维护者将发布新 Ubuntu 版本的软件。但情况并非总是如此。如果维护者不再活跃,那么将不会更新。像你这样尝试遵循教程说明的人将会看到此错误。

现在,你有两个选择:

选项 1:在其他地方寻找该软件

这里有几种可能性。

新版 Ubuntu 可能也可以通过其他 PPA 获得相同的软件。请在 Launchpad 网站或互联网上查找。

这是怎么发生的?许多原始软件开发人员只是发布源代码,因此一些志愿者创建 Debian 软件包并从 Launchpad 分发它,以便像你这样的 Ubuntu 用户可以轻松安装该软件。不止一名志愿者可以为同一软件创建自己的个人包存档(PPA)。你应该使用活跃的一个。

例如,如果我查找 onedriver 包,我可以看到它可能在另一个名为 Ubuntu deployment 的 PPA 中可用。

另一个方式是查看该包是否以其他格式提供,例如 Snap、Flatpak、AppImage。

在极少数情况下,该软件可能已经在 Ubuntu 仓库中可用。

为此,你必须是一个聪明的用户并在互联网上进行搜索。如果你找到其他包格式,那就太好了。否则,下一步就是绝望。

选项 2:从 PPA 下载 deb 文件

PPA 仓库为你提供 Debian 软件包。添加仓库后,你还可以直接通过系统更新获得更新(如果有)。

如果你的 Ubuntu 版本的 PPA 没有更新,并且你在其他地方找不到该软件,你可以尝试从 PPA Launchpad 页面下载 deb 软件包。

在包详细信息页面上,单击展开符号并查找 deb 文件。除非你使用类似树莓派的主板,否则你应该选择 amd64。

Download deb package from PPA

? 如果软件太旧,下载的 deb 包可能会因为依赖问题而无法安装成功。此外,你将不会获得已安装软件包的更新(如果已安装)。不过,这个方法还是值得一试。

结论

尽管 Canonical 在大力推动 Snap 打包,PPA 仍然是用户在 Ubuntu 中安装第三方应用的最爱。

但 PPA 也有其自身的麻烦,而不能添加 PPA 错误就是其中之一。同样的问题还会导致 “仓库没有发布文件” 错误。

我希望现在这个问题更加清楚了。如果你仍有疑问,请告诉我。

(题图:MJ/d1013502-d518-4bc8-896c-d8dddd15ae22)


via: https://itsfoss.com/cannot-add-ppa-error/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

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

简单易学的指南,帮助你在 Windows 上安装 Oracle VirtualBox,以便在虚拟机中安装 Linux。

VirtualBox 是 最好的虚拟化软件 之一。

如果你想 使用 Windows 上的 VirtualBox,在虚拟机中安装 Linux,第一步是安装 VirtualBox 应用本身。

我们已经介绍了 在 Ubuntu 上安装 VirtualBox 的教程。让我重点介绍 Windows 系统的步骤。

对于最新的 Windows 10 或 11 及更早版本,步骤将相同。在 Windows 上安装 Oracle VirtualBox 的两种简单方法:

  1. 下载 Windows 版安装程序并按照屏幕上的说明进行操作
  2. 使用 winget 工具

1、使用 Windows 安装程序

要开始使用,请前往 VirtualBox 的官方下载页面。单击 “Windows host” 选项下载 .exe 安装程序。

下载安装程序(.exe)文件后,启动它后将执行以下操作:

安装指导允许你选择安装位置。你应该坚持使用 C: 驱动器上的默认设置,以确保安装 VirtualBox 所需的所有内容,使其按预期工作。

安装过程包括设置虚拟网络接口。因此,你的网络此时可能会被重置。确保安装时没有连接到任何重要的东西。

在对网络功能进行重整的同时,还需要处理一些依赖关系。

需要安装 Python 核心包才能使 Python 绑定正常工作。如果你不想使用 Python 脚本控制虚拟机,则不一定需要安装它。

但是,如果你认为将来可能需要它们,则应该将其与它一起安装。

现在,最终的安装过程将根据你上面的偏好开始,并且它将向你提供在关闭安装程序时启动 VirtualBox 的选项。

2、使用 winget 工具

winget 命令行工具使用 Windows 包管理器在 Windows 10 和 11 上搜索、安装、升级、删除和配置应用。

如果你更喜欢使用命令行,那么这就是适合你的方法。

首先,你需要以管理员身份启动命令提示符

接下来,你需要使用 winget 命令来安装 VirtualBox。

这是要输入的命令:

winget install Oracle.VirtualBox
? 如果你是第一次使用 winget,它会要求你同意这些条款。你需要接受它们才能继续使用它,同时你的一些数据(例如区域)将发送到微软商店。

下一步是启用虚拟化

你可以注意到,这两种方法都会安装适用于 Windows 的最新 VirtualBox 软件包。因此,你可以开始使用 VirtualBox 来创建和管理虚拟机。

但安装 VirtualBox 只是第一步。你应该通过调整一些设置来 确保你的 Windows 系统已做好虚拟化准备。以下是更多详细信息。

让你的 Windows 系统为虚拟机做好准备

? 你在流程中遇到过任何问题吗?你更喜欢哪种方法?请在下面的评论中告诉我。

(题图:MJ/ac593dfb-8d50-4e77-a3d7-6b772bcfc870)


via: https://itsfoss.com/install-virtualbox-windows/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:校对者ID

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

利用 Just Perfection GNOME 扩展为你的 Linux 桌面带来全新的个性化定制体验。

GNOME 在 Linux 界中备受喜爱,是 最热门的桌面环境 之一。

然而,讨论到 GNOME 的可定制程度,你会发现与 KDE 相比,可供选择的选项相对较少。

这并不意味着我们无法 定制 GNOME。图形化的界面工具 GNOME 调整 GNOME Tweaks 让你能轻松改变一些常规配置。而对于更深层次的设置更改,可以使用 dconf 编辑器,不过这对许多人可能略显复杂。

在此,我想向你推荐一款名叫 Just Perfection 的 GNOME 扩展,它帮助你一次性修改桌面的多种设置。

Just Perfection,一款全能扩展 ?

如果 Just Perfection 扩展的名称是 “Do it all” 或许会更符合其特性。我在后续的功能介绍中会更详细地解释此扩展的用途。

通过使用这个扩展,你可以进行诸如设置 停靠区 Dock 、通知面板、图标,以及调整与 GNOME 交互方式等一系列的微调。

Just Perfection 这款工具有以下一些核心特性:

  • 提供 4 个预设的用户配置文件
  • 可以启用/禁用 super 键、动画、面板、时钟、日历等功能
  • 可以启用/禁用应用菜单、面板通知、电源图标及活动状态的图标显示
  • 可以个性化调整面板、通知栏、OSD 位置(音量/亮度弹出)、窗口尺寸,以及在按下 Alt + Tab 时的应用程序预览
  • 可以调整工作空间预览的行为、是否展示工作空间切换器、应用网格的打开方式等等

这些功能听起来确实令人期待,对吗?

Just Perfection 的安装方法

Linux 上安装 GNOME 扩展有 多种途径。其中一个是通过网页浏览器来进行安装。

若要使用网页浏览器进行安装,请访问其官方下载页面:

获取 Just Perfection

在完成安装之后,你可以在下载页面看到一个设置图标,点击它,就会弹出一个对话框,你可以在其中调整 Just Perfection 扩展的设置:

Just Perfection GNOME 扩展的使用方法

使用这款扩展最方便的方法,就是选择四个预先配置好的用户配置之一。

虽然这一步是可选的,我还是建议启用“覆盖 Shell 主题”的选项,这样可以让你的桌面更具视觉吸引力:

一旦做了这个操作,它会自动切换到 Custom 用户配置,同时使停靠区背景变为透明。

关于各个用户配置文件的简述:

  • Default:默认文件,不会做出任何改变,但如果你启用了覆盖 Shell 的选项,它会稍微缩小面板和停靠区的尺寸。
  • Custom:在启用且覆盖 Shell 选项后生效,可将停靠区背景变为透明。
  • Minimal:减少停靠区和面板的尺寸,增加更多的屏幕工作区域。
  • Super Minimal:移除停靠区和面板,给予你一个干净的视野和最大的屏幕工作空间。

以下是在切换这些用户配置文件时的预期效果情况:

现在,你可以启用或禁用各种选项,来定制你理想的桌面环境。

使用 Just Perfection 创造简洁的桌面环境

在本节,我将展示如何实现一个由 Linux Mint 的 Cinnamon 桌面启发的简约桌面体验,其视觉效果如下:

下图是在切换工作空间时的显示效果:

为了使我的桌面看起来如上所示的简约,我进行了以下设定:

  • 透明的停靠区定位于右侧(可在系统菜单中设置)
  • 将面板位置调整到底部
  • 从面板中移除 应用 Application 菜单及 活动 Activities
  • 将时钟调整到左下角
  • 设置通知弹出位置为左下角
  • 启用工作区切换器
  • 增大工作区概览面板的半径

不过这些步骤可根据个人喜好进行跳过。

1、将透明的停靠区定位在右侧

要实现透明的停靠区,你需要在 “ 用户配置 Profile ” 菜单中选取 Custom 配置文件,并启用 “ Shell 主题 Shell Theme ” 选项即可:

如果你使用的是 Ubuntu 的最新版本,你可以在系统菜单中找到调整停靠区位置的选项。

首先,在系统菜单中打开设置,然后进入 “ 外观 Appearance ” 菜单。在 “ 停靠区 Dock ” 部分,你会找到 “ 在屏幕上的位置 Position on screen ” 选项。

在这里选择 “ 右侧 Right ” 即可:

对于使用较旧 GNOME 版本的用户,你可能无法找到这个菜单。

然而,不必担心,你可以 安装名为 Dash to Dock 的扩展 来获得相同的效果。

在此,你需进行以下两个设置:

  • 将屏幕上的位置选项设为 “ 右侧 Right
  • 如果已经选中了面板模式,取消选中即可

2、将面板定位至底部

要将面板定位至底部,前往 “ 定制 Customize ” 菜单,找到 “ 面板位置 Panel Position ” 选项。

双击这个选项并选择 “ 底部 Bottom ”:

3、将时钟位置设定在左下角

过去的六个月里我一直在以此方式使用时钟,这对我的工作流程帮助很大。简单说,你会更频繁地看时钟,以此更快地对时间有所感触。

这也让桌面看起来更好!

要更改时钟位置,进入 “定制” 菜单,然后找到 “ 时钟菜单位置 Clock Menu Position ” 选项,选择 “ 左侧 Left ”:

4、移除应用菜单和活动按钮

我注意到用户中鲜有人使用这两个选项,因此移除它们不失为一种方式,这样可以使界面看上去更清晰简洁。

要达到目的,你需要前往 “ 视觉 Visibility ” 菜单,然后取消以下两个选项:

  • 活动按钮
  • 应用菜单

5、将通知弹窗定位至右下角

因为面板自身已经被移动到底部,所以(至少对我来说)将弹窗放在顶部毫无意义。而且,相比从顶部,从底部阅读信息要更加方便。

为此,你需要做以下两步:

  • 前往 “定制” 菜单
  • 在 “ 提示栏位置 Notification Banner Position ` 中选择 “ 底部末端 Bottom End ”。

6、启用工作区切换器

当你在预览多个工作区的活动时,工作区切换器可以显示每个工作区的预览。

可能有些混淆?启用后的样子如下:

这样,你只需要按下 super 键,就可以清楚地查看在每个工作区中发生的事情。

当然,你同样可以通过(按两下 super 键)打开系统菜单来获得相同的视角,但为何要浪费一次按键并打开系统菜单,而不是在预览窗口中就实现呢?

要启用这个功能,需要以下三步:

  • 前往 “ 行为 Behavior ” 菜单并打开 “ 始终显示工作区切换器 Always Show Workspace Switcher
  • 进入 “ 定制 Customize ” 菜单
  • 为 “ 工作区切换器大小 Workspace Switcher Size ” 选择 11%

我增加工作区切换器大小的原因是,我觉得默认的视图尺寸相对较小。

7、增大工作区概览面板的圆角半径

我非常喜欢圆角设计,尤其是当它应用在工作区概览面板上时,当壁纸与设置相得益彰时尤为如此。

这就是应用上述设置后的效果:

要增加工作区概览面板圆角的半径,你需要:

  • 前往 “定制” 菜单
  • 在 “ 工作区背景圆角尺寸 Workspace Background Corner Size ” 中选择 60px (这是最大的设置值)

关于 GNOME 更深层次的自定义

如果你是 Ubuntu 的新手,那么我们有一份详细的指南,可以带你熟悉 如何自定义 GNOME

如何自定义 GNOME

下面会演示如何使用 GNOME Tweak 工具来提升 GNOME 的使用感受:

在 Ubuntu 等 Linux 下安装和使用 GNOME 调整工具

我希望这篇指南能对你有所帮助。

(题图:MJ/a7937194-0bf3-4626-99b6-4fbba1790314)


via: https://itsfoss.com/just-perfection-gnome-extension/

作者:Sagar Sharma 选题:lujun9972 译者:ChatGPT 校对:wxy

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