• pedro
    置顶
    2021-08-16
    以我所在的腾讯云为例。 腾讯云服务器 CVM 支持用户自定义一切资源:CPU、内存、硬盘、网络、安全等,并可以在需求发生变化时轻松地调整它们,还支持随时扩容,迁移,运维等管理功能。 一个成熟的IAAS平台搭建起来不容易啊,要考虑的事情太多了。

    作者回复: 如果只是在一台物理机上开启多个虚拟机KVM确实已经做的很棒了,但是如果我们扩展到多个机架、多个机房,问题就变得更加复杂了。我们除了要考虑之前讲过的网络问题,好需要考虑分布式环境下的计算、存储、消息传输、状态同步、动态迁移、扩缩容、镜像、身份认证、编排与调度、UI管理面板等很多问题。当然,业界也有一些开源解决方案,比如大名鼎鼎的OpenStack,不过笔者觉得OpenStack由于设计实现的比较早,所以存在集群规模有限、部署、维护、二次开发复杂度高、历史包袱重等问题,所以和多位架构师沟通交流之后我们正在尝试重新设计并实现一套更现代化的轻量级的IAAS云平台,感兴趣的同学可以加入群多多交流。

    共 4 条评论
    9
  • 苏流郁宓
    置顶
    2021-08-16
    装虚拟机出现过ghost系统(如win系统ghost版),在VM虚拟机上面识别不了,需要装原版官网下载的非ghost版本才安装成功,以及AMD的cpu装苹果系统也没成功,故认为开发虚拟机系统(如VM),需要对厂家的cpu指令以及各系统的启动流程有一定的了解。如此才好“欺骗”,虚拟机安装系统失败的很大部分原因是没找对原版系统,也就是修改过的系统启动流程和虚拟机表中的流程不完全一致,识别不了。 故,认为开发虚拟机可以单独做一个启动表(允许修改),还有就是扫描表,就是在安装系统前对要装的系统进行扫描,识别不了的东西也显示出来,方便用户网上查询和修改参数,而不是猜。还有就是文件格式的识别需要改进,iso或者dmg都能识别最好,这样覆盖的厂家更多! 还可以设计一种网络虚拟机,就是虚拟机装在A电脑上,但是用户在B电脑上,用户的操作通过平台翻译成标准信息输出,然后传送到A电脑上,这样就不用考虑用户在B电脑(手机)用的是什么系统,硬件性能如何。只要他能联网就行,这样可以在A电脑上允许多个用户分时间操作,更能利用好资源。

    作者回复: 66666

    共 2 条评论
    2
  • neohope
    2021-08-24
    二、下半部分 5、在调用ioctl时 SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ->vfs_ioctl,会用到vfs_ioctl.unlocked_ioctl也就是kvm_vm_ioctl kvm_vm_ioctl->kvm_vm_ioctl_create_vcpu ->kvm_arch_vcpu_precreate ->kvm_vcpu_init ->kvm_arch_vcpu_create ->kvm_get_kvm ->create_vcpu_fd,生成设备文件inode ->kvm_arch_vcpu_postcreate 其中,kvm_arch_vcpu_create ->kvm_mmu_create ->vcpu->arch.user_fpu = kmem_cache_zalloc(x86_fpu_cache, GFP_KERNEL_ACCOUNT); ->kvm_pmu_init(vcpu); ->kvm_hv_vcpu_init(vcpu); ->kvm_x86_ops.vcpu_create(vcpu); ->kvm_vcpu_mtrr_init(vcpu); ->vcpu_load(vcpu); ->kvm_vcpu_reset(vcpu, false); ->kvm_init_mmu(vcpu, false); //包括init_kvm_tdp_mmu和init_kvm_softmmu两种虚拟化方式 6、启动虚拟机,还是文件操作 static struct file_operations kvm_vcpu_fops = { .release = kvm_vcpu_release, .unlocked_ioctl = kvm_vcpu_ioctl, .mmap = kvm_vcpu_mmap, .llseek = noop_llseek, KVM_COMPAT(kvm_vcpu_compat_ioctl), }; 7、在调用ioctl时KVM_RUN SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ->vfs_ioctl,会用到vfs_ioctl.unlocked_ioctl也就是kvm_vcpu_ioctl kvm_vcpu_ioctl-> case KVM_RUN: kvm_arch_vcpu_ioctl_run 其中,kvm_arch_vcpu_ioctl_run->vcpu_run->vcpu_enter_guest 8、IO同样有虚拟化和半虚拟化两种,一个处理函数为kvm_fast_pio,另一个为kvm_emulate_instruction
    展开

    作者回复: 老哥对KVM也有研究啊

    
    5
  • neohope
    2021-08-24
    一、上半部分 1、内核模块初始化 module_init(vmx_init)->kvm_init module_init(svm_init)->kvm_init 其中,kvm_init ->kvm_arch_init ->kvm_irqfd_init ->kvm_arch_hardware_setup ->misc_register(&kvm_dev) 2、从数据结构角度,又可以看到了设备皆为文件的思想 static struct miscdevice kvm_dev = { KVM_MINOR, "kvm", &kvm_chardev_ops, }; static struct file_operations kvm_chardev_ops = { .unlocked_ioctl = kvm_dev_ioctl, .llseek = noop_llseek, KVM_COMPAT(kvm_dev_ioctl), }; 通过misc_register,实现了操作的绑定。 3、通过上面的数据结构,我们就可以找到创建虚拟机的方法,并生成控制文件 kvm_dev.kvm_chardev_ops.kvm_dev_ioctl ioctl系统调用KVM_CREATE_VM,效果也是一样的: SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ->vfs_ioctl,会用到vfs_ioctl.unlocked_ioctl也就是kvm_dev_ioctl ->case KVM_CREATE_VM: -> r = kvm_dev_ioctl_create_vm(arg); ->file = anon_inode_getfile("kvm-vm", &kvm_vm_fops, kvm, O_RDWR); 其中,kvm_dev_ioctl_create_vm ->kvm_create_vm ->->kvm_arch_init_vm ->->hardware_enable_all ->->kvm_arch_post_init_vm ->->list_add(&kvm->vm_list, &vm_list); 4、生成虚拟CPU套路很相似,仍是文件操作 static struct file_operations kvm_vm_fops = { .release = kvm_vm_release, .unlocked_ioctl = kvm_vm_ioctl, .llseek = noop_llseek, KVM_COMPAT(kvm_vm_compat_ioctl), }; 创建虚拟机时,anon_inode_getfile("kvm-vm", &kvm_vm_fops, kvm, O_RDWR),实际上就把文件和kvm_vm_fops绑定了起来。
    展开

    作者回复: 是的 6666

    
    3
  • 吴建平
    2022-08-29 来自湖北
    文中用到的kvm的源码,是linux的么,哪个版本的,或者去哪里可以下载到对应源码

    作者回复: 对 kvm直接 是在Linux内核中的

    
    
  • 西门吹牛
    2022-07-08
    老师,JVM 属于软虚拟还是硬虚拟?

    作者回复: 不用Jit的JVM是软虚拟

    
    
  • ifelse
    2022-02-27
    秀啊

    作者回复: 哈哈

    
    
  • 云师兄
    2021-09-08
    软硬结合才是虚拟化的关键啊!

    作者回复: 是的 是的

    
    
  • springXu
    2021-08-16
    这课的例子和内容相当精彩,还是意犹未尽呀。由于虚拟化知识欠缺了,想问还有后续不?

    作者回复: 暂时没有 可能加餐

    
    