1. 程式人生 > >阿里雲原始碼編譯核心並替換

阿里雲原始碼編譯核心並替換

1 介紹

阿里雲新機器:

  • 系統Ubuntu 16.04
  • 記憶體16G
  • 4核CPU

原始碼編譯Linux最新stable版本核心,並替換現有核心使用新核心

2 編譯

2.1 安裝依賴

$ apt update
$ apt apt-get install ncurses-dev bison flex pkg-config libelf-dev libssl-dev

2.2 下載原始碼

下載xz壓縮後的tar包,以減少下載時間:

$ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.18.9.tar.xz
$ xz -d linux-4.18.9.tar.xz
$ tar xvf linux-4.18.9.tar
$ ls
linux-4.18.9  linux-4.18.9.tar
  • xz -d: decompress xz file
  • tar xvf: x for e’x’traction, v for 'v’borse, ‘f’ for 'f’ile.

2.3 配置

$ cd linux-4.18.9
$ make menuconfig

image Select->Save,會在(當前目錄下生成.config檔案,應該也是基於當前核心配置的基礎上生成的)

.config檔案格式如下,舉例說明:

  • CONFIG_PCI=y PCI support
  • # CONFIG_XFS_FS is not set We have not selected the XFS filesystem support

可以Load->Select->Save來選擇Custom的config,或者直接拷貝一個config檔案:

$ cp /boot/config-$(uname -r) .config

2.4 編譯

檢視當前核心版本:

$ uname -r
4.4.0-117-generic

編譯生成Kernel的Image,這裡是compressed後的Image,-jN後面的N一般為CPU核心數的兩倍,這裡選擇8:

$ make bzImage -j8
xxx
Kernel: arch/x86/boot/bzImage is ready  (#1)

編譯上述配置中選擇的components生成kernel modules:

$ make modules -j8

安裝modules,會在/lib/modules/4.18.9目錄下安裝模組和其他一些必要檔案:

$ make modules_install

安裝kernel image,會在/boot更新kernel image,更新bootloader的配置檔案(grub.conf)和其他一些讓新核心bootable的操作:

$ make install

重啟再檢視現有核心版本:

$ reboot
$ uname -r
4.18.9

3 修改預設的啟動核心

修改預設啟動的Kernel,來切換核心版本,比如又想回到之前的核心版本

首先是要知道GRUB的menu格式,可以重啟進入GRUB看,也可以不重啟看:

  • 重啟進入GRUB看:
$ vi /etc/default/grub
GRUB_HIDDEN_TIMEOUT=10(預設是0,修要修改成大於0的值,比如10)

然後按Esc進入GRUB image image

  • 不重啟執行用如下命令看:
$ update-grub -v
grub-mkconfig (GRUB) 2.02~beta2-36ubuntu3.18

$ grep -Ei 'submenu|menuentry ' /boot/grub/grub.cfg | sed -re "s/(.? )'([^']+)'.*/\1 \2/"
menuentry  Ubuntu
submenu  Advanced options for Ubuntu
	menuentry  Ubuntu, with Linux 4.18.9
	menuentry  Ubuntu, with Linux 4.18.9 (recovery mode)
	menuentry  Ubuntu, with Linux 4.4.0-117-generic
	menuentry  Ubuntu, with Linux 4.4.0-117-generic (recovery mode)
	menuentry  Ubuntu, with Linux 4.4.0-116-generic
	menuentry  Ubuntu, with Linux 4.4.0-116-generic (recovery mode)
	menuentry  Ubuntu, with Linux 4.4.0-87-generic
	menuentry  Ubuntu, with Linux 4.4.0-87-generic (recovery mode)

修改GRUB預設啟動的核心

$ vi /etc/default/grub
GRUB_DEFAULT="1>2"

$ update-grub

修改預設的為Advanced options for Ubuntu(1)下面menuentry Ubuntu, with Linux 4.4.0-117-generic(2),下標從0開始。

$ reboot
$ uname -r
4.4.0-117-generic

好的,核心版本換了,我胡漢三又回來了

4 總結

原始碼編譯Linux核心就下面那些命令:

$ make menuconfig

# make包含Image和Modules
$ make
$ make modules_install
$ make install

5 出現的問題

問題1:依賴問題,解決方法就是按照提示安裝依賴

問題2:不能進GRUB,解決方法是修改GRUB_HIDDEN_TIMEOUT=10

6 參考連結