Files
Denso/ipc/linuxrt/6.6.116/README.md
2026-07-03 16:31:37 +07:00

16 KiB

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=y trước khi có thể thấy option PREEMPT_RT
  • Option này nằm trong General setup, KHÔNG phải Processor 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à modules
  • linux-headers-*-rt*.deb - Headers cho development
  • linux-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 tasks
  • nohz_full=1-3: Tắt timer interrupts trên cores này
  • rcu_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: dmesg hoặ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=y trong /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