从现有 Linux 系统安装 Arch Linux
本文档描述了从运行中的 Linux 主机系统安装 Arch Linux 所需的引导(bootstrapping)过程。引导完成后,安装过程将按照 安装指南 中所述进行。
从运行中的 Linux 安装 Arch Linux 在以下场景中非常有用:
- 远程安装 Arch Linux,例如(虚拟)根服务器
- 在没有安装介质的情况下替换现有的 Linux(参见 #在没有安装介质的情况下替换现有系统)
- 创建新的 Linux 发行版或 基于 Arch Linux 的 LiveMedia
- 创建 Arch Linux chroot 环境,例如用于 Docker 基础镜像
- 无盘机器的 rootfs-over-NFS
引导程序的目的是搭建一个环境,以便能够运行 arch-install-scripts 中的脚本(例如 pacstrap(8) 和 arch-chroot(8))。
如果主机系统运行的是 Arch Linux,只需安装 arch-install-scripts 即可实现。如果主机系统运行的是其他 Linux 发行版,则需要先建立一个基于 Arch Linux 的 chroot 环境。
备份与准备
备份所有数据,包括邮件、Web 服务器等。确保所有信息触手可及。保留所有服务器配置、主机名等。
以下是您可能需要的数据列表:
- IP 地址
- 主机名 (hostname),(注意:根服务器通常也是供应商域的一部分,在删除前请检查或保存您的
/etc/hosts) - DNS 服务器 (检查
/etc/resolv.conf) - SSH 密钥(如果其他人也在您的服务器上工作,他们必须接受新密钥,否则无法登录。这包括来自 Apache、邮件服务器、SSH 服务器等的密钥。)
- 硬件信息(网卡等。参考预安装的
/etc/modules.conf) - 引导加载程序(Boot loader)配置文件。
一般来说,在本地硬盘上保留一份原始 /etc 目录的副本是一个好主意。
从运行 Arch Linux 的主机安装
安装 arch-install-scripts 软件包。
参考 安装指南#挂载文件系统 来挂载将用于根目录的文件系统以及所有其他必要的挂载点。如果您已经将 /mnt 目录用于其他用途,只需创建另一个目录(如 /mnt/install)并将其作为后续安装的挂载点根目录即可。
在此阶段,Arch Linux 既可以从零开始安装,也可以镜像主机安装。以下描述了这两种选项。
创建新的 Arch 安装
参考 安装指南#安装。
在操作过程中,第一个步骤 安装指南#选择镜像源 可以跳过,因为主机应该已经拥有正确的镜像列表(mirrorlist)。
- pacstrap 将使用来自主机的
/etc/pacman.conf配置以及 pacman 钩子(hooks)。参见 archlinux/arch-install-scripts#60。如果您的配置与标准配置不同(例如,在 pacman 配置中有Noextract=行),这将同样影响新的安装。 - 如果需要,可以下载 默认的 pacman.conf,并使用 pacstrap 的
-C选项指向该文件。
-c 选项来使用主机机器的软件包缓存。创建现有 Arch 安装的副本
可以通过将主机文件系统复制到新分区,并进行一些调整使其可启动且唯一,从而复制现有的 Arch Linux 安装。
第一步是将主机文件复制到挂载的新分区,为此,请参考 rsync#全系统备份 中展示的方法。
然后,按照 安装指南#配置系统 中描述的步骤操作,但需注意以下几点并增加额外步骤:
- 安装指南#时间、安装指南#本地化 和 安装指南#Root 密码 可以跳过。
- 如果更改了文件系统(例如从 ext4 更改为 Btrfs),则可能需要执行 安装指南#Initramfs。(如果在这一步遇到错误,请在安装引导加载程序后再返回此步骤)
- 关于 安装指南#引导加载程序,必须重新安装引导加载程序。
- 删除
/etc/machine-id并使用 systemd-machine-id-setup(1) 创建一个新的。
如果镜像后的 Arch 安装将在不同的配置或硬件上使用,请考虑以下额外操作:
- 在执行 安装指南#引导加载程序 步骤期间,使用适配于目标系统的 CPU 微代码 (microcode) 更新
- 如果主机上存在特定的 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
从 镜像站 下载 bootstrap 压缩包到 /tmp/。
从 下载页面 下载 bootstrap 压缩包的签名,并将其放在同一目录下。不要从镜像站下载签名。
解压 tarball
# tar xf /path-to-bootstrap-image/archlinux-bootstrap-x86_64.tar.zst --numeric-owner
请注意最后的 --numeric-owner 选项,如果您的现有 Linux 系统使用的 UID 和 GID 数字与 Arch Linux 不同,该选项对于保留解压文件的正确数字 ID 至关重要。
通过编辑 /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参见 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 loader) 并将其配置为使用你之前预留的交换分区作为根分区。你可能希望配置引导加载程序以便能够启动进入旧系统;为此,在新系统中重新使用服务器现有的
/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
安装
在临时分区中安装必要软件包以及任何其他使系统能够联网运行所需的软件包,请注意约 700 MiB 的空间限制。在使用 pacstrap 指定要安装的软件包时,考虑添加 -c 标志,以避免因将软件包下载到宿主系统而占用宝贵的空间。
一旦新的 Arch Linux 系统安装完成,修复引导加载程序配置,然后重启进入新创建的系统,并将整个系统 rsync 到主分区。