Hướng dẫn Build Linux Kernel Realtime
Hướng dẫn này mô tả cách build Linux kernel với patch realtime (RT) để có độ trễ thấp cho các ứng dụng thời gian thực.
Phiên bản sử dụng
- Kernel: Linux 6.6.116
- RT Patch: patch-6.6.116-rt66
Yêu cầu hệ thống
Phần cứng tối thiểu
- RAM: ít nhất 4GB (khuyến nghị 8GB+)
- Ổ cứng: ít nhất 20GB dung lượng trống
- CPU: hỗ trợ đa nhân để tăng tốc quá trình build
Phần mềm cần thiết (Ubuntu/Debian)
sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev \
fakeroot dwarves zstd liblz4-tool bc kmod cpio initramfs-tools \
git wget curl xz-utils debhelper
Bước 1: Tải xuống Kernel và RT Patch
Tạo thư mục làm việc
mkdir -p ~/kernel-build
cd ~/kernel-build
Tải kernel source
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.6.116.tar.xz
Tải RT patch
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.6/patch-6.6.116-rt66.patch.xz
Kiểm tra tính toàn vẹn (tùy chọn)
# Tải signature files để verify (nếu có)
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.6.116.tar.sign
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.12/patch-6.6.116-rt66.patch.sign
Bước 2: Giải nén và áp dụng RT Patch
Giải nén kernel
tar -xf linux-6.6.116.tar.xz
cd linux-6.6.116
Giải nén và áp dụng RT patch
xzcat ../patch-6.6.116-rt66.patch.xz | patch -p1
Lưu ý: Nếu có lỗi khi patch, kiểm tra:
- Đảm bảo đang ở trong thư mục kernel source
- Kiểm tra phiên bản patch có khớp với kernel không
- Có thể cần
--dry-runđể test trước:patch -p1 --dry-run < ../patch-6.6.116-rt66.patch
Bước 3: Cấu hình Kernel
Sao chép cấu hình hiện tại (khuyến nghị)
cp /boot/config-$(uname -r) .config
Hoặc tạo cấu hình mặc định
make defconfig
Cấu hình RT-specific options
make menuconfig
Đường dẫn cụ thể trong menuconfig để cấu hình RT (Kernel 6.6.116-rt66):
1. High Resolution Timers và Tick Handling
General setup --->
Timers subsystem --->
[*] High Resolution Timer Support (CONFIG_HIGH_RES_TIMERS)
Timer tick handling (Full dynticks system (tickless)) --->
(X) Full dynticks system (tickless) (CONFIG_NO_HZ_FULL)
2. RT Preemption Model (QUAN TRỌNG NHẤT)
General setup --->
[*] Expert users only (CONFIG_EXPERT) - PHẢI BẬT TRƯỚC
Preemption Model (Fully Preemptible Kernel (Real-Time)) --->
(X) Fully Preemptible Kernel (Real-Time) (CONFIG_PREEMPT_RT)
Lưu ý quan trọng:
- PHẢI bật
CONFIG_EXPERT=ytrước khi có thể thấy optionPREEMPT_RT - Option này nằm trong
General setup, KHÔNG phảiProcessor type and features
3. Kernel Tracing (để debug RT latency)
Kernel hacking --->
Tracers --->
[*] Kernel Function Tracer (CONFIG_FUNCTION_TRACER)
[*] Preemption-off Latency Tracer (CONFIG_PREEMPT_TRACER)
[*] Interrupts-off Latency Tracer (CONFIG_IRQSOFF_TRACER)
[*] Scheduling Latency Tracer (CONFIG_SCHED_TRACER)
[*] Trace max stack (CONFIG_STACK_TRACER)
4. Tắt Debug Info (giảm kích thước package)
Kernel hacking --->
Compile-time checks and compiler options --->
[ ] Compile the kernel with debug info (CONFIG_DEBUG_INFO) - TẮT
[ ] Generate BTF typeinfo (CONFIG_DEBUG_INFO_BTF) - TẮT
5. Processor Features (Tùy chọn thêm)
Processor type and features --->
Timer frequency (1000 HZ) --->
(X) 1000 HZ (CONFIG_HZ_1000) - Khuyến nghị cho RT
[*] Symmetric multi-processing support (CONFIG_SMP)
Kiểm tra và xóa TRUSTED_KEYS/REVOCATION_KEYS
Khi copy config từ máy khác, cần kiểm tra và xóa các key không tồn tại:
# Kiểm tra các key files
grep -E "CONFIG_SYSTEM_TRUSTED_KEYS|CONFIG_SYSTEM_REVOCATION_KEYS" .config
# Xóa các key files không tồn tại
scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str CONFIG_SYSTEM_REVOCATION_KEYS ""
Cấu hình nhanh bằng scripts (thay vì menuconfig)
Nếu không muốn dùng menuconfig, có thể cấu hình nhanh bằng lệnh:
# QUAN TRỌNG: Phải enable EXPERT trước
scripts/config --enable CONFIG_EXPERT
# Enable RT preemption và các tùy chọn cần thiết
scripts/config --enable CONFIG_PREEMPT_RT
scripts/config --enable CONFIG_HIGH_RES_TIMERS
scripts/config --enable CONFIG_NO_HZ_FULL
scripts/config --set-val CONFIG_HZ_1000 y
scripts/config --set-val CONFIG_HZ 1000
# Enable tracing cho debug RT latency
scripts/config --enable CONFIG_PREEMPT_TRACER
scripts/config --enable CONFIG_IRQSOFF_TRACER
scripts/config --enable CONFIG_SCHED_TRACER
scripts/config --enable CONFIG_FUNCTION_TRACER
scripts/config --enable CONFIG_STACK_TRACER
# Tắt debug symbols để giảm kích thước package
scripts/config --disable CONFIG_DEBUG_INFO
scripts/config --disable CONFIG_DEBUG_INFO_BTF
scripts/config --disable CONFIG_DEBUG_INFO_DWARF4
scripts/config --disable CONFIG_DEBUG_INFO_DWARF5
scripts/config --disable CONFIG_DEBUG_INFO_REDUCED
scripts/config --disable CONFIG_DEBUG_INFO_COMPRESSED
# Cập nhật dependencies và kiểm tra
make olddefconfig
# Kiểm tra cấu hình RT đã được enable chưa
scripts/config --state CONFIG_EXPERT
scripts/config --state CONFIG_PREEMPT_RT
scripts/config --state CONFIG_HIGH_RES_TIMERS
Bước 4: Build Kernel
Kiểm tra số CPU cores
nproc
Build kernel packages (không tạo debug packages)
make -j$(nproc) bindeb-pkg
Lưu ý về bindeb-pkg:
bindeb-pkg: Tạo binary packages (.deb) không có debug symbols- Nhanh hơn và tạo ra file nhỏ hơn so với
deb-pkg - Không tạo ra
linux-image-*-dbg.deb(debug package)
Các tùy chọn build khác (nếu cần):
# Build kernel image only
make -j$(nproc)
# Build modules only
make -j$(nproc) modules
# Build với debug (không khuyến nghị - tạo file lớn)
make -j$(nproc) deb-pkg
Kiểm tra cấu hình trước khi build
# Kiểm tra các config quan trọng
grep -E "CONFIG_PREEMPT_RT|CONFIG_HIGH_RES_TIMERS|CONFIG_NO_HZ_FULL" .config
grep -E "CONFIG_CPU_FREQ|CONFIG_CPU_IDLE" .config
grep -E "CONFIG_DEBUG_INFO" .config
# Kết quả mong muốn:
# CONFIG_PREEMPT_RT=y
# CONFIG_HIGH_RES_TIMERS=y
# CONFIG_NO_HZ_FULL=y
# # CONFIG_CPU_FREQ is not set
# # CONFIG_CPU_IDLE is not set
# # CONFIG_DEBUG_INFO is not set
Thời gian build: Khoảng 30 phút - 2 giờ tùy theo cấu hình máy.
Bước 5: Cài đặt Kernel
Cài đặt từ Debian packages
Cách 1: Cài đặt trực tiếp vào hệ thống
cd ..
# List các file .deb được tạo
ls -la linux-*.deb
# Cài đặt kernel packages (không có debug package)
sudo dpkg -i linux-image-*.deb linux-headers-*.deb
Cách 2: Cài đặt vào folder đặc biệt (khuyến nghị để test)
cd ..
# Tạo folder để cài kernel tạm thời
sudo mkdir -p /opt/rt-kernel
export KERNEL_INSTALL_DIR="/opt/rt-kernel"
# Giải nén package để kiểm tra nội dung trước
dpkg-deb --extract linux-image-*.deb $KERNEL_INSTALL_DIR/
dpkg-deb --extract linux-headers-*.deb $KERNEL_INSTALL_DIR/
# Xem cấu trúc files được cài
ls -la $KERNEL_INSTALL_DIR/
tree $KERNEL_INSTALL_DIR/ || find $KERNEL_INSTALL_DIR/ -type f | head -20
# Copy kernel files vào /boot từ folder tạm
sudo cp $KERNEL_INSTALL_DIR/boot/vmlinuz-* /boot/
sudo cp $KERNEL_INSTALL_DIR/boot/initrd.img-* /boot/
sudo cp $KERNEL_INSTALL_DIR/boot/System.map-* /boot/
sudo cp $KERNEL_INSTALL_DIR/boot/config-* /boot/
# Copy modules vào /lib/modules
sudo cp -r $KERNEL_INSTALL_DIR/lib/modules/* /lib/modules/
# Tạo symbolic links (nếu cần)
sudo ln -sf /boot/vmlinuz-6.6.116-rt66 /boot/vmlinuz-rt
sudo ln -sf /boot/initrd.img-6.6.116-rt66 /boot/initrd.img-rt
Cách 3: Sử dụng dpkg với --root option
cd ..
# Cài vào thư mục riêng để kiểm tra
sudo mkdir -p /tmp/kernel-staging
sudo dpkg --root=/tmp/kernel-staging -i linux-image-*.deb
# Xem files sẽ được cài
find /tmp/kernel-staging -name "vmlinuz*" -o -name "initrd*"
# Copy thủ công vào hệ thống sau khi kiểm tra
sudo cp /tmp/kernel-staging/boot/* /boot/
sudo cp -r /tmp/kernel-staging/lib/modules/* /lib/modules/
Files được tạo bởi bindeb-pkg:
linux-image-*-rt*.deb- Kernel image và moduleslinux-headers-*-rt*.deb- Headers cho developmentlinux-libc-dev_*.deb- Libc development files
Cập nhật bootloader
sudo update-grub
Đặt RT kernel làm mặc định
Sau khi cài đặt và update-grub, cần đặt RT kernel làm boot option mặc định:
Cách 1: Sử dụng grub-set-default
# Liệt kê các kernel entries trong GRUB
grep "menuentry\|submenu" /boot/grub/grub.cfg | grep -E "(rt|6\.6\.116)"
# Đặt kernel RT làm mặc định (thay số 0 bằng index thực tế)
sudo grub-set-default "1>2" # Ví dụ: submenu 1, entry 2
# Hoặc sử dụng tên đầy đủ
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.6.116-rt66"
Cách 2: Chỉnh sửa /etc/default/grub
# Backup file gốc
sudo cp /etc/default/grub /etc/default/grub.backup
# Chỉnh sửa GRUB_DEFAULT
sudo nano /etc/default/grub
Thay đổi dòng:
# Từ:
GRUB_DEFAULT=0
# Thành (với saved):
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
# Hoặc chỉ định trực tiếp:
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.6.116-rt66"
Cách 3: Sử dụng grub-reboot (tạm thời)
# Boot vào RT kernel chỉ cho lần khởi động tiếp theo
sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 6.6.116-rt66"
Cập nhật GRUB sau khi thay đổi
sudo update-grub
Bước 6: Khởi động với RT Kernel
Reboot và chọn kernel
sudo reboot
Trong GRUB menu, chọn kernel mới với tên có chứa "rt" hoặc version 6.6.116.
Kiểm tra RT kernel đã load
uname -a
# Nên thấy output có chứa "rt12" và "PREEMPT_RT"
cat /sys/kernel/realtime
# Nên output "1" nếu RT enabled
Kiểm tra kernel mặc định hiện tại
# Xem kernel nào sẽ boot mặc định
sudo grub-editenv list
# Xem tất cả kernel entries có sẵn
awk -F\' '/menuentry |submenu / {print $1 $2}' /boot/grub/grub.cfg
# Kiểm tra GRUB_DEFAULT hiện tại
grep "GRUB_DEFAULT" /etc/default/grub
Xóa kernel cũ (tùy chọn)
Sau khi đã chắc chắn RT kernel hoạt động tốt:
Nếu cài bằng dpkg trực tiếp:
# Liệt kê các kernel packages đã cài
dpkg --list | grep linux-image
# Xóa kernel cũ (cẩn thận!)
sudo apt remove linux-image-<version-cũ>
sudo apt autoremove
# Cập nhật GRUB sau khi xóa
sudo update-grub
Nếu cài từ folder đặc biệt:
# Xóa files kernel cũ từ /boot
sudo rm /boot/vmlinuz-<version-cũ>
sudo rm /boot/initrd.img-<version-cũ>
sudo rm /boot/System.map-<version-cũ>
sudo rm /boot/config-<version-cũ>
# Xóa modules cũ
sudo rm -rf /lib/modules/<version-cũ>
# Cleanup staging folder
sudo rm -rf /opt/rt-kernel
sudo rm -rf /tmp/kernel-staging
# Cập nhật GRUB
sudo update-grub
Bước 7: Tối ưu hóa hệ thống cho RT
Kernel parameters
Thêm vào /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=1-3 nohz_full=1-3 rcu_nocbs=1-3"
Trong đó:
isolcpus=1-3: Cô lập CPU cores 1-3 cho RT tasksnohz_full=1-3: Tắt timer interrupts trên cores nàyrcu_nocbs=1-3: RCU callbacks không chạy trên cores này
RT scheduling policy
# Set RT priority cho process
sudo chrt -f 99 your_rt_application
# Check RT processes
ps -eo pid,cls,rtprio,ni,comm | grep -E "(FF|RR)"
Memory locking
# Lock memory để tránh page faults
ulimit -l unlimited
Kiểm tra hiệu năng RT
Test latency với cyclictest
# Cài đặt rt-tests
sudo apt install rt-tests
# Test latency cơ bản
cyclictest -t1 -p99 -n -i200 -l1000
# Test stress với load
cyclictest -t4 -p99 -n -i200 -l10000 -q
Test với hackbench
hackbench -l 10000
Xử lý sự cố
Lỗi build do TRUSTED_KEYS
# Nếu gặp lỗi về certificate/key files
make[4]: *** No rule to make target 'debian/canonical-certs.pem'
# Giải pháp: Xóa các key files
scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str CONFIG_SYSTEM_REVOCATION_KEYS ""
make clean && make -j$(nproc) bindeb-pkg
GRUB không hiện RT kernel
# Nếu không thấy RT kernel trong GRUB menu
sudo update-grub
sudo grub-install /dev/sda # thay sda bằng disk thực tế
# Kiểm tra kernel files có tồn tại không
ls -la /boot/vmlinuz-*rt*
ls -la /boot/initrd.img-*rt*
# Nếu cài từ folder đặc biệt, kiểm tra permissions
sudo chmod 644 /boot/vmlinuz-*rt*
sudo chmod 644 /boot/initrd.img-*rt*
sudo chown root:root /boot/vmlinuz-*rt* /boot/initrd.img-*rt*
# Rebuild initramfs nếu cần
sudo update-initramfs -u -k 6.6.116-rt66
Kernel files không đúng vị trí (khi cài từ folder đặc biệt)
# Kiểm tra kernel modules đã được copy chưa
ls -la /lib/modules/ | grep rt
# Nếu thiếu modules, copy lại từ staging folder
sudo cp -r /opt/rt-kernel/lib/modules/6.6.116-rt66 /lib/modules/
# Update module dependencies
sudo depmod -a 6.6.116-rt66
# Kiểm tra symbolic links
ls -la /boot/ | grep -E "vmlinuz$|initrd.img$"
Không boot được vào RT kernel
# Boot vào kernel cũ và kiểm tra
journalctl -b -1 | grep -i error
# Kiểm tra kernel modules
sudo depmod -a 6.6.116-rt66
sudo update-initramfs -u -k 6.6.116-rt66
# Reset GRUB default về kernel cũ
sudo grub-set-default 0
sudo update-grub
Kernel panic khi boot
- Boot với kernel cũ từ GRUB
- Kiểm tra logs:
dmesghoặc/var/log/kern.log - Có thể cần disable một số drivers/modules
Hiệu năng kém
- Kiểm tra
CONFIG_PREEMPT_RT=ytrong/boot/config-* - Verify kernel parameters với
cat /proc/cmdline - Check IRQ affinity:
cat /proc/interrupts
Module driver không tương thích
# List missing modules
dmesg | grep -i "unknown symbol\|unresolved symbol"
# Rebuild external modules
sudo dkms autoinstall
File .deb quá lớn
Nếu vẫn tạo ra file quá lớn:
# Kiểm tra debug info đã tắt chưa
grep DEBUG_INFO .config
# Nên thấy:
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_INFO_BTF is not set
Tham khảo
Ghi chú
- Backup: Luôn backup kernel cũ trước khi cài RT kernel
- Testing: Test kỹ trên môi trường dev trước khi deploy production
- Updates: RT patches thường ra sau kernel chính vài tuần/tháng
- Hardware: Một số hardware cần firmware/drivers đặc biệt cho RT
Được tạo ngày: $(date) Version: 1.0