前奏
①、执行make menuconfig需要安装库libncurses5-dev,执行“sudo apt-get install libncurses5-dev”
②、执行make需要安装库libssl-dev,执行“sudo apt-get install libssl-dev”
③、编译内核出现如下错误“kernel/bounds.c:1:0: error: code model kernel does not support PIC mode”
修改顶层Makefile文件:
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ - -std=gnu89
+ -std=gnu89 -fno-pie
- KBUILD_AFLAGS := -D__ASSEMBLY__
+ KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-pie
④、深度内核常识性介绍:https://wiki.deepin.org/wiki/Linux%E5%86%85%E6%A0%B8#.E5.AE.89.E8.A3.85
不进行内核编译升级内核版本参考如下文档:https://bbs.deepin.org/forum.php?mod=viewthread&tid=175411&extra=
手动进行内核获取、编译和内核替换升级
1、获取当前内核版本
think@think-PC:~/Desktop$ sudo uname -r
4.15.0-30deepin-generic
think@think-PC:~/Desktop$ sudo uname -a
Linux think-PC 4.15.0-30deepin-generic #31 SMP Fri Nov 30 04:29:02 UTC 2018 x86_64 GNU/Linux
2、查看当前可用源码包
think@think-PC:~/Desktop$ sudo apt-cache search linux-source
linux-source - Linux kernel source (meta-package)
linux-source-4.15.0 - Linux kernel source for version 4.15.0 with Ubuntu patches
linux-source-4.19 - Linux kernel source for version 4.19 with Debian patches
linux-source-4.9 - Linux kernel source for version 4.9 with Debian patches
3、获取内核源码包
1)、联网获取
sudo apt-get install linux-source-4.19
会在/usr/src目录下得到"linux-source-4.19.tar.xz"和“linux-patch-4.19-rt.patch.xz”的源码,前一个为内核源码,后一个为当前Deepin系统的补丁文件。这两个文件均采用两层压缩的方式,外层是xz压缩,内层是tar压缩。
2)、从网络下载的内核压缩包
从https://www.kernel.org/网站下载内核源码,具体路径:https://mirrors.edge.kernel.org/pub/linux/kernel/,下载之后上传到Linux系统中进行解压。
4、对源码包进行解压
# 解压外层
think@think-PC:/usr/src$ xz -d linux-source-4.19.tar.xz
# 解压内层
think@think-PC:/usr/src$ tar -xf linux-source-4.19.tar
5、编译内核
# 打补丁,此过程为可选项。打补丁是为了升级内核,如果不升级内核不需要打补丁。
think@think-PC:/usr/src/linux-source-4.19$ sudo patch -p1 < ../linux-patch-4.19-rt.patch
#配置内核(确保当前深度内核与将要编译内核版本相同,使用该编译方法会读取当前系统版本内核配置文件,同时去掉当前系统未使用的模块,优化内核编译)
think@think-PC:/usr/src/linux-source-4.19$ sudo make localmodconfig
#编译内核
think@think-PC:/usr/src/linux-source-4.19$ sudo make
6、在lib下创建内核版本目录
think@think-PC:/lib/modules$ sudo mkdir 4.15.0 think@think-PC:/lib/modules$ ls 4.15.0 4.15.0-30deepin-generic
7、安装驱动到创建的4.15.0目录下
think@think-PC:~/kernel/linux-4.15$ sudo make modules_install
8、安装内核、文件系统、映射到/boot目录。
安装过程主要包括:
1)、复制System.map、Vmlinuz和config-4.15.0到/boot目录。
2)、执行"update-initramfs -c -k 4.15.0"命令,在/boot目录中产生文件系统文件。
3)、执行“update-grub”命令,更新/boot/grub/grub.cfg文件,产生4.15.0版本的引导项。
think@think-PC:~/kernel/linux-4.15$ sudo make install sh ./arch/x86/boot/install.sh 4.15.0 arch/x86/boot/bzImage \ System.map "/boot" run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.15.0 /boot/vmlinuz-4.15.0 run-parts: executing /etc/kernel/postinst.d/dkms 4.15.0 /boot/vmlinuz-4.15.0 Error! Build of huawei-wmi.ko failed for: 4.15.0 (x86_64) Consult the make.log in the build directory /var/lib/dkms/huawei-wmi/1.0/build/ for more information. Error! Build of mincores.ko failed for: 4.15.0 (x86_64) Consult the make.log in the build directory /var/lib/dkms/mincores/0.2.0/build/ for more information. run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.15.0 /boot/vmlinuz-4.15.0 update-initramfs: Generating /boot/initrd.img-4.15.0 WARNING: Setting CRYPTSETUP in /etc/initramfs-tools/initramfs.conf is deprecated and will stop working in the future. Use /etc/cryptsetup-initramfs/conf-hook instead. loadkeys is missing. Please install the \'kbd\' package. W: plymouth: The plugin label.so is missing, the selected theme might not work as expected. W: plymouth: You might want to install the plymouth-themes package to fix this. W: mdadm: /etc/mdadm/mdadm.conf defines no arrays. run-parts: executing /etc/kernel/postinst.d/reconfigure-dde-daemon 4.15.0 /boot/vmlinuz-4.15.0 fix systemd/logind config run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.15.0 /boot/vmlinuz-4.15.0 Generating grub configuration file ... Found theme: /boot/grub/themes/deepin/theme.txt Found linux image: /boot/vmlinuz-4.15.0-30deepin-generic Found initrd image: /boot/initrd.img-4.15.0-30deepin-generic Found linux image: /boot/vmlinuz-4.15.0 Found initrd image: /boot/initrd.img-4.15.0 done
GRUB启动说明
Grub启动主要从两个文件夹进行修改:/etc/default/grub和/etc/grub.d
1、/etc/default/grub文件
DEEPIN_GFXMODE_DETECT=1
#手动添加内核启动参数
GRUB_CMDLINE_LINUX=""
#添加内核启动参数,这个为默认
GRUB_CMDLINE_LINUX_DEFAULT="splash quiet "
#默认启动项,这个值为0就是默认启动第一个,为1默认启动第二个
GRUB_DEFAULT=0
#获得发行版本(此行将追加到所有的linux 定义内核行的后面,不论是救援模式还是一般模式)
GRUB_DISTRIBUTOR="`/usr/bin/lsb_release -d -s 2>/dev/null || echo Deepin`"
#启动的分辨率
GRUB_GFXMODE=2560x1600,1920x1440,1856x1392,1792x1344,1920x1200,1600x1200,1680x1050,1400x1050,1280x1024,1440x900,1280x960,1360x768,1280x800,1152x864,1280x768,1024x768,auto
#启动的主题,是各种图片和各种显示的字体
GRUB_THEME=/boot/grub/themes/deepin-fallback/theme.txt
#等待时间,5秒未操作直接进入默认系统。改为-1是一直等待。
GRUB_TIMEOUT=5
2、/etc/grub.d
00_header # 配置初始的显示项目,如默认选项,时间限制等,一般由/etc/default/grub导入,一般不需要配置
05_debian_theme # 配置引导画面,文字颜色等主题
10_linux #定位当前操作系统使用中的root设备内核的位置,包含deepin 启动项和advanced里面的启动项
15_linux_bar # 救援模式的启动项
20_linux_xen # 虚拟机监视器的东西,(暂时不知有什么用
30_uefi-firmware # “system setup” 的启动项
35_os-prober # windows的启动项一般在这个里面
40_custom # 用来加入用户自定义的启动项,将会在执行update-grub时更新至grub.cfg中
41_custom # 判断custom.cfg此配置文件是否存在,如果存在就加载它
前面的数字是对文件排列执行的顺序进行排序,可进行更改,比如你想把windows启动项调到第一个,就把35_os-prober前面那个数字改成5到10的数字,比如06、07、08、09.
存在多个系统启动项时选择启动选项
按照上述方案创建的多个系统启动项会放置到启动界面的Advanced options选项中,启动时需要手动选择启动项。在实际应用中需要设定某一版本的系统自动启动,此时需要更改启动选项,更改步骤如下:
①、将需要自动启动的内核启动项从/boot/grub/grub.cfg文件的submenu中找到。
②、将其复制到/etc/grub.d/40_custom文件,修改之后文件内容如下所示。
③、修改/etc/default/grub文件的default值为2,执行update-grub命令。
/etc/grub.d/40_custom文件内容如下:
#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the \'exec tail\' line above. menuentry \'Deepin 15.10.1 GNU/Linux, with Linux 4.15.0\' --class deepin --class gnu-linux --class gnu --class os $menuentry_id_option \'gnulinux-4.15.0-advanced-c270f13a-54cd-4258-b179-e0f36e41abba\' { load_video insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi 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 c270f13a-54cd-4258-b179-e0f36e41abba else search --no-floppy --fs-uuid --set=root c270f13a-54cd-4258-b179-e0f36e41abba fi linux /boot/vmlinuz-4.15.0 root=UUID=c270f13a-54cd-4258-b179-e0f36e41abba ro splash quiet DEEPIN_GFXMODE=$DEEPIN_GFXMODE initrd /boot/initrd.img-4.15.0 }