Install Arch Linux from existing Linux (简体中文)

From ArchWiki
翻译状态:本文是 Install_from_Existing_Linux翻译。上次翻译日期:2021-9-27。如果英文版本有所更改,则您可以帮助同步翻译。

本指南给出了从当前 Linux 发行版安装 Arch Linux 所需的准备步骤。 准备完成后的安装参考 Installation guide (简体中文)

从当前 Linux 发行版安装 Arch Linux 对以下情形有所帮助:

这些准备步骤的目的在于为搭建一个 arch-install-scripts(如 pacstraparch-root)可运行的环境。

如果当前系统是 Arch Linux,这个目的可通过在当前系统安装 arch-install-scripts 达成。如果当前系统不是 Arch Linux,可以构建基于 Arch Linux 的 chroot 环境。

注意: 本指南要求当前系统能够运行目标 Arch Linux 构架的程序。这意味着当前系统必须是 x86_64 架构。
警告: 在进行每一步前,确保你理解你在干什么,不然你很可能会造成系统损坏或关键数据损失。要请你的服务提供商恢复这些这些数据可能会花上不少钱。

备份和准备

备份你的所有数据,包括邮件、网页服务器等,把所有数据都放在手边。记录下你的服务器配置、hostname 等数据。

你可能会用到的数据:

  • IP 地址
  • hostname(s),(注意:根服务器可能是域名提供的一部份,在你删除 /etc/hosts 前先检查并备份)
  • DNS 服务器(检查 /etc/resolv.conf
  • SSH 密钥(如果其它人也要用你的服务器,如果你删除了 SSH 密钥,他们就需要新的密钥了。这些密钥可能来自:Apache、邮件服务器、SSH 服务器和其它服务)
  • 硬件信息(比如网卡,参考你的 /etc/modules.conf
  • Grub 配置

总之,在本地备份一份原本的 /etc 总不会错。

从一个正在运行 Arch Linux 的主机

安装 arch-install-scripts

参考 Installation guide (简体中文)#挂载分区 来挂载用来安装的文件系统根目录,以及其它必要的挂载点。如果 /mnt 文件夹已经被占用 , 只要新建一个文件夹,比如 /mnt/install 用来替代即可。

目前,Arch Linux 可以从头安装,或者作为宿主系统的镜像,这两种选项会在下面说明。

进行全新的 Arch Linux 安装

参考 Installation guide#Installation

你可以跳过 Installation guide (简体中文)#选择镜像,因为主机中应该已经有了合适的镜像列表。

提示:
  • 要避免重新下载所有软件包,可以参考 pacman (简体中文)/Tips and tricks (简体中文)#在网络上共享pacman缓存。或者使用 pacstrap-c 选项,来使用宿主系统上的软件包缓存。
  • 在使用 grub 时,grub-mkconfig 可能无法正确检测设备,这回导致 Error:no such device 错误。要解决这个问题,在宿主 Arch Linux 系统上,挂载安装新 Arch Linux 的分区,arch-chroot 到新分区上再安装并配置 grub。最后可能需要在 /etc/lvm/lvm.conf 里设置 use_lvmetad=0 来禁用 lvmetad

安装和配置

参考 Installation guide (简体中文)#挂载分区。如果 /mnt文件夹已经被占用 , 只要新建一个文件夹,比如 /mnt/install用来替代即可。

然后参考 Installation guide (简体中文)#安装

创建已有的 Arch 的备份

复制宿主系统的文件系统到新分区,再做一些必要的调整,就可以备份已有的 Arch Linux。

第一步是拷贝宿主文件到新的分区里,可以考虑使用 Rsync (简体中文)#全盘系统备份 里展示的方法。

然后,参考 Installation guide (简体中文)#配置系统 里的步骤,注意以下几点:

如果镜像 Arch 必须要使用与宿主系统不同的配置,或者要安装到不同的硬件上,考虑进行以下操作:

从一个运行另一个 Linux 发行版的主机

下列是多个可以自动处理大量步骤的工具。具体方法可以参考他们各自主页的相关说明。

以下是介绍手动处理的办法,具体思路要么是直接在宿主系统上运行 pacman,要么是在宿舍系统里运行一个 Arch 系统,这个嵌套系统位于 chroot 中。

在宿主系统上运行 pacman

Pacman 可以在大部分 Linux 发行版上编译运行,可以直接用来在宿主系统上创建 Arch Linux。最近的发行版上 arch-install-scripts 应该可以顺利运行。

一些发行版官方提供 pacman 和 / 或者 arch-install-scripts 的软件包。截止 2020 六月,Void Linux 提供了 pacman 软件包,Apline Linux 和 Fedora 提供了 pacmanarch-install-scripts 的软件包。

创建 chroot

以下是两个创建并进入chroot的方法,从最简单到最复杂。二者选其一,然后参考#使用 chroot 环境.

方法一:使用 Bootstrap 镜像(推荐)

镜像站下载 bootstrap 镜像到 /tmp,你也可以下载签名文件(以 .sig 结尾的同名文件)并用 GnuPG 验证

解压 tarball:

 # tar xzf <path-to-bootstrap-image>/archlinux-bootstrap-*-x86_64.tar.gz --numeric-owner

留意最后的 --numeric-owner 选项。你当前的 Linux 系统使用的 UID 和 GID 可能与 Arch Linux 不同,这个选项可以保留解压出文件的 UID 和 GID。

然后编辑来 /tmp/root.x86_64/etc/pacman.d/mirrorlist 选择软件仓库服务器。

进入 chroot:

  • 若安装了4或更高版本的 bash,并且 unshare 支持 --fork --pid 选项:
  # /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    # (假设文件系统上存在 /run)
  # chroot /tmp/root.x86_64 /bin/bash

方法二:使用 LiveCD 镜像

挂载最新的 Arch Linux 安装介质并 chroot 是可能的。这种方法为当前系统提供了可运作的 Arch Linux 安装程序而无需另外准备。

注意: 开始前,确保最近版本的 squashfs 已安装。否则会出现诸如 FATAL ERROR aborting: uncompress_inode_table: failed to read block的错误信息。

根镜像能在镜像站iso/latest/arch/x86_64/ 目录下找到。squashfs 格式无法编辑,因此需要解压出根镜像并挂载。

解压,运行

# unsquashfs 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  # pacman 所需(用于签名检查)
# cp -L /etc/resolv.conf squashfs-root/etc  # 网络连接所需

现在 chroot 到新配置好的 Arch 环境:

# chroot squashfs-root bash

使用 chroot 环境

初始环境非常基础(没有 nano 或者 lvm2),因此,我们得设置好 pacman 来安装必要的软件包。

初始化 pacman 密匙环

开始安装前,需要设置 pacman 密匙。执行以下命令前请阅读Pacman-key (简体中文)#初始化密钥环以理解其对熵的要求:

# pacman-key --init
# pacman-key --populate archlinux
提示:

如果你要运行 pacman-key --init 的电脑没有生成足够的熵(比如在无头服务器上),生成密钥可能会花费很长时间。要生成拟熵,在宿主系统上,安装 havegedrng-tools,并开启对应的服务,然后再执行 pacman-key --init。(在目标系统上安装这些服务是行不通的,因为 systemd 会拒绝在 chroot 下启动服务,而且本来你就须要在安装任何软件包前初始化 pacman 密钥环。)

如果你倾向于靠系统活动来生成熵,并且决定在另一个控制台(TTY,终端,SSH 会话……)里运行 ls -Ra /,尽管在循环里多运行几次:在远程无头服务器里,五到六次运行应该能够生成足够的熵了。

下载基本工具

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

注意: 你在用 pacman 安装软件包时,可能会遇到错误: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

安装提示

请按照Installation guide (简体中文)中的挂载分区安装必须的软件小节进行安装。

一些宿主系统或配置可能需要额外的步骤,参考下面的章节。

基于 Debian 的当前系统
/dev/shm

在基于 Debian 的当前系统上,pacstrap 会发生以下错误:

# pacstrap /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
/dev/pts

在从 Debian 7 宿主上安装 archlinux-2015.07.01-x86_64 时,下面的错误会阻止 pacstrap(8)arch-chroot 正常工作:

# pacstrap -i /mnt
mount: mount point /mnt/dev/pts does not exist
==> ERROR: failed to setup chroot /mnt

显然这是由于这两个脚本使用了共同的函数,chroot_setup()[1] 依赖 util-linux 的新功能,这与 Debian 7 userland 不兼容(参考 FS#45737)。

针对 pacstrap 的解决办法是手动执行多任务,但使用常规方式来挂载内核文件系统到目标目录("$newroot"):

# newroot=/mnt
# mkdir -m 0755 -p "$newroot"/var/{cache/pacman/pkg,lib/pacman,log} "$newroot"/{dev,run,etc}
# mkdir -m 1777 -p "$newroot"/tmp
# mkdir -m 0555 -p "$newroot"/{sys,proc}
# mount --bind "$newroot" "$newroot"
# mount -t proc /proc "$newroot/proc"
# mount --rbind /sys "$newroot/sys"
# mount --rbind /run "$newroot/run"
# mount --rbind /dev "$newroot/dev"
# pacman -r "$newroot" --cachedir="$newroot/var/cache/pacman/pkg" -Sy base base-devel ... ## add the packages you want
# cp -a /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"       ## 拷贝密钥串
# cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"  ## 拷贝 mirrorlist

不要使用 arch-chrootInstallation guide (简体中文)#Chroot,只使用

# chroot "$newroot"
lvmetad

Trying to create LVM logical volumes from an archlinux-bootstrap-2015.07.01-x86_64 environment on a Debian 7 host resulted in the following error:

# lvcreate -L 20G lvm -n root
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
  /dev/lvm/root: not found: device not cleared
  Aborting. Failed to wipe start of new LV.

(Physical volume and volume group creation worked despite /run/lvm/lvmetad.socket: connect failed: No such file or directory being displayed.)

This could be easily worked around by creating the logical volumes outside the chroot (from the Debian host). They are then available once chrooted again.

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: This problem did not arise when installing from a Debian 7 host without lvmetad enabled. The recommended messaround with /etc/lvm/lvm.conf looks rather error prone (2015-07-26). (Discuss in Talk:Install Arch Linux from existing Linux (简体中文))

Also, if the system you are using has lvm, you might have the following output:

# grub-install --target=i386-pc --recheck /dev/main/archroot
Installing for i386-pc platform.
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.

This is because debian does not use lvmetad by default. You need to edit /etc/lvm/lvm.conf and set use_lvmetad to 0:

use_lvmetad = 0

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: Is it the problem with LVM on Debian or with trying to install Arch on LVM? (Discuss in Talk:Install Arch Linux from existing Linux (简体中文))

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements. See Help:Style for reference.Tango-edit-clear.png

This will trigger later an error on boot in the initrd stage. Therefore, you have to change it back after the grub generation. In a software RAID + LVM, steps would be the following:

  • After installing the system, double check your Mkinitcpio and your bootloader settings. See Arch boot process#Boot loader for a list of bootloaders.
  • You may need to change your /etc/mdadm.conf to reflect your RAID settings (if applicable).
  • You may need to change your HOOKS and MODULES according to your LVM and RAID requirements: MODULES="dm_mod" HOOKS="base udev mdadm_udev ... block lvm2 filesystems ..."
  • You will most likely need to generate new initrd images with mkinitcpio. See Mkinitcpio#Image creation and activation.
  • Set use_lvmetad = 0 in /etc/lvm/lvm.conf.
  • Update your bootloader settings. See your bootloader's wiki page for details.
  • Set use_lvmetad = 1 in /etc/lvm/lvm.conf.
基于Fedora的当前系统

在基于 Fedora 的宿主系统和 live USBs 上时,当你用 genfstab 生成你的 fstab 你可能会遇到问题。移除重复的入口和“seclabel”选项(如果有),因为它们是针对 Fedora 的。

无 LiveCD 替换当前系统

在硬盘上划分出 ~700 MB 的空闲空间,如分割交换分区。你可以禁用交换分区并用省下的空间建立新系统。

把旧的交换分区设为新的根分区

检查 cfdisk/proc/swaps 或者 /etc/fstab 来找到你的交换分区。假设你的硬盘位于 sdaXX 是数字)。

执行下面的操作:

禁用交换分区:

# swapoff /dev/sdaX

在上面建立新的文件系统

# fdisk /dev/sda
(设置 /dev/sdaX ID 为 "Linux" - Hex 83)
# mke2fs -j /dev/sdaX

创建一个新目录来挂载它

# mkdir /mnt/newsys

最后,挂载新目录并安装过渡系统。

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

安装

安装必要软件包和其它让系统联网和在临时文件系统下运行的必需软件包。注意 ~700 MB 的空间限制。当使用 pacstrap 安装时,考虑加上 -c 选项来避免占满宝贵的空间。

一旦完成安装,修复引导器配置,然后重启进入到新系统并rsync 整个系统至主分区。