• 生成CPIO格式的initrd


    因为initrd.img只是系统启动的一个虚拟磁盘而已,系统启动完成后就没有用处了,因此,我决定用busybox来完成一些必要的启动工作(用的是busybox-1.5.1,配置文件如下)
    cd /tmp
    mkdir initrd
    cd initrd
    mkdir dev proc sys lib mnt
    mkdir -p lib/modules/kernel/{drivers,fs}
    mkdir -p lib/modules/kernel/drivers/{ide,scsi,usb}
    mkdir -p lib/modules/kernel/drivers/usb/{core,host,input,storage}
    mkdir -p lib/modules/kernel/fs/{ext2,ext3,jbd}
    注:复制内核模块有一些讲究,经过分析,要用U盘启动,必须要有sd_mod usb-storage内核模块才能让内核认出U盘,通过分析/lib/modules/uname -r/modules.dep这个文件可以发现:
    usb-storage 依赖scsi_mod、usbcore和ide-core这三个模块,但是没有说明依赖usb/host/下面的模块,但是,只有将 drivers/usb/host/下面的模块加载以后,内核才能识别USB设备,因此,drivers/usb/host/目录下的模块是需要复制的
    sd_mod 依赖scsi_mod
    因为我的U盘上的文件系统是ext3的,因此还需要复制fs/ext3下的所有内核模块(为了稳妥,我同时复制了fs/ext2下的模块)
    ext3 依赖 mbcache 和 jbd 模块
    这么查找后,已经分析清楚U盘启动的时候需要哪些模块了

    /lib/modules/`uname -r`/kernel/drivers/ide/ide-core.ko
    /lib/modules/`uname -r`/kernel/drivers/scsi/scsi_mod.ko
    /lib/modules/`uname -r`/kernel/drivers/scsi/sd_mod.ko
    /lib/modules/`uname -r`/kernel/drivers/usb/core/usbcore.ko
    /lib/modules/`uname -r`/kernel/drivers/usb/host/ehci-hcd.ko
    /lib/modules/`uname -r`/kernel/drivers/usb/host/ohci-hcd.ko
    /lib/modules/`uname -r`/kernel/drivers/usb/host/uhci-hcd.ko
    /lib/modules/`uname -r`/kernel/drivers/usb/storage/usb-storage.ko
    /lib/modules/`uname -r`/kernel/drivers/usb/input/usbhid.ko #加载这个模块是为了支持USB键盘,如果在启动过程中,如果出现无法找到root的时候,会进入一个临时的shell,因此可能需要一些简单的调试,如 果是USB键盘的话,就必须要加载这个模块了
    /lib/modules/`uname -r`/kernel/fs/ext2/ext2.ko
    /lib/modules/`uname -r`/kernel/fs/ext3/ext3.ko
    /lib/modules/`uname -r`/kernel/fs/jbd/jbd.ko
    /lib/modules/`uname -r`/kernel/fs/mbcache.ko
    

    将这些文件按照目录结构复制到lib/modules/kernel下,我省略了uname -r,是为了简化脚本,以便在有新的内核的时候不需要修改启动脚本。

    创建设备文件
    mknod dev/console c 5 1
    mknod dev/null c 1 3

    复制可执行文件
    cp -a /usr/local/src/busybox-1.5.1/_install/{bin,sbin} .

    生成init文件(注, 用不同格式的initrd就需要不同名字的启动文件,这个是我爬了一周的网后得出 的结果,如果是ASCII cpio archive (SVR4 with no CRC)格式的initrd文件,那么就应该使用init,否则,就使用linuxrc,具体可参看linux: Documentation/initrd.txt,只是ramdisk的启动方式比较复杂,而initramfs的方式比较简单,因此我选择用 initramfs的方式)

    cat > init < #!/bin/sh
    #
    # Utility functions
    #
    PATH="/bin:/sbin"
    
    #
    # Setting up mounts
    #
    mount -nt sysfs sysfs /sys
    mount -nt proc proc /proc
    
    ro=-r
    INIT=/sbin/init
    ROOTDELAY=10
    ROOT=/dev/sda1
    
    for i in $(cat /proc/cmdline)
    do
    case "$i" in
    rootdelay=*)
    ROOTDELAY=${i#rootdelay=}
    ;;
    root=/dev/*)
    ROOT=${i#root=}
    ;;
    init=*)
    INIT=${i#init=}
    ;;
    ro)
    ro=-r
    ;;
    rw)
    ro=
    ;;
    esac
    done
    
    #load needed modules
    insmod /lib/modules/kernel/fs/mbcache.ko
    insmod /lib/modules/kernel/fs/jbd/jbd.ko
    insmod /lib/modules/kernel/fs/ext2/ext2.ko
    insmod /lib/modules/kernel/fs/ext3/ext3.ko
    
    insmod /lib/modules/kernel/drivers/ide/ide-core.ko
    insmod /lib/modules/kernel/drivers/scsi/scsi_mod.ko
    insmod /lib/modules/kernel/drivers/usb/core/usbcore.ko
    insmod /lib/modules/kernel/drivers/usb/input/usbhid.ko
    insmod /lib/modules/kernel/drivers/usb/host/ehci-hcd.ko
    insmod /lib/modules/kernel/drivers/usb/host/ohci-hcd.ko
    insmod /lib/modules/kernel/drivers/usb/host/uhci-hcd.ko
    insmod /lib/modules/kernel/drivers/usb/storage/usb-storage.ko
    insmod /lib/modules/kernel/drivers/scsi/sd_mod.ko
    
    echo "wait root ..."
    sleep $ROOTDELAY
    
    mdev -s
    
    [ -b $ROOT ] || (echo "not find root";/bin/sh)
    
    
    mount -n $ro -o errors=remount-ro $ROOT /mnt
    
    echo "Switching root ..."
    umount -n /sys
    umount -n /proc
    exec switch_root /mnt $INIT "$@"
    EOFINIT
    

    生成initrd

    find . | cpio -o -H newc | gzip > /mnt/sda1/boot/initrd.img-2.6.18-4-686
    

    (注:-H newc 是必须的,否则内核会认为是ramdisk,而不是initramfs,因为这个,我重新启动电脑N次(N>20))

  • 相关阅读:
    第一个博客——python通过值传递函数参数
    JAVA并发体系-1.1-终结任务或线程
    JAVA并发体系-1.4-线程池
    JAVA并发体系-1.3-线程之间的协作
    JAVA并发体系-2-锁机制
    并发实现机制-1-综述
    JAVA并发体系-3-并发容器
    并发实现机制-2-互斥实现
    并发实现机制-3-死锁和饥饿
    JAVA持有对象
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/14261082.html
Copyright © 2020-2023  润新知