远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

    • [1. 准备](#1. 准备)
    • [2. QEMU启动安装Ubuntu](#2. QEMU启动安装Ubuntu)
      • [2.1 服务器端](#2.1 服务器端)
      • [2.2 本地端](#2.2 本地端)
    • [3. 从服务器终端控制虚拟机GRUB与虚拟机终端](#3. 从服务器终端控制虚拟机GRUB与虚拟机终端)

这段时间参与大量内核切换测试工作,实体机需要硬件自检太过笨重,因此主要通过QEMU验证正确性。有一个很大的问题是QEMU运行起来后终端看不到系统的状态,只能通过VNC连接,这无疑是比较低效的方法。更为重要的是,QEMU搭载在远程服务器上。下面介绍本人的最佳实践。

1. 准备

  • 远程服务器:(ip) a.b.c.d
    • QEMU
    • Ubuntu镜像
  • 本地机器
    • ssh
    • VNCViewer

2. QEMU启动安装Ubuntu

2.1 服务器端

shell 复制代码
OS_IMG=./ubuntu20.img
qemu-system-x86_64 
	-m 4G\
	-hda ${OS_IMG} \
	-enable-kvm \
	-cpu host \
	-device e1000,netdev=net \
	-netdev user,id=net,hostfwd=tcp::2333-:22 \
	-smp cpus=20 \
	-serial stdio \
	-vnc :2
  • -netdev ... hostfwd=tcp::2333-:22:此时a.b.c.d:2333端口被转发到虚拟Ubuntu的22端口,意味着可以通过ssh a.b.c.d:2333连接虚拟机。不过需要虚拟机上安装openssh
  • -serial stdio:虚拟机的串口使用服务器的标准输出(也就是能够在终端显示)
  • -vnc :2:暴露VNC口a.b.c.d:5902

2.2 本地端

此时只能使用VNC连接安装,如何快速连接远端VNC口呢?参考

总的来说,首先在本地建立起 ssh隧道

shell 复制代码
ssh -L 5902:localhost:5902 username@a.b.c.d

这代表本地端的5902端口与a.b.c.d:5902建立起了一条隧道,将本地机的5902端口转发到远端机器的5902端口

然后打开VNCReviewer,连接localhost:5902即可

3. 从服务器终端控制虚拟机GRUB与虚拟机终端

安装完毕后,重新运行QEMU,终端上仍然在等待VNC连接,没有任何输出。参考

远程连接虚拟机

shell 复制代码
ssh username@a.b.c.d -p 2333

修改虚拟机配置/etc/default/grub如下:

shell 复制代码
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=saved
# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL="serial"

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

关键点如下:

  • GRUB_TERMINAL="serial",GRUB的输出通过串口输出
  • GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8" :Ubuntu Linux的输出通过串口输出

sudo reboot后就能够在服务器终端上看到GRUB菜单以及Ubuntu的输出信息,然后就可以彻底抛弃VNC了。


OK,从现在开始就可以起飞了🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫

相关推荐
拾忆,想起22 分钟前
Dubbo服务调用流程全解析:从请求到响应的微服务通信之旅
服务器·网络·微服务·云原生·架构·dubbo
回忆是昨天里的海35 分钟前
docker存储-目录挂载
运维·docker·容器
永不停歇的蜗牛1 小时前
Maven的POM文件相关标签作用
服务器·前端·maven
爱吃萝卜的美羊羊1 小时前
ubuntu下国内升级ollama
linux·运维·ubuntu
Erwin Rommel5591 小时前
nginx的https服务搭建实验
服务器·nginx·https
mzhan0171 小时前
Linux: console: printk: console_no_auto_verbose
linux·运维·服务器
用什么都重名1 小时前
Docker 镜像源配置指南
运维·docker·容器
河南博为智能科技有限公司1 小时前
高集成度国产八串口联网服务器:工业级多设备联网解决方案
大数据·运维·服务器·数据库·人工智能·物联网
Savvy..1 小时前
天机学堂-Day01
linux·服务器·网络
HIT_Weston2 小时前
47、【Ubuntu】【Gitlab】拉出内网 Web 服务:Nginx 事件驱动分析(一)
前端·ubuntu·gitlab