从现有 Linux 安装 Arch Linux

出自 ArchWiki

本文档描述了从正在运行的 Linux 主机系统引导安装 Arch Linux 所需的引导过程。引导完成后,安装过程将按照安装指南中的描述进行。

从正在运行的 Linux 安装 Arch Linux 适用于

引导过程的目标是建立一个环境,从中可以运行 arch-install-scripts(例如 pacstrap(8)arch-chroot(8))中的脚本。

如果主机系统运行的是 Arch Linux,则只需安装 arch-install-scripts 即可实现。如果主机系统运行的是另一个 Linux 发行版,则首先需要设置一个基于 Arch Linux 的 chroot。

注意: 本指南要求现有主机系统能够执行新的目标 Arch Linux 架构程序。这意味着它必须是 x86_64 主机。
警告: 请确保在继续之前了解每个步骤。很容易破坏您的系统或丢失数据!

备份和准备

备份所有数据,包括邮件、Web 服务器等。将所有信息掌握在手。保留所有服务器配置、主机名等。

以下是您可能需要的数据列表

  • IP 地址
  • 主机名(注意:根服务器通常也是提供商域的一部分,删除之前检查或保存您的 /etc/hosts
  • DNS 服务器(检查 /etc/resolv.conf
  • SSH 密钥(如果其他人使用您的服务器,他们将不得不接受新的密钥,否则将无法访问。这包括来自您的 Apache、邮件服务器、SSH 服务器和其他服务器的密钥。)
  • 硬件信息(网卡等。请参阅您预装的 /etc/modules.conf
  • 引导加载程序配置文件。

一般来说,最好在本地硬盘驱动器上保留原始 /etc 目录的本地副本。

从运行 Arch Linux 的主机

安装 arch-install-scripts 软件包。

按照安装指南#挂载文件系统挂载将用于根目录的文件系统以及所有其他需要的挂载点。如果您已经将 /mnt 目录用于其他用途,只需创建另一个目录,例如 /mnt/install,并将其用作其余安装的挂载点基础。

在此阶段,可以从头开始安装 Arch Linux,也可以镜像主机安装。以下描述了两种选择。

创建新的 Arch 安装

按照安装指南#安装进行操作。

在该过程中,可以跳过第一步安装指南#选择镜像,因为主机应该已经有一个正确的镜像列表。

警告: pacstrap 将使用来自主机的 /etc/pacman.conf 配置以及 pacman 钩子。请参阅 archlinux/arch-install-scripts#60。如果您的设置与标准设置不同(例如,您的 pacman 配置中有 Noextract= 行),这将也会影响新的安装。
提示: 为了避免重新下载所有软件包,请考虑遵循 Pacman/技巧和窍门#网络共享 pacman 缓存,或者使用 pacstrap-c 选项来使用您主机机器的软件包缓存。

创建现有 Arch 安装的副本

可以通过将主机文件系统复制到新分区并对其进行一些调整以使其可启动且唯一,从而复制现有的 Arch Linux 安装。

第一步是将主机文件复制到挂载的新分区中,为此,请考虑使用 rsync#完整系统备份 中展示的方法。

然后,按照 安装指南#配置系统 中描述的过程进行操作,但有一些注意事项和额外的步骤

如果镜像的 Arch 安装可能在不同的配置或不同的硬件中使用,请考虑以下附加操作

从运行其他 Linux 发行版的主机

有多种工具可以自动化以下小节中描述的大部分步骤。有关详细说明,请参阅它们各自的主页。

以下小节介绍了手动方法。其思路是让 pacman 直接在主机系统上工作,或者在主机系统内部运行 Arch 系统,实际安装从 Arch 系统执行。嵌套系统包含在 chroot 中。

从主机系统使用 pacman

Pacman 可以在大多数 Linux 发行版上编译,并直接在主机系统上使用以引导 Arch Linux。arch-install-scripts 应该可以在任何最新的发行版上直接从下载的源代码运行而不会出现问题。

一些发行版在其官方存储库中为 pacman 和/或 arch-install-scripts 提供了软件包,可以用于此目的。截至 2020 年 7 月,已知 Void Linux 提供了 pacman 软件包,Alpine Linux 和 Fedora 已知同时提供了 pacmanarch-install-scripts

创建 chroot

下面介绍了两种设置和进入 chroot 的方法,从最简单到最复杂。仅选择两种方法中的一种。然后,继续 #使用 chroot 环境

方法 A:使用引导 tarball(推荐)

镜像 下载引导 tarball 到 /tmp/

下载页面 下载引导 tarball 签名,并将其放置在同一目录中。不要从镜像下载。

使用 GnuPG 验证签名.

提取 tarball

# tar xf /path-to-bootstrap-image/archlinux-bootstrap-x86_64.tar.zst --numeric-owner

请注意最后的 --numeric-owner 选项,这对于在现有 Linux 系统使用与 Arch Linux 不同的数字时,保留提取文件的正确 UID 和 GID 编号非常重要。

通过编辑 /tmp/root.x86_64/etc/pacman.d/mirrorlist 选择存储库服务器。

进入 chroot

  • 如果安装了 bash 4 或更高版本,并且 unshare 支持 --fork--pid 选项(util-linux 2.24 或更高版本)
    # /tmp/root.x86_64/bin/arch-chroot /tmp/root.x86_64/
  • 否则,运行以下命令
# mount --bind /tmp/root.x86_64 /tmp/root.x86_64
# cd /tmp/root.x86_64
# cp /etc/resolv.conf etc
# mount -t proc /proc proc
# mount --make-rslave --rbind /sys sys
# mount --make-rslave --rbind /dev dev
# mount --make-rslave --rbind /run run    # (assuming /run exists on the system)
# chroot /tmp/root.x86_64 /bin/bash

方法 B:使用安装环境的根文件系统镜像

本文或章节正在考虑移除。

原因: 提取根文件系统镜像(airootfs.sfs)或复制 live 环境的根文件系统不是受支持的安装方法airootfs.sfs 包含不适合或不安全用于已安装系统的自定义配置。(在 Talk:Install Arch Linux from existing Linux 中讨论)

可以挂载最新 Arch Linux 安装介质的根镜像,然后 chroot 进入其中。此方法的优点是在主机系统内提供可用的 Arch Linux 安装,而无需通过安装特定软件包来准备它。

注意: 在继续之前,请确保主机系统上安装了最新版本的 squashfs-tools。否则,可能会出现如下错误:FATAL ERROR aborting: uncompress_inode_table: failed to read block

根镜像可以在 镜像 之一的 iso/latest/arch/x86_64/ 下找到。squashfs 格式不可编辑,因此我们解压缩根镜像并挂载它。

要解压缩根镜像,请运行

# unsquashfs airootfs.sfs
注意: 在低内存系统上,您可能会在解压缩和提取完成之前遇到 killed 错误。您可以更改 unsquash 命令以使用更少的内存。此示例命令使用 32 MiB 内存:unsquashfs -da 16 -fr 16 airootfs.sfs

通过编辑 squashfs-root/etc/pacman.d/mirrorlist 选择存储库服务器。

chroot 到解压缩的根镜像之前,我们需要设置一些挂载点并复制 resolv.conf 以进行联网。

# mount --bind squashfs-root squashfs-root
# mount -t proc none squashfs-root/proc
# mount -t sysfs none squashfs-root/sys
# mount -o bind /dev squashfs-root/dev
# mount -o bind /dev/pts squashfs-root/dev/pts  ## important for pacman (for signature check)
# cp -L /etc/resolv.conf squashfs-root/etc  ## this is needed to use networking within the chroot

现在,一切都已准备就绪,可以 chroot 进入新安装的 Arch 环境

# chroot squashfs-root bash

使用 chroot 环境

引导环境非常简陋(没有 nanolvm2)。因此,我们需要设置 pacman 以下载其他必要的软件包。

初始化 pacman 密钥环

在开始安装之前,需要设置 pacman 密钥。运行以下命令

# pacman-key --init
# pacman-key --populate

有关详细信息,请参阅 pacman/软件包签名#初始化密钥环

下载基本工具

刷新软件包列表安装您需要的:base-develparted 等。

本文或章节需要语言、wiki 语法或样式改进。请参阅 Help:Style 以供参考。

原因: 此错误在 arch-chroot(8) § DESCRIPTION 中进行了解释,应在此处链接。(在 Talk:Install Arch Linux from existing Linux 中讨论)
注意: 当您尝试使用 pacman 安装软件包时,您可能会遇到 error: could not determine cachedir mount point /var/cache/pacman/pkg。要解决此问题,请运行
# mount --bind directory-to-livecd-or-bootstrap directory-to-livecd-or-bootstrap
在 chroot 之前。请参阅 FS#46169

安装技巧

您现在可以继续 安装指南#挂载文件系统 并按照其余的 安装指南 进行操作。

某些主机系统或配置可能需要某些额外的步骤。请参阅以下部分以获取技巧。

基于 Debian 的主机

/dev/shm

在某些基于 Debian 的主机系统上,pacstrap 可能会产生以下错误

# pacstrap -K /mnt base
==> Creating install root at /mnt
mount: mount point /mnt/dev/shm is a symbolic link to nowhere
==> ERROR: failed to setup API filesystems in new root

这是因为在某些版本的 Debian 中,/dev/shm 指向 /run/shm,而在基于 Arch 的 chroot 中,/run/shm 不存在并且链接已断开。要纠正此错误,请创建一个目录 /run/shm

# mkdir /run/shm

基于 Fedora 的主机

在基于 Fedora 的主机和 Live USB 上,当使用 genfstab 生成 fstab 时,您可能会遇到问题。删除重复的条目以及出现的 seclabel 选项,因为这是 SELinux 特定的,并且会阻止您的系统正常启动。

重启前检查事项

在重启之前,请仔细检查安装中的一些细节,以实现成功安装。为此,首先 chroot 进入新安装的系统,然后

  • 创建一个带密码的用户,以便您可以通过 ssh 登录。这至关重要,因为自 OpenSSH-7.1p2 以来,默认情况下禁用了 root 登录。
  • 设置 root 密码,以便您以后可以通过 su 切换到 root
  • 安装 ssh 解决方案并 启用 其服务器实例以在启动时自动启动。
  • 设置您的 网络配置,以便在启动时自动启动连接。
  • 设置 引导加载程序 并将其配置为使用您之前指定的交换分区作为根分区。您可能希望将引导加载程序配置为能够启动到旧系统;为此,在新系统中重用服务器现有的 /boot 分区很有帮助。

在没有安装介质的情况下替换现有系统

在磁盘上的某个位置找到大约 700 MiB 的可用空间,例如通过分区交换分区。您可以禁用交换分区并在那里设置系统。

将旧的交换分区设置为新的根分区

检查 cfdisk/proc/swaps/etc/fstab 以查找您的交换分区。假设您的硬盘驱动器位于 sdaX 上(X 将是一个数字)。

执行以下操作

禁用交换空间

# swapoff /dev/sdaX

在它上面创建一个文件系统

# fdisk /dev/sda
(set /dev/sdaX ID field to "Linux" - Hex 83)
# mke2fs -j /dev/sdaX

创建一个目录以将其挂载在其中

# mkdir /mnt/newsys

最后,挂载新目录以安装中间系统。

# mount -t ext4 /dev/sdaX /mnt/newsys

安装

安装基本软件包和任何其他在临时分区中启动并运行具有 Internet 连接的系统所需的软件包,请注意 ~700 MiB 空间的限制。当指定要使用 pacstrap 安装的软件包时,请考虑添加 -c 标志以避免通过将软件包下载到主机系统来填满宝贵的空间。

安装新的 Arch Linux 系统后,修复引导加载程序配置,然后重启进入新创建的系统,并将 整个系统 rsync 到主分区。