# 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) ```bash 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 ```bash mkdir -p ~/kernel-build cd ~/kernel-build ``` ### Tải kernel source ```bash wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.6.116.tar.xz ``` ### Tải RT patch ```bash 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) ```bash # 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 ```bash tar -xf linux-6.6.116.tar.xz cd linux-6.6.116 ``` ### Giải nén và áp dụng RT patch ```bash 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ị) ```bash cp /boot/config-$(uname -r) .config ``` ### Hoặc tạo cấu hình mặc định ```bash make defconfig ``` ### Cấu hình RT-specific options ```bash 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: ```bash # 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: ```bash # 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 ```bash nproc ``` ### Build kernel packages (không tạo debug packages) ```bash 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):** ```bash # 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 ```bash # 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 ```bash 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) ```bash 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 ```bash 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 ```bash 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 ```bash # 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 ```bash # 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: ```bash # 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) ```bash # 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 ```bash sudo update-grub ``` ## Bước 6: Khởi động với RT Kernel ### Reboot và chọn kernel ```bash 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 ```bash 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 ```bash # 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: ```bash # 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- sudo apt autoremove # Cập nhật GRUB sau khi xóa sudo update-grub ``` #### Nếu cài từ folder đặc biệt: ```bash # Xóa files kernel cũ từ /boot sudo rm /boot/vmlinuz- sudo rm /boot/initrd.img- sudo rm /boot/System.map- sudo rm /boot/config- # Xóa modules cũ sudo rm -rf /lib/modules/ # 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`: ```bash 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 ```bash # 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 ```bash # Lock memory để tránh page faults ulimit -l unlimited ``` ## Kiểm tra hiệu năng RT ### Test latency với cyclictest ```bash # 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 ```bash hackbench -l 10000 ``` ## Xử lý sự cố ### Lỗi build do TRUSTED_KEYS ```bash # 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 ```bash # 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) ```bash # 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 ```bash # 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 ```bash # 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: ```bash # 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 - [Linux RT Wiki](https://rt.wiki.kernel.org/) - [Real-Time Linux Kernel Documentation](https://www.kernel.org/doc/Documentation/admin-guide/real-time-kernel.txt) - [RT-Tests Suite](https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git) ## 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*