在上一章节中,我们已经成功完成了内核和 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中进行了显示