我有一个虚拟机,里面有 Ubuntu 14.04。我最近在其上构建并安装了 linux-3.14.5 内核,并尝试启动它,但它让我进入 BusyBox v1.21.1 内置 shell。
这就是我所做的:
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.5.tar.xz
mkdir ~/linux
mv linux-3.14.5.tar.xz ~/linux
tar -xJf linux-3.14.5.tar.xz
mkdir linux-3.14.5
cd linux-3.14.5_src/
make defconfig O=../linux-3.14.5
make menuconfig O=../linux-3.14.5 /* i didn't change anything */
make O=../linux-3.14.5
cd ../linux-3.14.5
sudo make install
我可以看到一个名为initrd.img-3.14.5在/启动旁边的intrd.img-3.13.0-24-通用(我猜,这是 Ubuntu 14.04 的内核)。
还有 2 个文件名为vmlinuz-3.14.5和vmlinuz-3.13.0-24-通用。
之后就跑了
sudo blkid
并得到以下结果:
/dev/sda1: UUID="92ec153c-cb92-4300-8d2a-f63b747ddd35" TYPE="ext4"
/dev/sda5: UUID="439a6423-28dc-4363-b47e-580f1e65e951" TYPE="swap"
我也跑了
sudo fdisk -l
这给了我
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000268be
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 39845887 19921920 83 Linux
/dev/sda2 39847934 41940991 1046529 5 Extended
/dev/sda5 39847936 41940991 1046528 82 Linux swap / Solaris
我检查了/boot/grub/grub.cfg文件具有以下条目:
menuentry 'Ubuntu, with Linux 3.13.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-24-generic-advanced-92ec153c-cb92-4300-8d2a-f63b747ddd35' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 92ec153c-cb92-4300-8d2a-f63b747ddd35
else
search --no-floppy --fs-uuid --set=root 92ec153c-cb92-4300-8d2a-f63b747ddd35
fi
echo 'Loading Linux 3.13.0-24-generic ...'
linux /boot/vmlinuz-3.13.0-24-generic root=UUID=92ec153c-cb92-4300-8d2a-f63b747ddd35 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.13.0-24-generic
}
所以,我继续添加以下几行/etc/grub.d/40_custom(我刚刚更改了第 1、14、15 和 17 行)
menuentry 'MyNewKernel' {
recordfail
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 92ec153c-cb92-4300-8d2a-f63b747ddd35
else
search --no-floppy --fs-uuid --set=root 92ec153c-cb92-4300-8d2a-f63b747ddd35
fi
echo 'Loading My New Kernel ...'
linux /boot/vmlinuz-3.14.5 root=UUID=92ec153c-cb92-4300-8d2a-f63b747ddd35 ro recovery nomodeset find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.14.5
}
然后跑了
sudo update-grub
sudo reboot
不工作!错误消息说
ALERT! /dev/disk/by-uuid/92ec153c-cb92-4300-8d2a-f63b747ddd35 does not exist.
Dropping to a shell!
所以我尝试更换通用唯一标识符经过/dev/sda1产生以下文件。
menuentry 'MyNewKernel' {
recordfail
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 /dev/sda1
else
search --no-floppy --fs-uuid --set=root /dev/sda1
fi
echo 'Loading Linux 3.13.0-24-generic ...'
linux /boot/vmlinuz-3.14.5 root=/dev/sda1 ro recovery nomodeset find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.14.5
}
这也不起作用,并给了我一个非常相似的错误消息。
ALERT! /dev/sda1 does not exist.
Dropping to a shell!
我想我犯了一些愚蠢的错误,但我不知道是什么,因为这是我第一次。我将不胜感激任何帮助。
感谢您阅读这么长的帖子。如果您需要更多信息,请告诉我。
答案1
您错过了make install
安装所需驱动程序之前的两个步骤。在make install
执行之前make modules
并make modules_install
按此顺序。这将根据您的 .config 文件安装驱动程序。
由于 .config 文件中的配置不正确以及缺少一些驱动程序,也可能会发生该错误。所以这是一种进行内核编译的黑客方法。获得正确配置的最佳方法之一是将工作配置从 /boot 目录复制到内核源代码文件夹中的 .config。您的工作内核配置文件是
/boot/config-`uname -r`
然后用 进行编译make
。make
会提示一些配置,这些配置不在.config文件中,因为这个.config文件可能对应于旧内核,并且没有您尝试编译的新内核中的一些配置。只需输入 Enter 即可出现所有配置提示 - 这将选择默认配置。然后做make modules
,make modules_install
最后make install
。这必须解决您的问题。
这种编译方式不适合专业人士,但可以帮助对不同配置选项没有太多了解的新手开始内核编译。