從現有 Linux 發行版安裝 Arch Linux

出自 Arch Linux 中文维基

本指南給出了從當前 Linux 發行版安裝 Arch Linux 所需的準備步驟。 準備完成後的安裝參考 Installation guide

從當前 Linux 發行版安裝 Arch Linux 對以下情形有所幫助:

這些準備步驟的目的在於為搭建一個 arch-install-scripts(如 pacstraparch-chroot)可運行的環境。

如果當前系統是 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-devel包組parted 等等。

注意: 你在用 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.

本文或本章節的事實準確性存在爭議。

原因: 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).(在 Talk:從現有 Linux 發行版安裝 Arch 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

本文或本章節的事實準確性存在爭議。

原因: Is it the problem with LVM on Debian or with trying to install Arch on LVM?(在 Talk:從現有 Linux 發行版安裝 Arch Linux 中討論)

本文或本章節的語言、語法或風格需要改進。參考:Help:Style

原因:poor style(在Talk:從現有 Linux 發行版安裝 Arch Linux討論)

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 整個系統至主分區。