系统构建--NFS挂载根文件系统

本文介绍的是利用NFS挂载根文件系统。github仓库:https://github.com/rikeyone/qemu-linux-system.git

host上需要先配置NFS服务

startnfs.sh:

HOST_IP=192.168.1.1
NET_NUMBER=192.168.1.0
NET_MASK=255.255.255.0

NFS_ROOT=~/work/rootfs

sudo apt-get install nfs-kernel-server
sudo apt-get install uml-utilities

if [ ! -e /etc/exports.bak ];then
       sudo cp /etc/exports /etc/exports.bak
fi

sudo echo "${NFS_ROOT} *(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports
sudo /etc/init.d/nfs-kernel-server restart

TAP=$(ifconfig tap0 | head -n 1 | awk '{print $1}')

if [ x${TAP} = x ];then
       sudo tunctl -u $(whoami) -t tap0
       sudo ifconfig tap0 ${HOST_IP}
       sudo route add -net ${NET_NUMBER} netmask ${NET_MASK} dev tap0
       sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
fi

在宿主机上创建一个TAP网络,对应的网络设备为tap0。

qemu启动target设备

qemu-system-arm -M vexpress-a9 \
        -smp 4 \
        -m 1024m \
        -kernel linux-4.0/arch/arm/boot/zImage \
        -append "console=ttyAMA0 loglevel=8 root=/dev/nfs rw nfsroot=${HOST_IP}:${NFS_ROOT},nolock ip=${TARGET_IP}" \
        -dtb linux-4.0/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
        -net nic -net tap,ifname=tap0,script=no \
        -nographic

关键是传入cmdline选项:

root=/dev/nfs rw nfsroot=${HOST_IP}:${NFS_ROOT},nolock ip=${TARGET_IP}

以及对应的qemu选项

-net nic -net tap,ifname=tap0,script=no

这里的qemu选项指定要虚拟网卡,并且把虚拟机的网络加到tap0中。
如果我们使用的arm64平台,那么qemu的命令会有些差异:

qemu-system-aarch64 -machine virt \
        -cpu cortex-a57 \
        -machine type=virt \
        -nographic -m 2048 \
        -smp 2 \
        -kernel linux-4.0/arch/arm64/boot/Image \
        -append "console=ttyAMA0 loglevel=8 root=/dev/nfs rw nfsroot=${HOST_IP}:${NFS_ROOT}/arm64/_install,nolock ip=${TARGET_IP}:${HOST_IP}:::::off::" \
        -netdev tap,id=tap0,ifname=tap0,script=no \
		-device virtio-net-device,netdev=tap0

主要差异在于qemu传入的选项发生了变化:

“-netdev tap,id=tap0,ifname=tap0,script=no”指定QEMU虚拟机网络设备的后端。
“-device virtio-net-device,netdev=tap0”表示虚拟机中的网络设备,需要指定绑定上的netdev。

你可能感兴趣的:(Linux系统构建)