Buildroot qemu镜像使用tftp和telnet
在Ubuntu上使用Buildroot编译 qemu_arm_vexpress_defconfig 项目。
背景原因: 在低端嵌入式Linux上,使用tftp + telnet组合,可以比使用ssh + sftp/scp组合节约更多存储空间,虽然后者更现代。
在 qemu_arm_vexpress_defconfig 项目中配置 tftp客户端和telnet服务端,并操作演示。
以下Ubuntu用Host代指,编译出的buildroot镜像,用target代指。
1. 安装环境
在Host安装以下工具:
$ sudo apt install build-essential flex bc gawk texinfo bison file u-boot-tools libssl-dev libncurses-dev $ sudo apt install tftpd-hpa tftp-hpa xinetd bridge-utils uml-utilities
2. 编译buildroot
编译一个基础的镜像,以验证可用:
$ wget https://buildroot.org/downloads/buildroot-2025.02.4.tar.xz $ tar -xf buildroot-2025.02.4.tar.xz $ mv buildroot-2025.02.4 buildroot-arm $ cd buildroot-arm $ make qemu_arm_vexpress_defconfig $ make source $ make -j8
运行可用即可。
3. 配置Host端tftp服务器
修改文件:
$ sudo vim /etc/default/tftpd-hpa
修改以下变量为下面内容:
TFTP_DIRECTORY="/tftpboot" # 设置TFTP根目录 TFTP_ADDRESS="0.0.0.0:69" # 允许所有IP访问 TFTP_OPTIONS="--secure --create" # 启用安全模式和文件创建
创建TFTP目录并设置权限:
$ sudo mkdir -p /tftpboot $ sudo chmod 777 /tftpboot # 确保客户端可读写
启动并验证服务:
$ sudo systemctl restart tftpd-hpa $ sudo systemctl status tftpd-hpa # 检查服务状态 $ sudo netstat -uln | grep ":69" # 确认端口监听
确保69端口被监听。
4. Host端配置Qemu桥接模式
1. 创建网桥并配置物理网卡
$ sudo brctl addbr br0 # 创建网桥br0 $ sudo brctl addif br0 enp0s3 # 改为你实际的网卡 $ sudo ifconfig br0 up # 启动网桥 $ sudo dhclient br0 # 为网桥获取IP(或手动配置静态IP)
2. 创建TAP设备并关联网桥
$ sudo tunctl -t tap0 -u $USER # 创建tap0设备 $ sudo brctl addif br0 tap0 # 将tap0加入网桥 $ sudo ifconfig tap0 up
3. 修改start-qemu.sh
--- a/output/images/start-qemu.sh +++ b/output/images/start-qemu.sh @@ -25,4 +25,4 @@ if ! ${mode_sys_qemu}; then export PATH="/home/phoebus/tshark/br2/buildroot_arm/output/host/bin:${PATH}" fi -exec qemu-system-arm ... -net nic,model=lan9118 -net user ..." +exec qemu-system-arm ... -net nic -net tap,ifname=tap0,script=no,downscript=no ..."
执行 ifconfig 应该出现类似如下的拓扑结构:
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.2.16 netmask 255.255.255.0 broadcast 10.0.2.255 ... ... enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 ... ... lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 ... ... tap0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ... ...
注意: 其中的 "..." 为省略的部分,省略部分不修改,保持原样。
5. 添加并验证tftp
修改u-boot配置,添加tftp客户端:
$ cd buildroot-arm $ make busybox-menuconfig
修改如下 (添加tftp客户端):
Networking Utilities ---> [*] tftp (11 kb) [ ] Enable progress bar [*] tftp-hpa compat (support -c get/put FILE)
重新编译buildroot:
$ make -j8
Host端添加测试文件:
$ cd /tftpboot $ echo "hello" > hello.txt
从Host启动qemu镜像:
$ cd buildroot-arm $ ./output/images/start-qemu.sh
target端验证:
# 获取服务器指定文件 (buildroot) $ tftp -gr hello.txt 10.0.2.15 (buildroot) $ ls hello.txt # 验证获取到的文件 (buildroot) $ cat hello.txt hello # 向服务器发送文件 (buildroot) $ echo "nihao" > nihao.txt (buildroot) $ tftp -l nihao.txt -p 10.0.2.15
在host验证用户上传的文件:
$ cd /tftpboot $ ls hello.txt nihao.txt $ cat nihao.txt nihao
如果验证没有问题,tftp就可以正常使用了。
6. 添加并验证telnet
修改busybox配置:
$ cd buildroot-arm $ make busybox-menuconfig
在busybox中添加如下配置(telnet服务端):
Networking Utilities ---> [*] telnetd (13 kb) [*] Support standalone telnetd (not inetd only) (23) Default port [*] Support -w SEC option (inetd wait mode)
重新编译buildroot后,启动qemuu镜像验证。
buildroot target:
(buildroot) $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff inet 10.0.2.17/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever
ubuntu host:
$ tftp 10.0.2.17 Trying 10.0.2.17... Connected to 10.0.2.17. Escape character is '^]'. buildroot login: root # ls hello.txt nihao.txt # cat nihao.txt nihao # cat hello.txt hello
验证类似上述就代表通过了。
两个功能仅占用大约24KB存储空间。

浙公网安备 33010602011771号