跳至內容

mkinitcpio

出自 Arch Linux 中文维基

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

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

基於 systemd 的 initramfs(版本 40 起默認)
systemd 在早期用戶空間階段開始時即被啟動。需要執行的任務由常規的 systemd 單元文件決定。參見 systemd 啟動流程
優點
  • 與 systemd 生態系統的其餘部分緊密集成,帶來更一致、流暢的啟動流程。
  • 能更有效地並行化某些啟動任務,在某些場景下可能縮短整體啟動時間。
  • 提供更全面的功能集,例如 systemd-cryptsetup-generatorGPT 分區自動掛載功能。
缺點
  • 依賴較多,生成映像較大。由於包含 systemd 二進制文件及其依賴項,通常會導致 initramfs 增大,可能會稍稍延長啟動時間。
基於 BusyBox 的 initramfs
啟動一個 init 腳本,該腳本隨後掃描 initramfs 查找需要執行的腳本(即本文中的「運行時鉤子」)。
優點
  • 輕量級,依賴較少,生成映像較小。


具體採用哪種方案取決於 /etc/mkinitcpio.confHOOKS 數組中是否包含 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 數組中。
  • 當使用 encryptsd-encrypt 鉤子時,目標系統和運行mkinitcpio系統不同時,鍵盤模塊和/或啟動系統期間需要解鎖LUKS設備的文件系統模塊加入 MODULES 數組。例如,如果需要使用位於一個ext2系統的鑰匙文件,但是運行mkinitcpio的系統中ext2文件系統沒有被掛載,增加ext2。參見 dm-crypt/System configuration#cryptkey 獲得更多細節。
  • 如果使用USB3接口的鍵盤,希望用它來解鎖LUKS設備。增加usbhid xhci_hcd
  • 如果使用顯示器連接擴展塢,可能需要加入你的顯卡模塊使初始化輸出信息可見(例如,為大多數英特爾顯卡加入 i915 )。

二進制文件和普通文件(BINARIES、FILES)

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

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

注意 BINARIESFILESBash數組,配置支持多個選項,用空格隔開。

鉤子(HOOKS)

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

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

構建時鉤子

構建時鉤子位於/usr/lib/initcpio/install,自定義的構建時鉤子可能位於/etc/initcpio/install/。這些文件會在運行 mkinitcpio 時被包含進腳本,應該提供如下兩個函數:buildhelpbuild 函數描述了需要加入映像的模塊、文件和二進制文件。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, sleepstrip的信息, 找出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 添加lzolz4內核模塊,以允許在使用編譯時默認值以外的休眠映像壓縮算法時恢復。添加 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 掛鉤後調用此掛鉤,之添加系統中使用的塊設備的模塊。模塊ahcisd_modusb_storageuasmmc_blocknvmevirtio_scsivirtio_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=offip=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 壓縮包,通過 findbsdcpio 命令生成,利用可被內核理解的壓縮方式被有選擇的壓縮,參考#壓縮方式(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 信息,加 atkbdMODULES 數組。

標準急救過程

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

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

在主要映像 initramfs 掃描 /sysmkinitcpioautodetect 鉤子 過濾掉了 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 倉庫

另見