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

566 lines
16 KiB
Markdown

# 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-<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:
```bash
# 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`:
```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*