Linux Containers and Virtualization 学习笔记

一本简短的关于 Linux 虚拟化方面的书, 涉及到虚拟机和container的一些核心概念, 挺好的.
<<Linux Containers and Virtualization: A Kernel Perspective>>

基础部分

  1. Linux Kernel and CPU help on virtualization.
  2. process-level virtualization -> Java -> Java runtime environment virtualized the POSIX layer.
  3. VMware -> virtualizing the actual hardware like the CPU, memory, disks, etc -> VMware software(hypervisor: host->guest OS) -> ESX (type 1: OS on hypervisor) & GSX (type 2: OS on OS)
  4. 对底层计算资源的更加灵活的利用/隔离/管控 -> 不同 level 的实现/优劣/代价/
  5. 2 种常见虚拟化技术的对比(VM-based vs container-based). 思考的角度/实现的思路 -> 我要一台虚拟机->我要一个 OS-> 一个物理机跑几个 OS (底层) | 虚拟化就是资源的隔离与限制 (上层)
  6. Hypervisor -> VMM (Virtual Machine Monitor): trapping and emulating the privileged instruction set & Device model: virtualizing the I/O devices
  7. VMM 满足 3 大属性: 1. Isolation 隔离, 2. Equivalency 同等性, 3. Performance 性能.
  8. VMM 基本功能:

    1. 不允许 VM 访问 privileged 状态;
    2. 处理异常和中断, map 到对应的虚拟机;
    3. 处理 CPU 虚拟化: 大部分指令 natively, trapping 部分特权指令;
    4. 处理各 VM 的内存映射, 控制物理内存映射
  9. 内存虚拟化: guest OS 不能直接操作物理内存, 不能操作硬件 page tables. 一般Virtual Memory -> CR3 + MMU (硬件) -> 查找 page tables -> 物理内存; 对应 VMM 有了 3 层抽象

    1. Guest virtual memory;
    2. Guest physical memory;
    3. System physical memory;
  10. 内存虚拟化: 对于3 层抽象, 可能的 2 个解决方案: 1) Shadow page tables ; 2) Nested page tables with hardware support -> AMD & Intel 提供硬件扩展 -> EPT (Extended Page Table) -> 2 层 page tables;

namespace

  1. Namespaces kernel 内部逻辑隔离, 通过限制系统资源可见性的方法 主体: process, 对象: (内核资源) mnt, pid, uts, ipc, net, time, cgroup, user.
  2. namespace 实现-> kernel 的内部数据结构 -> task-struct->nsproxy (task-struct->cred (user only)).
  3. namespace 相关的 syscall 1. clone; 2). unshare; 3. setns.
  4. 查看一个进程的 ns -> /proc/<pid>/ns/
  5. net namespace 相关的命令

    1. ip netns add myns
    2. ip netns del myns
    3. ip netns exec myns sh ## 执行 sh 在 myns namespace
    4. ip link add veth0 type veth peer name veth1  ##创建 veth 对 (veth0 ~ veth1)
    5. ip link set veth1 netns myns ## 把 veth 的一端加到 myns namespace

cgroup

  1. cgroup(control group): kernel 里的: cgroup controller + cgroupfs 组成;
  2. cgroup v1 ~ v2
  3. mount cgroup v2: mount -t cgroup2 none <mount_point>
  4. CPU group:

    1. CFS scheduler vs RT scheduler
    2. CFS -> cpu.shares vs cpu.cfs_quota_us/cpu.cfs.period_us (us:微秒)
    3. CFS -> 数据结构: task_struct -> sched_entity -> vruntime;
    4. CFS -> 每次 schedule 的时候, 计算权重,剩余时间,控制用量, 排序 -> 根据 CPU 个数, 进程数, 配置, 等信息
    5. CFS -> 数据结构: CONFIG_CFS_BANDWIDTH
  5. Block I/O cgroup

    1. 块设备 I/O 的读写 bytes 和 iops (数据量和次数);
    2. fairness + throttling
    3. process -> (Page Caches + VFS) -> File System -> Blocker Layer -> Driver -> Disk
    4. Block I/O cgroup 实现在 Blocker Layer;
    5. 数据结构: request_queue -> request -> bio;
    6. 控制结构: blkcg <- 块 I/O cgroup, 每个块 I/O cgroup 映射到一个 request queue. -> blkcg_gq;
    7. CFQ (Complete Fair Queuing) -> 每个 block I/O cgroup 以 group 为单位. 所有队列形成一个 queue tree;
    8. 数据结构: cfq_group -> vdisktime

Layered File System

  1. File system 屏蔽了底层的真实情况, 抽象成 文件读写. block 设备 vs non-block 设备 -> VFS;
  2. 所有的文件系统都注册到 VFS -> File -> (1:1) Inode (metadata). Dentry 内存里面用来根据 filename 查找遍历 Inode. Superblock (block, device metadata). File -> Dentry -> Inode -> page cache (address_space) -> memory page.
  3. mount -> 数据结构: vfsmount -> superblock;
  4. pdflush -> page dirty flush to disk;
  5. Layered File System:

    1. 节省磁盘 shared on disk
    2. 节省内存 -> 内存共享 (page cache). 快速启动 (已经加装在内存);
  6. Whereas in the case of a layered file system, the file system is broken into layers and each layer is a read-only file system. Since these layers are shared across the containers on the same host, they tend to use storage optimally. And, since the inodes are the same, they refer to the same OS page cache. This makes things optimal from all aspects.
  7. Union File System:
  8. OverlayFS: 一种 union FS. 大概可以理解为 Layered File System 是一个概念, UnionFS 是一个 API, OverlayFS 是一个实现

image.png

标签: none

添加新评论