跳至內容

archiso

出自 Arch Linux 中文维基

Archiso 是一個高度可定製的工具,用於構建 Arch Linux live CD/USB ISO 映像、netboot 文件、bootstrap tar 包。官方映像是用 archiso 構建的,包含這些軟體包。它可以用作救援系統、Linux 安裝程序或其他系統的基礎。這篇 Wiki 文章介紹了如何安裝 archiso,以及如何配置它以控制生成的 ISO 映像的各個方面,例如隨附的軟體包和文件。 技術需求和構建步驟可以在官方項目文檔中找到。 archiso 通過許多 bash 腳本實現。 archiso 的核心組件是 mkarchiso 命令。 它的選項記錄在 mkarchiso -h 中,這裡不作介紹。

安裝

安裝 archiso

準備自定義配置文件

注意:要深入了解配置文件,可參閱 archiso 項目的 README.profile.rst

Archiso 帶有兩個配置文件,relengbaseline

  • releng 用於創建正式的每月安裝ISO。它可以作為創建自定義ISO映像的起點。
  • baseline 是一種最低限度的配置,它只包括從介質啟動 Live 環境所需的最低限度的軟體包。

要構建配置文件的未修改版本,請參閱 #構建 ISO 映像。否則,如果您希望調整或自定義 archiso 的已發布配置文件之一,請將其從 /usr/share/archiso/configs/profile-name/ 複製到一個可寫目錄,並使用您的名稱選擇。例如:

$ cp -r /usr/share/archiso/configs/releng/ archlive

現在,根據所選的配置文件和您的目標進入不同的章節。

配置文件結構

Archiso 配置文件包含定義生成的 ISO 映像的配置。配置文件結構記錄在 /usr/share/doc/archiso/README.profile.rst[1]

選擇包

編輯 packages.x86_64 以選擇要在 Live 系統映像上安裝的軟體包,逐行列出軟體包。

自定義本地倉庫

要添加不在標準 Arch 倉庫中的包(例如來自 AUR 或採用 ABS 定製的包),請建立一個自建本地倉庫並將您的自定義包添加到其中。然後將您的倉庫添加到 pacman.conf,如下所示:

archlive/pacman.conf
...
[customrepo]
SigLevel = Optional TrustAll
Server = file:///path/to/customrepo
...
注意:
  • pacman.conf 中的順序很重要。要為您的自定義存儲庫提供最高優先級,請將其置於其他存儲庫條目之上。
  • 這個 pacman.conf 僅用於在構建映像,而不會在 live 環境中有效。要在 live 環境裡使用,請參考 #向映像中添加倉庫
  • 確保 mkarchiso 過程(包括 chroot)可以訪問倉庫,應將倉庫放在合適的目錄下(如 /tmp),以確保映像構建時正確讀取倉庫。
  • mkarchiso 會尋找名為 custom 的倉庫,因此在創建倉庫時,應運行:
$ repo-add /path/to/custom.db.tar.zst /path/to/package-1.0-1-x86_64.pkg.tar.zst

安裝 multilib 中的軟體包

要從 Multilib 資源庫中安裝軟體包,僅需在pacman.conf中取消注釋如下的相關行以啟用 multilib

[multilib]
Include = /etc/pacman.d/mirrorlist

向映像裡添加文件

Airootfs 目錄用作映像上 Live 系統的根目錄 (/) 的起點。在安裝包之前,它的所有內容都將被複製到工作目錄中。

將任何自定義文件和/或目錄放在 airootfs/ 下的所需位置。例如,如果您在當前系統上自定義了 nftables 規則,希望在 Live 映像上沿用,請按如下方式複製它們:

$ cp -r /etc/nftables.conf archlive/airootfs/etc

同樣,對於駐留在層次結構中某處的特殊配置文件也需要格外小心。使用 mkdir(1) 可以輕鬆地創建目錄結構的缺失部分。

提示:要將文件添加到安裝用戶的主目錄,請將其放在 archlive/airootfs/root/ 中。要將文件添加到所有其他用戶的主目錄,請將其放在 archlive/airootfs/etc/skel/
注意:與軟體包提供的衝突的自定義文件將被覆蓋,除非軟體包將它們指定為 備份文件

默認情況下,權限將是 644 (對於文件)和 755(對於目錄)。所有這些都將歸根用戶所有。要為特定文件和/或文件夾設置不同的權限或所有權,請使用 profiledef.sh 中的 file_permissions 關聯列表。有關詳細信息,請參閱 README.profile.rst

向映像中添加倉庫

要在 live 環境中添加一個可用的倉庫,請創建一個適當修改pacman.conf,並將其置於archlive/airootfs/etc/下。

若倉庫也使用密鑰,將密鑰放置在 archlive/airootfs/usr/share/pacman/keyrings/ 下。密鑰文件名須以 .gpg 結尾。並且,密鑰必須被信任。可以在同目錄下創建 GnuPG 導出的信任文件,來實現這一點。文件名須以 -trusted 結尾。文件的第一部分是密鑰指紋,第二部分是信任信息。您可以參考 /usr/share/pacman/keyrings/archlinux-trusted 作為實例。

ArchZFS 實例

實例中文件如下:

airootfs
├── etc
│   ├── pacman.conf
│   └── pacman.d
│       └── archzfs_mirrorlist
└── usr
    └── share
        └── pacman
            └── keyrings
                ├── archzfs.gpg
                └── archzfs-trusted
airootfs/etc/pacman.conf
...
[archzfs]
Include = /etc/pacman.d/archzfs_mirrorlist
...
airootfs/etc/pacman.d/archzfs_mirrorlist
Server = https://github.com/archzfs/archzfs/releases/download/experimental
airootfs/usr/share/pacman/keyrings/archzfs-trusted
3A9917BF0DED5C13F69AC68FABEC0A1208037BE9:4:

導入並信任此密鑰(在映像構建期間,或在啟動之後的設置腳本中):

$ curl -Lo archzfs.gpg 'https://github.com/archzfs/archzfs-keyring/raw/master/keyring/packager/archzfs/3A9917BF0DED5C13F69AC68FABEC0A1208037BE9/3A9917BF0DED5C13F69AC68FABEC0A1208037BE9.asc'
# pacman-key --add archzfs.gpg
# pacman-key --lsign-key 3A9917BF0DED5C13F69AC68FABEC0A1208037BE9

內核

儘管兩個 Archiso 包含的配置文件都只有linux,但可以使映像包含其他甚至多個內核

首先,編輯 packages.x86_64 以包含您想要的內核包名稱。當 mkarchiso 運行時,它將包括所有 work_dir/airootfs/boot/vmlinuz-*work_dir/boot/initramfs-*.img ISO 中的文件(以及用於 UEFI 引導的 FAT 映像中)。

mkinitcpio 默認情況下預設將構建後備 initramfs 映像。對於 ISO,主 initramfs 映像通常不包含 autodetect 掛鉤,因此不需要額外的備用映像。為防止創建後備 initramfs 映像,使其不占用空間或減慢構建過程,請在 archlive/airootfs/etc/mkinitcpio.d/pkgbase.preset 中放置自定義預設。例如,對於 linux-lts

archlive/airootfs/etc/mkinitcpio.d/linux-lts.preset
PRESETS=('archiso')

ALL_kver='/boot/vmlinuz-linux-lts'
ALL_config='/etc/mkinitcpio.conf'

archiso_image="/boot/initramfs-linux-lts.img"

最後,創建引導加載程序配置文件來啟動內核。

引導加載程序

Archiso 支持 syslinux 用於 BIOS 引導和 systemd-bootGRUB 用於 UEFI 引導。有關其配置語法的信息,請參閱引導加載程序的文章。

提示:
  • 當使用 El Torito 刻錄到光碟時,或使用 Isohybrid 寫入硬碟(或 USB 快閃記憶體驅動器或類似驅動器)時,releng' 配置文件默認構建到支持 BIOS 和 UEFI 啟動的 ISO 中。
  • 由於 isolinux 的模塊化特性,您可以使用許多插件,因為所有 .c32 文件都已複製並可供您使用。看看 官方 syslinux 站點configs/releng/syslinux archiso git repo。使用所述插件,可以製作具有視覺吸引力的複雜菜單。參見 [1]

mkarchiso 期望 GRUB 配置位於 grub 目錄中,systemd-boot 配置位於 efiboot 目錄中,而 syslinux 配置位於 syslinux 目錄中。

UEFI 安全啟動

如果要使 archiso 在啟用 UEFI 安全啟動的環境下可啟動,則必須使用簽名過的引導加載程序。您可以按照 安全啟動#引導安裝介質 中的說明進行操作。

systemd 單元

要為 Live 環境 啟用 systemd 服務/套接字/計時器,您需要像 systemctl enable 那樣手動創建符號連結。

例如,要啟用包含 WantedBy=multi-user.targetgpm.service,請運行:

$ mkdir -p archlive/airootfs/etc/systemd/system/multi-user.target.wants
$ ln -s /usr/lib/systemd/system/gpm.service archlive/airootfs/etc/systemd/system/multi-user.target.wants/

可以通過讀取 systemd 單元找到所需的符號連結,或者如果您安裝了服務,則通過 啟用 它並觀察 systemctl 輸出。

登錄管理器

通過啟用登錄管理器的 systemd 服務來在啟動時 Start X。如果您不知道要啟用哪個 .service,您可以輕鬆找出是否在您構建 ISO 的系統上使用相同的程序。只需使用:

$ ls -l /etc/systemd/system/display-manager.service

現在在 archlive/airootfs/etc/systemd/system/ 中創建相同的符號連結。對於 LXDM:

$ ln -s /usr/lib/systemd/system/lxdm.service archlive/airootfs/etc/systemd/system/display-manager.service

這將在您的 Live 系統上的系統啟動時啟用 LXDM。

改變自動登錄

Getty 的自動登錄配置位於 airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf

您可以修改這個文件來更改自動登錄用戶:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --noreset --noclear --autologin username - ${TERM}

或者乾脆刪除 autologin.conf 來禁用自動登錄。

如果使用串行控制台,請創建 airootfs/etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf 並添加以下內容:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --noreset --noclear --autologin root --keep-baud 115200,57600,38400,9600 - ${TERM}

用戶和密碼

要創建在 Live 環境中可用的 用戶,您必須手動編輯 archlive/airootfs/etc/passwdarchlive/airootfs/etc/shadowarchlive/airootfs/etc/grouparchlive/airootfs/etc/gshadow

注意:如果這些文件存在,它們必須包含 root 用戶和組。

例如,添加用戶 archie。按照 passwd(5) 語法將它們添加到 archlive/airootfs/etc/passwd

archlive/airootfs/etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
archie:x:1000:1000::/home/archie:/usr/bin/zsh
注意:passwd 文件須以換行符結尾。

shadow(5) 的語法將用戶添加到 archlive/airootfs/etc/shadow。若要為用戶設置密碼,請使用 openssl passwd -6 生成密碼哈希值,並將其添加到文件中。例如:

archlive/airootfs/etc/shadow
root::14871::::::
archie:$6$randomsalt$cij4/pJREFQV/NgAgh9YyBIoCRRNq2jp5l8lbnE5aLggJnzIRmNVlogAg8N6hEEecLwXHtMQIl2NX2HlDqhCU1:14871::::::

您也可以將密碼欄位留空。這意味著,該用戶無需密碼即可登錄。

根據 group(5) 將用戶的組和他們將加入的組添加到 archlive/airootfs/etc/group。例如:

archlive/airootfs/etc/group
root:x:0:root
adm:x:4:archie
wheel:x:10:archie
uucp:x:14:archie
archie:x:1000:

根據 gshadow(5) 創建相應的 archlive/airootfs/etc/gshadow

archlive/airootfs/etc/gshadow
root:!*::root
archie:!*::

確保 /etc/shadow/etc/gshadow 具有正確的權限:

archlive/profiledef.sh
...
file_permissions=(
  ...
  ["/etc/shadow"]="0:0:0400"
  ["/etc/gshadow"]="0:0:0400"
)

軟體包安裝後,mkarchiso 將為 archlive/airootfs/etc/passwd 中列出的用戶創建所有指定的主目錄並複製 work_directory/x86_64/ airootfs/etc/skel/* 給他們。複製的文件將具有適當的用戶和組歸屬。

鍵映射

要修改 Live 系統控制台上的默認鍵映射,可添加含有所需鍵映射的 vconsole.conf。細節以及更多選項,參見 Linux_控制台/鍵盤配置vconsole.conf(5)

例如,要將控制台和 X11 的默認鍵映射修改為德語(de-latin1),創建 archlive/airootfs/etc/vconsole.conf,使其帶有下列內容:

archlive/airootfs/etc/vconsole.conf
KEYMAP=de-latin1
XKBLAYOUT=de

區域設置

要修改 Live 系統的 Locale,您須先啟用並生成區域化文件。為此,須添加含有所需區域設置的自定義 locale.gen,並在 Live 系統中運行 locale-gen。由此,也可同理修改系統默認區域設置。

例如,要啟用 de_DE.UTF-8 UTF-8en_US.UTF-8 UTF-8,可創建 archlive/airootfs/etc/locale.gen,使其帶有下列內容(細節參閱 Locale#生成區域設置):

archlive/airootfs/etc/locale.gen
de_DE.UTF-8 UTF-8
en_US.UTF-8 UTF-8

隨後,您需要在 Live 系統中運行 locale-gen。要達成這點,可使用 Pacman 掛鉤,並隨後借另一掛鉤將其自動移除。創建 archlive/airootfs/etc/pacman.d/hooks/locale-gen.hook,使其帶有下列內容(細節參見 Pacman#Hooks and alpm-hooks(5)):

archlive/airootfs/etc/pacman.d/hooks/locale-gen.hook
# remove from airootfs!
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = glibc

[Action]
Description = Generating localisation files...
When = PostTransaction
Depends = glibc
Exec = /usr/bin/locale-gen

之後是可選操作:要修改 Live 系統的默認區域設置,可添加自定義的 locale.conf。例如,要將默認區域設置改為 de_DE.UTF-8,創建 archlive/airootfs/etc/locale.conf,使其帶有下列內容(細節參見 Locale#變量locale.conf(5)):

更改 ISO 中使用的分發名稱

首先將文件 /etc/os-release 複製到 rootfs 的 etc/ 文件夾中。然後,相應地編輯文件。您還可以更改 GRUB 和 syslinux 內部的名稱。

構建 ISO 映像

通過運行以下命令構建一個 ISO 映像,然後您可以將其刻錄到 CD 或 USB:

# mkarchiso -v -r -w /tmp/archiso-tmp -o /path/to/out_dir /path/to/profile/
  • -w 指定工作目錄。如果未指定該選項,則默認為當前目錄下的 work。若內存允許,更好的選擇是將工作目錄安置在 tmpfs 下(如上所示)以加速此過程。
  • -r 在 ISO 構建成功之後刪除工作目錄(若工作目錄由 mkarchiso 創建)。
  • -o 指定將放置構建的 ISO 映像的目錄。如果未指定該選項,則默認為當前目錄中的 out
  • 需要注意的是配置文件 profiledef.sh 在運行 mkarchiso 時不能指定,只能指定文件的路徑。

/path/to/profile/ 替換為您的自定義配置文件的路徑,或者如果您正在構建一個 /usr/share/archiso/configs/releng/未修改的配置文件。

運行時,腳本將下載並安裝您指定到 work_directory/x86_64/airootfs 的包,創建內核和初始化映像,應用您的自定義選項,最後將 ISO 構建到輸出目錄中。

刪除工作目錄

警告:如果 mkarchiso 被中斷,運行 findmnt(8) 以確保在刪除之前沒有掛載綁定 - 否則,你可能會丟失數據(例如安裝在 /run/media/user/label 的外部設備綁定在 work/x86_64/airootfs/run/media/user/label 在構建過程中)。

臨時文件被複製到工作目錄中。如果 mkarchiso 運行帶有 -r 選項,成功構建 ISO 後,它會刪除工作目錄(先前未存在的話)。或者,也可手動刪除:

# rm -rf /path/to/work_dir

使用 ISO

有關各種選項,請參見 Installation guide#準備安裝介質

在 QEMU 中測試 ISO

安裝 可選依賴項 qemu-desktopedk2-ovmf

使用便捷腳本 run_archiso 使用 QEMU 運行構建的映像。

$ run_archiso -i /path/to/archlinux-yyyy.mm.dd-x86_64.iso

虛擬機也可以使用 UEFI 仿真運行:

$ run_archiso -u -i /path/to/archlinux-yyyy.mm.dd-x86_64.iso
提示:除了 VNC/SDL 屏幕之外,腳本還會將來自主機埠 60022 的 TCP 連接傳達給虛擬機埠 22,即虛擬機 SSH 守護進程所監聽的埠。可與#準備 ISO 以通過 SSH 進行安裝搭配使用。

技巧提示

ISO 構建過程中運行設置命令

創建自定義配置文件時,對於部分改動,你需要在創建 ISO 之前,在 Live 系統環境中運行設置命令。例如,如果你要啟用額外的區域設置,則須在 Live 系統中運行 locale-gen,以生成必要的區域化文件。

要在創建 ISO 之前運行設置命令,可在 archlive/airootfs/etc/pacman.d/hooks/ 下,添加一個 Pacman 掛鉤 。如何創建自定義 Pacman 掛鉤的細節,參見 Pacman#鉤子alpm-hooks(5)。示例又見 #區域設置

設置掛鉤往往只需要在 ISO 構建過程中運行一次,故而在 releng 配置文件中包含一個 Pacman 掛鉤,用於移除帶有 "remove from airootfs" 標記的所有 Pacman 掛鉤。因此,如果你不想讓你的 Pacman 掛鉤同樣作用於正在運行的 Live 系統,可在掛鉤後追加:

# remove from airootfs!

準備 ISO 以通過 SSH 進行安裝

注意:自從 archlinux-2021.02.01-x86_64.iso,提供cloud-init 支持sshd.service默認啟用的

通過 SSH 安裝 Arch Linux 而不與系統進行任何交互,必須將 SSH 公鑰放在 authorized_keys 中。

添加 SSH 密鑰可以手動完成(在此處解釋),也可以通過 cloud-init

要手動添加密鑰,首先 複製 archiso 的 releng 配置文件 到可寫目錄。以下示例使用 archlive

$ cp -r /usr/share/archiso/configs/profile/ archlive

在將用於登錄的用戶的主目錄中創建一個 .ssh 目錄。以下示例將使用 root 用戶。

$ mkdir archlive/airootfs/root/.ssh

將用於登錄的 SSH 公鑰添加到 authorized_keys

$ cat ~/.ssh/key1.pub >> archlive/airootfs/root/.ssh/authorized_keys
$ cat ~/.ssh/key2.pub >> archlive/airootfs/root/.ssh/authorized_keys

.ssh 目錄和 authorized_keys 文件設置正確的 權限 和所有權:

archlive/profiledef.sh
...
file_permissions=(
  ...
  ["/root"]="0:0:0750"
  ["/root/.ssh"]="0:0:0700"
  ["/root/.ssh/authorized_keys"]="0:0:0600"
)

最終 構建 ISO 映像。啟動 ISO 後,OpenSSH 將啟動,並且可以使用相應的 SSH 私鑰登錄。

使用 iwd 自動連接到 Wi-Fi 網絡

在配置文件的 airootfs 目錄中創建 /var/lib/iwd/ 並設置正確的權限:

$ mkdir -p archlive/airootfs/var/lib/iwd
archlive/profiledef.sh
...
file_permissions=(
  ...
  ["/var/lib/iwd"]="0:0:0700"
)

按照 iwd#Network configurationiwd.network(5) 中的說明為您的 Wi-Fi 網絡創建網絡配置文件。

將配置文件保存在 archlive/airootfs/var/lib/iwd/ 中。

調整根文件系統的大小

在 live 環境中,例如在需要使用 DKMS 模塊的硬體上安裝軟體包時,根文件系統的默認大小可能不允許包的下載和安裝。

提示:選中大小的理由請參見 BBS#210389,歷史細節請參見 FS#45618

當在 live 環境中下載文件或安裝軟體包時,它將表現為以下錯誤信息:

error: partition / too full: 63256 blocks needed, 61450 blocks free
error: not enough free disk space
error: failed to commit transaction (not enough free disk space)
Errors occurred: no packages were upgraded.

您亦可通過運行以下命令以動態調整根分區大小:

# mount -o remount,size=SIZE /run/archiso/cowspace

關於 SIZE 可能的參數,請參見 tmpfs(5) § size

要在引導加載程序階段調整大小(按 eTab),請使用以下引導選項:

cow_spacesize=SIZE

要在{ic|grub/*.cfg}}

  • syslinux/*.cfg

您可以通過運行以下命令檢查文件系統的大小:

$ df -h

查看 mkinitcpio-archiso 啟動參數於

Google Compute Engine 映像

Google Compute Engine 兼容的 releng 壓縮映像以 archlinux-gceAUR 的形式提供。

Libvirt 虛擬機配置

運行 releng 映像的 libvirt 配置可用作 archlinux-libvirtAUR

疑難解答

窗口管理器凍結

如果您想在 Live CD 中使用窗口管理器,則必須添加必要且正確的顯卡驅動,否則 WM 可能會在加載時凍結。

參見

構建映像階段調整大小,請將引導選項添加至:

  • efiboot/loader/entries/*.cfg
  • grub/*.cfg
  • syslinux/*.cfg

您可以通過運行以下命令檢查文件系統的大小:

$ df -h

查看 mkinitcpio-archiso 啟動參數於

Google Compute Engine 映像

Google Compute Engine 兼容的 releng 壓縮映像以 archlinux-gceAUR 的形式提供。

Libvirt 虛擬機配置

運行 releng 映像的 libvirt 配置可用作 archlinux-libvirtAUR

疑難解答

窗口管理器凍結

如果您想在 Live CD 中使用窗口管理器,則必須添加必要且正確的顯卡驅動,否則 WM 可能會在加載時凍結。

參見