mkinitcpio - Arch Linux 中文维基

跳至內容

# mkinitcpio

出自 Arch Linux 中文维基

翻譯狀態：

- 本文（或部分內容）譯自 mkinitcpio，最近一次同步於 2025-12-27，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Booster
- Boot debugging
- dracut
- Kernel modules
- mkinitcpio/極簡 initramfs
- systemd
- 統一內核映像

mkinitcpio 是用於創建 initramfs 映像的 bash 腳本。有關對 initramfs 的一般性介紹，請參閱 Arch 的啟動流程#initramfs。

需要注意的是，存在兩種截然的不同方式用於執行早期用戶空間階段的各項任務：

基於 systemd 的 initramfs（版本 40 起默認）

  systemd 在早期用戶空間階段開始時即被啟動。需要執行的任務由常規的 systemd 單元文件決定。參見 systemd 啟動流程。

  優點：
  - 與 systemd 生態系統的其餘部分緊密集成，帶來更一致、流暢的啟動流程。
  - 能更有效地並行化某些啟動任務，在某些場景下可能縮短整體啟動時間。
  - 提供更全面的功能集，例如 systemd-cryptsetup-generator 與 GPT 分區自動掛載功能。
  缺點：
  - 依賴較多，生成映像較大。由於包含 systemd 二進制文件及其依賴項，通常會導致 initramfs 增大，可能會稍稍延長啟動時間。

基於 BusyBox 的 initramfs

  啟動一個 init 腳本，該腳本隨後掃描 initramfs 查找需要執行的腳本（即本文中的「運行時鉤子」）。

  優點：
  - 輕量級，依賴較少，生成映像較小。

具體採用哪種方案取決於 `/etc/mkinitcpio.conf` 的 `HOOKS` 數組中是否包含 `systemd` 鉤子。詳見 #常用鉤子。

mkinitcpio 由 Arch Linux 開發者及社區貢獻者共同開發。參見公開 Git 倉庫。

## 安裝

安裝軟體包 mkinitcpio包。這個軟體包是 linux包 等軟體包的依賴，應該已經自動被安裝了。高級用戶可以從 mkinitcpio-gitAUR 獲取 mkinitcpio 的最新開發版本。

注意：若要使用 git 開發版本，強烈建議同時加入 arch-projects 郵件列表！

## 創建和啟用映像

### 自動匹配生成

每次安裝或升級內核時，一 pacman 鉤子會自動在 `/etc/mkinitcpio.d/` 生成 .preset 文件。例如，`linux.preset` 文件是官方穩定內核 linux包 生成的。.preset 文件本質上是一個創建 initramfs 映像所需信息的列表，避免手動指定各項參數及輸出文件位置。

可自動創建兩個映像：

- default（默認）映像，根據 #配置中的指令創建。
- fallback（後備）映像，與上述類似，但不使用 autodetect 鉤子，因此包含支持大多數硬體的完整模塊集。

默認僅創建 default 映像，fallback 映像必須顯式啟用。

創建預設文件後，該 pacman 鉤子會調用 `mkinitcpio`，利用 .preset 文件中提供的信息生成映像。

注意：.preset 文件用於在內核更新後自動重新生成 initramfs，編輯時請務必小心。

### 手動生成

手動運行腳本，參照mkinitcpio(8) 幫助頁面獲得指引。尤其是當利用內核包生成（重新生成）預設時，使用`-p`/`--preset`選項按照預設生成映像。例如 為 linux包 包生成映像，使用這個命令：

    # mkinitcpio -p linux

利用`-P`/`--allpresets`選項，根據所有現存的預設文件生成映像。常見的用法是當全局設置#配置變化後用此法重新生成全部的內存映像：

    # mkinitcpio -P

可以按照不同的配置文件創建任意數量的內存映像。想要引導加載的映像必須在相應的引導加載程序配置中明確寫出。

### 自定義生成

可以使用相應的配置文件產生一個映像。例如，接下來會根據`/etc/mkinitcpio-custom.conf`裡指令生成初始化內存映像，並且將後者保存在 `/boot/initramfs-custom.img`。

    # mkinitcpio --config /etc/mkinitcpio-custom.conf --generate /boot/initramfs-custom.img

如果為一個不是當前運行的內核創建映像，增加內核版本號到命令行。已安裝的內核版本號可以在`/usr/lib/modules/`中找到，對於每個內核語法結構和`uname -r`命令輸出結果一致。

    # mkinitcpio --generate /boot/initramfs-custom2.img --kernel 5.7.12-arch1-1

### 統一內核映像

mkinitcpio 既可自行構建統一內核映像（UKI），也可通過 systemd-ukify包 構建。如果系統中未安裝 systemd-ukify包 或使用 `--no-ukify` 參數明確禁用它，mkinitcpio 將使用自有實現，但此時將無法使用 ukify 提供的高級功能。

關於構建 UKI 的詳細信息，請參閱統一內核映像。

## 配置

mkinitcpio的主配置文件是`/etc/mkinitcpio.conf`。也支持附加配置文件（Drop-in），如`/etc/mkinitcpio.conf.d/mkhooks.conf`（當使用 `-c`/`--config` 選項和/或使用了含 `ALL_config` 的預設時無效）。此外，內核軟體包的預配置文件位於`/etc/mkinitcpio.d`（例如：`/etc/mkinitcpio.d/linux.preset`）。

用戶可以編輯配置文件中的七個變量，參見mkinitcpio.conf(5) § VARIABLES獲得更多細節：

`MODULES`
  在鉤子擴展運行前需要加載的內核模塊。
`BINARIES`
  內存檔映像中包含的額外的二進制文件（一般是可執行的命令）。
`FILES`
  內存檔映像中包含的其他文件。
`HOOKS`
  要執行的鉤子擴展，它是在生成映像時執行的腳本。
`COMPRESSION`
  內存檔映像的壓縮方式。
`COMPRESSION_OPTIONS`
  傳遞給壓縮工具的額外參數，強烈不建議使用，mkinitcpio 可以自動根據壓縮算法傳遞需要的參數(例如對 xz 傳遞 `--check=crc32` to xz), 手動設置了錯誤的參數可能導致系統無法啟動。
`MODULES_DECOMPRESS`
  解壓可加載內核模塊和固件文件或保持未解壓原樣。

注意：

- 一些系統需要的鉤子像 lvm2, mdadm_udev, and encrypt 默認 不是開啟的 。參見 #鉤子（HOOKS） 仔細遵循指示。
- 存在多個硬碟控制器使用相同的節點名字，但是擁有不同的內核模塊（例如，兩個SCSI/SATA控制器或2個IDE控制器）應該使用 持久化設備命名persistent block device naming 保證正確的設備被掛載。否則在兩次系統啟動時根系統的位置可能改變導致內核崩潰。

### 模塊（MODULES）

`MODULES`數組指定了啟動過程最開始時就要加載的模塊。

如果模塊名稱後加上一個`?`問號，那麼即使系統無法找到該模塊也不會報錯。對於自己編譯的內核，其中內置了某些模塊，在這些模塊在鉤子或配置文件中顯式的列出來時，該功能可能有用。

注意：

- 如果使用樹外文件系統，且需要在早期用戶空間掛載時（比如作為根文件系統），對應模塊（如 reiser4）必須加入 `MODULES` 數組中。
- 當使用 encrypt 或 sd-encrypt 鉤子時,目標系統和運行mkinitcpio系統不同時，鍵盤模塊和/或啟動系統期間需要解鎖LUKS設備的文件系統模塊加入 `MODULES` 數組。例如，如果需要使用位於一個ext2系統的鑰匙文件，但是運行mkinitcpio的系統中ext2文件系統沒有被掛載，增加`ext2`。參見 dm-crypt/System configuration#cryptkey 獲得更多細節。
- 如果使用USB3接口的鍵盤，希望用它來解鎖LUKS設備。增加`usbhid xhci_hcd`。
- 如果使用顯示器連接擴展塢，可能需要加入你的顯卡模塊使初始化輸出信息可見(例如，為大多數英特爾顯卡加入 `i915` )。

### 二進制文件和普通文件（BINARIES、FILES）

這兩個選項允許用戶添加任何文件到映像中。`BINARIES`、`FILES`數組在鉤子運行之前指定了要加入內存檔映像的文件，可以覆蓋鉤子擴展提供的文件。`BINARIES`中的二進制文件會自動放入一個標準的`PATH`路徑，而且會自動加入可執行文件依賴的函數庫。`FILES`中的文件則不進行上述處理，as-is直接原樣放入映像。例如：

    FILES=(/etc/modprobe.d/modprobe.conf)
    BINARIES=(kexec)

注意 `BINARIES` 和 `FILES` 是 Bash數組，配置支持多個選項，用空格隔開。

### 鉤子（HOOKS）

`HOOKS`設置是此文件中最重要的設置。鉤子是一系列的小腳本，描述哪些東西需要加入到映像裡面。有些鉤子還包含了運行組件，可以提供額外的行特定動作，像啟動服務、構建存儲棧的塊設備等。鉤子按照配置文件中`HOOKS`項中給出的順序執行。

默認的`HOOKS`可以滿足大部分簡單的單硬碟系統。對於堆棧的或多塊設備像 LVM, RAID, or dm-crypt 等複雜根分區系統，請查看相應的 Wiki 頁面，進行必要的進一步設置。

#### 構建時鉤子

構建時鉤子位於`/usr/lib/initcpio/install`，自定義的構建時鉤子可能位於`/etc/initcpio/install/`。這些文件會在運行 mkinitcpio 時被包含進腳本，應該提供如下兩個函數：`build` 和 `help`。`build` 函數描述了需要加入映像的模塊、文件和二進制文件。mkinitcpio(8) 中的記錄的 API 幫助添加這些項目。`help` 函數在鉤子執行後輸出描述信息。

列出可用的鉤子列表：

    $ mkinitcpio -L

使用 mkinitcpio 的 `-H`/`--hookhelp` 選項輸出對於某一鉤子的幫助。例如：

    $ mkinitcpio -H udev

#### 運行時鉤子

運行時鉤子可以在`/usr/lib/initcpio/hooks`中找到自定義的運行時鉤子在`/etc/initcpio/hooks/`。 對於任何運行時掛鉤，都應該始終有一個同名的構建鉤子，它會調用`add_runscript`將運行時掛鉤添加到映像中。 這些文件是由早期用戶空間中的BusyBox ash shell調用。除清理鉤子以外（清理鉤子是倒序執行的），它們始終將按照`HOOKS`設置中列出的順序運行。 運行時鉤子可能包含以下函數：

`run_earlyhook`: 一旦掛載了API文件系統並且已經解析了內核命令行，便會運行這個函數。 通常，從此處啟動早期引導過程所需的額外守護程序（例如udev，它從早期引導過程的開始就被需要）。

`run_hook`: 這個函數在早期鉤子掛接後不久便運行。 這是最常見的鉤子特點，應在此處進行諸如堆疊塊設備的組裝之類的操作。

`run_latehook`: 此名稱的函數在掛載根設備後運行。 應當謹慎地將其用於根設備的進一步設置，或用於掛載其他文件系統，例如`/usr`。

`run_cleanuphook`: 該名稱的函數將儘可能晚地運行，並且以與配置文件的`HOOKS`數組中列出函數的相反順序來運行。 這些鉤子應該用於所有的最終清理操作，例如關閉由早期鉤子啟動的所有守護程序。

注意：運行時鉤子僅僅被BusyBox的init使用。systemd 鉤子觸發一個 systemd 基礎的初始化, 它不需要運行任何運行時鉤子，而是使用systemd單元。

#### 映像後處理鉤子

映像後處理鉤子（post hook）是位於 `/usr/lib/initcpio/post/`（軟體包提供）和 `/etc/initcpio/post/`（自定義）目錄下的可執行文件或 shell 腳本。這些文件會在（重新）生成映像後執行，以執行簽名等附加任務。

每個可執行文件會按以下順序接收參數：

1. 使用的內核（某些情況下可能為空）；
2. 生成的initramfs 映像位置；
3. （可選）生成的統一內核映像位置。

此外，還會設置以下環境變量：`KERNELVERSION` 表示完整內核版本，`KERNELDESTINATION` 表示內核要想正常啟動應位於的默認位置。

#### 常用鉤子

下面是一個常見鉤子和它們如何影響映像的創建以及運行時的次序。注意這個表格是不完整的，因為一些包會提供一些自定義的鉤子。

這篇文章的某些內容需要擴充。

原因：增加關於`hostdata`, `memdisk`, `sleep` 和`strip`的信息, 找出`dmraid`等是否在 systemd 為基礎的映像中正常工作或被需要。 (在 Talk:Mkinitcpio#Improvements for the Common hooks table and section about systemd hook 中討論)

BusyBox init | systemd init | 構建時鉤子 | 運行時鉤子（僅BusyBox init）
--- | --- | --- | ---
base | 設置所有初始目錄並安裝基礎工具和庫。除非清楚自己在做什麼，否則請始終將此鉤子置於首位，因為如果沒有 systemd 鉤子，該鉤子是必需的，提供關鍵的 BusyBox init 程序。 當使用 systemd 鉤子時，此鉤子可選，僅提供一個 BusyBox 恢復 shell。啟用 base 後，在內核參數中臨時添加 `SYSTEMD_SULOGIN_FORCE=1` 使用該 shell。 | –
udev | systemd | 增加 udevd, udevadm,和一小套udev規則進映像。 | 從內核中啟動udev守護進程和uevents過程; 創建設備節點。因為不需要用戶清晰的明確出必須設備這是簡化的引導過程，推薦使用。
usr | 增加支持`/usr` 在獨立分區。參見#/usr 放到單獨分區 獲得更多細節。 | 在掛載真正根分區後掛載 `/usr` 分區 。
resume | 添加`lzo`和`lz4`內核模塊，以允許在使用編譯時默認值以外的休眠映像壓縮算法時恢復。添加 systemd-hibernate-resume(8) 二進制文件以支持從通過 `HibernateLocation` UEFI 變量指定的休眠映像恢復。 | 試圖從"suspend to disk" 狀態重新開始。 參見 休眠 做進一步設置。
btrfs | – | 設置必備模塊能夠讓Btrfs 支持Btrfs的多設備分區。需要安裝 btrfs-progs包 開啟功能。Btrfs在單設備時此鉤子不需要（`filesystems`足矣）。 | 當udev 鉤子或systemd不存在時，運行 `btrfs device scan` 組裝多設備Btrfs根文件系統。安裝btrfs-progs包 包使用此鉤子。
autodetect | 系統掃描後創建設備白名單從而減少內存映像的尺寸。確定校驗進入的模塊正確性和完整性。為了自動偵測發揮作用，必須放在其他子系統鉤子之前。放在'autodetect'鉤子之前的鉤子將會被完整安裝。 | –
microcode | 在未壓縮的 initramfs 映像前添加適用於 Intel 和 AMD 處理器的早期微碼更新文件。使用`/usr/lib/firmware/amd-ucode`和`/usr/lib/firmware/intel-ucode`（若可用），否則從`/boot/amd-ucode.img`和`/boot/intel-ucode.img`提取。 若在此之前 autodetect 鉤子已調用，則只會添加對應處理器的微碼更新文件。 此掛鉤已經取代了棄用的`--microcode`參數和在預設文件中的`microcode`選項。這使得啟動配置中微碼的`initrd`參數行可以刪除了，因為它們已被打包進主要的 initramfs 映像中。 | –
modconf | 從`/etc/modprobe.d/`和`/usr/lib/modprobe.d/`中包含探測模塊配置文件。 | –
kms | 為 KMS 早啟動添加 GPU 模塊。另外還添加了某些筆記本電腦液晶面板中內置的隱私屏幕所需的模塊。 | –
keyboard | 為鍵盤設備增加必要的模塊。如果USB或串口鍵盤在早期用戶空間起作用加入此鉤子（可以輸入密碼或和shell交互）。有一個副作用，一些非鍵盤的輸入設備也可能加進來，但這並不可靠。此鉤子代替老的 usbinput鉤子。 注意：使用不同的硬體配置啟動的系統（例如筆記本電腦連接外置鍵盤和內置鍵盤或headless systems）時，此鉤子需要放在autodetect之前才能在引導中使用鍵盤，例如使用`encrypt`鉤子解密加密設備。 | –
keymap | sd-vconsole | 自`/etc/vconsole.conf`加入特定的 鍵盤映射keymap(s) 到映像。在早期用戶空間如果使用系統加密, 尤其全盤加密, 此鉤子放在`encrypt`鉤子之前。 | 在早期用戶空間從 `/etc/vconsole.conf` 加載指定的鍵盤映射。
consolefont | 自`/etc/vconsole.conf`中加入特定的 終端字體 到映像。 | 在早期用戶空間自`/etc/vconsole.conf`裡，使用特定的終端字體。
block | 加載塊設備模塊。若在 `autodetect` 掛鉤後調用此掛鉤，之添加系統中使用的塊設備的模塊。模塊`ahci`、`sd_mod`、`usb_storage`、`uas`、`mmc_block`、`nvme`、`virtio_scsi`和`virtio_blk` 會無條件地添加 | –
net | 未實現 | 增加必要網絡設備模塊。必須安裝 mkinitcpio-nfs-utils包 包, 參見 #使用 net | 支持NFS為基礎的根文件系統。
dmraid | ? | 支持fakeRAID根設備。必須安裝 dmraid包 包。注意如果你的控制器支持，更好選擇是mdadm 聯合 mdadm_udev鉤子支持fakeRAID根設備。參見 #使用 RAID 磁碟陣列 。 | 使用`dmraid`定位組裝fakeRAID塊設備。
mdadm_udev | 通過udev支持組裝RAID陣列。必須安裝 mdadm包 包。若在FakeRAID使用這個鉤子推薦將 `mdmon` 加入 `BINARIES`. 參見 #使用 RAID 磁碟陣列 。 | –
encrypt | sd-encrypt | 增加`dm_crypt` 內核模塊 和 `cryptsetup` 工具到映像。 必須安裝cryptsetup包包。 注意：啟動時反覆確認keyboard鉤子放在解密設備前面。和/或當使用鑰匙文件解鎖時，存放鑰匙文件的文件系統加入#模塊（MODULES） 裡。 | 偵測和解鎖加密根系統。參見 #運行時配置 。 sd-encrypt 參見 dm-crypt/系統配置#使用systemd-cryptsetup-generator。
lvm2 | 加入設備映射內核模塊和`lvm` 工具到映像。 必須安裝lvm2包 包。 如果根系統在LVM這是必須的鉤子。 | –
fsck | 增加fsck二進制文件和特定系統幫助文件，允許fsck在掛載前處理根系統（和/usr分區如果有）。如果放在autodetect鉤子前僅僅加載的定的幫助文件到根系統。強烈推薦使用此鉤子，獨立`/usr`分區需要它。強烈建議如果使用的此鉤子同時要加入必要模塊保證鍵盤在早期用戶空間使用。 使用這個鉤子需要在內核參數加入 `rw` 參數（討論）。參見 fsck#啟動時檢查。 | –
filesystems | 除非在`MODULES`中加入了文件系統，不然此鉤子是必須的。 | –
acpi_override | 從 `/usr/initcpio/acpi_override/` 和 `/etc/initcpio/acpi_override/` 添加 ACPI 機器語言文件（.aml）到早期未壓縮的 initramfs 映像中，使得內核可以在啟動早期重載 ACPI 表（比如 DSDT）[1] | –

### 壓縮方式(COMPRESSION)

內核支持幾種initramfs的壓縮方式 - gzip包, bzip2包, lzma, xz包, lzo包, lz4包 and zstd包。mkinitcpio默認使用zstd壓縮映像，注意zstd運行的多線程模式（使用了`-T0`選項，以偵測到內核數量作為線程數量。）

系統中的 `mkinitcpio.conf` 已經注釋掉了各種 `COMPRESSION` 選項，要使用某個壓縮方式，請取消前面的注釋，並確認安裝了相應的壓縮工具包。不指定 `COMPRESSION` 選項會使用 zstd 壓縮的 initramfs 文件。想要創建一個未壓縮的映像，在配置中指定`COMPRESSION=cat` 或者在命令行使用 `-z cat`。

提示：lz4 在高壓縮率模式(`-9`)下映像有2.5的壓縮比率，以付出最慢的單線程壓縮速度為代價，可以獲得最快的解壓縮速度。lzo使用輕度較好的壓縮模式後仍然有較快的解壓速度。 zstd 提供多樣解決方案, 通過參數使用多線程壓縮方式和大範圍壓縮水平，參見 zstd(1) § Operation modifiers。 xz在其高壓縮預設(`-9`)中以大約5的縮減因子實現了最小的體積，但代價是解壓速度要慢得多。

### 壓縮選項(COMPRESSION_OPTIONS)

還有一些額外的標準可以傳遞到 `COMPRESSION` 指定的程序，例如：

    COMPRESSION_OPTIONS='-9'

這個選項可以留空， mkinitcpio 會確保任何支持的壓縮方法有必要的標誌來產生一個可以工作的映像。

警告：使用錯誤的參數選項可能導致內核不能引導，因為錯誤參數導致內核不能解壓生成的壓縮檔。

使用默認的 zstd 壓縮時，`--long`選項在節省自定義內核的空間（特別是在使用 EFI 系統分區作為`/boot`時的雙系統設置）非常有效。但是，內存有限的系統可能無法使用此選項解壓縮 initramfs。還可能需要`-v` 選項來查看 initramfs 生成期間的詳細信息。例如：

    COMPRESSION="zstd"
    COMPRESSION_OPTIONS=(-v -5 --long)

通過使用 xz 的 `-9e` 壓縮級別並解壓可加載內核模塊和固件，可以實現最高（但最慢）的壓縮：

    COMPRESSION="xz"
    COMPRESSION_OPTIONS=(-9e)
    MODULES_DECOMPRESS="yes"

### 模塊解壓縮(MODULES_DECOMPRESS)

`MODULES_DECOMPRESS` 控制內核模塊與固件文件是否在 initramfs 創建時解壓縮。默認為 `no`。

Arch 使用 19 級 zstd 壓縮內核模塊和 linux-firmware包。 當為 initramfs 使用更高的壓縮等級，設置`MODULES_DECOMPRESS="yes"` 可以更大幅度地減少 initramfs 的大小。這會導致在早期啟動階段更高的內存和 CPU 占用，對於內存有限、CPU 性能不足的系統有影響，因為內核將花費更多的時間來解壓縮整個 initramfs 映像，而不是加載單個模塊和固件時解壓縮它們。

提示：在 initramfs 生成過程接近結束時，所有剩餘的 .bz2、.gz、.lz4、.lzma、.lzo、.xz 和 .zst 文件被移動到早期未壓縮的 initramfs 映像以避免雙重壓縮。

## 運行時配置

這篇文章的某些內容需要擴充。

原因：哪個選項可以在 `systemd` 鉤子工作， 哪個只能在 `base`-only? (在 Talk:Mkinitcpio 中討論)

。

運行時配置選項可以通過內核命令行傳遞到 `init` 以及某些鉤子。內核命令行參數通常是由啟動引導器提供。下面討論的參數可以附加到內核命令行以改變默認行為。參見 Arch 啟動過程和內核參數以獲取更多信息。

### 從基本鉤子啟動

`root=`
  這是內核命令行中指定的最重要的參數，因為它決定了哪一個設備會被掛載為你的正確的 root 設備。mkinitcpio 允許不同的格式，詳見Persistent_block_device_naming#Kernel_parameters

注意：下面的選項會改變 `init` 在 initramfs 環境中的默認行為。參見 `/lib/initcpio/init` 獲取更多信息。但當啟用`systemd`鉤子時，這些參數不起作用，因為來自`base`鉤子的 `init` 被取代了。

`break`
  如果`break` 或者 `break=premount` 被指定，`init` 會暫停啟動過程（在加載鉤子之後，但是在掛載根文件系統之前）然後啟動一個交互式終端，一般用來排障。如果指定為`break=postmount`，這個終端會在根目錄掛載後啟動。退出這個 shell 之後可以繼續正常的啟動流程。

`disablehooks=`
  在運行時可以通過添加 `disablehooks=hook1{,hook2,...}` 禁用某些鉤子。例如

      disablehooks=resume

`earlymodules=`
  改變模塊加載的順序。可以通過 `earlymodules=mod1{,mod2,...}` 指定一些模塊提前加載。 (例如，這可以用來確保多個網絡接口的正確順序。)

參見: 常規故障排除#系統啟動問題和 mkinitcpio(8)。

### 使用 RAID 磁碟陣列

參見 RAID#Configure mkinitcpio。

### 使用 net

警告：NFSv4 仍然不被支持 FS#28287。

必須的包

`net` 需要 mkinitcpio-nfs-utils包 包。

內核參數

    内核文档包含最新的信息和清晰的说明。

ip=

這個參數告訴內核怎樣生成設備IP位址和怎樣安裝路由表。它最多可選9個參數： `ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>`。

如果這些參數在內核命令行缺失，所有區域將被認為是空白，則根據 kernel documentation 使用默認參數。通常這就意味這內核利用自動配置表來配置。

`<autoconf>` 參數單獨作為 `ip` 的值出現 (沒有上面提及的任一參數)。如果值是 `ip=off` 或 `ip=none`, 將不會執行自動配置，否則會執行自動配置。最常見的是`ip=dhcp`.

獲取參數具體說明，參見 kernel documentation.

例子：

     ip=127.0.0.1:::::lo:none  --> 启用 loopback 接口。
     ip=192.168.1.1:::::eth2:none --> 启用静态 eth2 接口。
     ip=:::::eth0:dhcp --> 为 eth0 启用 dhcp。

注意：請確保使用內核設備命名 (例如 eth0) 作為 `<device>` 參數, 不要使用 網絡配置#Network interfaces 命名 (例如 enp2s0) 因為這個不起作用。

BOOTIF= 使用多個網卡的時候，此參數可以指定要使用網卡的 Mac 地址。在接口號可能變化或與 IPAPPEND 2 、IPAPPEND 3 選項共用時比較有用。默認使用 eth0.

示例：

    BOOTIF=01-A1-B2-C3-D4-E5-F6  # 注意前缀加"01-" 并且字母要大写。

nfsroot=

如果命令行中沒有給出 `nfsroot` 參數，那麼默認的 `/tftpboot/%s` 會被使用。

     nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

運行`mkinitcpio -H net` 查看參數詳細解釋。

### 使用 lvm

如果你的根分區在 LVM文件系統中, 參見 Install Arch Linux on LVM#Adding mkinitcpio hooks.

### 使用加密根目錄

如果使用加密根目錄，請參考 Dm-crypt/System configuration#mkinitcpio。

### /usr 放到單獨分區

如果將 /usr 放在單獨分區，必須滿足：

- 添加 `fsck` 鉤子, `/usr`在`/etc/fstab`分區表中的`passno` 參數設置為`2` ，以便啟動時檢查該分區。作為常規推薦 如果想要`/usr`分區可以在啟動時被檢查，以上設置是中肯的。沒有這個鉤子 `/usr` 永遠不能被檢查（fsck）。

- 如果沒使用systemd鉤子，請添加`usr`鉤子。這樣將會在掛載根系統後掛載`/usr` 分區。

## 提示與技巧

### 生成 fallback initramfs 映像

自 mkinitcpio 版本 40 起，默認不生成 fallback initramfs 映像。若需要啟用：

- 調整 `/etc/mkinitcpio.d/` 目錄下相應的 .preset 文件：
  - 注釋掉 `PRESETS=('default')` 行，並取消注釋 `PRESETS=('default' 'fallback')` 行
  - 取消注釋 `fallback_image="/boot/initramfs-linux-fallback.img"`
  - 取消注釋 `fallback_options="-S autodetect"`
- 重新生成 initramfs。
- 更新引導加載程序配置。

警告：缺少後備 initramfs 可能會使您在默認 initramfs 啟動失敗時，失去另一個啟動系統的選項。請務必手頭準備一個可啟動的安裝介質以備救援之用。

## 疑難解答

### 解壓縮映像

如果你對 initrd 映像的內容感到好奇，你可以解壓縮它然後看看裡面的文件。

initrd 映像是一個 SVR4 CPIO 壓縮包，通過 `find` 和 `bsdcpio` 命令生成，利用可被內核理解的壓縮方式被有選擇的壓縮，參考#壓縮方式(COMPRESSION)。

mkinitcpio 包含了一個叫做 lsinitcpio(1) 的工具，可以列出和/或解壓縮出 initramfs 映像的內容。

你可以用下面的命令列出映像中的文件：

    # lsinitcpio /boot/initramfs-linux.img

然後全部解壓縮到當前文件夾：

    # lsinitcpio -x /boot/initramfs-linux.img

你也可以用更對人類友好的方式列出映像中的重要的部分：

    # lsinitcpio -a /boot/initramfs-linux.img

### 重新壓縮解壓之後修改過的映像

激活`/usr/bin/mkinitcpio`腳本的 `build_image` 功能使用此參數：

    build_image outfile compression

將會產生一個擁有`build_image`功能的新腳本，用上面的參數運行它（outfile輸出文件名字，compression壓縮工具），將會把當前目錄下的內容壓縮到一個名字為`outfile`的新文件裡。

警告：建議在運行上面的命令產生一個新的`/boot/initramfs-linux.img`之前把現有的映像重命名作為備份，以便情況不妙時有後悔藥吃。如果因為失誤導致系統無法啟動，你需要用fallback映像或者boot CD啟動，然後運行mkinitcpio來overwrite掉之前做的更改，或者你自己修好它然後重新壓縮映像。

### "/dev must be mounted" when it already is

mkinitcpio使用這個檢測通過判斷`/dev/fd/` 是否存在來判斷`/dev`是否被掛載。如果其他一切看起來都很好，可以通過以下方式手動「創建」：

    # ln -s /proc/self/fd /dev/

(顯然, `/proc` 必須被安裝. mkinitcpio 無論如何要求這樣,指示它要檢測的下一件事。)

### Possibly missing firmware for module XXXX

當內核更新後，initramfs映像被重新構建時，你可能得到以下警告：

    ==> WARNING: Possibly missing firmware for module: wd719x
    ==> WARNING: Possibly missing firmware for module: aic94xx
    ==> WARNING: Possibly missing firmware for module: xhci_pci

如果產生 default映像時出現這些或相近的信息，那麼按照警告要求安裝額外的被需要的固件。絕大部分固件通過安裝安裝 linux-firmware包包獲得。其他提供固件的包可以查看下表或在官方倉庫或 AUR 中搜索固件模塊名字。

除此以外，警告信息只出現在 fallback 映像生成時，可以按照下面的建議來：

- 如果不需要使用缺失模塊的硬體，可以安全地忽略這些警告。
- 如果想要消除這些警告，安裝缺失的固件，元包 mkinitcpio-firmwareAUR 包括絕大部分可選的固件。也可以手動安裝需要的包：

  模塊 | 包
  --- | ---
  aic94xx | aic94xx-firmwareAUR
  ast | ast-firmwareAUR
  bfa | linux-firmware-qlogic包
  bnx2x | linux-firmware-broadcom包
  liquidio | linux-firmware-liquidio包
  mlxsw_spectrum | linux-firmware-mellanox包
  nfp | linux-firmware-nfp包
  qat_420xx | linux-firmware-intel包
  qed | linux-firmware-qlogic包
  qla1280 | linux-firmware-qlogic包
  qla2xxx | linux-firmware-qlogic包
  wd719x | wd719x-firmwareAUR
  xhci_pci xhci_pci_renesas | upd72020x-fwAUR

如果想去掉警告，但不想浪費磁碟空間在不需要的固件包上，可以禁用 #生成 fallback initramfs 映像。

對於不可用的固件，也可以通過創建占位文件來抑制警告，例如：

    # echo "设备不可用" > /usr/lib/firmware/qat_420xx.bin
    # echo "设备不可用" > /usr/lib/firmware/qat_420xx_mmp.bin

### 沒有發現 PS/2 控制器

在一些主板（主要是早期的但是也有一些新的主板）， i8042 控制器不能被自動偵測到。這很罕見，但是一些人確定沒有鍵盤使用。 可以提前偵測到這種情況。PS/2 接口得到 `i8042: PNP: No PS/2 controller found. Probing ports directly` 信息，加 atkbd 到 `MODULES` 數組。

### 標準急救過程

使用不正確的初始化內存映像盤經常出現不可引導。因此遵守以下的系統急救過程：

#### 在一台機器引導成功，但在另一台引導失敗

在主要映像 initramfs 掃描 `/sys` 時 mkinitcpio的 `autodetect` 鉤子 過濾掉了 kernel modules ，這些模塊在啟動被調用。 如果轉移`/boot` 目錄到其他機器，在早期用戶空間造成啟動失敗，原因是新的硬體由於缺失內核模塊不能被偵測到。注意USB 2.0 和 3.0 需要不同的模塊。

修正這個缺陷，首先試著從引導記錄bootloader 中選擇 fallback 映像 ，因為這個映像不使用`autodetect`過濾模塊。 一旦引導成功，在新機器上運行mkinitcpio用正確的模塊重建主要映像。如果fallback映像失敗，試著用 Arch Linux live CD/USB，使用 arch-chroot 進入系統中, 在新機器上運行 mkinitcpio 。最後的手段，手工增加模塊到[#MODULES|手動]]映像中。

### 無法訪問控制台，root 用戶被鎖定

`systemd` 鉤子會禁用 root 用戶。要啟用緊急 shell，請臨時在內核參數中添加 `SYSTEMD_SULOGIN_FORCE=1`。

或者，也可以使用 initcpio-hook-shadowcopyAUR。安裝後，在 `/etc/mkinitcpio.conf` 中將 `shadowcopy` 鉤子置於 `systemd` 之後，並使用 `mkinitcpio -P` 重新生成 initramfs。更多文檔請參見其 GitHub 倉庫。

## 另見

- Linux Kernel documentation on initramfs, "What is rootfs?"
- Linux Kernel documentation on initrd
- Wikipedia article on initrd

分類：​

- Initramfs
- 內核
- Arch 項目
- 命令

mkinitcpio
新增話題