Linux工具:使用mkinitcpio

使用mkinitcpio

简介

    mkinitcpio是一代的initramfs制作工具。相对于老的mkinitrd和mkinitramfs,它有以下很多优点。
  • 它使用Linux核心开发小组开发的klibc和kinit为早期(启动)的userspace提供一个小巧轻量级的基本系统。
  • 它在系统启动的时候使用udev来检测硬件,因此防止大量不必要的模块被加载。
  • 基于hook的init脚本使它很容易通过自定义hooks来进行扩展(/etc/mkinitcpio.conf),有很多hooks包含在源里的软件包里,可以很容易用pacman来安装,从而避免修改mkinitcpio自身。
  • 它早已经为legacy和luks volumes两者、raid、swsusp、suspend2唤醒以及从USB设备启动提供lvm2,dm-crypt支持。
  • 很多新特性可以通过内核参数来进行调整,而不用重建image.
  •  mkinitcpio可以将image集成在一个内核镜像之中,因此制作一个自我包含的内核镜像已经成为可能。
    mkinitcpio在community社区的协助下,由phrakture和tpowa开发完成。

安装mkinitcpio

    添加current的源,通过pacman -Sy mkinitcpio安装。如果想使用最新开发版本,可以使用phrakture的svn源:
    #svn co http://phraktured.net/initramfs
    最新的程序位于initramfs/mkinitcpio目录下
    为2.6.17内核激活mkinicpio在内核安装或升级的过程中,会又两个镜像生成。
    如果你使用kernel26
    /boot/kernel26.img --> 通过autodetect削减了体积
    /boot/kernel26-fallback.img -->包括了全部的模块
    如果你使用kernel26beyond
    /boot/kernel26beyond.img --> 通过autodetect削减了体积
    /boot/kernel26beyond-fallback.img -->包括了全部的模块
    记得修改你的bootloader来加载你想用的image.
注意:
    lvm2,raid和encrypt默认没有被启用,请仔细阅读wiki有关的内容来配置你的系统。
    拥有不止一个的硬盘控制器的用户: 如果你拥有不止一个的SCSI/SATA或者IDE硬盘控制器,且又需要不同的内核模块来加载它们,那么请在/etc/mkinitcpio.conf和fallback配置文件中的 MODULES=" "中指定,否则可能会发生你的根设备不停的转换、遇到随机的kernel panic的情况。

    一个更好的方法是使用Persistent block device naming来保证设备被正确的挂载。

    已知的,在启动的时候不会被加载的模块:如果你需要使用下面列表的模块来挂载你的root device,请考虑在/etc/mkinitcpio.conf中的MODULES=" "加载(相对于fallback.img,请修改对应的配置文件),否则在启动过程会出现kernel panics.
    - SCSI CONTROLLERS (status stock kernel 2.6.18)
    scsi_transport_sas ultrastor qlogicfas eata BusLogic pas16 wd7000 sym53c416
    g_NCR5380_mmio fdomain u14-34f dtc initio in2000 imm t128 aha1542 aha152x
    atp870u g_NCR5380 NCR53c406a qlogicfas408 megaraid_mm advansys

自定义mkinitcpio配置文件

    制作自定义的image
    要打造适合自己系统的img文件,请修改默认的/etc/mkinitcpio.conf文件

    制作fallback image
    如果你使用kernel26,修改 /boot/mkinitcpio-kernel26.conf
    如果你使用kernel26beyond, 修改 /boot/mkinitcpio-kernel26beyond.conf
    然后请在/etc/pacman.conf中加入NoUpgrade=* (*为你修改过的文件),这样下次mkinitcpio更新的时候就不会使用新的配置文件来覆盖原来修改过的文件了。

配置HOOKS

 
下面就是mkinitcpio配置中最重要的部分了。/etc/mkinitcpio.conf中的HOOKS条目包含的hooks指导mkinitcpio应该把那些模块做成img,并在系统启动的时候执行这些模块(举例: initrd /boot/*.img),格式如下:
HOOKS="foo1 foo2 foo3 bar1 bar2"

可用的hooks:

base: 建立初始的、所有必需的目录,安装基本的klibc工具和库文件。你需要这个hook,除非你知道自己在干什么。

udev: 为你的img文件添加udev。
启动时:Udev用来建立你的root device的节点(例如/dev/*da),为root device检测需要的模块。由于这个hook简化了很多事情,所以推荐使用。

modload:
启动时:自动检测的另一个替代方法,但是比udev慢很多,不推荐使用,还是用udev吧。

autodetect: 自动检测你的系统所需要的模块,从而缩小initramfs的体积。记得检验被包含的模块的正确和完整。为了充分发挥autodetcet的优势,这个hook必须先于其他hooks子系统启动。任何先于“autodetec”启动的hook会被最大化安装。

ide: 为img添加IDE模块。如果你的root device基于一个IDE硬盘,请使用。同样,如你想最小化img的size,同时使用autodetect.
启动时:加载IDE模块,要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

pata: 为img添加IDE模块.如果你的root device基于一个IDE硬盘,请使用。同样,如你想最小化img的size,同时使用autodetect.
启动时:加载IDE模块。要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。PATA是内核里新的IDE驱动,它会将/dev/hd*改成/dev/sd*. 要了解更多请查看:
http://archlinux.org/news/272/

sata:将serial ATA模块添加到image中。如果你的根分区装在sata硬盘上,请使用。同样,配合autodetect来缩小体积。
启动时:加载SATA模块,要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

scsi: 将SCSI模块添加到img。如果你的root device基于SCSI硬盘,请使用。
启动时:加载SCSI模块,要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

usb:将USB模块添加到img。如果你的根分区在usb设备上(优盘上的Linux),请使用。
启动时:加载USB模块,要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

usbinput: 将USB HID modules添加到image。如果你在系统早期启动的时候(安全模式)需要用到usb键盘,请使用。
启动时:加载USB HID模块,要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

fw:将FIREWIRE模块添加到img。如果你的根分区在FW设备上,请使用。
启动时:启动时:加载FW模块,要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

net:为网络设备添加必要的模块。如要使用pcmcia设备,也请添加 pcmcia hook。
启动时:加载network模块。要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

pcmcia:为pcmcia设备添加必需的模块,要安装pcmciautils。
启动时:加载pcmcia模块。要使用这个hook,你将会需要udev或者modload hook,除非你已经手动指定需要的模块。

dsdt:在启动的时候加载一个自定义的acpi dsdt文件。将你的dsdt文件改名为custom.dsdt,放到/lib/initcpio目录。
启动时:如果initramfs文件中有dsdt配置文件,它会自动被内核使用。

filesystems: 将必需的文件系统模块添加到image中。要想系统能够启动,这个hook是必须的(除非你把使用的文件系统编进了内核)。
启动时:启用这个hook,系统会在启动的时候检测文件系统的类型,加载文件系统模块并将它转移到kinit.注意:它不会检测reiser4, reiser4必须添加到modules条目。

lvm2:将设备的mapper 内核模块和lvm 工具添加到image。要使用该hook,你必须安装lvm2 package。
启动时:激活所有的lvm2 volume groups。对于位于lvm的文件系统是必须的。

raid: 为software raid安装添加模块和mdassamble。需要安装mdadm。
启动时:为software raid设备加载必需的模块,在启动时装配raid设备。

encrypt: 添加dm-crypt内核模块和crypsetup工具到image。要安装cryptsetup软件包。
启动时:检测并为加密的根分区解锁。

resume:
启动时:从休眠状态唤醒。适用于swsusp和suspend2。

firmware: 添加/lib/firmware的文件
启动时:加载firmware。要使用这个hook,你将会需要udev的配合。

keymap: 从rc.conf文件中添加keymap和consolefonts。
启动时:在早期启动中加载在rc.conf中指定的keymap和consolefont。

实例:

下面这个标准设置可以满足大部分用户:
HOOKS="base udev autodetect ide scsi sata filesystems"

如果想在多台机上使用image,使用下面的配置:
HOOKS="base udev ide scsi sata filesystems"

要在lvm2 volume groups之上使用encrypted volumes:
HOOKS="base udev autodetect ide scsi sata lvm2 encrypt filesystems"

设置 MODULES

 
你可以通过设置配置文件里面的MODULES条目,在任何的东西加载前使用一个模块。例如,如果你不想使用udev或者modload hooks,可以加载所有必须的模块使启动速度更快:
MODULES="piix ide_disk reiserfs"
HOOKS="base autodetect ide filesystems"
注意:如果你使用reiser4,那就必须将它加载到MODULES条目。

设置 BINARIES and FILES

 
这几个选项的作用是允许你将文件添加进image里。唯一不同的地方是, BINARIES会检查binaries和libraries的依赖,而FILES则是简单的添加文件。
例子:
FILES="/etc/modprobe.conf"
BINARIES="/usr/bin/somefile"

创建image

 
重建预先确定/目前使用的image
如果你想为archlinux的原始的kernel26内核重建initramfs image, 那么请用下面的命令:
# mkinitcpio -p kernel26
上面是kernel26的例子,对于其它内核packages,例如beyond,都是适用的。

如果你想改变

手动制作:
用以下命令生成image:
mkinitcpio -g /boot/kernel26.img
该命令会在/boot目录下生成一个目前运行的内核(kernel26)的image。kernel26beyond的用户要用以下命令:mkinitcpio -g /boot/kernel26beyond.img

当然,你自己喜欢下载内核源码亲自编译,像我这样:),那么你需要:
mkinitcpio -g /boot/*.img -k (/lib/modules/*)
注:第一个*是img文件的前部分名称,任意取;-k 参数后面的,用ls /lib/modules看一下,输入由于你自己编译而产生的目录名称。例如我编译2.6.20,安装模块后,在/lib/modules生成2.6.20的文件夹,那么制作image的时候要用:mkinitcpio -g /boot/*.img -k 2.6.20

为目前不使用内核创建image,一定要用-k参数!
要为目前运行的内核创建fallback image,例如kernel26, kernel26beyond,你要:
mkinitcpio -c /boot/mkinitcpio-kernel26.conf -g /boot/kernel26.img
For beyond:
mkinitcpio -c /boot/mkinitcpio-kernel26beyond.conf -g /boot/kernel26beyond.img
一般来书,安装kernel26或者kernel26beyond的时候,系统会自动创建fallback.img的。而且我的系统上好像没有/boot/mkinitramfs-kernel26.conf这文件(我没有删除kernel26)

生成了image后,使用之前记得修改bootloader的配置文件。


自定义内核启动参数

 
就好像不用initramfs的话,有的选项需要通过内核命令行(kernel command line)来告诉内核如何启动,例如我们都要在kernel /boot/vmliuz 这一行指定root=/dev/*d* ro 。而且有的mkinitcpio hooks 有特殊的选项,要通过内核命令行来实现。这些东西我们将在下面进行讨论:
如果你不知道什么是内核命令行,那么请参考grub或者lilo的说明文档。

进入failsafe mode
如果你在内核命令行加入了这个选项: break=y
init会在启动完成后停止,并进入命令行模式,这个功能能让我们检查init的启动情况。输入exit后,系统会继续启动。

禁止hooks
你可以在启动的时候禁止一个或多个hook, 只要在内核命令行输入disablehooks=hook1,hook2,hook3
例如:
disablehooks=resume

把modules加入黑名单
方法如上: disablemodules=mod1,mod2,mod3
例如:
disablemodules=ata_piix

使用raid(译者对raid不熟悉,略过)
使用net (都是比较高级的网络参数,对于我等桌面用户没什么用,略过)
使用lvm (没用过,略过)
使用encrypted root (没用过,略过)
使用休眠 (Linux下的休眠不怎么敢试,略过)

Bootloader的配置实例 (我想玩ArchLinux的人都应该都会该这个吧,略过)

Troubleshooting

(Intel)piix ide 控制器和 beyond 内核
问题:
如果你碰到在系统切换到kinit, mkinitcpio检测你的硬盘时,提示“Can't find device dev(0,0)”的错误信息,这可能是ata_piix和piix驱动相冲突的结果。 Beyond内核打了一些libata的补丁,会导致 ata_piix和 piix冲突。
解决方法:
修改 /etc/mkinitcpio.conf,只启用ide、sata或者scsi三个中的一个,这取决于你的系统事实上需要什么来启动。
 
注:转载自http://www.linuxsir.org/bbs/thread293129.html,感谢xsam分享! 
posted @ 2009-02-06 13:37  david++  阅读(4060)  评论(0编辑  收藏  举报