在上一章节中,我们已经成功完成了内核和 busybox 环境的配置。为了进一步提高开发效率,我们可以使用 NFS(Network File System)来挂载根目录。NFS 允许我们将本地文件系统通过网络共享给虚拟机使用,这样在开发过程中,我们对本地文件系统所做的修改可以实时反映到虚拟机中,无需频繁地重新构建和烧录根文件系统,从而显著提高开发效率。
1. Ubuntu网桥配置
1.1 编辑 Netplan 配置文件
在 Ubuntu 20.04 中,Netplan 是默认的网络配置工具。我们需要编辑 Netplan 配置文件,该文件通常位于 /etc/netplan/ 目录下,文件名可能类似于 00-installer-config.yaml。使用以下命令打开文件进行编辑:
sudo nano /etc/netplan/00-installer-config.yaml
示例配置如下,假设你的物理网卡名为 ens33,网桥名为 br0:
network:version: 2renderer: networkdethernets:ens33:dhcp4: nodhcp6: nobridges:br0:interfaces: [ens33]dhcp4: yesdhcp6: no
以上配置的含义为:
ens33:将物理网卡ens33的 DHCPv4 和 DHCPv6 功能关闭。br0:创建一个名为br0的网桥,将ens33添加到网桥中,并开启网桥的 DHCPv4 获取 IP 地址功能。
1.2 应用 Netplan 配置
保存文件后,使用以下命令应用 Netplan 配置,使网桥配置生效:
sudo netplan apply
1.3 验证网桥配置
使用 brctl show 命令查看网桥是否创建成功:
brctl show
若输出包含类似如下内容,则表示网桥创建成功:
bridge name bridge id STP enabled interfaces
br0 8000.001122334455 no ens33

2. NFS 环境搭建
2.1 安装 NFS 服务器
sudo apt-get install nfs-kernel-server
2.2 创建 NFS 共享目录
sudo mkdir -p /nfsroot
sudo chmod 777 /nfsroot
2.3 复制根文件系统到 NFS 共享目录
将之前已经配置好的根文件系统在 ~/rootfs 目录下,将其复制到 NFS 共享目录:
cp -r ~/rootfs/* /nfsroot/
2.4 配置 NFS 共享
编辑 /etc/exports 文件,添加以下内容:
/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
重新导出 NFS 共享并重启 NFS 服务:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
验证NFS环境 sudo exportfs -v

3. QEMU 启动命令详解
以下是一个启动 QEMU 模拟 vexpress-a9 开发板并使用 NFS 根文件系统的示例命令:
sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel linux-5.15.18/arch/arm/boot/zImage \
-dtb linux-5.15.18/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-net bridge,br=br0 \
-net nic,model=lan9118 \
-append "root=/dev/nfs rw nfsroot=192.168.3.32:/home/jiuri/linux/nfs,tcp,nfsvers=3 ip=192.168.3.100::192.168.3.32:255.255.255.0::eth0:none console=ttyAMA0 earlyprintk"
命令参数详解:
-
-M vexpress-a9:指定模拟的开发板型号为 vexpress-a9。 -
-m 512M:分配 512MB 的内存给虚拟机。 -
-kernel linux-5.15.18/arch/arm/boot/zImage:指定 Linux 内核镜像文件的路径。 -
-dtb linux-5.15.18/arch/arm/boot/dts/vexpress-v2p-ca9.dtb:指定设备树二进制文件的路径。 -
-append "root=/dev/nfs rw nfsroot=192.168.3.32:/home/jiuri/linux/nfs,tcp,nfsvers=3 ip=192.168.3.100::192.168.3.32:255.255.255.0::eth0:none console=ttyAMA0 earlyprintk":内核启动参数,具体解释如下:
root=/dev/nfs:指定根文件系统使用 NFS。rw:以读写模式挂载根文件系统。nfsroot=192.168.3.32:/home/jiuri/linux/nfs,tcp,nfsvers=3:指定 NFS 服务器的 IP 地址、共享目录,使用 TCP 协议,NFS 版本为 3。ip=192.168.3.100::192.168.3.32:255.255.255.0::eth0:none:指定虚拟机的 IP 地址、网关、子网掩码等网络配置。console=ttyAMA0 earlyprintk:指定控制台设备并启用早期打印功能。
-
-net bridge,br=br0:使用桥接网络,指定网桥名为br0。 -
-net nic,model=lan9118:配置网络网卡,型号为lan9118。
测试验证
在虚拟机中创建test文件夹,在ubuntu中进行了显示
