嵌入式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
二、第一部分:彩色终端完整固化配置
- BusyBox 底层开启 ls 彩色支持
bash
运行
make busybox-menuconfig
Coreutils → ls
勾选两项:
\* Allow use of color to identify file types
\* Produce colored ls output by default
- 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
- SecureCRT 客户端配套设置(否则颜色不渲染)
会话选项 → 仿真
终端类型:Linux
勾选:启用 ANSI 颜色、256 色模式
三、第二部分:SSH 免密登录永久固化(空密码方案)
- Buildroot 主配置开启 Dropbear SSH 服务
bash
运行
make menuconfig
Target packages → Networking applications
勾选 \* dropbear
- 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
- 新增开机脚本自动清空 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的根文件系统支持中文
- 工具链编码基础
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
- 内核仅开启 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终于做成了。