• 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分享! 
  • 相关阅读:
    shell 脚本编程学习
    LMH6505 vs AD8336
    ubuntu 8.04 NFS服务的配置(转)
    新博客开张了!
    基于ARMlinux环境下的音频系统开发
    可恶的英语考试
    转HashTable(C#)
    我的手机3300
    高效注册DLL控件 让你的IE浏览器复活
    学习.NET2.0随笔
  • 原文地址:https://www.cnblogs.com/mywolrd/p/1930706.html
Copyright © 2020-2023  润新知