如何使用 QEMU 中的虚拟串口
如何使用?QEMU?中的虛擬串口[轉]_yanglin_新浪博客如何使用?QEMU?中的虛擬串口[轉]_yanglin_新浪博客,yanglin,http://blog.sina.com.cn/s/blog_a1e6528101019xmm.html
QEMU 具有模擬?串口?和?并口?的能力, 在 QEMU 的命令行接口, 提供了 -serial 參數供用戶設置把虛擬的串口重定向到哪里.
本文檔主要介紹如何使用這個虛擬串口, 接下來會從代碼方面描述 QEMU 如何模擬 一個串口.
不使用串口
$ qemu-kvm ArchLinux.img?-serial?none不管是 Linxu 還是 Window, 在 QEMU 里面禁用了串口, 但是用一些硬件檢測 工具還是能檢測到串口的存在. 用一段簡單的代碼來檢測是否串口可以使用
#!/usr/bin/python?import?serial?try: s = serial.Serial('/dev/ttyS0')?print?"Find serial port on /dev/ttyS0"?except:?print?"Cant found serial port on /dev/ttyS0"重定向到虛擬控制臺
$ qemu-kvm ArchLinux.img?-serial?vc:800x600?# 或者 vc:80Cx24C實際上, 默認 啟動 QEMU 的時候如果不加參數的話, 會自動創建四個控制臺, 分別用 Ctrl + Alt + number 來切換, number 為 1, 2 或 3, 4 其中 1 是 QEMU 的圖形終端, 2 是 QEMU 的 Monitor 終端(QEMU 的 Monitor 稍候會介紹), 3 是 Serial 終端, 4 是并口終端.
重定向到一個偽終端
$ qemu-kvm ArchLinux.img?-serial?pty然后會發生什么呢? QEMU 會自動創建一個偽終端設備(/dev/pts/3) 之類的, 然后 用 screen 之類的工具就可以操縱這個終端了.
PS. 這東西 Linux only 喲
重定向到 null
$ qemu-kvm ArchLinux.img?-serial?null這和重定向到 none 有什么區別呢? 區別就是 -> none QEMU 不會虛擬串口設備, 但是 -> null 會虛擬一個串口設備, 丟棄所有的輸出: 如以下的代碼. 至于輸入? 需要輸入嗎?
static?int?null_chr_write(CharDriverState?*chr,?const?uint8_t?*buf,?int?len)?{?return?len;?}重定向要真實串口設備
$ qemu-kvm ArchLinux.img?-serial?/dev/ttyS0但是虛擬串口的硬件參數需要和真實串口符合
PS. Linux only 喲
重定向到并口
$ qemu-kvm ArchLinux.img?-serial?/dev/parportN重定向到第 N 個并口
PS. Linux only 喲
重定向到一個文件
$ qemu-kvm ArchLinux.img?-serial?file:/tmp/serial.out不過從打開文件的方式看來, QEMU 只是把串口的輸出寫入文件, 而并不支持串口的 輸入.
TFR(fd_out?=?qemu_open(qemu_opt_get(opts,?"path"),?O_WRONLY?|?O_TRUNC?|?O_CREAT?|?O_BINARY,?0666));重定向到 stdio
$ qemu-kvm ArchLinux.img?-serial?stdio把串口重定向到標準輸入輸出, 這給調試 Guest OS(其實我說的是 Linux OS, 你要調試 Window OS? 你吃飽了撐的?)提供了方便.
重定向到管道
$ qemu-kvm ArchLinux.img?-serial?pipe:/tmp/serial:不過這玩意還比上面的復雜, 根據 QEMU 打開這類設備的代碼, 需要手動創建 /tmp/serial.in 和 /tmp/serial.out 兩個管道文件
snprintf(filename_in,?256,?"%s.in",?filename);?snprintf(filename_out,?256,?"%s.out",?filename);?TFR(fd_in?=?qemu_open(filename_in,?O_RDWR?|?O_BINARY));?TFR(fd_out?=?qemu_open(filename_out,?O_RDWR?|?O_BINARY)); $?mkdir?fifo?/tmp/serial.in $?mkdir?fifo?/tmp/serial.out怎么使用呢? cat /tmp/serial.out 會看到 Linux 登錄的一堆信息, 最后停在?virt-debian login:?這里等待輸入, 用
$?echo?your_username?>>?/tmp/serial.in $?echo?your_password?>>?/tmp/serial.in再打開 cat /tmp/serial.p.out 就可以看到內容已經變成?root@virt-debian:~#?這樣的東西了.
所以這玩意對我用處不大
重定向到 udp 端口
$ qemu-kvm ArchLinux.img?-serial?udp::3333將 QEMU 的串口重定向到 3333 端口, 使用 nc 訪問這個端口 (當然可以自己編寫 socket 訪問). 這對遠程管理很有幫助
$ nc?-u?-l?-p?3333重定向到 tcp 端口
$ qemu-kvm ArchLinux.img?-serial?tcp::3333,server,nowait可以使用 telnet 來訪問該端口
$ telnet localhost?3333重定向到 telnet
幾乎 TCP 是一樣的
$ qemu-kvm ArchLinux.img?-serial?telnet::3333,server,nowait重定向到 Unix socket
$ qemu-kvm ArchLinux.img?-serial?unix:/tmp/serial.sock,server,nowait用 socat 連接
$ socat?/tmp/serial.sock STDIO同時定向到串口和 mon 控制臺
$ qemu-kvm ArchLinux.img?-serial?mon:telnet::3333,server,nowait這將同時定向串口到 TCP 3333 端口的同時, 可以使用 Ctrl + a 然后按 c 訪問 Monitor 終端
定向到 braille
這個太強大了, 相關 google braille
msmouse
重來沒有使用過
總結
以上是生活随笔為你收集整理的如何使用 QEMU 中的虚拟串口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深圳云计算培训:怎么样学习云计算相关技术
- 下一篇: 2019年 Android 开源框架 排