• socat


    root@(none):/# host_vsock_addr=x00x00x14x14x00x00x02x00x00x00x00x00x00x00
    root@(none):/# socat -u "fd:3" "socket-connect:40:0:${host_vsock_addr}"
    2020/12/09 08:17:30 socat[41] E connect(5, AF=40 AF=40 0x0000141400000200000000000000, 16): No such device
    root@(none):/# 
    docker: Error response from daemon: OCI runtime create failed: failed to launch qemu: exit status 1, error messages from qemu log: qemu-system-aarch64:
    -device vhost-vsock-pci,disable-modern=false,vhostfd=3,id=vsock-1072880509,guest-cid=1072880509,romfile=: device is modern-only, use disable-legacy=on: unknown.
    qemu-system-aarch64要加patch
    qemu-system-aarch64: -device vhost-vsock-pci,disable-modern=false,vhostfd=3,id=vsock-1072880509,guest-cid=1072880509: vhost_set_owner failed: Inappropriate ioctl for device (25)
    qemu-system-aarch64: -device vhost-vsock-pci,disable-modern=false,vhostfd=3,id=vsock-1072880509,guest-cid=1072880509: vhost-vsock: vhost_dev_init failed: Operation not permitted

    Simple vsock setup for QEMU

    Configuration

    Host Kernel: rawhide 4.13.0-0.rc6.git4.2.fc28.x86_64 (on Fedora 24)

    QEMU is mainline built from sources: QEMU emulator version 2.10.50 (v2.10.0-105-g223cd0e)

    Guest: clear-17460-kvm.img (which has vsock support)

    Launching the VM

    First install the vsock driver

    modprobe vhost_vsock
    

    Launch QEMU

    export VMN=3
    export IMAGE=clear-17460-kvm.img
    /usr/local/bin/qemu-system-x86_64 
        -device vhost-vsock-pci,id=vhost-vsock-pci0,guest-cid=${VMN} 
        -enable-kvm 
        -bios OVMF.fd 
        -smp sockets=1,cpus=4,cores=2 -cpu host 
        -m 1024 
        -vga none -nographic 
        -drive file="$IMAGE",if=virtio,aio=threads,format=raw 
        -netdev user,id=mynet0,hostfwd=tcp::${VMN}0022-:22,hostfwd=tcp::${VMN}2375-:2375 
        -device virtio-net-pci,netdev=mynet0 
        -debugcon file:debug.log -global isa-debugcon.iobase=0x402 $@
    

    How test the vsock connection using socat

    Here the CID of the VM is set to 3 and the port set to 1024

    In the VM

    socat - SOCKET-LISTEN:40:0:x00x00x00x04x00x00x03x00x00x00x00x00x00x00
    Note: CID = 3
    

    On the host

    sudo socat - SOCKET-CONNECT:40:0:x00x00x00x04x00x00x03x00x00x00x00x00x00x00
    

    Minimal console over vsock using socat

    VM: Without auth:

    socat SOCKET-LISTEN:40:0:x00x00x00x04x00x00x03x00x00x00x00x00x00x00,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane,ctty,echo=0 
    

    With auth:

    socat SOCKET-LISTEN:40:0:x00x00x00x04x00x00x03x00x00x00x00x00x00x00,reuseaddr,fork EXEC:login,pty,stderr,setsid,sigint,sane,ctty,echo=0
    

    On the host

    socat - SOCKET-CONNECT:40:0:x00x00x00x04x00x00x03x00x00x00x00x00x00x00
    

    ssh over vsock using socat

    VM:

    socat SOCKET-LISTEN:40:0:x0000xFFxFFx0000x03x00000000000000,reuseaddr,fork TCP:localhost:22
    

    VMM:

    sudo socat TCP4-LISTEN:2222,reuseaddr,fork SOCKET-CONNECT:40:0:x0000xFFxFFx0000x03x00000000000000
    

    Now you can ssh into the VM from the host on port 2222

    ssh root@localhost -p 2222
    

    Using specific ports

    socat does not support vsock right now, so you will need to use the generic socket address option to interact with it http://www.dest-unreach.org/socat/doc/socat-genericsocket.html

    To generate the appropriate generic socket option you can use this simple C program

    #include <sys/socket.h>
    #include <linux/vm_sockets.h>
    #include <stdio.h>
    #include <string.h>
    
    #define GUEST_CID 3
    
    int main(void)
    {
            int i;
            char buf[16];
            struct sockaddr_vm sa = {
                                .svm_family = AF_VSOCK,
                                .svm_cid = GUEST_CID, 
                                .svm_port = 1024,
                           };
    
            printf("VM:
    ");
            memcpy(buf, &sa, sizeof(sa));
            for(i=2;i<sizeof(sa);i++) {
                    printf("x%02x", (unsigned char)buf[i]);
            }
            printf("
    ");
            
            sa.svm_cid = 2;
    
            printf("VMM:
    ");
            memcpy(buf, &sa, sizeof(sa));
            for(i=2;i<sizeof(sa);i++) {
                    printf("x%02x", (unsigned char)buf[i]);
            }
            printf("
    ");       
    }
    
    

    Testing with a go program

    Testing with: https://github.com/mdlayher/vsock/tree/master/cmd/vscp

    On the host you run: vscp -v -r -p 1024 cpuinfo.txt

    On the guest: vscp -v -s -c 2 -p 1024 /proc/cpuinfo

    And you will see the file contents show up

  • 相关阅读:
    git版本库管理介绍,撤销git pull操作
    【laravel5.4】自定义404、503等页面
    【laravel5.4】{{$name}}、{{name}}、@{{$name}} 和 @{{name}} 的区别
    python 了解一点属性的延迟计算
    python 了解一下__dict__
    excel怎么把一个sheet的 全部内容打印到一页纸上
    python 简单了解一下 描述器
    python 调用父类方法, 重写父类构造方法, 不显式调用,会报错
    Python 今天抽空学习了@Property
    python 语法糖是什么意思
  • 原文地址:https://www.cnblogs.com/dream397/p/14109328.html
Copyright © 2020-2023  润新知