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 4 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ácmakefilevà cácbản vá (patches)để nó có thể dễ dàng tạo ra mộtcross-compilation toolchainvà 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
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ả:
 ![Image Docker]() 
- Run Container
 Command:docker run -it rpi-buildroot:1.0
 Kết quả:
 ![Docker Container]() 
- 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 Kernel
- rootfs.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 .ctrong folderoutput/host/bin
 Ở đây sử dụngx86_64-buildroot-linux-uclibc-gcc
- 
Export $PATHra home để có thể chạy comamndexport PATH="/buildroot/output/host/bin:${PATH}"
 Kiểm tra:
 ![export_path]() 
- 
Tạo 1 file hello.cvà 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 helloKết quả: 
 ![hello]() 
 ![run]() 
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
 
 




