Tối ưu hóa thời gian khởi động Nvidia Xavier
1. Vai trò
Trước tiên, mình xin giới thiệu sơ qua về Nvidia Xavier NX. Đây là 1 dòng máy tính rất mạnh và tất nhiên là rất đắt tiền ( sương sương hơn 20 củ gì thôi ), nổi bật với khả năng xử lý AI tiên tiến trong một kích thước nhỏ gọn, phù hợp với nhiều loại thiết bị thông minh và ứng dụng trong các ngành công nghiệp như robot, xe tự hành, và IoT công nghiệp.
- Các thông số kỹ thuật các bạn có thể tham khảo ở đây https://www.proe.vn/jetson-xavier-nx-developer-kit
2. Vấn đề đặ ra về thời gian khởi động của Nvidia Xavier NX
- Ta flash lên kit theo hướng dẫn sau đối với jetpack 5.1.1: https://docs.nvidia.com/jetson/archives/r35.3.1/DeveloperGuide/text/IN/QuickStart.html
Tại thời điểm ban đầu, khi chưa thực hiện tối ưu, thời gian khởi động rơi vào khoảng 46 – 49s. Đây là 1 thời gian khá dài đối với những tình huống lập trình viên / người sử dụng muốn sử dụng nhanh chóng => Cần thiết giảm thời gian khởi động.
3. Phương hướng
Để tối ưu thời gian khởi động của thiết bị, trước tiên, ta cần biết khi khởi động, điều gì xảy ra. 1 hệ thống nhúng Linux gồm 4 thành phần như sau:
- Toolchain :Bộ công cụ để phát triển phần mềm, gồm binutils, gcc, C library (libc), và gdb. Có hai loại: Native toolchain (xây mã nhị phân cho chính máy đó) và Cross toolchain (xây mã nhị phân cho thiết bị khác). Khi phát triển Embedded Linux, hầu hết chúng ta sẽ sử dụng Cross Toolchain vì các thiết bị chạy thường tốc độ thấp, bộ nhớ ít nên không thích hợp để build source trên đó hay chạy Native Tool trên đó.
- Bootloader: Khởi động hệ thống, tải kernel vào RAM và chuyển quyền điều khiển cho nó để tiếp tục khởi động hệ điều hành.
- Kernel: Quản lý phần cứng, bộ nhớ, tiến trình, thiết bị, và cung cấp các dịch vụ cơ bản cho ứng dụng.
- Root Filesystem: Hệ thống tập tin chứa tất cả các thư mục, tệp tin và ứng dụng cần thiết để hệ điều hành hoạt động. Bao gồm các thư mục như /bin, /sbin, /etc, /home, /var, /tmp, /lib, và /usr. Khi flash lên kit, ta flash 3 thành phần là bootloader, kernel và rootfs. Khi thiết bị khởi động, 3 thành phần trên lần lượt được tải lên. Để tải mỗi thành phần cần tốn 1 thời gian nhất định. => Để tối ưu hóa boot time, ta cần tối ưu hóa từng thành phần trên.
4. Thực hiện
a. Tối ưu hóa bootloader
Các phiên bản Jetson có thể khởi động bằng hai loại bootloader: CBoot và UEFI. Đối với các phiên bản JetPack trước 32, CBoot là bootloader mặc định; trong khi ở các phiên bản sau, UEFI trở thành lựa chọn mặc định. Trong trường hợp của mình, khi flash kit lên phiên bản Jetson 35.3.1, bootloader được sử dụng là UEFI. Cách tối ưu hóa UEFI hiệu quả nhất là tinh chỉnh và build lại mã nguồn. Soure UEFI được chia sẻ tại : https://github.com/NVIDIA/edk2-nvidia/wiki Các bước tinh chỉnh tối ưu UEFI source:
B1: Cài Đặt Docker và Thiết Lập Môi Trường theo các comand sau:
Cài đặt Docker
sudo apt install docker.io
sudo usermod -a -G docker ${USER}
Thiết lập biến môi trường Docker
export EDK2_DEV_IMAGE="ghcr.io/tianocore/containers/ubuntu-22-dev:latest"
export EDK2_USER_ARGS="-v \"${HOME}\":\"${HOME}\" -e EDK2_DOCKER_USER_HOME=\"${HOME}\""
export EDK2_BUILD_ROOT="/build"
export EDK2_BUILDROOT_ARGS="-v \"${EDK2_BUILD_ROOT}\":\"${EDK2_BUILD_ROOT}\""
alias edk2_docker="docker run -it --rm -w \"\$(pwd)\" ${EDK2_BUILDROOT_ARGS} ${EDK2_USER_ARGS} \"${EDK2_DEV_IMAGE}\""
edk2_docker echo hello
B2: Cấu hình edkrepo bằng các command
sudo apt install docker.io
sudo usermod -a -G docker ${USER}
B3: Tạo workspace bằng các command sau
cd /build
edk2_docker edkrepo clone nvidia-uefi NVIDIA-Platforms r35.3.1 updates
B4: Tinh chỉnh UEFI
Tại thư mục /build/nvidia-uefi/edk2-nvidia/Platform/NVIDIA, ta chỉnh sửa, rút gọn lại các file NVIDIA.fvmain.fdf.inc (File này để mô tả cấu trúc của các phân vùng firmware và các thành phần trong firmware.) và NVIDIA.common.dsc.inc( file này cung cấp thông tin cấu hình cho dự án firmware, bao gồm các module và driver, cũng như các cài đặt xây dựng.)
Tùy vào ứng dụng của các bạn, các bạn có thể bỏ đi các phần không cần thiết. Tuy nhiên, phần cơ bản nhất có thể loại bỏ/ chỉnh sửa là tắt boot timeout trong UEFI image ( thời gian chờ cho việc nhấn phím để vào UEFI menu) bằng cách chỉnh sửa dòng sau tại file NVIDIA.common.dsc.inc
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5
Thời gian chờ mặc định là 5s, giảm xuống 0s bằng cách chỉnh sửa dòng trên thành
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|0
B5: Build UEFI Image
Trở về thư mục build/nvidia-uefi và build bằng command sau :
edk2_docker edk2-nvidia/Platform/NVIDIA/Jetson/build.sh
B6: Copy Image cũ bằng Image mới
Sau khi build xong. ta được uefi_Jetson_RELEASE.bin trong thư mục images. Việc tiếp theo là đổi tên file trên thành uefi_jetson.bin và copy vào Linux_for_Tegra/bootloader.
Ta thực hiện các command
cd images
sudo mv uefi_Jetson_RELEASE.bin uefi_jetson.bin
sudo rm Nvidia_Directory/Linux_for_Tegra/bootloader/uefi_jetson.bin
sudo cp -rf ./uefi_jetson.bin Nvidia_Directory/Linux_for_Tegra/bootloader/
b. Tối ưu hóa kernel Image
Để biết thời gian khởi động của kernel, ta sử dụng lệnh systemd-analyze. Tại thời điểm chưa tối ưu, kết quả thu được như sau: Để giảm thời gian khởi động kernel, cách mà mình lựa chọn chính là giảm kích thước Kernel Image. Ta thực hiện bằng cách menuconfig và build lại. Các bước thực hiện như sau:
B1: Cài đặt các công cụ cần thiết:
sudo apt install build-essential bc
B2: Tải source Linux Kernel và Tooichain tại:
https://developer.nvidia.com/embedded/jetson-linux-r3531
B3: Giải nén Toolchian theo hướng dẫn tại:
B4: Giải nén Linux Kernel :
tar -xjf public_sources.tbz2
cd Linux_for_Tegra/source/public
tar –xjf kernel_src.tbz2
B4: Cài đặt biến môi trường:
cd /path_to_source/Linux_for_Tegra/source/public
JETSON_XAVIER_NX_KERNEL_SOURCES=$(pwd)
TEGRA_KERNEL_OUT=$JETSON_XAVIER_NX_KERNEL_SOURCES/build
TOOLCHAIN_PREFIX=$HOME/l4t-gcc/bin/aarch64-buildroot-linux-gnu-
sudo make -C kernel/kernel-5.10/ ARCH=arm64 O=$TEGRA_KERNEL_OUT LOCALVERSION=-tegra CROSS_COMPILE=${TOOLCHAIN_PREFIX} tegra_defconfig
sudo make -C kernel/kernel-5.10/ ARCH=arm64 O=$TEGRA_KERNEL_OUT LOCALVERSION=-tegra CROSS_COMPILE=${TOOLCHAIN_PREFIX} menuconfig
Tại đây, menuconfig hiện ra, công việc ta cần thực hiện là tắt các tính năng không cần thiết được build-in ( ký hiệu bằng dấu sao, tắt bằng cách nhấn SPACE, sau đó lưu và thoát.)
sudo make -C kernel/kernel-5.10/ ARCH=arm64 O=$TEGRA_KERNEL_OUT LOCALVERSION=-tegra CROSS_COMPILE=${TOOLCHAIN_PREFIX} -j$(nproc) Image
Sau khi hoàn tất, ta thu được Image mới tại thư mục build/arch/arm64/boot. Thay thế Image cũ tại thư mục LinuxforTegra/kernel và LinuxforTegra/rootfs/boot/ bằng Image mới tạo được này.
c. Tối ưu hóa rootfs
Để biết các dịch vụ đã được khởi đông, ta sử dụng lệnh systemd-analyze blame. Tại thời điểm chưa tối ưu, kết quả như sau:
Vai trò của từng dịch vụ như sau:
- kerneloop.service: dịch vụ dùng để theo dõi và phân tích các lỗi và vấn đề liên quan đến kernel, rất hữu ích trong phát hiện và xử lý các lỗi kernel.
- nvphs.service: quản lý và giám sát các chức năng và phần cứng cụ thể của hệ thống.
- ssh.service: dịch vụ cho phép bạn kết nối và quản lý máy tính từ xa qua giao thức SSH (Secure Shell).
- gdm.service: dịch vụ quản lý đăng nhập (login) cho GNOME Display Manager. Dịch vụ này giúp khởi tạo môi trường desktop(GDM khởi tạo môi trường desktop GNOME và đưa người dùng vào giao diện chính của hệ thống), cần thiết cho việc sử dụng màn hình HDMI.
- nv-l4t-usb-device-mode.service: dịch vụ liên quan đến chế độ USB của các thiết bị NVIDIA Jetson. Dịch vụ này có chức năng đảm bảo rằng thiết bị Jetson có thể chuyển đổi giữa các chế độ USB khác nhau tùy theo yêu cầu của hệ thống, giúp dễ dàng kết nối và tương tác với các thiết bị khác qua giao diện USB.
- dev-mmcblk0p1.device: dịch vụ trong systemd, quản lý việc gắn kết thiết bị lưu trữ, cụ thể là phân vùng của thẻ nhớ (SD card hoặc eMMC) trên hệ thống Linux.
- Avahi-daemon.service: dịch vụ liên quan đến Avahi, một hệ thống dịch vụ mạng được thiết kế để cung cấp khả năng phát hiện dịch vụ trong mạng cục bộ mà không cần cấu hình DNS phức tạp. Nó sử dụng giao thức mDNS (Multicast DNS) và DNS-SD (DNS Service Discovery) để cho phép các thiết bị trong cùng một mạng cục bộ tìm và kết nối với nhau một cách tự động.
- network-dispatcher.service: Xử lý các sự kiện mạng và kích hoạt các kịch bản khi có thay đổi về trạng thái mạng. Dịch vụ này giúp NetworkManager thực thi các kịch bản mạng khi có thay đổi trong kết nối mạng, chẳng hạn như khi kết nối hoặc ngắt kết nối mạng.
- apport.service: Dịch vụ liên quan đến hệ thống báo cáo lỗi của Ubuntu. Apport là công cụ dùng để thu thập thông tin lỗi và báo cáo lỗi khi có sự cố xảy ra trên hệ thống. Nó thu thập thông tin về lỗi từ các ứng dụng và hệ thống.
- snapd.service và các dịch vụ khác liên quan đến snap: Dịch vụ quản lý và cung cấp các ứng dụng Snap trên hệ thống. snapd là dịch vụ chịu trách nhiệm cài đặt, quản lý và cập nhật các gói Snap, một dạng gói phần mềm độc lập với các phụ thuộc. Nó cho phép user dễ dàng cài đặt và duy trì các ứng dụng mà không cần quan tâm đến sự tương thích của thư viện hoặc phụ thuộc.
- networkManager.service: Dịch vụ quản lý kết nối mạng trên hệ thống. NetworkManager cung cấp một cách đơn giản để cấu hình và quản lý các kết nối mạng, bao gồm Ethernet, Wi-Fi, VPN và nhiều loại kết nối khác. Dịch vụ này tự động phát hiện và kết nối với mạng có sẵn và cho phép người dùng dễ dàng thay đổi cấu hình mạng.
- udisk2.service: Dịch vụ quản lý các thiết bị lưu trữ di động, như ổ đĩa USB và thẻ SD. Udisk2 cung cấp các chức năng để tự động gắn kết và tháo dỡ các thiết bị lưu trữ di động, cũng như cung cấp thông tin về các thiết bị này cho các ứng dụng và người dùng.
- account-daemon.service : Dịch vụ quản lý và cung cấp thông tin về các tài khoản người dùng và nhóm trong hệ thống. account-daemon thường được sử dụng để xử lý các thông tin liên quan đến người dùng và nhóm, và có thể cung cấp các chức năng quản lý tài khoản cho các ứng dụng khác hoặc hệ thống.
- systemd-udev-trigger.service: Dịch vụ chịu trách nhiệm kích hoạt các quy tắc udev cho các thiết bị mới được phát hiện trên hệ thống. udev là hệ thống quản lý thiết bị trong Linux, và systemd-udev-trigger đảm bảo rằng tất cả các thiết bị được phát hiện trong quá trình khởi động sẽ được cấu hình theo các quy tắc udev đã định nghĩa.
- resolvconf-pull-resolved.service: Dịch vụ này chịu trách nhiệm lấy và cập nhật thông tin cấu hình DNS từ systemd-resolved và tích hợp nó vào resolvconf - một công cụ quản lý cấu hình DNS cho hệ thống.
- nv-l4t-bootloader-config.service: Dịch vụ này liên quan đến cấu hình bootloader của các thiết bị NVIDIA Jetson.
- swicheroo-control.service: Dịch vụ này liên quan đến việc quản lý và điều khiển chế độ chuyển đổi giữa các card đồ họa (GPU) trong hệ thống.
- nvpower.service: quản lý và tối ưu hóa hiệu suất nguồn điện của các thiết bị NVIDIA Jetson.
- polkit.service: Dịch vụ này cung cấp cơ chế quản lý quyền truy cập và phân quyền cho các ứng dụng và người dùng trong hệ thống Linux. polkit (PolicyKit) cho phép các ứng dụng yêu cầu quyền truy cập đến các tài nguyên hệ thống mà không cần phải yêu cầu quyền root cho toàn bộ ứng dụng.
- psyslog.service: Dịch vụ này là một hệ thống ghi log mạnh mẽ và linh hoạt cho các hệ thống Linux. rsyslog thu thập, xử lý và lưu trữ các bản ghi sự kiện và thông điệp từ các dịch vụ và ứng dụng hệ thống.
- systemd-logind.service: quản lý các phiên đăng nhập và đăng xuất của người dùng, bao gồm các chức năng như quản lý các thiết bị đầu vào, xử lý các sự kiện như đăng nhập, đăng xuất, và các hành động liên quan đến quyền truy cập của người dùng.
- nv.service: quản lý và cấu hình các chức năng và tài nguyên của thiết bị NVIDIA, bao gồm các phần cứng và phần mềm đặc thù của NVIDIA Jetson. nv.service có thể bao gồm các tác vụ như tải các trình điều khiển NVIDIA, thiết lập các cấu hình phần cứng, hoặc quản lý các tính năng đặc biệt của hệ thống NVIDIA.
- wpa_supplicant.service: Dịch vụ này quản lý kết nối mạng không dây (Wi-Fi) trên hệ thống Linux.
- e2scrub-reap.service: Dịch vụ này thuộc bộ công cụ e2fsprogs, quản lý các hệ thống tập tin ext2, ext3, và ext4 trên Linux. Nó thực hiện việc quét và kiểm tra các hệ thống tập tin để phát hiện và sửa chữa lỗi, giúp duy trì sự toàn vẹn của hệ thống tập tin.
- pppd-dns.service: Dịch vụ này liên quan đến pppd (Point-to-Point Protocol Daemon), và chịu trách nhiệm quản lý cấu hình DNS cho các kết nối mạng PPP (Point-to-Point Protocol).
- nvfb-early.service: Dịch vụ này liên quan đến việc khởi tạo và cấu hình framebuffer của NVIDIA trên hệ thống. Nvfb-early được khởi động sớm trong quá trình khởi động để thiết lập các framebuffer cần thiết cho việc hiển thị đầu ra đồ họa trước khi các dịch vụ đồ họa khác được khởi động.
- nv-nvsciipc-init.service: Dịch vụ này liên quan đến NVIDIA NVSciIPC (NVIDIA NVLink SCI IPC). Nó khởi tạo các giao tiếp IPC (Inter-Process Communication) cho hệ thống NVIDIA NVLink.
- ubiquity.service: Đây là dịch vụ quản lý quá trình cài đặt Ubuntu hoặc các bản phân phối dựa trên Ubuntu. Nó cung cấp giao diện đồ họa cho người dùng để thực hiện cài đặt hệ điều hành.
- nvmodel.service: quản lý và tối ưu hóa hiệu suất năng lượng của các thiết bị NVIDIA Jetson, bao gồm các hệ thống như NVIDIA Xavier NX. Dịch vụ này thường có nhiệm vụ quản lý các chế độ năng lượng và hiệu suất của hệ thống.
- user@.service: khởi tạo và quản lý các phiên làm việc của người dùng trên hệ thống Linux
- systemd-journald.service: Đây là dịch vụ quản lý và lưu trữ các bản ghi hệ thống (logs) trong một cơ sở dữ liệu nhị phân gọi là journal. Dịch vụ này cung cấp các bản ghi hệ thống và ứng dụng, cũng như các thông báo từ các dịch vụ khác. Các bản ghi này có thể được sử dụng để theo dõi, phân tích lỗi, và kiểm tra trạng thái hệ thống.
- systemd-resolved.service: Dịch vụ này quản lý việc phân giải tên miền DNS trên hệ thống.
- upower.service: Dịch vụ này cung cấp thông tin về trạng thái nguồn năng lượng của hệ thống và các thiết bị như pin, giúp các ứng dụng và hệ thống quản lý nguồn năng lượng hiệu quả.
- systemd-udevd.service: Dịch vụ này quản lý việc phát hiện và cấu hình các thiết bị phần cứng khi chúng được kết nối hoặc gỡ bỏ khỏi hệ thống. Nó điều phối các sự kiện thiết bị và thực thi các quy tắc udev để cấu hình thiết bị phần cứng, như gán tên thiết bị, tạo liên kết thiết bị, và thực hiện các tác vụ cần thiết liên quan đến thiết bị.
- systemd-modules-load.service: Dịch vụ này được sử dụng để tải các mô-đun kernel (module) từ các tập tin cấu hình khi hệ thống khởi động. Các mô-đun kernel là các phần mở rộng của kernel Linux có thể được nạp và gỡ bỏ khi hệ thống đang chạy. Dịch vụ này đảm bảo rằng các mô-đun cần thiết cho phần cứng hoặc các chức năng đặc biệt được tải lên khi hệ thống khởi động.
- keyboard-setup.service: Dịch vụ này được sử dụng để cấu hình các thiết lập bàn phím trong quá trình khởi động hệ thống.
- systemd-timesyncd.service: Dịch vụ này đồng bộ hóa đồng hồ hệ thống của bạn với một hoặc nhiều máy chủ NTP. Nó giúp giữ cho đồng hồ hệ thống chính xác bằng cách điều chỉnh thời gian dựa trên các máy chủ thời gian mạng.
- alsa-restore.service: Dịch vụ này phục hồi các thiết lập âm thanh của ALSA từ một tệp cấu hình được lưu trữ trước đó.
- ModemManager.service: Dịch vụ này quản lý các modem di động, bao gồm các thiết bị như 3G, 4G LTE, và các modem USB.
- bluetooth.service: Dịch vụ này cung cấp các chức năng quản lý và điều khiển Bluetooth trên hệ thống. Nó bao gồm việc quản lý các thiết bị Bluetooth, thiết lập và duy trì kết nối Bluetooth, và cung cấp giao diện cho các ứng dụng để tương tác với thiết bị Bluetooth.
- nv-l4t-usb-device-mode-runtime.service: Dịch vụ này quản lý các chế độ USB của thiết bị NVIDIA Jetson khi đang hoạt động (runtime). Nó đảm bảo rằng các chức năng USB hoạt động đúng cách và hỗ trợ chuyển đổi giữa các chế độ USB khác nhau như chế độ thiết bị và chế độ chủ. Dịch vụ này giúp duy trì khả năng kết nối và tương tác với các thiết bị USB khác qua giao diện USB.
- packagekit.service: Dịch vụ này cung cấp một giao diện để quản lý các gói phần mềm và cập nhật trên hệ thống Linux. PackageKit hoạt động như một lớp trung gian giữa các công cụ quản lý gói khác nhau (như apt, yum, dnf, v.v.) và các ứng dụng, giúp cho việc cài đặt, gỡ bỏ, và cập nhật phần mềm dễ dàng hơn thông qua một giao diện thống nhất..
- nvfb-udev.service: cấu hình và quản lý các thiết bị NVIDIA framebuffer (NVFB) thông qua hệ thống Udev. Udev là hệ thống quản lý thiết bị trong Linux, và nvfb-udev.service giúp quản lý các thiết bị framebuffer cụ thể của NVIDIA, điều này có thể bao gồm cấu hình các thiết bị đầu ra video và các thiết bị hiển thị khác.
- modprobe@ramoops.service: Dịch vụ này thực hiện việc nạp module kernel cần thiết để cấu hình và sử dụng ramoops, một cơ chế ghi lại lỗi và thông tin hệ thống vào bộ nhớ RAM. Đây là một phần của hệ thống ghi lại lỗi kernel, giúp lưu trữ thông tin về các sự cố hệ thống để phân tích sau khi khởi động lại hoặc khi hệ thống gặp sự cố.
- nvfb.service: Dịch vụ này chịu trách nhiệm quản lý và khởi tạo các thiết bị framebuffer của NVIDIA. Framebuffer là vùng bộ nhớ dùng để lưu trữ hình ảnh trước khi nó được hiển thị trên màn hình. Dịch vụ này có thể liên quan đến việc cấu hình và khởi tạo các thiết bị đầu ra video và màn hình liên quan đến NVIDIA.
- modprobe@pstore_zone.service: Dịch vụ này dùng để tải module kernel cụ thể cho khu vực pstore, giúp hệ thống lưu trữ và khôi phục thông tin lỗi hoặc trạng thái hệ thống. Đây là một phần của cơ chế pstore dùng để lưu trữ thông tin về các lỗi hoặc sự cố hệ thống, giúp phân tích và khắc phục sự cố sau khi hệ thống khởi động lại.
- modprobe@pstore_blk.service liên quan đến việc tải module kernel cho pstore (persistent storage) đặc biệt là đối với các khu vực lưu trữ thông tin trên block devices (thiết bị khối như ổ đĩa cứng, SSD, v.v.).
- systemd-rfkill.service: là một dịch vụ của systemd dùng để quản lý trạng thái của các thiết bị không dây như Wi-Fi, Bluetooth thông qua công cụ rfkill.
- colord.service: Dịch vụ này cung cấp một cách để quản lý các cấu hình màu sắc trên hệ thống. Nó thường được sử dụng để đảm bảo rằng các thiết bị đầu ra như màn hình và máy in có màu sắc chính xác và nhất quán.
- modprobe@chromes_pstore.service: liên quan đến việc nạp các module kernel cho hệ thống lưu trữ nhật ký pstore trên hệ thống như Chrome OS.
- modprobe@efi_pstore.service liên quan đến việc nạp các module kernel cho hệ thống lưu trữ nhật ký pstore thông qua EFI (Extensible Firmware Interface).
- kmod-static-nodes.service: Dịch vụ này tạo các node thiết bị tĩnh trong /dev, đảm bảo rằng các thiết bị cần thiết đã được tạo ra trước khi các module kernel liên quan được nạp. Điều này là quan trọng để đảm bảo rằng các thiết bị được nhận diện và có thể được sử dụng đúng cách khi hệ thống khởi động. -binfmt-support.service Cung cấp hỗ trợ cho binfmt_misc, cho phép hệ điều hành nhận diện và thực thi các tập tin nhị phân có định dạng không phải chuẩn (như chương trình được biên dịch cho kiến trúc khác) thông qua việc sử dụng các mô-đun kernel.
- systemd-remount-fs.service: Dịch vụ này đảm bảo rằng các hệ thống tập tin được gắn lại với các tùy chọn phù hợp sau khi hệ thống đã hoàn tất quá trình khởi động. Điều này bao gồm việc gắn các hệ thống tập tin với các tùy chọn đã được chỉ định trong file cấu hình như fstab.
- systemd-tmpfiles-setup-dev.service : thiết lập và cấu hình các tập tin tạm thời và thư mục trong /dev. Dịch vụ này đảm bảo rằng các thiết bị ảo cần thiết (như các thiết bị ảo trong thư mục /dev) được tạo và cấu hình đúng cách trong quá trình khởi động.
- systemd-tmpfiles-setup.service: đảm nhận việc cấu hình và xử lý các tệp tạm thời khi hệ thống khởi động -systemd-random-seed.service: trong hệ thống sử dụng systemd có nhiệm vụ quản lý và duy trì nguồn entropy của hệ thống bằng cách lưu trữ và phục hồi "random seed” giữa các lần khởi động. Entropy được sử dụng để tạo ra số ngẫu nhiên trong các ứng dụng cần độ ngẫu nhiên cao, chẳng hạn như mã hóa và sinh khóa bảo mật. Random Seed (hạt giống ngẫu nhiên) là giá trị bắt đầu được sử dụng để khởi tạo các thuật toán tạo số ngẫu nhiên. Nó là điểm xuất phát cho quá trình tạo ra chuỗi số ngẫu nhiên.
- dev-zram.device: là vị dịch vụ trong systemd, đại diện cho thiết bị ảo zram. zram thường được sử dụng để tạo phân vùng swap nén, giúp cải thiện hiệu suất hệ thống khi bộ nhớ RAM chính bị đầy, bằng cách cung cấp một phân vùng swap nhanh hơn.
- rpcbind: dịch vụ quản lý và ánh xạ các dịch vụ RPC tới các cổng mạng mà chúng lắng nghe. Nó giúp các dịch vụ RPC xác định cổng mà chúng sử dụng để giao tiếp qua mạng. các dịch vụ dựa trên RPC có thể kể đến là NFS, NIS,…
- user-runtime-dir.service: dịch vụ trong hệ thống systemd chịu trách nhiệm tạo và quản lý thư mục runtime cho mỗi người dùng khi họ đăng nhập vào hệ thống. Thư mục này được sử dụng để lưu trữ các tệp tạm thời và các dữ liệu runtime cần thiết cho các phiên làm việc của người dùng. Đây là 1 dich vụ cần thiết cho các tính năng liên quan đến đa người dùng.
- openvpn.service: dịch vụ trong hệ thống systemd quản lý các kết nối mạng riêng ảo (VPN) sử dụng phần mềm OpenVPN.
- systemd-sysusers.service: một dịch vụ trong hệ thống systemd dùng để quản lý việc tạo và thiết lập các tài khoản người dùng và nhóm hệ thống theo các quy tắc được xác định trong các tệp cấu hình.
- systemd-update-utmp.service chịu trách nhiệm cập nhật thông tin về trạng thái hệ thống (boot, shutdown) và các phiên đăng nhập (login) trong tệp nhật ký utmp và wtmp.
- systemd-user-sessions.service: dịch vụ trong systemd liên quan đến việc quản lý phiên người dùng (user session). Nó quản lý các phiên làm việc của người dùng, giúp đảm bảo rằng mọi thứ được thiết lập chính xác và duy trì trong suốt thời gian người dùng đăng nhập.
- systemd-journal-flush.service: dịch vụ trong systemd chịu trách nhiệm ghi các bản ghi (logs) từ bộ nhớ đệm (RAM) vào đĩa cứng (persistent storage).
- console-setup.service: dịch vụ trong hệ thống systemd có nhiệm vụ cấu hình các thiết lập của bàn phím và bảng điều khiển (console) khi hệ thống khởi động. Điều này bao gồm việc thiết lập bố cục bàn phím (keyboard layout) và các tùy chọn hiển thị cho bảng điều khiển (console).
- plymouth-quit-wait.service: dịch vụ trong hệ thống systemd, chịu trách nhiệm chờ đợi quá trình dừng (quit) của Plymouth - một ứng dụng cung cấp màn hình splash (hình ảnh hiển thị trong quá trình khởi động) khi hệ thống khởi động. Dịch vụ này đảm bảo rằng Plymouth hoàn tất trước khi tiếp tục quá trình khởi động hệ thống.
- rtkit-daemon.service: dịch vụ của systemd cung cấp khả năng quản lý và tối ưu hóa các nhiệm vụ thời gian thực (real-time) trên hệ thống Linux. Dịch vụ này điều chỉnh các ưu tiên của quy trình để đảm bảo rằng các nhiệm vụ quan trọng và thời gian thực, như âm thanh hoặc video phát trực tiếp, có thể thực thi mà không bị gián đoạn bởi các quy trình khác.
- setvtrgb.service: dịch vụ của systemd có nhiệm vụ thiết lập màu sắc của cửa sổ giả lập console.
- nfs-config.service: Dịch vụ cấu hình Network File System (NFS) trên hệ thống. NFS là một giao thức mạng cho phép máy tính chia sẻ thư mục và tập tin với nhau qua mạng, giúp các hệ thống khác có thể truy cập và sử dụng các tệp trên máy chủ từ xa như thể chúng là tệp cục bộ.
Đối với việc vô hiệu hóa dịch vụ trực tiếp trên thiết bị
ta thực hiện bằng cách sử dụng lệnh sudo systemctl disable
VD:
`sudo systemctl disable snap.service`
Đối với việc xóa trực tiếp cấu hình dịch vụ trên thiết bị:
- Với các ứng dụng zram, ta thực hiện bằng cách chỉnh sửa cấu hình của file định nghĩa dịch vụ là nvzramconfig.sh tại thư mục /etc/systemd/system.
- Với các dịch vụ nvpower.service nv.service nvphs.service nvpmodel.service, ta xóa trực tiếp tại thư mục /etc/systemd/system bằng lệnh
sudo rm
VD:
cd /etc/system/system
sudo rm nvpower.service nv.service nvphs.service nvpmodel.service
- Với các dịch vụ khác, ta xóa trực tiếp trong /lib/systemd/system bằng lệnh
sudo rm
VD:
sudo rm snap.service
Đối với ứng dụng thực tế, ưu tiêu sự nhanh gọn hiệu quả, cách tốt nhất là tối ưu hóa trực tiếp bản rootfs sử dụng trong quá trình Flash. Các bước thực hiện như sau
- Di chuyển vào thư mục rootfs thuộc Linux_for_Tegra.
- Với các dịch vụ zram, ta tối ưu bằng cách tinh chỉnh file cấu hình tại thư mục ./etc/systemd/system.
- Với các dịch vụ nvpower.service nv.service nvphs.service nvpmodel.service, ta xóa trực tiếp tại thư mục ./etc/systemd/system bằng lệnh
sudo rm
VD:
sudo rm nvpower.service nv.service nvphs.service nvpmodel.service
- Với các dịch vụ khác, ta xóa trực tiếp tại thư mục ./lib/systemd/system/ bằng lệnh
sudo rm
VD:
cd ./lib/systemd/system
sudo rm snap.service
Ngoài ra, ta còn có thể giảm mức độ log ra và bật chế độ AutoLogin bằng các cách sau:
- Để giảm mức độ LOG, ta chỉnh sửa trong file /boot/extlinux.conf bằng cách chỉnh sửa LOG_LEVEL thành các mức thấp như 2 hoặc 3.
- Để bật chế độ AutoLogin, ta chỉnh sửa trong file /etc/gdm3/custom.conf bằng cách bỏ comment tại AutoLogin và chỉnh sửa tên user thành tên thiết bị của mình.
5. Kết quả đạt được
Tùy vào mức độ tối ưu của các bạn, kết quả đạt được ( thời gian còn lại để khởi động ) là khác nhau. Để kiểm tra lại thời gian khởi động kernel và rootfs, ta sử dụng command: systemd-analyze Để biết các dịch vụ còn lại, các bạn dùng command: systemd-analyze blame
Trên đây là bài viết của mình. Trong bài viết có thể còn những chỗ thiếu sót, mong nhận được sự góp ý từ mọi người.
All Rights Reserved