Resumo da tecnologia de virtualização do kernel Linux KVM e breve análise da tecnologia de contêiner Docker (tomando a arquitetura x86 como exemplo)


Os componentes básicos de um sistema operacional moderno de código aberto:

Função endereço do link
Gerenciamento de arquivos e gerenciamento de dispositivos Sistema de arquivos virtual (sistema de arquivos sem armazenamento persistente), tomando proc e sysfs como exemplos
Gerenciamento de memória Princípios de gerenciamento de memória de sistemas operacionais modernos: tomando Linux2.6.xx como exemplo
Princípio de inicialização do sistema Análise aprofundada do código-fonte da arquitetura Arm Linux 2.6.4.30 - com base na "análise de código-fonte do kernel Linux ARM"
espaço de endereço virtual O que é um espaço de endereço virtual? Explicado de uma perspectiva arquitetônica
link dinâmico Um longo artigo conduz você por todo o processo de vinculação dinâmica do Linux

No artigo anterior: Manual do desenvolvedor de software das arquiteturas Intel® 64 e IA-32, você pode ver Intelque a tecnologia de virtualização ainda é muito importante, portanto, este artigo usa a plataforma Linux para resumir a tecnologia de virtualização.

A diferença entre tecnologia de virtualização e tecnologia de contêiner: uma breve discussão sobre os princípios da tecnologia de virtualização de kernel KVM e da tecnologia de contêiner Docker?

Próximo artigo: Princípios e soluções de sistemas multi-core

A virtualização é dividida principalmente nas seguintes partes: CPUvirtualização, virtualização de memória, virtualização de interrupção e virtualização de dispositivos. Entre elas, a virtualização de memória e a virtualização de interrupção pertencem a tecnologias de virtualização de software, enquanto a CPUvirtualização e a virtualização de dispositivos pertencem a tecnologias de virtualização de hardware, especialmente a virtualização de dispositivos, que não é muito diferente dos dispositivos reais.

Tecnologia VT-d

Virtualização de CPU

Combinado com Intela tecnologia de virtualização do manual

Modelo de armadilha e simulação ( Trap and Emulate) : Tanto o programa do usuário quanto o kernel da máquina virtual são executados no modo de usuário (geralmente, o programa do usuário é executado no modo de usuário e o kernel é executado no modo de sistema). Isso é chamado de compactação de nível de privilégio (). Neste caso Ring CompressionNeste modo, o tratamento de nível não privilegiado da máquina virtual é executado diretamente no processador. Quando uma instrução de nível privilegiado é executada, a exceção do processador será acionada e presa no VMM, e a máquina virtual proxy será VMMconcluída o acesso aos recursos do sistema.

Posteriormente, Intelforam desenvolvidas tecnologias VTpara suportar a virtualização, como CPUfoi adicionado VMX, viz Virtual-Machine Extension. CPUDois modos de operação são fornecidos neste momento : VMX Root Modee VMX non-Root Mode, cada um deles é suportado ring0-ring3. VMMA execução em VMX Root Mode, exceto suporte VMX, VMX Root Modenão é essencialmente diferente do modo normal. VMCorrendo VMX non-Root Mode, Guest kernelcorrendo . VMX non-Root Mode_ring0

VTÉ tecnicamente uma função do processador, então não se preocupe com os detalhes.

Insira a descrição da imagem aqui
Você VMX Root Modepode mudar para ele VMMexecutando CPUas instruções de virtualização fornecidas . Como esse processo é equivalente a entrar , muitas vezes também é chamado . Quando a execução interna de instruções sensíveis à força, como certas operações, irá desencadear uma ação presa, esse processo é equivalente a exit , por isso é chamado . Em seguida, simule a operação.VMLaunchVMX non-Root ModeGuestVM entryGuestI/OCPUVMVM exitVMMGuest

Assim como uma pessoa CPUpode executar diversas tarefas em tempo compartilhado, cada personagem tem seu próprio contexto, e o contexto é alterado quando agendado pelo agendador, permitindo assim que a mesma tarefa execute diversas tarefas ao mesmo tempo CPU. cenário, o mesmo personagem físico CPUpode ser executado de maneira compartilhada, portanto Host, Guestdiferentes modos também precisam salvar seu próprio contexto. Cada um Guesttem sua própria instância e será executado de maneira diferente quando carregado VMCSfisicamente .CPUVMCSGuest

Ao executar Guestum modo, Guestas chamadas de sistema do espaço do usuário são interceptadas diretamente no Guestespaço do kernel do modo, em vez de serem interceptadas no Hostespaço do kernel do modo.

Para interrupções externas, porque são necessários VMMrecursos do sistema de controle , quando a interrupção externa é recebida Guestno modo CPU. Em seguida, o modo é acionado para sair CPUdo modo e a interrupção externa é processada pelo kernel.Depois que a interrupção é processada, o modo é reentrado. (Não precisa ser gerado neste momento )GuestHostHostGuestVM exit

Para VCPU, VMMuse um thread para representar esta VCPUentidade

KVMé um módulo do kernel.

Preso e simulado : Ao Guestacessar os recursos do sistema, você precisa sair Hostdo modo e Hosto gerenciador unificado concluirá o acesso aos recursos em seu nome. Quando uma máquina virtual acessa I/O, ela primeiro precisa ser interceptada Host. Depois que VMMo disco virtual na máquina virtual receber I/Oa solicitação, se a imagem de disco da máquina virtual estiver armazenada em um arquivo local, o arquivo local será lido e gravado em seu nome . Ao acessar I/Oo espaço de endereçamento mapeado pela memória do dispositivo, uma exceção de página será acionada. Porém, esses endereços não correspondem à memória, mas sim ao I/Oespaço do dispositivo simulado. Portanto, é necessário KVMintervir e chamar o dispositivo simulado correspondente em processamento.I/O

Para armadilhas de gatilho passivas, você só Guestprecisa CPUabrir mão de recursos Host.

Os métodos de acesso periférico comumente usados ​​incluem PIOeMMIO

virtualização de memória

A essência é criar uma tabela de páginas sombra ou EPToutra tabela de páginas para mapear o relacionamento com a memória física.

Interrompa a virtualização

Para chips de interrupção virtual de software, o sinal de interrupção é apenas uma variável. Do ponto de vista da simulação de software, é para definir o valor da variável. Se KVMfor constatado que o chip de interrupção virtual possui uma solicitação de interrupção, as informações da interrupção são gravadas no campo VMCSdo meio . No momento da mudança para o modo, este campo será verificado, assim como a verificação do pino. Se houver uma interrupção , o processo de execução da interrupção será inserido.VM entry controlVM-entry interruption-information filedGuestCPUCPU

A lógica de interrupção é

  • PICO dispositivo virtual envia uma solicitação de interrupção ao chip de interrupção virtual e PICregistra virtualmente as informações de interrupção do dispositivo virtual. Diferente do processo de interrupção física, a lógica de avaliação de interrupção do chip virtual não é acionada neste momento PIC, mas VM entryé executada em tempo real.
  • Se o virtual CPUestiver em estado de suspensão, ative o virtual CPU, mesmo que CPUo thread correspondente ao virtual entre na CPUfila de tarefas físicas prontas
  • Quando o virtual CPUcomeçar a funcionar, Guestpouco antes de ligar, KVMo módulo verificará o PICchip virtual para ver se há alguma interrupção que precise ser processada. Neste momento, a lógica de avaliação de interrupção do KVMchip virtual será acionada.PIC
  • GuestDepois que uma interrupção que precisa ser processada é calculada pelo chip de interrupção virtual , as informações da interrupção são injetadas VMCSno campo de interrupção .VM-entry interruption-information
  • Depois de entrar Guestno modo, CPUverifique VMCSas informações de interrupção
  • Se houver uma interrupção que precise ser processada, o serviço de interrupção correspondente CPUserá chamado para tratar a interrupção.Guest IDT

Insira a descrição da imagem aqui
Geralmente, o controle de interrupção é realizado por um controlador de interrupção 8259A, um controlador de interrupção programável ou um controlador de interrupção avançado programável, portanto, esses dois chips também devem ser virtualizados.APIC

Suporte para virtualização de hardware

O chip de interrupção virtual é implementado no espaço do usuário, mas o chip de interrupção está intensamente envolvido no processo de operação de todo o sistema do computador.Portanto, a fim de reduzir a sobrecarga causada pela alternância de contexto entre o espaço do kernel e o espaço do usuário, posteriormente, o virtual O chip de interrupção está no espaço do kernel. Para melhorar ainda mais a eficiência, Inteltodos os aspectos da virtualização são suportados no nível do hardware.

  • virtual-APIC page: Implementado um para armazenar registros de interrupção Intelno CPUmodo . Com este estado no modo e lógica de interrupção nos modos posteriores , muitos comportamentos de interrupção não precisam de intervenção, reduzindo bastante o número de interrupções.Guestvirtual-APIC pageGuestGuestVMMVM exit
  • GuestLógica de avaliação de interrupção no modo. IntelA lógica de parte do chip de interrupção é implementada no Guestmodo de avaliação de interrupção.Quando ocorre uma interrupção, CPUnão há necessidade de passar para Hosto modo, mas Guesta avaliação da interrupção é concluída diretamente no modo.
  • posted-interrupt processing: Após o chip de interrupção virtual receber a solicitação de interrupção, ele salvará as informações no chip de interrupção virtual. Nesse momento VM entry, a lógica de avaliação de interrupção do chip de interrupção virtual é acionada e a avaliação da interrupção é realizada com base nas informações de interrupção registradas no chip de interrupção virtual. No entanto, quando a lógica de avaliação de interrupção no modo de CPUsuporte Guesté implementada, o chip de interrupção virtual pode passar diretamente as informações de interrupção para o chip de interrupção no modo após receber a solicitação de interrupção. A Guestavaliação de interrupção CPUé realizada no Guestmodo lógico do chip de interrupção. no modo e enviado para entrega direta do padrão está quebrado.GuestGuestCPU

Virtualização de dispositivos

Virtualização de dispositivos: O software de virtualização de sistema usa software para apresentar Guesta lógica dos dispositivos de hardware ao sistema operacional. A virtualização de dispositivos experimentou sucessivamente virtualização completa, paravirtualização e, posteriormente, virtualização assistida por hardware, incluindo a transmissão direta de hardware para a máquina virtual e a virtualização de uma peça de hardware do nível de hardware em vários subhardwares, cada subhardware separadamente. para máquinas virtuais, etc.

Transmissão transparente do dispositivo

Se a virtualização de dispositivos usar simulação de software, ela precisará VMMestar envolvida. Para evitar essa sobrecarga, tente oferecer suporte à virtualização Intelno nível do hardware , ou seja, transmitir diretamente o dispositivo para o dispositivo , ignorando o acesso direto ao dispositivo físico sem participar do processo. Este método fornece o melhor desempenho de virtualização.I/OGuestGuestVMMVMMI/OI/O

IntelO método inicial era Direct Assignmenttransmitir de forma transparente todo o dispositivo para uma determinada máquina virtual e não suportava várias VMmáquinas compartilhando o mesmo dispositivo. PIC-SIGPor exemplo , foi desenvolvido um padrão para tornar equipamentos de diferentes fabricantes compatíveis entre si : Single Root I/O Virtualzation and Sharingpara abreviar SR-IOV. SR-IOVDois novos Functiontipos são introduzidos, um é Physical Functionabreviação PF; o outro é Virtual Functionabreviatura VF. Pode SR-IOV-se suportar vários VFe cada um VFpode ser transmitido separadamente de forma transparente , dessa forma, o compartilhamento múltiplo do mesmo dispositivo físico Guestserá realizado do ponto de vista do hardware .Guest

Insira a descrição da imagem aqui
Cada VF possui seu próprio espaço de armazenamento independente, fila, interrupção e unidade de processamento de comandos para transmissão de dados, etc., mas o gerenciamento dessas VFs ainda está sob o controle do sistema, através VMMdo VMMgerenciamento PFdestas VF. A máquina virtual pode acessá-los diretamente VFem vez de VMMacessar o dispositivo físico por meio do dispositivo emulado na máquina virtual. PFAlém de fornecer VFacesso ao gerenciamento, Hostos aplicativos nele contidos ainda podem PFacessar o dispositivo físico indiscriminadamente. Para quem não tem VFdrivers Guest, as máquinas virtuais ainda podem SR-IOVcompartilhar dispositivos físicos por meio da interface PF do dispositivo.

Método de transmissão de dados
(1) MMIO: Memory-Mapped I/OMapeie a memória e os registros dos periféricos para CPUo espaço de endereço da memória e CPUacesse os periféricos como se estivesse acessando sua própria memória.
(2) PIO: Port I/O: Uso INe OUTinstruções para ler dados da porta especificada.

Não gosto de redes e não explorei a virtualização de redes, então pulei.

Ressalta-se aqui que VT-da tecnologia implementa CPUvirtualização e virtualização de memória, e interrupções e dispositivos não são considerados um tipo de virtualização.

Tecnologia QEMU/KVM

Já vi muitos conceitos e é um pouco chato, vamos dar uma olhada na prática.

QEMUDownload do código-fonte: download do site oficial do código-fonte qemu

LinuxDownload do código-fonte: download do site oficial do código-fonte do kernel Linux

conceitos e história

Uma máquina virtual ( Virtual Machine,VM) é um processo. Um processo pode ser considerado como uma coleção de recursos. Ele possui seu próprio espaço de endereço de processo independente e CPUregistros independentes. Ele executa instruções escritas pelo programador e completa certas tarefas. A virtualização de sistemas desenvolveu-se rapidamente com o suporte da computação em nuvem, Intele ambas as empresas adicionaram sucessivamente suporte à virtualização AMDno nível do hardware.CPU

Posteriormente, foi desenvolvida no kernel a tecnologia de virtualização de hardware Qumranetutilizada , com arquitetura simplificada e integração natural com o kernel, permitindo sua entrada rápida no kernel. A virtualização é agora uma pedra angular de muito sucesso do que é conhecido como computação em nuvem.IntelLinuxKVM Kernel Virtual MachineKVMLinuxKVMVMM

QEMUNo início, as instruções da arquitetura de origem TCG Tiny Code Generatoreram convertidas em instruções da arquitetura de destino por meio do mecanismo.
IntelHedu adicionou sucessivamente suporte para virtualização AMDno nível de hardware, ou seja, virtualização de hardware, adicionou um conjunto de instruções estendidas com base no conjunto de instruções , adicionou novos modos de operação e completou a correção de vulnerabilidades de virtualização. Através das novas instruções de virtualização de hardware, ele pode ser construído de forma muito conveniente e o código na máquina virtual pode ser executado nativamente no físicoCPUIntelx86VMXVT-xCPUx86
VMMx86CPU

KVMÉ um módulo do kernel que exporta uma série de interfaces para o espaço do usuário. O espaço do usuário pode usar essas interfaces para criar máquinas virtuais. No início, KVMele era responsável apenas pelas CPUpartes principais de virtualização e virtualização de memória. Era usado QEMUcomo componente de modo de usuário e era responsável pela simulação de um grande número de periféricos. A solução na época era chamada de QEMU-KVM.

Insira a descrição da imagem aqui
Além disso, existem soluções de virtualização como VMware.VirtualbBox

Virtualização de CPU

Criação de uma máquina virtual: Para criar uma KVMmáquina virtual, uma solicitação precisa ser iniciada do lado do usuário QEMU.

QEMUA criação de máquinas virtuais secundárias e KVMa criação de máquinas virtuais: QEMUuse KVMStateestruturas para representar KVMestruturas de dados relacionadas. KVM_INITA função primeiro abre /dev/kvmo dispositivo para obter um fd, chama a interface para criar uma máquina virtual kvm_ioctl(s, KVM_CREATE_VM)no nível intermediário e também chama para completar alguns inicialização relacionada à arquitetura.KVMkvm_initkvm_arch_init

// qemu
static int accel_init_machine(AccelClass *acc, MachineState *ms) 
{
    
    
	//
	ret = acc->init_machine(ms);
	if (ret < 0) 
	{
    
    
		...
	}
	return ret;
}

// kvm
static int kvm_init(MachineState *ms) 
{
    
    
	// 
	MachineClass *mc = MACHINE_GET_CLASS(ms);
	
	ms = KVM_STATE(ms->accelerator);
	ms->vmfd = -1;
	ms->fd = qemu_open("/dev/kvm", O_RDWR);

	do 
	{
    
    
		ret = kvm_ioctl(s, KVM_CREATE_VM, type);  // 创建一台KVM虚拟机
	} while (ret == -EINTR);
}

VCPUCriação de

VCPUtipo

struct X86CPUDefinition {
    
    
    const char *name;
    uint32_t level;
    uint32_t xlevel;
    /* vendor is zero-terminated, 12 character ASCII string */
    char vendor[CPUID_VENDOR_SZ + 1];
    int family;
    int model;
    int stepping;
    FeatureWordArray features;
    char model_id[48];
};

static X86CPUDefinition builtin_x86_defs[] = {
    
    
	// 各种cpu型号和特性
    {
    
    
        .name = "pentium",
        .level = 1,
        .vendor = CPUID_VENDOR_INTEL,
        .family = 5,
        .model = 4,
        .stepping = 3,
        .features[FEAT_1_EDX] =
            PENTIUM_FEATURES,
        .xlevel = 0,
    },	
    // ......
}

Ao chamar KVMa função de criação virtual , CPUuma função é passada kvm_vcpu_ioctle um parâmetro é passado para representar o cpustatus de criação, como segue

int kvm_cpu_exec(CPUState *cpu) 
{
    
    
	do 
	{
    
    
		...
		run_ret = kvm_vcpu_ioctl(cpu, KVM_RUN, 0);
	} while ()
}

Tecnologia de contêiner Docker

A tecnologia de virtualização tradicional pode ser implementada por meio de hardware ou sistemas operacionais, por exemplo KVM, para permitir que aplicativos virtuais alcancem resultados semelhantes aos de máquinas físicas, Hypervisor/VMMpermite que vários sistemas operacionais compartilhem um ou mais sistemas operacionais CPU, mas traz muitos sobrecarga. Como a máquina virtual inclui um conjunto completo de máquinas virtuais OS, o agendamento e o uso de recursos são muito pesados.

Insira a descrição da imagem aqui

A tecnologia Container ( Container) é uma tecnologia de virtualização de sistema operacional mais leve. Ela empacota aplicativos, pacotes dependentes, arquivos de biblioteca, etc. em imagens padronizadas, fornece isolamento de processos por meio do mecanismo de contêiner e pode limitar recursos. Permite que o ambiente separe aplicativos OSdo plataforma e hardware subjacente.

Insira a descrição da imagem aqui

Aqui deve ser mencionado um comando: chroot, ou seja change root, sua função é alterar a localização do diretório raiz referenciado quando o programa é executado, o que pode aumentar a segurança do sistema e limitar o que o usuário pode fazer.

Mecanismo de gerenciamento de contêineres

Inclui principalmente vários módulos, como processo daemon, imagem, driver e gerenciador de contêiner.

Daemon Docker

Este processo é um processo daemon que reside em segundo plano. Ele é responsável por monitorar as solicitações do cliente, executar a lógica correspondente subsequente e gerenciar Dockerobjetos. Ele consiste principalmente em três partes:

  • Server: Responsável por receber solicitações do cliente, após receber a solicitação, encontra Servera solicitação de execução correspondente Handlerpor meio de roteamento e agendamento de distribuição, interage com o armazém espelho do contêiner e retorna o resultado para Docker Client.
  • Engine: Ligue o motor. Este módulo desempenha Docker containero papel de um armazém de armazenamento. EngineCada trabalho pode ser dividido em múltiplas ações mínimas Job, que são suas unidades de execução de trabalho mais básicas.
  • Job: Dockercada operação interna pode ser abstraída em uma e será concluída Jobusando o driver subjacente .Driver

Driver Docker

DockerNo driver, a camada do driver de design é desacoplada, que separa a lógica de execução de imagem, rede e isolamento do gerenciamento de contêineres da Docker Daemonlógica do contêiner.

Na implementação a médio prazo, os impulsionadores podem ser divididos nas três categorias seguintes:

  • graphdriver: Responsável pelo gerenciamento de imagens de contêiner, principalmente pelo armazenamento e aquisição de imagens.Quando a imagem é baixada, a imagem será armazenada persistentemente em um diretório local especificado.
  • networkdriver: Responsável pela Dockerconfiguração do ambiente de rede do contêiner, como alocação de mapeamentos de portas Dockerem tempo de execução IPe criação de pontes de rede e placas de rede virtuais na inicialização.
  • execdriver: Driver de execução, por meio de operação Lxcou libcontainerisolamento de recursos. É responsável por criar e gerenciar o namespace de execução do contêiner, gerenciar a alocação de recursos e a execução dos processos reais dentro do contêiner.

libcontainer

Fornece acesso ao kernel relacionado ao contêiner APIe é responsável por operações específicas no contêiner.

Principalmente usando o kernel namespacee cgroupduas tecnologias.
É namespaceresponsável pelo isolamento do processo e cgrouplimitação de recursos.

Sistemas de arquivos virtuais visíveis (sistemas de arquivos sem armazenamento persistente), tomando como exemplos proc e sysfs Cgroup.


Se você estiver interessado, pode dar uma olhada neste projeto, que tem bashmais de cem linhas simples escritas à mão docker: bocker


Acho que você gosta

Origin blog.csdn.net/qq_48322523/article/details/127688886
Recomendado
Clasificación