跳转至内容

离线安装

来自 ArchWiki
警告 解压根文件系统镜像(airootfs.sfs)或复制 live 环境的根文件系统不是一个受支持的安装方法。airootfs.sfs 包含不适合或不安全的自定义配置,不适用于已安装的系统。

本文档提供了在没有互联网连接的系统上安装 Arch Linux 的说明。要实现此目的,需要另一台具有正常互联网连接的系统。

首先,遵循 安装指南,跳过需要互联网连接的步骤(例如 安装指南#连接到互联网),然后继续本指南,而不是遵循 安装指南#安装基本软件包

准备本地仓库

按照 Pacman/技巧和窍门#从 CD/DVD 或 U 盘安装软件包 中的说明,在另一台主机安装上准备包含所需文件的本地仓库。

至少,为了一个可运行的系统,建议安装以下软件包

# mkdir /tmp/blankdb
# pacman -Syw --cachedir $PWD --dbpath /tmp/blankdb base linux linux-firmware
提示 考虑添加其他需要的软件,请参阅 安装指南#安装基本软件包 以获取必要软件包的列表(例如文本编辑器)。

创建您的自定义离线仓库

# repo-add ./custom.db.tar.zst ./*[^sig]

本文或本章节的准确性存在争议。

原因: 上面的命令示例似乎不正确,因为它会产生:==> ERROR: 'some_filename.zst' is not a package file, skipping (在 Talk:Offline installation 中讨论)

挂载与配置

本文章或章节需要扩充。

原因: 添加关于将自定义仓库放在 ISO 中的可选说明。(在 Talk:Offline installation 中讨论)

准备好仓库后,将外部媒体连接到新安装的系统,并将其挂载到新创建的根文件系统上

# mount --mkdir /dev/sdxy /mnt/repo

编辑您的 archiso /etc/pacman.conf 并添加一个新的节

/etc/pacman.conf
[custom]
SigLevel = Optional
Server = file:///mnt/repo/

注释掉 [core][extra],这样 pacman 在访问默认仓库时就不会失败。

Pacstrap

默认情况下,pacman 的密钥环仅在 NTP 激活后(https://bbs.archlinux.org/viewtopic.php?id=283075)在 live 会话中初始化一次。如果 NTP 无法激活(例如,您没有互联网访问权限),您需要手动运行

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

在此之后,您可以继续使用 pacstrap 将您本地可用的软件包安装到新系统中

# pacstrap -K /mnt base linux linux-firmware
提示 在此命令中匹配 #准备本地仓库 中使用的软件包。

离线安装软件包

从文件安装

如果离线安装过程只是临时的,但在能够访问网络之前需要手动安装一些软件包,请参阅 pacman#附加命令 以了解如何安装本地软件包。

Shell 通配符可用于一次安装多个软件包

# pacman -U /package/folder/*.tar.zst

离线缓存

您可以将所需文件放入 /var/lib/pacman/sync/var/cache/pacman/pkg,以便 pacman 认为它拥有执行搜索、更新和安装所需的一切。以下方法基于两个论坛帖子:[1][2]

步骤如下

  1. 在有互联网连接的计算机上下载最新的软件包数据库,
  2. 将它们传输到离线计算机,
  3. 生成离线计算机更新所需的软件包列表,
  4. 在有互联网连接的计算机上下载它们及其签名,
  5. 将它们传输到离线计算机的 pacman 缓存中,
  6. 安装更新。
提示 如果您更改了默认仓库(core、extra 和 multilib),您应该检查您的 /etc/pacman.conf 文件。

以下脚本将下载更新的软件包数据库。如果需要,将 MIRROR 更改为 镜像状态列表中的任何一个镜像。

download_databases.sh
#!/bin/sh

ARCH="x86_64"
MIRROR="https://mirrors.kernel.org/archlinux/"

wget "${MIRROR}/core/os/${ARCH}/core.db"
wget "${MIRROR}/extra/os/${ARCH}/extra.db"
wget "${MIRROR}/multilib/os/${ARCH}/multilib.db"

# and possibly -uncomment- (if customized in /etc/pacman.conf or pacman.conf.d):

#wget "${MIRROR}/core-testing/os/${ARCH}/core-testing.db"
#wget "${MIRROR}/extra-testing/os/${ARCH}/extra-testing.db"
#wget "${MIRROR}/multilib-testing/os/${ARCH}/multilib-testing.db"

# and -additionally- debug and staging packages.

使脚本 可执行 并运行它。您将获得多个 .db 文件。

接下来的步骤是将 .db 文件传输到离线 PC,使其看起来像是您正在使用最新的软件包列表(如同您运行了 pacman -Sy),然后生成更新所需的软件包列表

# cp *.db /var/lib/pacman/sync/
# pacman -Sup --noconfirm > pkglist
注意 确保您已启用 /etc/pacman.d/mirrorlist 文件中定义的至少一个服务器。否则,您只会得到一个误导性的错误消息:error: no database for package: package-name

您还需要下载相应的软件包签名,所以准备好要下载签名的列表

# sed -e 's/\.zst$/.zst.sig/' ../pkglist > ../siglist

接下来,将这两个列表带到有互联网的地方,并在一个空目录中下载列出的软件包

# wget -nv -i ../pkglist
# wget -nv -i ../siglist
提示 当使用 cygwin 或其他 Windows 环境下载软件包时,文件名会因为 Windows 默认文件名要求转义冒号等字符而变得混乱。为避免这种情况(在 cygwin 下,因为它不遵循此类限制),请使用 wget --restrict-file-names=unix

将所有 *.pkg.tar.zst*.pkg.tar.zst.sig 文件带回家,将它们放在 /var/cache/pacman/pkg 中,最后运行

# pacman -Su

本地仓库

如果新系统预计将保持离线或气隙状态,应将其配置为仅期望本地仓库。

完整的仓库

chroot 进入新安装后,以与之前相同的方式编辑新的 /etc/pacman.conf(但没有 /mnt 前缀)

/etc/pacman.conf
[custom]
SigLevel = Optional
Server = file:///repo/

注释掉所有其他仓库并保存。按常规继续配置新系统。

从现在起,可以通过带来本地仓库的最新副本,将其挂载到 /repo 并像往常一样运行 pacman 命令来对离线系统进行任何更新。

参见