内核重新编译之make install和生成initramfs的过程分析

$ sudo make install
sh /home/ch/下载/linux-3.13/arch/x86/boot/install.sh 3.13.0 arch/x86/boot/bzImage \
        System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.13.0 /boot/vmlinuz-3.13.0
run-parts: executing /etc/kernel/postinst.d/dkms 3.13.0 /boot/vmlinuz-3.13.0
Error! Bad return status for module build on kernel: 3.13.0 (i686)
Consult /var/lib/dkms/fglrx/13.350.1/build/make.log for more information.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.13.0 /boot/vmlinuz-3.13.0
update-initramfs: Generating /boot/initrd.img-3.13.0
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.13.0 /boot/vmlinuz-3.13.0
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.13.0 /boot/vmlinuz-3.13.0
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.13.0 /boot/vmlinuz-3.13.0

Generating grub configuration file ...




cat  /etc/kernel/postinst.d/initramfs-tools
#!/bin/sh -e

version="$1"
bootopt=""

# passing the kernel version is required
if [ -z "${version}" ]; then
    echo >&2 "W: initramfs-tools: ${DPKG_MAINTSCRIPT_PACKAGE:-kernel package} did not pass a version number"
    exit 2
fi

# exit if custom kernel does not need an initramfs
if [ -n "${KERNEL_PACKAGE_VERSION}" ] && [ "$INITRD" = 'No' ]; then
    exit 0
fi

# absolute file name of kernel image may be passed as a second argument;
# create the initrd in the same directory
if [ -n "$2" ]; then
    bootdir=$(dirname "$2")
    bootopt="-b ${bootdir}"
fi

# avoid running multiple times
if [ -n "$DEB_MAINT_PARAMS" ]; then
    eval set -- "$DEB_MAINT_PARAMS"
    if [ -z "$1" ] || [ "$1" != "configure" ]; then
        exit 0
    fi
fi

# we're good - create initramfs.  update runs do_bootloader
INITRAMFS_TOOLS_KERNEL_HOOK=1 update-initramfs -c -t -k "${version}" ${bootopt} >&2






#!/bin/sh

STATEDIR=/var/lib/initramfs-tools
BOOTDIR=/boot
CONF=/etc/initramfs-tools/update-initramfs.conf
USETRIGGERS=true
mode=""
version=""
update_initramfs=yes
backup_initramfs=no

set -e

[ -r ${CONF} ] && . ${CONF}

case "$DPKG_MAINTSCRIPT_PACKAGE" in
linux-image-*)
    if [ -z "$INITRAMFS_TOOLS_KERNEL_HOOK" ]; then
        # kernel maintainer script called us directly; ignore
        # it and let the hook script handle it instead
        echo "update-initramfs: deferring update (hook will be called later)"
        exit 0
    fi
    ;;
?*)
    if       $USETRIGGERS                        \
        && [ $# = 1 ]                        \
        && [ x"$1" = x-u ]                    \
        && dpkg-trigger --check-supported 2>/dev/null
    then
        if dpkg-trigger --no-await update-initramfs; then
            echo "update-initramfs: deferring update (trigger activated)"
            exit 0
        fi
    fi
    ;;
esac

usage()
{
    if [ -n "${1:-}" ]; then
        printf "${*}\n\n" >&2
    fi
    cat >&2 << EOF
Usage: ${0} [OPTION]...

Options:
 -k [version]    Specify kernel version or 'all'
 -c        Create a new initramfs
 -u        Update an existing initramfs
 -d        Remove an existing initramfs
 -t        Take over a custom initramfs with this one
 -b        Set alternate boot directory
 -v        Be verbose
 -h        This message

EOF
    exit 1
}

# chroot check
chrooted()
{
    # borrowed from udev's postinst
    if [ "$(stat -c %d/%i /)" = "$(stat -Lc %d/%i /proc/1/root 2>/dev/null)" ]; then
        # the devicenumber/inode pair of / is the same as that of
        # /sbin/init's root, so we're *not* in a chroot and hence
        # return false.
        return 1
    fi
return 0
}

mild_panic()
{
    if [ -n "${1:-}" ]; then
        printf "${*}\n" >&2
    fi
    exit 0
}

panic()
{
    if [ -n "${1:-}" ]; then
        printf "${*}\n" >&2
    fi
    exit 1
}

verbose()
{
    if [ "${verbose}" = 1 ]; then
        printf "${*}\n"
    fi
}

version_exists()
{
    [ -e "${STATEDIR}/${1}" ] && [ -e "${initramfs}" ]
    return $?
}

set_initramfs()
{
    initramfs="${BOOTDIR}/initrd.img-${version}"
}


# backup initramfs while running
backup_initramfs()
{
    [ ! -r "${initramfs}" ] && return 0
    initramfs_bak="${initramfs}.dpkg-bak"
    [ -r "${initramfs_bak}" ] && rm -f "${initramfs_bak}"
    ln -f "${initramfs}" "${initramfs_bak}" \
        || cp -a "${initramfs}" "${initramfs_bak}"
    verbose "Keeping ${initramfs_bak}"
}

# keep booted initramfs
backup_booted_initramfs()
{
    initramfs_bak="${initramfs}.dpkg-bak"

    # first time run thus no backup
    [ ! -r "${initramfs_bak}" ] && return 0

    # chroot with no /proc
    [ ! -r /proc/uptime ] && rm -f "${initramfs_bak}" && return 0

    # no kept backup wanted
    [ "${backup_initramfs}" = "no" ] && rm -f "${initramfs_bak}" && return 0

    # no backup yet
    if [ ! -r "${initramfs}.bak" ]; then
        mv -f ${initramfs_bak} "${initramfs}.bak"
        verbose "Backup ${initramfs}.bak"
        return 0
    fi

    # keep booted initramfs
    boot_initramfs=
    uptime_days=$(awk '{printf "%d", $1 / 3600 / 24}' /proc/uptime)
    if [ -n "$uptime_days" ]; then
        boot_initramfs=$(find "${initramfs}.bak" -mtime +${uptime_days})
    fi
    if [ -n "${boot_initramfs}" ]; then
        mv -f "${initramfs_bak}" "${initramfs}.bak"
        verbose "Backup ${initramfs}.bak"
        return 0
    fi
    verbose "Removing current backup ${initramfs_bak}"
    rm -f ${initramfs_bak}
}

# nuke generated copy
remove_initramfs_bak()
{
    [ -z "${initramfs_bak:-}" ] && return 0
    rm -f "${initramfs_bak}"
    verbose "Removing ${initramfs_bak}"
}


generate_initramfs()
{
    echo "update-initramfs: Generating ${initramfs}"
    OPTS="-o"
    if [ "${verbose}" = 1 ]; then
        OPTS="-v ${OPTS}"
    fi
    if mkinitramfs ${OPTS} "${initramfs}.new" "${version}"; then
        mv -f "${initramfs}.new" "${initramfs}"
        set_sha1
    else
        mkinitramfs_return="$?"
        remove_initramfs_bak
        rm -f "${initramfs}.new"
        if [ "$mkinitramfs_return" = "2" ]; then
            # minversion wasn't met, exit 0
            exit 0
        fi
        echo "update-initramfs: failed for ${initramfs} with $mkinitramfs_return." >&2
        exit $mkinitramfs_return
    fi
}

# lilo call
run_lilo()
{
    # show lilo errors on failure
    if ! lilo -t  > /dev/null 2>&1 ; then
        echo "ERROR lilo fails for new ${initramfs}:" >&2
        echo
        lilo -t
    fi
    lilo
}

# Invoke bootloader
run_bootloader()
{
    # invoke policy conformant bootloader hooks
    if [ -d /etc/initramfs/post-update.d/ ]; then
        run-parts --arg=${version} --arg=${initramfs} \
            /etc/initramfs/post-update.d/
        return 0
    fi
}

compare_sha1()
{
    sha1sum "${initramfs}" | diff "${STATEDIR}/${version}" - >/dev/null 2>&1
    return $?
}

# Note that this must overwrite so that updates work.
set_sha1()
{
    sha1sum "${initramfs}" > "${STATEDIR}/${version}"
}

delete_sha1()
{
    rm -f "${STATEDIR}/${version}"
}

# ro /boot is not modified
ro_boot_check()
{
    # check irrelevant inside of a chroot
    if [ ! -r /proc/mounts ] || chrooted; then
        return 0
    fi

    boot_opts=$(awk '/boot/{if ((match($4, /^ro/) || match($4, /,ro/)) \
        && $2 == "/boot") print "ro"}' /proc/mounts)
    if [ -n "${boot_opts}" ]; then
        echo "WARNING: /boot is ro mounted."
        echo "update-initramfs: Not updating ${initramfs}"
        exit 0
    fi
}

get_sorted_versions()
{
    version_list=""

    for gsv_x in "${STATEDIR}"/*; do
        gsv_x="$(basename "${gsv_x}")"
        if [ "${gsv_x}" = '*' ]; then
            return 0
        fi
        worklist=""
        for gsv_i in $version_list; do
            if dpkg --compare-versions "${gsv_x}" '>' "${gsv_i}"; then
                worklist="${worklist} ${gsv_x} ${gsv_i}"
                gsv_x=""
            else
                worklist="${worklist} ${gsv_i}"
            fi
        done
        if [ "${gsv_x}" != "" ]; then
            worklist="${worklist} ${gsv_x}"
        fi
        version_list="${worklist}"
    done

    verbose "Available versions: ${version_list}"
}

set_current_version()
{
    if [ -f /boot/initrd.img-`uname -r` ]; then
        version=`uname -r`
    fi
}

set_linked_version()
{
    linktarget=
    if [ -e /initrd.img ] && [ -L /initrd.img ]; then
        linktarget="$(basename "$(readlink /initrd.img)")"
    fi

    if [ -e /boot/initrd.img ] && [ -L /boot/initrd.img ]; then
        linktarget="$(basename "$(readlink /boot/initrd.img)")"
    fi

    if [ -z "${linktarget}" ]; then
        return
    fi

    version="${linktarget##initrd.img-}"
}

set_highest_version()
{
    get_sorted_versions
    if [ -z "${version_list}" ]; then
        version=
        return
    fi
    set -- ${version_list}
    version=${1}
}

create()
{
    if [ -z "${version}" ]; then
        usage "Create mode requires a version argument"
    fi

    set_initramfs

    if [ "${takeover}" = 0 ]; then
        if version_exists "${version}"; then
            panic "Cannot create version ${version}: already exists"
        fi

        if [ -e "${initramfs}" ]; then
            panic "${initramfs} already exists, cannot create."
        fi
    fi

    generate_initramfs
}

update()
{
    if [ "${update_initramfs}" = "no" ]; then
        echo "update-initramfs: Not updating initramfs."
        exit 0
    fi

    if [ -z "${version}" ]; then
        set_highest_version
    fi

    if [ -z "${version}" ]; then
        set_linked_version
    fi

    if [ -z "${version}" ]; then
        set_current_version
    fi

    if [ -z "${version}" ]; then
        verbose "Nothing to do, exiting."
        exit 0
    fi

    set_initramfs

    ro_boot_check

    altered_check

    backup_initramfs

    generate_initramfs

    run_bootloader

    backup_booted_initramfs
}

delete()
{
    if [ -z "${version}" ]; then
        usage "Delete mode requires a version argument"
    fi

    set_initramfs

    if [ "${takeover}" = 0 ]; then
        if [ ! -e "${initramfs}" ]; then
            panic "Cannot delete ${initramfs}, doesn't exist."
        fi

        if ! version_exists "${version}"; then
            panic "Cannot delete version ${version}: Not created by this utility."
        fi
    fi

    altered_check

    echo "update-initramfs: Deleting ${initramfs}"

    delete_sha1

    rm -f "${initramfs}" "${initramfs}.bak"
}

# Check for update mode on existing and modified initramfs
altered_check()
{
    # No check on takeover
    [ "${takeover}" = 1 ] && return 0
    if [ ! -e "${initramfs}" ]; then
        mild_panic "${initramfs} does not exist. Cannot update."
    fi
    if ! compare_sha1; then
        echo "update-initramfs: ${initramfs} has been altered." >&2
        mild_panic "update-initramfs: Cannot update. Override with -t option."
    fi
}

# Defaults
verbose=0
yes=0
# We default to takeover=1 in Ubuntu, but not Debian
takeover=1

##

while getopts "k:cudyvtb:h?" flag; do
    case "${flag}" in
    k)
        version="${OPTARG}"
        ;;
    c)
        mode="c"
        ;;
    d)
        mode="d"
        ;;
    u)
        mode="u"
        ;;
    v)
        verbose="1"
        ;;
    y)
        yes="1"
        ;;
    t)
        takeover="1"
        ;;
    b)
        BOOTDIR="${OPTARG}"
        if [ ! -d "${BOOTDIR}" ]; then
            echo "Error: ${BOOTDIR} is not a directory." >&2
            exit 1
        fi
        ;;
    h|?)
        usage
        ;;
    esac
done

shift $((${OPTIND} - 1))

if [ $# -ne 0 ]; then
    echo "Invalid argument for option -k." >&2
    usage
fi

# Validate arguments
if [ -z "${mode}" ]; then
    usage "You must specify at least one of -c, -u, or -d."
fi

if [ "${version}" = "all" ] \
    || ( [ "${update_initramfs}" = "all" ] && [ -z "${version}" ] ); then
    : FIXME check for --yes, and if not ask are you sure
    get_sorted_versions
    if [ -z "${version_list}" ]; then
        verbose "Nothing to do, exiting."
        exit 0
    fi

    OPTS="-b ${BOOTDIR}"
    if [ "${verbose}" = "1" ]; then
        OPTS="${OPTS} -v"
    fi
    if [ "${takeover}" = "1" ]; then
        OPTS="${OPTS} -t"
    fi
    if [ "${yes}" = "1" ]; then
        OPTS="${OPTS} -y"
    fi
    for u_version in ${version_list}; do
        verbose "Execute: ${0} -${mode} -k \"${u_version}\" ${OPTS}"
        "${0}" -${mode} -k "${u_version}" ${OPTS}
    done
    exit 0
fi


case "${mode}" in
    c)
        create
        ;;
    d)
        delete
        ;;
    u)
        update
        ;;
esac

升级ubunt到14.04后重新编译内核,下载的内核版本是3.13.0。

桌面比原来的反应快,搜狗输入法for,ubuntu也安装上了。


/*
 * A "pure" initcall has no dependencies on anything else, and purely
 * initializes variables that couldn't be statically initialized.
 *
 * This only exists for built-in code, not for modules.
 * Keep main.c:initcall_level_names[] in sync.
 */
#define pure_initcall(fn)        __define_initcall(fn, 0)

#define core_initcall(fn)        __define_initcall(fn, 1)
#define core_initcall_sync(fn)        __define_initcall(fn, 1s)
#define postcore_initcall(fn)        __define_initcall(fn, 2)
#define postcore_initcall_sync(fn)    __define_initcall(fn, 2s)
#define arch_initcall(fn)        __define_initcall(fn, 3)
#define arch_initcall_sync(fn)        __define_initcall(fn, 3s)
#define subsys_initcall(fn)        __define_initcall(fn, 4)
#define subsys_initcall_sync(fn)    __define_initcall(fn, 4s)
#define fs_initcall(fn)            __define_initcall(fn, 5)
#define fs_initcall_sync(fn)        __define_initcall(fn, 5s)
#define rootfs_initcall(fn)        __define_initcall(fn, rootfs)
#define device_initcall(fn)        __define_initcall(fn, 6)
#define device_initcall_sync(fn)    __define_initcall(fn, 6s)
#define late_initcall(fn)        __define_initcall(fn, 7)
#define late_initcall_sync(fn)        __define_initcall(fn, 7s)


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值