Install Arch Linux from existing Linux (简体中文)
本指南给出了从当前 Linux 发行版安装 Arch Linux 所需的准备步骤。 准备完成后的安装参考 Installation guide (简体中文)。
从当前 Linux 发行版安装 Arch Linux 对以下情形有所帮助:
- 远程安装 Arch Linux,如一台(虚拟的)根服务器
- 无需 LiveCD 替换当前 Linux 发行版(参见#无 LiveCD 替换当前系统)
- 创建基于 Arch Linux 的新 Linux 发行版或 LiveCD
- 创建 Arch Linux 的 chroot 环境,如可为 Docker 基础容器创建
- 为无盘机器准备 rootfs-over-NFS
这些准备步骤的目的在于为搭建一个 arch-install-scripts(如 pacstrap
和 arch-root
)可运行的环境。
如果当前系统是 Arch Linux,这个目的可通过在当前系统安装 arch-install-scripts 达成。如果当前系统不是 Arch Linux,可以构建基于 Arch Linux 的 chroot 环境。
备份和准备
备份你的所有数据,包括邮件、网页服务器等,把所有数据都放在手边。记录下你的服务器配置、hostname 等数据。
你可能会用到的数据:
- IP 地址
- hostname(s),(注意:根服务器可能是域名提供的一部份,在你删除
/etc/hosts
前先检查并备份) - DNS 服务器(检查
/etc/resolv.conf
) - SSH 密钥(如果其它人也要用你的服务器,如果你删除了 SSH 密钥,他们就需要新的密钥了。这些密钥可能来自:Apache、邮件服务器、SSH 服务器和其它服务)
- 硬件信息(比如网卡,参考你的
/etc/modules.conf
) - Grub 配置
总之,在本地备份一份原本的 /etc
总不会错。
从一个主机运行 Arch Linux
参考 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 (简体中文)#配置系统 里的步骤,注意以下几点:
- 可以跳过 Installation guide (简体中文)#时区、Installation guide (简体中文)#本地化 和 Installation guide (简体中文)#Root 密码
- 如果改变了文件系统,比如从 ext4 改为 Btrfs,必须进行 Installation guide (简体中文)#Initramfs
- 参考 Installation guide (简体中文)#安装引导程序,务必重新安装引导程序
- 删除
/etc/machine-id
,这样在系统启动时将生成一个全新的、独一无二的 matchine-id
如果镜像 Arch 必须要使用与宿主系统不同的配置,或者要安装到不同的硬件上,考虑进行以下操作:
- 在进行 Installation guide (简体中文)#安装引导程序 时,使用目标系统 CPU 的微码
- 如果宿主系统上有于目标系统上不兼容的 Xorg (简体中文)#配置,参考 Moving an existing install into (or out of) a virtual machine#Disable any Xorg-related files
- 其它针对目标系统的配置诸如网络和音频。
从一个主机运行另一个Linux发行版
下列是多个可以自动处理大量步骤的工具。具体方法可以参考他们各自主页的相关说明。
- arch-bootstrap (Bash)
- digitalocean-debian-to-arch (需要重新分区,针对 DigitalOcean)
- image-bootstrap (Python)
- vps2arch (Bash)
- archbashstrap (Bash)
以下是介绍手动处理的办法,具体思路要么是直接在宿主系统上运行 pacman,要么是在宿舍系统里运行一个 Arch 系统,这个嵌套系统位于 chroot 中。
在宿主系统上运行 pacman
Pacman 可以在大部分 Linux 发行版上编译运行,可以直接用来在宿主系统上创建 Arch Linux。最近的发行版上 arch-install-scripts 应该可以顺利运行。
一些发行版官方提供 pacman 和 / 或者 arch-install-scripts 的软件包。截止 2020 六月,Void Linux 提供了 pacman 软件包,Apline Linux 和 Fedora 提供了 pacman 和 arch-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 安装程序而无需另外准备。
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
的电脑没有生成足够的熵(比如在无头服务器上),生成密钥可能会花费很长时间。要生成拟熵,在宿主系统上,安装 haveged 或 rng-tools,并开启对应的服务,然后再执行 pacman-key --init
。(在目标系统上安装这些服务是行不通的,因为 systemd 会拒绝在 chroot 下启动服务,而且本来你就须要在安装任何软件包前初始化 pacman 密钥环。)
如果你倾向于靠系统活动来生成熵,并且决定在另一个控制台(TTY,终端,SSH 会话……)里运行 ls -Ra /
,尽管在循环里多运行几次:在远程无头服务器里,五到六次运行应该能够生成足够的熵了。
下载基本工具
刷新软件包列表并安装你需要的软件包:base、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。
安装提示
请按照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-chroot
来 Installation 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.
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
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
andMODULES
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
来找到你的交换分区。假设你的硬盘位于 sdaX
(X
是数字)。
执行下面的操作:
禁用交换分区:
# 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 整个系统至主分区。