从现有 Linux 系统安装 Arch Linux
本文档描述了从运行中的 Linux 主机系统引导安装 Arch Linux 所需的引导过程。引导完成后,安装过程将按照安装指南进行。
从运行中的 Linux 系统安装 Arch Linux 的用途包括:
- 远程安装 Arch Linux,例如(虚拟)根服务器。
- 不使用安装介质替换现有 Linux 系统(参见 #不使用安装介质替换现有系统)。
- 创建新的 Linux 发行版或基于 Arch Linux 的 LiveMedia。
- 创建 Arch Linux chroot 环境,例如用于 Docker 基础容器。
- 为无盘机器提供基于 NFS 的 rootfs。
引导过程的目标是建立一个环境,从中可以运行arch-install-scripts 包中的脚本(如 pacstrap(8) 和 arch-chroot(8))。
如果宿主系统运行的是 Arch Linux,只需安装arch-install-scripts 即可。如果宿主系统运行的是其他 Linux 发行版,您将首先需要设置一个基于 Arch Linux 的 chroot 环境。
备份与准备
备份所有数据,包括邮件、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 安装
按照 安装指南#安装 进行。
在此过程中,第一步 安装指南#选择镜像 可以跳过,因为宿主系统应该已经有一个正确的 mirrorlist。
- pacstrap 将使用宿主系统的
/etc/pacman.conf配置以及 pacman hook。参见 archlinux/arch-install-scripts#60。如果您的设置与标准不同(例如,您的 pacman 配置中有Noextract=行),这也会影响新安装。 - 如果需要,下载 默认的 pacman.conf 并使用 pacstrap 的
-C选项指向它。
-c 选项来使用您宿主机的软件包缓存。复制现有 Arch 安装
可以通过将宿主文件系统复制到新分区并进行一些调整使其可启动且唯一,来复制现有的 Arch Linux 安装。
第一步是将宿主文件复制到已挂载的新分区。为此,请考虑使用 rsync#完整系统备份 中展示的方法。
然后,按照 安装指南#配置系统 中描述的过程进行,但有一些注意事项和额外的步骤:
- 安装指南#时间、安装指南#本地化 和 安装指南#根密码 可以跳过。
- 安装指南#Initramfs 可能会需要,尤其是在更改文件系统时。例如,从 ext4 更改为 Btrfs。(如果在这一步出现错误,请在安装引导加载程序后返回此步骤。)
- 关于 安装指南#引导加载程序,有必要重新安装引导加载程序。
- 删除
/etc/machine-id并使用 systemd-machine-id-setup(1) 创建一个新的。
如果复制的 Arch 安装可能在不同的配置或与不同的硬件一起使用,请考虑进行以下额外操作:
- 在 安装指南#引导加载程序 步骤中,使用适用于目标系统的 CPU 微码更新。
- 如果宿主系统上存在任何可能与目标系统不兼容的特定 Xorg#配置,请遵循 将现有安装迁移到(或移出)虚拟机#禁用任何与 Xorg 相关的配置文件。
- 进行任何其他适合目标系统的调整,例如重新配置网络或音频。
从运行其他 Linux 发行版的宿主系统进行安装
有多种工具可以自动化以下小节中描述的大部分步骤。请参阅它们各自的主页以获取详细说明。
- archstrap (Bash)
- digitalocean-debian-to-arch (重新分区磁盘,DigitalOcean 特定;**不执行 PGP 签名验证**)
- image-bootstrap (Python;**不执行 PGP 签名验证**)
- vps2arch (Bash;**不执行 PGP 签名验证**)
以下小节介绍手动方法。思路是让 pacman 直接在宿主系统上工作,或者在宿主系统内运行一个 Arch 系统,实际安装从 Arch 系统执行。嵌套的系统包含在一个 chroot 中。
使用宿主系统的 pacman
Pacman 可以在大多数 Linux 发行版上编译,并直接在宿主系统上用于引导 Arch Linux。arch-install-scripts 应该可以直接从下载的源代码在任何较新的发行版上运行。
一些发行版在其官方仓库中提供了 pacman 和/或 arch-install-scripts 的软件包,可用于此目的。截至 2020 年 7 月,已知 Void Linux 提供 pacman 包,Alpine Linux 和 Fedora 提供 pacman 和 arch-install-scripts。
创建 chroot 环境
从镜像下载引导 tarball 到 /tmp/。
从下载页面下载引导 tarball 的签名,并将其放在同一个目录中。不要从镜像下载。
解压 tarball
# tar xf /path-to-bootstrap-image/archlinux-bootstrap-x86_64.tar.zst --numeric-owner
注意最后的 --numeric-owner 选项,这对于在现有 Linux 系统使用与 Arch Linux 不同的 UID 和 GID 号时保留提取文件的正确 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
使用 chroot 环境
引导环境非常基础(没有 nano 或 lvm2)。因此,我们需要设置 pacman 以便下载其他必需的软件包。
初始化 pacman 密钥环
在开始安装之前,需要设置 pacman 密钥。运行以下命令:
# pacman-key --init # pacman-key --populate
有关详细信息,请参阅 pacman/软件包签名#初始化密钥环。
下载基础工具
刷新软件包列表并安装您需要的:base-devel、parted 等。
error: could not determine cachedir mount point /var/cache/pacman/pkg 错误。解决方法是在 chroot 之前运行:# 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 解决方案并启用其服务器实例在启动时自动启动。
- 设置您的网络配置,以便在启动时自动建立连接。
- 设置引导加载程序并配置它以使用您之前分配的 swap 分区作为根分区。您可能希望配置您的引导加载程序以便能够启动到旧系统;为此,重用服务器现有的
/boot分区在新系统中会很有帮助。
不使用安装介质替换现有系统
在磁盘上找到约 700 MiB 的可用空间,例如通过分区一个 swap 分区。您可以禁用 swap 分区并将其用于设置您的系统。
将旧的 swap 分区设为新的根分区
检查 cfdisk、/proc/swaps 或 /etc/fstab 以找到您的 swap 分区。假设您的硬盘位于 sdaX(X 将是一个数字)。
执行以下操作:
禁用 swap 空间
# 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
安装
安装必需的软件包和任何其他需要的软件包,以便在临时分区中运行一个具有互联网连接的系统,并注意约 700 MiB 的空间限制。在指定 pacstrap 要安装的软件包时,请考虑添加 -c 标志以避免通过将软件包下载到宿主系统而占用宝贵的空间。
新 Arch Linux 系统安装完成后,修复引导加载程序配置,然后重启到新创建的系统,并rsync 整个系统到主分区。