linux kernel 格式之 vmlinux、zImage、bzImage、vmlinuz、uImage
vmlinux 是編譯出來的未經壓縮的原始內核文件,是linux接受的可執行文件格式(ELF、COFF),vm 是 Virtual Memor
y 的縮寫,與較老的DOS系統只有640K內存限制相比,linux 支持虛擬內存,linux可以使用硬盤空間作為虛擬
內存,因而得名 vm。
zImage 是由gzip壓縮vmlinux文件,並加上一段解壓啟動代碼得到的壓縮文件,只能從0X00地址運行。
bzImage 表示 big zImage,bzImage 解壓縮內核到高端內存(1M以上),zImage 解壓縮內核到低端內存(第一個640K
),如果內核較小,可以采用 zImage 或 bzImage,內核較大就應該采用 bzImage
vmlinuz 是 zImage、bzImage的統稱,編譯內核時通過以下兩種方式生成
1. 先make zImage,再 cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz
2. 先make bzImage,再 cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz
uImage 是U-boot使用的映像文件,使用工具 mkimage 在 zImage 文件頭部補加長度為0X40的頭信息,該頭部信息說
明了該映像文件的類型、加載位置、生成時間、大小等信息,即從uImage的0x40位置開始的內容與zImage
、bzImage是一樣的
GRUB 是一款多操作系統啟動管理器,是 GRand Unified Bootloader 縮寫,它可以從 FAT、minix、FFS、ext2、
ReiserFS分區讀取內核,即使grub菜單配置不正確,仍可以通過其控制台設置內核參數來引導系統
GRUB 2 筆記
grub 2 的配置文件主要包括 /etc/default/grub 和 /etc/grub.d/ 下的各文件,同樣用 fd 表示軟盤、hd 表示硬盤(包括 ID
E、SCSI 硬盤),設備編號從0開始、分區編號從1開始,主分區從 1-4,邏輯分區從 5 開始,例如
(fd0) 表示整個軟盤
(hd0, 1) 表示BIOS中第1個硬盤的第1個分區
(hd0, 5)/boot/vmlinuz 表示BIOS中第1個硬盤的第1個邏輯分區下 boot 目錄下的 vmlinuz 文件
GRUB 2 命令介紹
ls
ls (hd0, 5)/ 顯示該分區的所有文件
ls -l 列出當前所有設備,如(hd0)、(hd0, 1)、(hd0, 5)、(hd1)、(hd1, 1)、(hd1, 2) 等
ls / 列出當前設為 root 的分區下的文件
ls (hd1, 1) 列出(hd1, 1)分區下的文件
root
指定用於啟動系統的分區,即根目錄。set root 就是設置 root 這個環境變量的值
root (hd0, x) 掛載第1個硬盤的第 x 個分區,可以通過 ls 查看這個分區的內容
loopback
建立回放設備,舉例如下,使用 lo0 設備訪問 aa.iso 里內容,從aa.iso里的軟盤映像中啟動
loopback lo0 (hd0, 3)/aa.iso 利用 grub 回放設備掛載 iso,這樣就不用提取 casper 文件夾
linux (lo0)/memdisk
initrd (lo0)/aa.img
loopback -d lo0 刪除回放設備 lo0
search
search -f /ntldr 列出根目錄里包含 ntldr 文件的分區,返回分區號
search -l LINUX 列出 label 是 LINUX 的分區
search --set -f /ntldr 搜索根目錄包含 ntldr 文件的分區並設為 root,如果存在多個分區包含 ntldr 文件,
則 set 不起作用
kernel
用來加載 linux 內核,舉例如下
kernel /boot/bzImage ro ramdisk_size=65536 root=/dev/ram0
"/boot/bzImage" 指定加載哪個內核
"root=" 指定了哪個分區作為根設備,"/dev/ram0" 是從 linux 角度講的,內核要從根設備上
讀取一些文件
linux
該命令是用來取代 grub 的 kernel 命令的,加載 linux 內核,舉例如下
linux /boot/vmlinuz-XXX root=UUID=xxx quiet splash rw init=/bin/bash
"/boot/vmlinuz-XXX" 指定加載哪個內核
"root=UUID=xxx" 指定了哪個分區作為根設備,也可以使用 "root=/dev/ram0"
"quiet" 內核啟動時,簡化提示信息
"splash" 加載時啟動進度條提示,代替 init 的字符提示
"rw init=/bin/bash" 讓 init 進程執行 /bin/bash,無密碼進入 root 單用戶模式,執行一些救援工作
rw 表示讀寫權限,忘記添加該參數的話,root 用戶也不能執行寫操作
initrd
initial ram disk 縮寫,先加載虛擬根文件系統,再加載硬盤上的根文件系統,舉例如下
initrd /boot/initrd.img-XXX 使用名稱為"/boot/initrd.img-XXX"的文件在內存中構造虛擬的根文件系統,以便
於內核檢測完硬件信息后載入必需的模塊等等
如果 grub 配置中丟失了該動作,屏幕會出現 kernel panic 提示,因為 initrd.img-XXX 文件在開機時給 kernel 提
供必需的設備驅動(modules)文件,否則 kernel 不能把硬件掛載到根文件系統