If you want to run unmodified TOS or TOS4/TOS5, check out https://github.com/jose1711/qemu_turrisos
The goal of this guide is to show how you can run (slightly modified) clone of your existing installation of Turris OS (TOS) inside QEMU emulator. This may serve as a platform for testing upgrades before you do it on your production router etc. Of course one cannot expect full feature set as QEMU is unable to emulate all the features of hardware or for instance connected USB devices. In order to make things easier we'll only use two network interfaces:
eth0
- „wan“ - dhcp from range 10.x.x.x/24
(assigned by QEMU)eth1
- lan - static IP 192.168.123.1
install qemu
(you'll need qemu-system-arm
)
distribution-specific (e. g. apt install qemu)
enable packet forwarding in firewall
sudo iptables -P FORWARD ACCEPT # you may have to adjust (or maybe temporarily disable) firewall
create directory containing kernel and rootfs
mkdir -p ~/omnia-qemu/root
get 32-bit arm kernel from OpenWrt (the original one from TOS did not work)
curl -o ~/omnia-qemu/zImage https://downloads.openwrt.org/snapshots/targets/armvirt/32/openwrt-armvirt-32-zImage
copy start_omnia.sh
script into ~/omnia-qemu
#!/bin/sh LAN=ledetap0 KERNEL=zImage # enable ip forwarding fwd_orig=$(sysctl net.ipv4.ip_forward | awk '{print $NF}') sysctl net.ipv4.ip_forward=1 # create tap interface which will be connected to OpenWrt LAN NIC ip tuntap add mode tap $LAN ip link set dev $LAN up ip addr add 192.168.123.100/24 dev $LAN qemu-system-arm \ -nographic -M virt -kernel "${KERNEL}" -m 512 -no-reboot \ -fsdev local,id=rootdev,path=root,security_model=none \ -device virtio-9p-pci,fsdev=rootdev,mount_tag=/dev/root \ -append 'rootflags=trans=virtio,version=9p2000.L,cache=loose rootfstype=9p' \ -nic user \ -device virtio-net-pci,netdev=lan \ -netdev tap,id=lan,ifname=$LAN,script=no,downscript=no \ # cleanup. delete tap interface created earlier ip addr flush dev $LAN ip link set dev $LAN down ip tuntap del mode tap dev $LAN sysctl net.ipv4.ip_forward=${fwd_orig}
make a snapshot of the current system and export it to device (path) with enough free space
schnapps export /some/path
this will put omnia-medkit-XXXXXXXX.tar.gz
file into /some/path
directory. All the following commands are to be executed on your PC.
Transfer and extract the archive to your PC
ssh omnia 'cat /some/path/omnia-medkit-XXXXXXXX.tar.gz' | ( cd ~/omnia-qemu/root; tar xvzf -; )
append the following line into root/etc/inittab
:
ttyAMA0::askfirst:/bin/ash --login
reconfigure network interfaces in root/etc/config/network
:
config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config interface 'wan' option ifname 'eth0' option ipv6 '1' option dns '8.8.8.8 8.8.4.4' option proto 'dhcp' config interface 'wan6' option ifname '@wan' option proto 'dhcpv6' config interface 'lan' option proto 'static' option ipaddr '192.168.123.1' option netmask '255.255.255.0' option ifname 'eth1'
overwrite root/usr/bin/crypto-wrapper
with the following contents:
#!/bin/sh echo 0000000000000000 exit
edit root/etc/init.d/start-indicator
in the following manner:
start() { .. # don't change and/or delete any lines # only add this somewhere into the start() block echo 'Turris Omnia' > /tmp/sysinfo/model }
Optional step: disable services (option enabled '0'
) which you don't really need inside virtualized system:
root/etc/config/ddns
root/etc/config/hd-idle
root/etc/config/minidlna
root/etc/config/mjpg-streamer
root/etc/config/openvpn
execute qemu
as root
cd ~/omnia_qemu sudo ./start_omnia.sh
Hit Enter to activate console and wait for Router Turris successfully started.
message.
Check, whether the following commands all work:
/sbin/ifstatus wan # should return json cat /tmp/sysinfo/model # should return 'Turris Omnia' string ls -l /tmp/run/foris-controller-client.sock # should return name and file attributes # if not, run /etc/init.d/foris-controller start and give it some moments
Open https://192.168.123.1/ in your browser and log-in to Luci or Foris (may need certificate exception).
iptables
)schnapps
and everything related to btrfs
(virtualized system is using 9p
-type filesystem)'FileNotFoundError: [Errno 2] No such file or directory: '/sys/firmware/devicetree/base/model' 'No such file or directory: '/proc/net/nf_conntrack'
inside guest system:
reboot
qemu
will terminate, ledetap0
interface will be removed and ipv4 forwarding will be set to the original state.
These instructions are based on https://openwrt.org/docs/guide-user/virtualization/qemu and were successfully tested with TOS 3, host system was x86_64 running Arch Linux.