如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化

如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化

原文:How to Setup QEMU Output to Console and Automate Using Shell Script

Preface

While struggling to automate QEMU guest (communicate and control with the shell scripts), I faced with a lot of incomplete, partially working solutions around the internet. Now I’ve got a pretty decent collection of working recipes to tune up a QEMU guest, so I decided to organize all that stuff here, and it could be definitely useful for anyone else. Each scenario has been tested on the binaries, links on which I put below in the annex: Binaries used in examples, so you could check it out on your own.

Contents

  1. Input/output to the host terminal
  2. Early boot messages in the host terminal
  3. Input/output through a named pipe (file)
  4. Automate QEMU guest using expect tool
  5. Automate QEMU guest using ssh
  6. Binaries used in examples

  7. Input/output to the host terminal

-serial stdio

qemu-system-x86_64 -serial stdio wheezy.qcow2

如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化

-serial stdio redirects the virtual serial port to the host’s terminal input/output. You will see a welcome string after a successful boot.

-nographic

qemu-system-x86_64 -nographic wheezy.qcow2

如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化

-nographic does the same as “-serial stdio” and also hides a QEMU’s graphical window.

Cautions:

  1. You will not see any early boot logs in the host’s console. To get them, see Early boot messages in the host terminal below.

  2. To exit the guest system without GUI, using stdio redirected to the terminal, login as a root (user: root , password: root ) and shutdown the system (wait after that for a while):

Guest
shutdown -h now
  1. Early boot messages in the host terminal

console=ttyS0

If you want to see early boot logs, you should pass console=ttyS0 parameter to a Linux kernel command line:

qemu-system-x86_64 -nographic -kernel vmlinuz -hda wheezy.img -append "root=/dev/sda console=ttyS0"

or

qemu-system-x86_64 -serial stdio -kernel vmlinuz -hda wheezy.img -append "root=/dev/sda console=ttyS0"

or

qemu-system-x86_64 -serial stdio wheezy.qcow2
 # 1. Wait for a GRUB menu to show.

 # 2. Press e.

 # 3. Find the line starting with "linux".

 # 4. Add "console=ttyS0".

  • qemu-system-x86_64 -serial stdio -kernel vmlinuz -hda wheezy.img -append “root=/dev/sda console=ttyS0”*:

    如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化
  • -serial stdio or -nographic redirects input/output to the current terminal.

  • -append “root=/dev/sda console=ttyS0”: console=ttyS0 forces the guest kernel to send output to the first UART serial port ttyS0, which is redirected to the host by the -serial stdio option, and root=/dev/sda points the kernel to use a /dev/sda device to load the wheezy.img.

Other options:

  • -kernel vmlinuz loads the kernel from the local “./vmlinuz” file.

  • -hda wheezy.img is a raw image which is suitable for booting with vmlinuz binary (wheezy.qcow2 won’t be recognized in the block device).

  • Input/output through a named pipe (file)

Create a named pipe

mkfifo /tmp/guest.in /tmp/guest.out

Start QEMU

qemu-system-x86_64 -serial pipe:/tmp/guest -kernel vmlinuz -hda wheezy.img -append "root=/dev/sda console=ttyS0"

-serial pipe:/tmp/guest redirects a guest’s output to a /tmp/guest.out and allows to send input from host to guest via /tmp/guest.in.

Take an output from the guest

cat /tmp/guest.out

Send a command to the guest

When login screen appears, send a login string:

printf "root\n" > /tmp/guest.in

Wait until some string

Wait until SSH Daemon starts.

while read line; do
  echo "${line}"
  if [[ ${line} == *"Secure Shell server: sshd"* ]]; then
    break;
  fi
done < /tmp/quest.out
  1. Automate QEMU guest using expect tool

Install “expect” tool

sudo apt install expect

Create an expect script

example.exp:

#!/usr/bin/expect -f

Wait enough (forever) until a long-time boot
set timeout -1

Start the guest VM
spawn qemu-system-x86_64 -serial stdio wheezy.qcow2

expect "login: "
send "root\n"

expect "Password: "
send "root\n"

expect "# "
send "shutdown -h now"

Original script is found there:https://stacoverflow.com/questions/314613/qemu-guest-automation, but be careful, symbol of quotes ” (which is not a “) in the original stackoverflow answer cannot be recognized by the expect utility (send "root\n").

Execute “expect” script

chmod +x example.exp
./example.exp
  1. Automate QEMU guest using ssh

Set up port forwarding

qemu-system-x86_64 -netdev user,id=net0,hostfwd=tcp::10022-:22 -device e1000,netdev=net0 wheezy.qcow2

Connect via ssh

ssh root@localhost -p 10022 'uptime; ls; echo Test;'
  • To apply server’s public key automatically use
-o "StrictHostKeyChecking no"

:

ssh root@localhost -p 10022 -o "StrictHostKeyChecking no" 'uptime; ls; echo Test;'

Troubleshooting

  1. QEMU guest has to be able to recognize a network card device (NIC, Network Interface Card):
-netdev user,id=net0 -device e1000,netdev=net0

.

Without port forwarding
qemu-system-x86_64 -netdev user,id=net0 -device e1000,netdev=net0 wheezy.qcow2
  1. Boot and check that the new interface has appeared on the guest system:
Guest
ifconfig -a

Linux kernel on the guest must support a network card emulated by QEMU. In the opposite case the guest won’t get a new Ethernet interface. After booting you should find “eth0” (running broadcast device, not loopback) on the guest. It depends solely on the guest Linux kernel and on the kernel modules.

  1. Check the
10022

port on the host:

Host
netstat -tanp | grep 10022
   tcp  0  0 0.0.0.0:10022   0.0.0.0:*  LISTEN  16589/qemu-system-x
  1. Check the
22

port on the guest:

Guest
netstat -tanp | grep 22
    tcp  0  0 0.0.0.0:22      0.0.0.0:*  LISTEN  2430/sshd
  1. You can forward telnet port
23

and verify the connection:

qemu-system-x86_64 -netdev user,id=net0,hostfwd=tcp::10023-:23 -device e1000,netdev=net0 wheezy.qcow2
  1. Guest (server):
Guest
nc -v -l -p 23
    Listening on [0.0.0.0] (family 0, port 23)
  1. Host (client):
Host
echo asdf | nc localhost 10023

Establish passwordless login via ssh

  1. Generate host SSH keys:
Host
ssh-keygen -b 2048 -t rsa -q -N "" -f ./qemukey
  1. Set up a public key to the guest as a trusted (authorized) key.

  2. Via

ssh-copy-id
+ You need a root with password. You the guest root is passwordless, go to the guest system and set up the password:
Guest
sudo passwd
+ Send the generated public key:
Host
ssh-copy-id -p 10022 -i ~/.ssh/qemukey root@localhost
+ Reset the password in the guest system:
Guest
sudo passwd -l root
  1. Manually
    • Send a public key via
scp

:

Host
scp -P 10022 ./qemukey.pub root@localhost:/root/.ssh/
+ Login to the guest and set up new authorized key:
Guest
cat /root/.ssh/qemukey.pub >> /root/.ssh/authorized_keys
/etc/init.d/ssh restart
+ Or mount device locally, put the public key to the .ssh directory, and concatenate to authorized_keys.
  1. Fix the
/etc/ssh/sshd_config

on the guest:

PasswordAuthentication no
PermitRootLogin without-password
  1. Restart SSH daemon on the guest:
Guest
/etc/init.d/ssh restart
  1. Connect via ssh:
Host
ssh root@localhost -p 10022 -i ./qemukey

Viola! You don’t need the password and you can automate the remote QEMU guest.

Binaries used in the examples

  1. wheezy.qcow2 (i386) bootable Debian “Wheezy” image a QEMU copy-on-write format. Login/password: “root”/”root”, and “user”/”user”.
wget https://people.debian.org/~aurel32/qemu/i386/debian_wheezy_i386_standard.qcow2 -O wheezy.qcow2
  1. wheezy.img (i386) non-bootable Debian “Wheezy” image (without kernel) to use with own kernel (-kernel vmlinuz ).
wget https://storage.googleapis.com/syzkaller/wheezy.img
  1. vmlinuz (i386) compressed bootable Linux kernel. Options:
  2. Build from the scratch: Build Android Kernel and Run on QEMU with Minimal Environment: Step by Step.

  3. Download from Ubuntu repository ( WARNING! Port forwarding will NOT work):

wget http://security.ubuntu.com/ubuntu/pool/main/l/linux-signed-azure/linux-image-4.15.0-1036-azure_4.15.0-1036.38~14.04.2_amd64.deb
ar x linux-image-4.15.0-1036-azure_4.15.0-1036.38~14.04.2_amd64.deb
tar xf data.tar.xz ./boot/vmlinuz-4.15.0-1036-azure
cp ./boot/vmlinuz-4.15.0-1036-azure ./vmlinuz
  1. You can try your host’s linux kernel passing one to the QEMU guest ( WARNING! You could have problems either with port forwarding, or with a block device):

bash
sudo cp /boot/vmlinuz-$(uname -r) ./
WARNING! Ubuntu’s vmlinuz doesn’t contain drivers for QEMU emulated network card devices (NIC). Debian’s vmlinuz doesn’t have prebuilt drivers to load a raw image from /dev/sda device.

Original: https://www.cnblogs.com/schips/p/15489856.html
Author: schips
Title: 如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529530/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java常见知识点总结

    1 重载 && 重写 重载: 发生在同一个类中, 方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。 重写: 发生在父…

    Linux 2023年6月7日
    0120
  • IDEA对数据库、表、记录的(增删改查可视化操作)、数据库安全性问题的演示

    演示脏读 一个事物里面读到了另外一个事物没有提交的数据: read uncommitted 1.开启A,B窗口 2.分别查询A,B的隔离级别 select @@tx_isolati…

    Linux 2023年6月6日
    0125
  • 修改shell命令提示符和命令的输入颜色

    修改命令提示符颜色 修改命令提示符的话,只需修改PS1环境变量即可。 PS1=’\[\033[01;31m\][\u@\h \W]$ \[\033[00m\]’ 效果如图: 修改命…

    Linux 2023年5月28日
    0118
  • shell脚本执行错误:#!/bin/bash: No such file or directory

    1、问题描述: 执行.sh脚本时控制台报错 : #!/bin/bash: No such file or directory 2、解决办法: cat -A 文件路径 会发现第一行有…

    Linux 2023年5月28日
    0297
  • shell编程学习

    在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。 ! 告诉系…

    Linux 2023年5月28日
    0122
  • python3安装pyhook3遇到的问题

    一、 解决办法:安装好:使用C++的桌面开发即可完成。 打开官方网址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft….

    Linux 2023年6月13日
    0131
  • 网络安全中常用浏览器插件、拓展

    引言 现在的火狐、Edge( Chromium内核)、Chrome等浏览器带有插件、拓展(Plugin)的功能。这些插件中有的可以过滤广告,有的提供便捷的翻译,有的提供JavaSc…

    Linux 2023年6月6日
    0121
  • 节约内存:Instagram的Redis实践(转)

    1.M emcached 内存Key-Value Cache Redis 内存数据库 四,节约内存:Instagram的Redis实践 Instagram可以说是网拍App的始祖级…

    Linux 2023年5月28日
    0120
  • Linux 系统安全加固经验总结

    本文为博主原创,转载请注明出处: 1. 禁止root密码登录 修改 /etc/ssh/sshd_config 中 允许root 用户登录 PermitRootLogin 的值改为 …

    Linux 2023年6月14日
    0122
  • cpp-base

    1.cin&cout 2.两种注释方式 //注释方法1,’//’。用于单行注释 /* 注释方法2, 用于多行注释 */ &#x7279;&#x522B;&a…

    Linux 2023年6月7日
    0130
  • CentOS 7.6 安装 MySQL-5.7.31(RPM方式安装)

    准备工作: 注:5.7.31版本安装步骤及初始化和之前版本有较大区别 CentOS 7.6 系统: 带GUI的服务器 默认安装 MySQL 5.7.31 安装包: 1.RPM安装包…

    Linux 2023年6月8日
    098
  • Kafka部署安装及简单使用

    一、环境准备 1、jdk 8+ 2、zookeeper 3、kafka 说明:在kafka较新版本中已经集成了zookeeper,所以不用单独安装zookeeper,只需要在kaf…

    Linux 2023年6月13日
    0137
  • PostgreSQL实战技能全解

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Willoneday/p/16572876.htmlAu…

    Linux 2023年6月7日
    0115
  • neovim环境与vim简单使用

    Github仓库 neovim的配置 这里列出我自己使用的 init.vim,如果插件无法安装,请按照github仓库中给出的解决方法解决(手动clone安装即可)。参考了gith…

    Linux 2023年6月8日
    0128
  • CentOS7下安装mysql8.0.25

    一、mysql的rpm包准备 官网下载完整rpm包 解压后有多个rpm包, 挑选如下图的5个rpm包上传至linux 二、使用rpm -ivh安装rpm包 按如下安装顺序依次安装 …

    Linux 2023年6月6日
    0152
  • 2020年12月-第02阶段-前端基础-CSS Day05

    CSS Day05 学成在线页面制作 理解 能够说写单页面我们基本的流程能说出常见的css初始化语句能说出我们CSS属性书写顺序 应用 能利用ps切图能引入外部样式表能把psd文件…

    Linux 2023年6月8日
    0139
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球