Cùng tôi build 1 OS nhúng đơn giản dùng buildroot kết hợp Docker tạo môi trường
Bài đăng này đã không được cập nhật trong 3 năm
Trong quá trình học tập trên trường, mình có được tiếp xúc với môn lập trình nhúng. Ở môn học này, mình được giao một assignment liên quan đến buildroot. Cho nên hôm nay mình xin phép được chia sẻ một chút hiểu biết của mình, mọi người cùng tham khảo.
Buildroot là gì và dùng để làm gì ?
Là một build-system Linux hệ nhúng
Một tập cácmakefile
và cácbản vá (patches)
để nó có thể dễ dàng tạo ra mộtcross-compilation toolchain
và hệ thống tập tin gốc (root filesystem
) cho hệ thống linux đích mà chúng ta muốn xây dựng
Tóm lại thì Buildroot giúp chúng ta có thể làm ra 1 OS nhúng với kích thước nhỏ gọn, có thể dễ dàng tích hợp vào các thiết bị IoT sau này.
Cấu trúc của buildroot
Trong buildroot có 1 số thành phần giúp ta chạy thiết lập 1 OS
- Makefile: Chứa sẵn các script để build các OS với các config khác nhau
- Config.in: Chứa các option giúp t config một cách dễ dàng
- .config: Giống như file log của hệ thống, các option cài đặt được lưu lại vào đây
Sau khi build, ta có được đầy đủ các thành phần cơ bản của 1 Hệ điều hành
- Kernel
- Root filesystem
- Bootloader
- Các thành phần phụ trợ khác
Cài đặt buildroot dùng Docker
Các bước chính
- Setup môi trường dùng Docker
- Configure Buildroot
- Build Image
- Chạy thử 1 ví dụ đơn giản
Tiến hành cài đặt
Setup môi trường dùng docker
- Yêu cầu: Máy tính đã cài đặt Docker
Tham khảo link: How to install Docker - Tạo
Dockerfile
Tham khảo Dockerfile
Nội dung gồm các phần chính:FROM debian:jessie RUN apt-get update && apt-get install -y -q \ bash \ bc \ binutils \ build-essential \ bzip2 \ ca-certificates \ cpio \ debianutils \ file \ g++ \ gcc \ git \ graphviz \ gzip \ libncurses5-dev \ locales \ make \ patch \ perl \ python \ python-matplotlib \ rsync \ sed \ tar \ unzip \ wget \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN sed -i "s/^# en_US.UTF-8/en_US.UTF-8/" /etc/locale.gen && locale-gen && update-locale LANG=en_US.UTF-8 ENV BR_VERSION 2020.02.8 RUN wget -qO- http://buildroot.org/downloads/buildroot-$BR_VERSION.tar.gz \ | tar xz && mv buildroot-$BR_VERSION /buildroot
-
Lấy từ môi trường gốc là
Debian:jessie
FROM debian:jessie
-
Chạy 1 số yêu cầu cần thiết như:
RUN apt-get update && apt-get install -y -q \...
-
Thiết lập locale và gán biến môi trường:
RUN sed -i "s/^# en_US.UTF-8/en_US.UTF-8/" /etc/locale.gen && locale-gen && update-locale LANG=en_US.UTF-8 ENV BR_VERSION 2020.02.8
-
Tải và giải nén buildroot
RUN wget -qO- http://buildroot.org/downloads/buildroot-$BR_VERSION.tar.gz \ | tar xz && mv buildroot-$BR_VERSION /buildroot
-
- Build Image Docker
Commanddocker build –tag rpi-buildroot:1.0 .
Kết quả:
- Run Container
Command:docker run -it rpi-buildroot:1.0
Kết quả:
- Sau khi tắt máy tính, muốn chạy vào container buildroot
Command:docker exec -it modest_bose bash
Configure Buildroot
Vào trong thư mục buildroot: cd buildroot
Ở đây mình sử dụng bản cài đặt môi trường có sẵn
Virtual machine: make qemu_x86_64_defconfig
Ngoài ra chúng ta có thể tạo các bản cài đặt từ bên ngoài, sau đó thêm vào menuconfig, rồi tiến hành chạy trên giao diện cài đặt make menuconfig
Ví dụ: Dùng Conan để việc cài đặt sau này tiết kiếm thời gian (từ 1 vài tiếng xuống còn 1 vài phút)
Build Image
Command: make
Sau khi chạy xong, chúng ta kiểm tra kết quả ở output/images
bzImage
: File Linux Kernelrootfs.ext2
: File drive
Việc tiến hành cài đặt mất khá nhiều thời gian, trong thời gian chờ chúng ta có thể tiến hành cài đặt môi trường khởi chạy lại máy ảo qemu
Tạo file run_qemu.sh
với nội dung:
#!/bin/sh
(
BINARIES_DIR="${0%/*}/"
cd ${BINARIES_DIR}
if [ "${1}" = "serial-only" ]; then
EXTRA_ARGS='-nographic'
else
EXTRA_ARGS='-serial stdio'
fi
export PATH="/buildroot/output/host/bin:${PATH}"
exec qemu-system-x86_64 -M pc -kernel bzImage \
-drive file=rootfs.ext2,if=virtio,format=raw \
-append "rootwait root=/dev/vda console=tty1 console=ttyS0" \
-net nic,model=virtio -net user ${EXTRA_ARGS}
)
Cấp quyền thực thi cho file run_qemu.sh
và chạy, ví dụ:
chmod 770 run_qemu.sh
./run_qemu.sh
Chạy thử 1 ví dụ đơn giản
-
Tìm trình biên dịch file
.c
trong folderoutput/host/bin
Ở đây sử dụngx86_64-buildroot-linux-uclibc-gcc
-
Export
$PATH
ra home để có thể chạy comamndexport PATH="/buildroot/output/host/bin:${PATH}"
Kiểm tra:
-
Tạo 1 file
hello.c
và tiến hành biên dịchcd touch hello.c --> edit file tạo 1 chương trình helloworld x86_64-buildroot-linux-uclibc-gcc hello.c -o hello
Kết quả:
Tạm kết
Trên đây là 1 số kiến thức mình tìm hiểu được khi làm việc với buildroot, mong các bạn đánh giá và nhận xét để mình cải thiện bài viết được tốt hơn
Link tham khảo từ Doc của buildroot: https://buildroot.org/downloads/manual/manual.html
All rights reserved