Biên dịch Linux Kernel trên CentOS 7 Image Biên dịch Linux Kernel trên CentOS 7

Bài viết này giới thiệu với các bạn về cách biên dịch Linux Kernel trên bản phân phối CentOS 7 của hệ điều hành Linux. Trong bài viết này sẽ giới thiệu với các bạn cách biên dịch và sử dụng Linux Kernel từ đó giúp cho chúng ta có thể tự tìm hiểu và tự học Linux cơ bản dễ dàng hơn.

1. Giới thiệu về biên dịch và cài đặt Kernel

1.1. Giới thiệu về biên dịch Kernel

Giới thiệu kernel

Kelnel là phần trung tâm của hầu hết các hệ điều hành máy tính có nhiệm vụ dùng để thực hiện việc quản lý giao tiếp giữa phần mềm và phần cứng.

Biên dịch Linux Kernel giúp cho chúng ta có thể loại bỏ cũng như thêm vào những tính năng cần thiết, tối ưu cho một loại phần cứng nhất định từ đây giúp cho hệ thống khởi động nhanh hơn và bảo mật hơn.

Lưu ý: Quá trình biên dịch Linux Kernel được thực hiện trên bản phân phối CentOS 7

1.2 Biên dịch và cài đặt Kernel

1.2.1 Cài đặt các gói hỗ trợ

Đầu tiên chúng ta cần phải cập nhật kho lưu trữ gói phần mềm như sau:

[root@localhost ~]# yum update

Tiếp theo chúng ta thực hiện cài đặt các công cụ cần thiết để biên dịch Kernel và cài đặt thư viện ncurses bằng lệnh yum như bên dưới:

[root@localhost ~]# yum install -y ncurses-devel make gcc bc bison flex elfutils-libelf-devel openssl-devel grub2

1.2.2. Biên dịch và cài đặt Kernel

Chúng ta cần tải Kernel 5.2.1 sources mới nhất bằng cách sử dụng lệnh wget trong thư mục /usr/src/ hoặc chúng ta cũng có thể tải bằng cách truy cập tại https://www.kernel.org/.

[root@localhost ~]# cd /usr/src/
[root@localhost src]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Apr 11  2018 debug
drwxr-xr-x. 2 root root 6 Apr 11  2018 kernels
[root@localhost src]# wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.2.1.tar.xz

Sau khi tải xong chúng ta kiểm tra xem chúng có trong thư mục /usr/src/ chạy lệnh sau:

[root@localhost src]# ls -l
total 104524
drwxr-xr-x. 2 root root         6 Apr 11  2018 debug
drwxr-xr-x. 2 root root         6 Apr 11  2018 kernels
-rw-r--r--. 1 root root 107028672 Jul 16 21:14 linux-5.2.1.tar.xz

Tiếp theo chúng ta thực hiện giải nén linux-5.2.1.tar.xz và di chuyển đến thư mục linux-5.2.1 bằng các lệnh sau:

[root@localhost src]# tar -xvf linux-5.2.1.tar.xz
[root@localhost src]# cd linux-5.2.1

👉 Cấu hình kernel trong CentOS 7

Kernel cần phải được cấu hình một cách chính xác với các tùy chọn cấu hình được yêu cầu trong môi trường CentOS 7. Để đảm bảo an toàn chúng ta nên sao chép cấu hình Kernel đang chạy từ thư mục /boot sang thư mục linux-5.2.1

[root@localhost ~]# cp -v /boot/config-3.10.0-514.el7.x86_64 /usr/src/linux-5.2.1/.config

Đối với trường hợp VM chạy trên nền tảng ảo hóa KVM sử dụng Virtio thì chúng ta cần cấu hình như sau:

CONFIG_KVM_GUEST=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_BLK_DEV_SD
CONFIG_SCSI_VIRTIO=y
CONFIG_VIRTIO_NET=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y

Bắt đầu cấu hình Linux Kernel, chúng ta chạy lệnh make menuconfig.

[root@localhost ~]# cd /usr/src/linux-5.2.1/
[root@localhost linux-5.2.1]# make menuconfig
  HOSTCC  scripts/basic/fixdep
  UPD     scripts/kconfig/mconf-cfg
  HOSTCC  scripts/kconfig/mconf.o
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.h
  HOSTCC  scripts/kconfig/lexer.lex.o
  YACC    scripts/kconfig/parser.tab.c
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTLD  scripts/kconfig/mconf
scripts/kconfig/mconf  Kconfig
...

Khi chúng ta thực thi lệnh trên thì có một cửa sổ được mở và hiện các menu. Tại cửa sổ này chúng ta có thể vô hiệu hoá hoặc kích hoạt một số tính năng của Kernel. Nếu bạn muồn thoát menu này nhấn phím ESC để thoát. Giao diện menu như bên dưới:

Giao diện menu

Sau khi chúng ta đã đặt các tùy chọn cấu hình Kernel nhấn Save để lưu cấu hình và thoát menu.

Lưu cấu hình

👉 Biên dịch Kernel trong CentOS 7

Để có thể thực hiện quá trình biên dịch Linux Kernel trong CentOS 7 thì chúng ta phải đảm bảo hệ thống của chúng ta có dung lượng trống lớn hơn 25GB. Để kiểm tra dung lượng trống chúng ta sử dụng lệnh df như sau:

[root@localhost ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   44G  2.8G   41G   7% /
devtmpfs             908M     0  908M   0% /dev
tmpfs                920M     0  920M   0% /dev/shm
tmpfs                920M  8.9M  911M   1% /run
tmpfs                920M     0  920M   0% /sys/fs/cgroup
/dev/sda1           1014M  265M  750M  27% /boot
tmpfs                184M     0  184M   0% /run/user/0

Qua kết quả cho chúng thấy dung lượng trống của chúng ta là 41GB thoả mãn điều kiện. Bây giờ chúng ta thực hiện các lệnh sau để có thể biên dịch và cài đặt Linux Kernel (quá trình này có thể mất vài giờ).

[root@localhost ~]# cd /usr/src/linux-5.2.1
[root@localhost linux-5.2.1]# make bzImage
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_32_ia32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_64_x32.h
...
[root@localhost linux-5.2.1]# make modules
  CALL    scripts/checksyscalls.sh
  CALL    scripts/atomic/check-atomics.sh
  DESCEND  objtool
...
[root@localhost linux-5.2.1]# make
  CALL    scripts/checksyscalls.sh
  CALL    scripts/atomic/check-atomics.sh
  DESCEND  objtool
...
[root@localhost linux-5.2.1]# make install
sh ./arch/x86/boot/install.sh 5.2.1 arch/x86/boot/bzImage \
	System.map "/boot"
...
[root@localhost linux-5.2.1]# make modules_install
  INSTALL arch/x86/crypto/aesni-intel.ko
  INSTALL arch/x86/crypto/blowfish-x86_64.ko
  INSTALL arch/x86/crypto/camellia-aesni-avx-x86_64.ko
...

Quá trình biên dịch này sẽ đặt các tệp trong thư mục /boot và cũng tạo một mục Kernel mới trong tệp grub.conf của chúng ta.

Sau khi quá trình biên dịch hoàn tất, chúng ta sẽ khởi động lại hệ thống và kiểm tra Kernel mới được cài đặt bằng cách gõ lệnh sau:

[root@localhost ~]# reboot
[root@localhost ~]# uname -sr
Linux 5.2.1

Như vậy chúng ta đã biên dịch thành công Linux Kernel trong CentOS 7.

3. Cài đặt hoặc nâng cấp lên kernel 5.x trong CentOS 7 từ Repo

Chúng ta có thể cài đặt Linux Kernel mới nhất trong CentOS 7 bằng cách sử dụng kho lưu trữ RPM với các gói được xây dựng sẵn. Trong phần này, chúng ta sẽ sử dụng ELRepo để cài đặt Linux Kernel 5.x trên CentOS 7.

Bước 1: Kiểm tra phiên bản kernel đã cài đặt

Để xem phiên bản hiện tại của Linux Kernel được cài đặt trên hệ thống của chúng ta, chúng ta chạy lệnh sau để kiểm tra:

[root@localhost ~]# uname -sr
Linux 3.10.0-514.el7.x86_64

Sau đó chúng ta truy cập https://www.kernel.org/ để xem phiên bản Kernel mới nhất. Tại thời điểm này thì Kernel mới nhất là 5.2.1.

Chúng ta cần kiểm tra vòng đời của phiên bản Linux Kernel. Nếu phiên bản đang sử dụng sắp hết hạn thì chúng sẽ không có thêm sửa lỗi nào được cung cấp sau ngày đó. Để biết thêm thông tin chúng ta tham khảo trang Phát hành kernel.

Bước 2: Nâng cấp Kernel trong CentOS 7

Các bản phân phối hiện đại sử dụng hệ thống quản lý gói yum để nâng cấp Kernel và kho lưu trữ được hỗ trợ chính thức. Cách thực hiện này chỉ nâng cấp lên phiên bản Kernel mới nhất có sẵn trên kho lưu trữ chứ không phải phiên bản mới nhất có sẵn trong https://www.kernel.org/. Nếu như bạn muốn nâng lên phiên bản tuỳ ý có tại https://www.kernel.org/ thì sử dụng biên dịch Kernel Linux.

Để bật kho ELRepo vào CentOS 7 của bạn bằng cách chạy các lệnh bên dưới:

[root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@localhost ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
Retrieving http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:elrepo-release-7.0-3.el7.elrepo  ################################# [100%]

Sau khi kho lưu trữ đã được bật, bạn có thể sử dụng lệnh sau để liệt kê các gói kernel.related có sẵn :

[root@localhost ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror
elrepo-kernel                                                                                                                    | 2.9 kB  00:00:00
elrepo-kernel/primary_db                                                                                                         | 1.8 MB  00:00:04
Determining fastest mirrors
 * elrepo-kernel: mirror-hk.koddos.net
Available Packages
elrepo-release.noarch                                                       7.0-4.el7.elrepo                                               elrepo-kernel
kernel-lt.x86_64                                                            4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-lt-devel.x86_64                                                      4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-lt-doc.noarch                                                        4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-lt-headers.x86_64                                                    4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-lt-tools.x86_64                                                      4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-lt-tools-libs.x86_64                                                 4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-lt-tools-libs-devel.x86_64                                           4.4.185-1.el7.elrepo                                           elrepo-kernel
kernel-ml.x86_64                                                            5.2.1-1.el7.elrepo                                             elrepo-kernel
...

Tiếp theo, chúng ta cài đặt kernel ổn định mới nhất. Trong quá trình cài đặt thì chúng ta sẽ nhận được lời nhắc chúng ta chấp nhận hoặc từ chối trước khi cài đặt các gói. Nếu bạn muốn yum cài đặt tiếp tục cài đặt thì nhấn phím y như bên dưới:

[root@localhost ~]# yum --enablerepo=elrepo-kernel install kernel-ml
Loaded plugins: fastestmirror
base                                                                                                                             | 3.6 kB  00:00:00
elrepo                                                                                                                           | 2.9 kB  00:00:00
extras                                                                                                                           | 3.4 kB  00:00:00
updates                                                                                                                          | 3.4 kB  00:00:00
(1/5): base/7/x86_64/group_gz                                                                                                    | 166 kB  00:00:00
(2/5): updates/7/x86_64/primary_db                                                                                               | 6.5 MB  00:00:01
(3/5): base/7/x86_64/primary_db                                                                                                  | 6.0 MB  00:00:02
(4/5): elrepo/primary_db                                                                                                         | 331 kB  00:00:03
(5/5): extras/7/x86_64/primary_db                                                                                                | 205 kB  00:00:03
Resolving Dependencies
--> Running transaction check
---> Package kernel-ml.x86_64 0:5.2.1-1.el7.elrepo will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================
 Package                          Arch                          Version                                      Repository                            Size
========================================================================================================================================================
Installing:
 kernel-ml                        x86_64                        5.2.1-1.el7.elrepo                           elrepo-kernel                         48 M

Transaction Summary
========================================================================================================================================================
Install  1 Package

Total download size: 48 M
Installed size: 214 M
Is this ok [y/d/N]: y
Downloading packages:
kernel-ml-5.2.1-1.el7.elrepo.x86_64.rpm                                                                                          |  48 MB  00:00:09
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : kernel-ml-5.2.1-1.el7.elrepo.x86_64                                                                                                  1/1

  Verifying  : kernel-ml-5.2.1-1.el7.elrepo.x86_64                                                                                                  1/1

Installed:
  kernel-ml.x86_64 0:5.2.1-1.el7.elrepo

Complete!

Sau khi cài đặt xong chúng ta cần khởi động lại máy của bạn để áp dụng Kernel mới nhất.

[root@localhost ~]# reboot

Kernel sẽ xuất hiện như hình bên dưới:

Kernel mới

Sau đó chúng ta chọn Kernel mới nhất chúng ta đã cài đặt như sau:

Kernel mới nhất đã cài đặt

Khi hệ thống khởi động lại hoàn tất chúng ta chạy lệnh sau để kiểm tra:

[root@localhost ~]# uname -sr
Linux 5.2.1-1.el7.elrepo.x86_64

Bước 3: Đặt phiên bản Kernel mặc định trong GRUB

Để phiên bản mới được cài đặt thành tùy chọn khởi động mặc định, bạn sẽ phải sửa đổi cấu hình GRUB bằng cách mở tệp /etc/default/grub như sau:

[root@localhost ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Sử dụng trình soạn thảo vi để chỉnh sửa và thiết lập GRUB_DEFAULT=0. Việc chỉnh sửa này có nghĩa là hệ thống sẽ chọn Kernel đầu tiên trong màn hình ban đầu GRUB sẽ được sử dụng làm mặc định.

[root@localhost ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Tiếp theo, chạy lệnh sau để tạo lại cấu hình Kernel.

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.2.1-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.2.1-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-c36b5e22dc84471392ba572f52e58fe2
Found initrd image: /boot/initramfs-0-rescue-c36b5e22dc84471392ba572f52e58fe2.img
done

Khởi động lại hệ thống:

[root@localhost ~]# reboot

Xác minh rằng kernel mới nhất hiện đang được sử dụng theo mặc định.

Xác minh rằng kernel mới nhất hiện đang được sử dụng theo mặc định

3.1. Gỡ cài đặt Kernel 5.x trên CentOS 7

Bây giờ bạn đã cài đặt Linux Kernel 5.2.1 trên CentOS 7. Để gỡ cài đặt, chúng ta cần khởi động Kernel cũ hơn:

Khởi động Kernel cũ hơn

Chạy lệnh sau để kiểm tra phiên bản Kernel hiện tại:

[root@localhost ~]# uname -sr
Linux 3.10.0-514.el7.x86_64

Sau đó gỡ cài đặt Linux Kernel 5.x trên CentOS 7:

[root@localhost ~]# yum remove kernel-ml kernel-ml-{devel,headers,perf}
Loaded plugins: fastestmirror
No Match for argument: kernel-ml-devel
No Match for argument: kernel-ml-headers
No Match for argument: kernel-ml-perf
Resolving Dependencies
--> Running transaction check
---> Package kernel-ml.x86_64 0:5.2.1-1.el7.elrepo will be erased
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================
 Package                          Arch                          Version                                     Repository                             Size
========================================================================================================================================================
Removing:
 kernel-ml                        x86_64                        5.2.1-1.el7.elrepo                          @elrepo-kernel                        214 M

Transaction Summary
========================================================================================================================================================
Remove  1 Package

Installed size: 214 M
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : kernel-ml-5.2.1-1.el7.elrepo.x86_64                                                                                                  1/1
  Verifying  : kernel-ml-5.2.1-1.el7.elrepo.x86_64                                                                                                  1/1

Removed:
  kernel-ml.x86_64 0:5.2.1-1.el7.elrepo

Complete!

Sau khi đã gỡ cài đặt Kernel 5.x trên CentOS 7 chúng ta khởi động lại hệ thống:

[root@localhost ~]# reboot

Kết quả chỉ còn lại Kernel cũ như sau:

Kernel cũ

4. Lời kết

Qua bài trên, giúp cho chúng ta biết cách biên dịch Linux Kernel với các phiên bản tùy ý và cách cài đặt cùng với nâng cấp Linux Kernel bằng cách sử dụng kho lưu trữ bên thứ 3 trên hệ điều hành Linux thuộc họ CentOS. Từ đây giúp cho chúng ta có thể loại bỏ cũng như thêm vào những tính năng cần thiết, tối ưu cho một loại phần cứng nhất định để cho hệ thống khởi động nhanh hơn và bảo mật hơn.