计算机系统课上需要用到 MIPS 虚拟机。在网上找到些资料,记录在这里。
注:已将配置好的镜像上传,可以直接在Linux/Windows下使用。用户名 root 密码 rootroot,装好了gdb。推荐在Linux子系统中运行。
Windows下使用方法:
- 到 https://qemu.weilnetz.de/w64/ 下载并安装QEMU (备份下载: qemu-w64-setup-20190815.exe )
- 到安装目录找到 qemu-system-mipsel.exe ,找到上面三个文件的位置。
- 在cmd中执行命令 (注意更改加粗字体文件对应的位置)
“C:\Program Files\qemu\qemu-system-mipsel.exe” -hda D:\disk.qcow2 -M malta -kernel D:\vmlinux-4.19.0-6-4kc-malta -initrd D:\initrd.img-4.19.0-6-4kc-malta -m 512 --serial stdio -append "root=/dev/sda1 nokaslr console=ttyAMA0,115200 console=tty highres=off console=ttyS0 "
Ubuntu系系统/Windows下的Linux子系统使用方法:
- 安装 qemu-system-mipsel : $ sudo apt install qemu-system-mipsel -y
- 下载上面三个文件到工作目录
wget https://ftp.mrning.com/uploads/blog/initrd.img-4.19.0-6-4kc-malta wget https://ftp.mrning.com/uploads/blog/vmlinux-4.19.0-6-4kc-malta wget https://ftp.mrning.com/uploads/blog/disk.qcow2
- 执行下面的命令启动
qemu-system-mipsel -M malta -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.img-4.19.0-6-4kc-malta \ -kernel ./vmlinux-4.19.0-6-4kc-malta -append "nokaslr root=/dev/sda1" \ -nographic
将外部文件传到虚拟机中
如何将外部文件传到虚拟机中?可以在Linux系统中挂载虚拟盘,将文件复制到虚拟盘中,参考命令如下:
注:Linux子系统缺少内核模块,没法直接弄。
# 安装需要的软件包 sudo apt install nbd-client # 挂载虚拟磁盘 disk.qcow2 到 mnt 目录 sudo modprobe nbd max_part=8 sudo qemu-nbd --connect=/dev/nbd0 disk.qcow2 mkdir mnt sudo mount /dev/nbd0p1 mnt ##挂载虚拟盘到mnt目录下 ## 然后你可以复制文件到虚拟磁盘里了 # 卸载虚拟盘 sudo umount /dev/nbd0p1 sudo nbd-client -d /dev/nbd0
其他方法可以考虑在外部机子上搭建简易 web 服务器,在虚拟机中下载文件。也可以参考后面的启动脚本,安装并启动 ssh 服务。
如果自己安装虚拟机,可以参考以下步骤:
准备阶段
安装QEMU
对于 Ubuntu 系列系统,运行 sudo apt install qemu-system-mipsel -y
即可
在镜像站获取最新的 initrd 和 kernel
可用的地址: http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/ 或清华镜像站 https://mirrors.tuna.tsinghua.edu.cn/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/
如:$ wget
http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/initrd.gz
$ wget
http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/vmlinux-4.19.0-6-4kc-malta
新建虚拟磁盘
$ qemu-img create -f qcow2 disk.qcow2 20G
运行 Debian 网络安装程序
$ qemu-system-mipsel -M malta -m 1G \
-hda ./disk.qcow2 \
-initrd ./initrd.gz \
-kernel ./vmlinux-4.19.0-6-4kc-malta -append "nokaslr" \
-nographic
为减少安装时间,正确选择网络镜像,根据机器性能,安装需要一个多小时。
从虚拟磁盘中提取 initrd
sudo apt install nbd-client
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 disk.qcow2
mkdir mnt
sudo mount /dev/nbd0p1 mnt
cp mnt/boot/initrd.img-4.19.0-6-4kc-malta .
sudo umount /dev/nbd0p1
sudo nbd-client -d /dev/nbd0
最后,可以启动虚拟机了
$ qemu-system-mipsel -M malta -m 1G \
-hda ./disk.qcow2 \
-initrd ./initrd.img-4.19.0-6-4kc-malta \
-kernel ./vmlinux-4.19.0-6-4kc-malta -append "nokaslr root=/dev/sda1" \
-nographic
更多资料:
从外部连接到虚拟机 链接–> Debian on an emulated MIPS(EL) machine
Connect your emulated machine to a real network
When no option is specified QEMU uses a non priviledged user mode network stack that gives the emulated machine access to the world. But you probably want to make your emulated machine accessible from the outside. It is possible by using the tap mode and bridging the tap interface with the network interface of the host machine.
The first thing to do is to active a bridge on your host machine. For that you have to modify the/etc/network/interfaces
file as follow:
Before:
auto eth0
iface eth0 inet dhcp
After:
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_maxwait 0
Then you need to install thebridge-utils
package and restart your network interface:
# apt-get install bridge-utils
# ifdown eth0
# ifup br0
Create a script call/etc/qemu-ifup
that will be executed upon the start of QEMU:
#!/bin/sh
echo “Executing /etc/qemu-ifup”
echo “Bringing up $1 for bridged mode…”
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo “Adding $1 to br0…”
sudo /usr/sbin/brctl addif br0 $1
sleep 2
As you probably don’t want to execute QEMU as root, you need to create aqemu
user group and authorize the brctl and ifconfig commands for users of theqemu
viasudo
. You need to add the following lines to/etc/sudoers
(edit the file usingvisudo
):
…
Cmnd_Alias QEMU = /usr/sbin/brctl, /sbin/ifconfig
%qemu ALL=NOPASSWD: QEMU
Finally you can start your emulated machine using the following command
$ qemu-system-mips -M mips -kernel vmlinux-2.6.18-3-qemu -hda hda.img -append “root=/dev/hda1 console=ttyS0” -net nic,macaddr=00:16:3e:00:00:01 -net tap
You don’t need to give a MAC address if you are emulating only one machine, as QEMU will use a default one. However if you have more than one emulated machine (don’t forget QEMU can also emulate other architectures than MIPS), you will have to specify a unique MAC address for each machine. I advise you to select an address from the range 00:16:3e:xx:xx:xx, which has been assigned to Xen.
便捷的启动脚本 详见–> Building a Debian Stretch QEMU image for MIPSel
Debian doesn’t properly DHCP the Ethernet interface (get a wrong name for the interface), so it must be done manually at the first boot (use
ip -a
to show the interface name):You can now use the
# cat > /etc/network/interfaces << EOF
auto lo
iface lo inet loopback
iface enp0s18 inet dhcp
EOF
# shutdown -h now
start.sh
script to init the VM, andssh.sh
to SSH to it asuser
.
Thestart.sh
usually looks like!/bin/bash
KERNEL=./vmlinux-4.9.0-4-5kc-malta
INITRD=./initrd.img-4.9.0-4-5kc-malta
HDD=./disk.qcow2
SSH_PORT=22055
EXTRA_PORT=33055
qemu-system-mips64el -M malta -m 512 -cpu MIPS64R2-generic \
-kernel ${KERNEL} \
-initrd ${INITRD} \
-hda ${HDD} \
-net nic,model=e1000 \
-net user,hostfwd=tcp:127.0.0.1:${SSH_PORT}-:22,hostfwd=tcp:127.0.0.1:${EXTRA_PORT}-:4444 \
-display none -vga none -nographic \
-append 'nokaslr root=/dev/sda1 console=ttyS0'
exit 0
And thessh.sh
:!/bin/sh
echo "Existing users : 'root/root' & 'user/user'"
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22055 user@127.0.0.1 -- $*
exit 0
For Windows, simply convertscript.sh
to Batch.
参考资料
QEMU - Debian Wiki https://wiki.debian.org/QEMU
Building a Debian Stretch QEMU image for MIPSel - Blah Cats https://blahcat.github.io/2017/07/14/building-a-debian-stretch-qemu-image-for-mipsel/
Debian on an emulated MIPS(EL) machine https://www.aurel32.net/info/debian_mips_qemu.php
How to build a Debian MIPS image on QEMU https://markuta.com/how-to-build-a-mips-qemu-image-on-debian/