用buildroot在pc上自制一个类似嵌入式linux的迷你linux

嵌入式linux开发,通常是采购市售的开发板,这些开发板一般是以CPU核心板(由cpu,ram,flash,各种接口的TTL引出脚等构成)加底板(由供电电路,符合各种规范的接口等电路等),硬件工程师的任务就是根据项目要求,对底板上的电路进行取舍,重新绘制符合项目要求的底板。CPU核心板基础硬件的驱动,比如spi,i2c,232,甚至是can总线,蓝牙,wifi,4G或5G的网卡驱动等,基本上都由核心板的供应商提供了。嵌入式linux的软件工程师们通常不需要关于这些东西了。事实上,嵌入式linux工程师很多时候还需做些业务流程上的软件。这些软件通常和硬件无关,只需一个桌面linux即可开发。我就是这么做的。但时间长了以后,发现象ubuntu这样的linux发行版和真实的嵌入式linux还是有些不同的,很难做到100%复原。我之前就向大家推荐过一个名Alpine的linux迷你发行版,结果试用下来,因为它是基本musl的gcc做编译器,和主流的glibc的嵌入式linux不太一样,实际用下来,各种坑。因而放弃。

现在主流的嵌入式linux都是基于glibc的,而且是基于buildroot来构建linux的。于是决定就用它了。buildroot其实是一脚本,它负责把linux系统基本三件套,boot,kernel,busybox的源码下载下来,进行编译,再根据你的配置,构成linux的根文件系统,还可以把这个linux配套的glibc的编译打包,以方便你在电脑主机上进行交叉编译。想想十年前,这些工作都需要一步一步去做,这个buildroot太方便了。如能在pc上用buildroot来做一个嵌入式linux大小的迷你linux系统,就可获得一个和嵌入式linux类似的linux系统了,这样,业务类的程序代码就可以这个linux上调试了,查了豆包,还真可以。

于是我决定用buildroot做一个基于PC机的迷你linux系统。

用buildroot,需要一个buildroot的宿主机,我选用了virtal box建的虚拟机,安装了ubuntu24.04。接下来的操作全程查询豆包,进行指引。选用buildroot-2025.02.14进行构建。构建过程均在豆包指引下完成。顺利完成buildroot的构建,在源码目录的/home/lij/buildroot_prj/buildroot-2025.02.14/output/images下生成disk.img,然后用qemu-img convert -f raw -O vdi disk.img disk.vdi生成vbox可用的磁盘镜像。这里要说明一下,一开始豆包是指引在windows下安装qemu来做,结果最终失败,豆包才给出了在ubuntu下直接生成的方法。

生成以后,再用virtual box来建一个虚拟机,内存开成2048M,存诸控制器用SATA,类型要注意,需选择virtio-scsi,我试过其它的类型都不能正常启动,只有这个可以。声音的控制芯片选用Intel HD 音频。网卡选择桥接网卡。将disk.vdi导入到这个虚拟机,能成功引导这个迷你linux。

整个制作过程,编译源码的过程并不长,主要是一些外网的源码,下载起来太慢,更有一些源码来自于github的,那几天抽疯,死活下不来。好在buildroot的制作过程可中断,在国内找到相应源码文件的下载后,将源码复制到output/build下相应源码的目录下,再继续就可以了,这点要注意,不是如豆包所说的直接拷贝,这个版本buildroot会生成相应名子的源码目录。这里要吐槽下,一个纯技术的网站,还要被墙。

然而发现这个迷你linux终端显示没有彩色显示,虽说无关紧要,但完美主义的我还是决定让它能够彩色显示,象正常的桌面版linux一样,另外,顺便开启迷你linux的ssh登录功能。经查询豆包并实践如下

全程使用 rootfs overlay 固化配置,一次编译永久生效,重启 / 重编镜像不会丢失;彩色终端与 SSH 配置完全独立,互不干扰。

一、环境基础准备(仅做一次)

建立 overlay 目录(规范存放自定义系统文件)

bash

运行

mkdir -p board/custom/overlay/etc/init.d

目录结构:

plaintext

board/custom/overlay/

├── etc/

│ ├── profile # 彩色终端配置

│ └── init.d/

│ ├── S50dropbear # SSH启动脚本,带空密码参数-B

│ └── S99clearpasswd # 开机自动清空root密码

Buildroot 主配置启用 overlay

bash

运行

make menuconfig

System configuration → Root filesystem overlay directories 一项中

填入绝对路径:

/home/lij/buildroot_prj/buildroot-2025.02.14/board/custom/overlay

二、第一部分:彩色终端完整固化配置

  1. BusyBox 底层开启 ls 彩色支持

bash

运行

make busybox-menuconfig

Coreutils → ls

勾选两项:

\* Allow use of color to identify file types

\* Produce colored ls output by default

  1. overlay 写入全局彩色配置 /etc/profile

bash

运行

cat > board/custom/overlay/etc/profile <<'EOF'

256色终端兼容SSH客户端

export TERM=xterm-256color

ls快捷别名

alias ll='ls -alF'

alias la='ls -A'

alias l='ls -CF'

彩色命令提示符(绿色用户名主机,蓝色路径)

export PS1="\\\033\[32m\\\u@\h \\\033\[34m\\\w \\\033\[0m\\# "

EOF

  1. SecureCRT 客户端配套设置(否则颜色不渲染)

会话选项 → 仿真

终端类型:Linux

勾选:启用 ANSI 颜色、256 色模式

三、第二部分:SSH 免密登录永久固化(空密码方案)

  1. Buildroot 主配置开启 Dropbear SSH 服务

bash

运行

make menuconfig

Target packages → Networking applications

勾选 \* dropbear

  1. overlay 替换带 -B 参数的 SSH 启动脚本

-B 作用:允许 root 空密码 SSH 登录

bash

运行

cat > board/custom/overlay/etc/init.d/S50dropbear <<'EOF'

#!/bin/sh

test -r /etc/default/dropbear && . /etc/default/dropbear

start() {

关键参数 -B 开启空密码登录

DROPBEAR_ARGS="$DROPBEAR_ARGS -R -B"

if [ -L /etc/dropbear \

-a "$(readlink /etc/dropbear)" = "/var/run/dropbear" ]

then

if rm -f /etc/dropbear >/dev/null 2>&1; then

mkdir -p /etc/dropbear

else

echo "No persistent location to store SSH host keys."

mkdir -p "$(readlink /etc/dropbear)"

fi

fi

printf "Starting dropbear sshd: "

umask 077

start-stop-daemon -S -q -p /var/run/dropbear.pid \

--exec /usr/sbin/dropbear -- $DROPBEAR_ARGS

$? = 0 && echo "OK" || echo "FAIL"

}

stop() {

printf "Stopping dropbear sshd: "

start-stop-daemon -K -q -p /var/run/dropbear.pid

$? = 0 && echo "OK" || echo "FAIL"

}

restart() { stop; start; }

case "$1" in

start) start ;;

stop) stop ;;

restart) restart ;;

*) echo "Usage: $0 {start|stop|restart}"; exit 1

esac

EOF

添加可执行权限

chmod 755 board/custom/overlay/etc/init.d/S50dropbear

  1. 新增开机脚本自动清空 root 密码

bash

运行

cat > board/custom/overlay/etc/init.d/S99clearpasswd <<'EOF'

#!/bin/sh

case "$1" in

start)

passwd -d root

;;

esac

EOF

chmod 755 board/custom/overlay/etc/init.d/S99clearpasswd

脚本命名S99,开机最后执行,保证 SSH 启动前 root 无密码。

四、完整编译生效

bash

运行

全量清理,确保BusyBox/overlay配置全部更新

make clean

make -j$(nproc)

至此,一个可用的,并可用ssh远程登录的迷你linux即完成。

进而又发现此迷你linux中,嵌入式linux上常用的nfs挂载功能没有。且不支持中文显示。又是一番查询,加了上去,过程如下

busybox的根文件系统支持中文

  1. 工具链编码基础

Target options → Target library:选择 glibc(musl 对 locale 支持残缺)

Toolchain → 勾选 Enable locale support

System configuration

Generate locale data 勾选

Locales to keep:填入 C en_US

默认 locale:C.UTF-8

  1. 内核仅开启 NFS 客户端(FAT/CP936 全部不用配置)

make linux-menuconfig → File systems → Network File Systems

\* NFS client support

\* NFSv4 client support

二、Busybox 核心 Unicode 配置(make busybox-menuconfig → Settings)

make busybox-menuconfig

必开 Unicode 总开关(ls/cd/mv/cat/python 共用)

\* Support Unicode

\* Check LC_ALL, LC_CTYPE and $LANG environment variables

(0) Range of supported Unicode characters

\* Allow wide Unicode characters on output

Character code to substitute unprintable characters with = 32(空格,避开 63 问号、0 空白)

\* Allow zero-width Unicode characters on output

/etc/profile的文件内容如下:

开启256色终端

export TERM=xterm-256color

ls快捷别名(busybox已默认开彩色,无需--color参数)

alias ll='ls -alF'

alias la='ls -A'

alias l='ls -CF'

彩色命令提示符:绿色用户名主机、蓝色路径

export PS1="\\\033\[32m\\\u@\h \\\033\[34m\\\w \\\033\[0m\\# "

export LANG=C.UTF-8

export LC_ALL=C.UTF-8

export LC_CTYPE=C.UTF-8

注:在上面几步中,主要的坑点是配置好内核和busybox的menuconfig后,没有执行make linux-update-config和make busybox-update-config,即执行了make clean,导致配置丢失未起作用,还以为是自已配错了。这里豆包表现出了AI的局限性,还是我查阅了资料之才发现这点的,同时,在中文化方面也出了很多错误的指引,导致我在这方面停了一个显期无进展,不得已,自已查询了网上的相关文章才解决。但它有一点是对的,C.UTF-8的确不是网上所说的zh_cn.UTF-8。当然,zh_cn.UTF-8可能也是可以的,另外,在这个迷你linux上自带的终端还不能显示中文,查了资料,要实现这点还需要做一些操作,但在ssh登录后(我用的是secureCRT软件来登的,这个软件自身支持UTF8),可以完美显示中文,无论是中文内容,还是中文目录都能正常显示。

不管怎样,一个让我满意的和嵌入式linux基本一样的迷你linux终于做成了。