为什么内核启动失败?

为什么内核启动失败?

我正在尝试在 Ubuntu 12.04(内核 3.2.0-53)的系统上从 3.11.1 内核映像启动

我使用make defconfig然后编译,将映像放入/boot,更新GRUB,然后重新启动。

重新启动时,我收到以下消息:

EXT4-fs (sda1) : couldnt mount as ext3 due to feature incompatibilities
EXT4-fs (sda1) : couldnt mount as ext2 due to feature incompatibilities
init : unable to create device: /dev/kmsg
Root filesystem check failed

什么地方出了错?

如果内核知道文件系统是 ext4 (我认为这是因为 )EXT4-fs (sda1),为什么它被挂载为 ext3/2 ?


/etc/fstab:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
# / was on /dev/sda1 during installation
UUID=7be51edc-99ae-4e6e-b863-2bef9e4adb22 /               ext4    errors=remount-ro 0       1
# /home was on /dev/sda4 during installation
UUID=e4b936e5-e1c5-4146-9710-03b0d6dfdea2 /home           ext4    defaults        0       2
# swap was on /dev/sda3 during installation
UUID=10d012d1-bbba-43f4-8e8a-8aa493435acb none            swap    sw              0       0

# Move /tmp to RAM
tmpfs /tmp tmpfs defaults,noexec,nosuid 0 0

grub.cfg图像条目:

menuentry 'Ubuntu, with Linux 3.11.1' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 7be51edc-99ae-4e6e-b863-2bef9e4adb22
    linux   /boot/vmlinuz-3.11.1 root=/dev/sda1 ro   quiet splash $vt_handoff
}
menuentry 'Ubuntu, with Linux 3.11.1 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 7be51edc-99ae-4e6e-b863-2bef9e4adb22
    echo    'Loading Linux 3.11.1 ...'
    linux   /boot/vmlinuz-3.11.1 root=/dev/sda1 ro recovery nomodeset 
}

答案1

您正在尝试在没有 initramfs 的情况下启动。您需要使用update-initramfs -c -k 3.11.1然后创建一个update-grub

答案2

在我看来,就好像您从 kernel.org 或其他地方下载了 Linux 内核源代码并自己编译它,而没有利用您的发行版的任何功能(例如打包)。

当然可以做到这一点,但它比简单的方法要工作得多。

不幸的是,ubuntu launchpad kernel-ppa 似乎不再被维护,否则我会建议您参考以下答案:https://askubuntu.com/questions/47397/how-do-i-add-the-kernel-ppa

相反,我会向您推荐http://ubuntuhandbook.org/index.php/2013/09/kernel-3-11-1-released-install-upgrade-in-ubuntu-linux-mint/其中包含下载和安装 Ubuntu 预编译内核 3.11.1 软件包的说明。我运行 debian 而不是 ubuntu,所以我自己没有对此进行测试,但该页面声称这适用于 Ubuntu 12.04、12.10 和 13.10,并且说明似乎是正确的。

请注意,ubuntu.com 上的 kernel-ppa 是非官方或半官方存储库。该域名归 Canonical 所有,但可能不支持非官方内核包。自编译内核也不会。

总结一下:

ARCH=$(dpkg --print-architecture)
wget "http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11.1-saucy/linux-headers-3.11.1-031101-generic_3.11.1-031101.201309141102_$ARCH.deb"

wget "http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11.1-saucy/linux-headers-3.11.1-031101_3.11.1-031101.201309141102_all.deb"

wget "http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11.1-saucy/linux-image-3.11.1-031101-generic_3.11.1-031101.201309141102_$ARCH.deb"

sudo dpkg -iBE linux-headers-3.11.1*.deb linux-image-3.11.1*.deb

如果您更喜欢编译自己的内核而不是下载预编译的软件包,我强烈建议您搜索 3.11.1 的 ubuntu 源代码包,使用 解压源代码dpkg-source,安装构建依赖项,进行您需要的任何内核配置调整,并使用它们或类似的工具构建您自己的软件包dpkg-builpackage

就像其他软件一样,编译成软件包的内核可能会比未打包的内核少得多的麻烦和痛苦......安装软件包几乎总是比安装软件包更好make && make install,即使您想从源代码构建,也最好编译打包的源。

相关内容