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
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:
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.
👉 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:
Sau đó chúng ta chọn Kernel mới nhất chúng ta đã cài đặt như sau:
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.
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:
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:
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.