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存储空间。

posted @ 2025-08-18 15:51  this毛豆  阅读(28)  评论(0)    收藏  举报