我正在尝试在 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
,即使您想从源代码构建,也最好编译打包的源。