缘起

笔者最近分别购买了一台腾讯云和百度云的机器,都是一年期的,配置和价格分别如下:

腾讯云 百度云
配置 2 核,2G 内存,40G 硬盘 2 核,4G 内存,80G 硬盘
价格 50 元 78 元

似乎性价比都差不多,但是,用 "lscpu" 命令一看就会发现,腾讯云机器的 "Thread(s) per core" 这一项为 1,而百度云为 2,这意味着后者是开启了 hyper-threading 的,性能一般只相当于 1.1-1.2 个 CPU(大家注意以后避免踩坑),而腾讯的是真两核(要不然怎么叫良心云呢)。

另外从控制台上,虽然是轻量应用版本,但是腾讯云也支持 snapshot 功能,而百度云好像没有。不能打快照的话,都不敢在上面做过多的试验性操作。

有时想想,这么低的价格,怕是连电费都不够,还别说为了保持产品的竞争力,隔几年就需要对昂贵的 CPU 进行升级换代,这可是一笔不小的开销。

云服务器普遍存在“超卖”的情况,毕竟不可能售出的所有虚机都同时使用(银行也是无法同时满足每一个储户的取现需求)。会不会是像航空公司一样,多卖出去的一个座位,只是几十元的「边际成本」(比如这两年的“随心飞”产品)。当使用一年之后,由于数据迁移的不便,加上习惯和黏性,赌你还会接着续费使用?

采用虚拟机模式构建的云服务,算是一种共享经济了,但根据目前了解到的一些信息,在公司级项目的层面,由于各种各样的原因,目前购买云主机的成本并不见得比自建机房低。

不过“云”还有一个好处,就是随时随地的访问,周末写文章常常需要一个 Linux 的访问环境,买台云服务器的话,可以省去背电脑回家的麻烦。

在到手的这 2 台机器上,笔者都基于 5.17.0 内核,使用 menuconfig 默认配置进行了编译,结果生成的镜像占用空间较多。由于磁盘空间受限,笔者就想着能不能精简下配置,把不必要的模块都去掉。前提一是能在采用 KVM 的虚机上运行,二是虚机里能跑 docker。

动手

笔者最开始使用的是 defconfig,为了加快后续编译,make 时加上了 ccache(参考这篇文章)。替换内核是高危操作,所以保险的做法是在 make install 之前打个快照,并且用 "grubby --set-default" 将老内核作为默认启动项(因为启动失败后,网页版的 VNC 界面很可能无法切换内核)。

支持 KVM

之后,切到新内核的启动卡在了 "System hang after output: Reached target Basic System",这可能是 initramfs 里的磁盘驱动缺失导致。

因为目前 KVM 普遍采用 VIRTIO 作为虚机的驱动,所以得在配置里包含相关部分,主要是 BLK, SCSI, PCI 和 NET,以 block 为例,配置路径如下:

Device Drivers ---> Block devices --> Virtio block driver

此外,作为 guest 虚机,还需加上 "KVM_GUEST" 的配置:

Processor type and features ---> Linux guest support

注意,"Virtualization --> Kernel-based Virtual Machine (KVM) support" 这个并不需要,因为它是用来支持虚机运行的,是给宿主机内核用的。

煞费周章后,新内核终于可以正常启动了。其实后来才知道,Linux 针对 KVM 虚机提供了一个现成的配置,在拥有一个基础的 ".config" 文件后,直接 "make kvm_guest.config" 即可("kvm_guest" 这个 config 文件并不是内核编译所需的完整配置文件,它只有几十行,所以中间其实自动进行了一个和基础配置文件 merge 的过程)。

支持 docker

启动后试着输入 "docker ps" 命令,dockerd 守护进程都没起来:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Is the docker daemon running?

那为啥没 run 呢,是没有设置开机自启么?用 "systemctl is-enabled docker",结果显示为 "enabled",再用 "systemctl status docker":

只有最后一部分日志,看不出来具体原因,完整的还得用 "journalctl -u docker",然后从里面找到端倪:

msg="failed to mount overlay: no such device" storage-driver=overlay

"lsmod |grep overlay" 的输出为空,说明确实没有这个驱动,得增加 CONFIG_OVERLAY_FS。但重新编译后,docker 还是没能起来:

再把 cgroup 里面缺失的 controller 都补上,比如 CONFIG_CGROUP_DEVICE。现在有经验了,docker 的三要素嘛,还差一个 namespace,也一起给补了:

嗯,dockerd 总算是可以运行了,但是容器的网络不通,还是没法正常使用:

docker 网络这块的关系颇为复杂,传统上是 iptables,由于两台机器都采用和 RHEL-8 兼容的用户态,所以还涉及 nftables:

图片来源见文末链接

折腾一番后,所幸找到了一个查找容器运行依赖项的工具(具体用法见这篇文章)。对着检查出的结果, 补齐 "Generally Necessary" 里面 "missing" 的部分(比如 CONFIG_VETH),最后总算勉强跑起来了。

小结

由于在此期间需要多次重编内核,ccache 的加速作用功不可没。在配置差异的比较中,源码 "scripts" 目录下的 diffconfig 工具也是必不可少。整个探(折)索(腾)的过程,除了工具的使用,对 KVM 和 docker 底层依托的组件,也有了更深的印象。

除了腾出有限的存储空间,更少的配置也意味着更短的编译时间(咱这只有 1 到 2 个 CPU 的小驴,编译内核可是非常耗时的),以及更快速的启动(可以用 "systemd-analyze" 来分析启动时间的构成)。

参考:

iptables: The two variants and their relationship with nftables | Red Hat Developer

原文链接:https://zhuanlan.zhihu.com/p/523851273  原文作者:兰新宇

KVM - 虚机内核配置相关推荐

  1. KVM虚机转换为VMware虚机

    1.先找到KVM虚机的虚拟磁盘文件,文件格式为.qcow2 2.将虚拟磁盘文件转化成VMware的虚拟磁盘文件格式.VMDK    例如(在KVM虚机的宿主机上操作):    #qemu-img co ...

  2. 【KVM系列08】使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    第八章 使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 1. QEMU/KVM 迁移的概念 1.1 迁移效率的衡量 1.2 KVM 迁移的原理 1.3 使用命令行的方式做动态迁移 ...

  3. 【KVM系列06】Nova 通过 libvirt 管理 QEMU/KVM 虚机

    第六章 Nova 通过 libvirt 管理 QEMU/KVM 虚机 1. Libvirt 在 OpenStack 架构中的位置 2. Nova 中 libvirt 的使用 2.1 创建 QEMU/K ...

  4. KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]

    KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain] 学习 KVM 的系列文章: (1)介绍和安装 (2)CP ...

  5. 【云计算 | Openstack】KVM虚机通过dhcp自动获取地址

    环境: os:centos7 1. 背景 前文 [云计算 | OpenStack]从零开始使用libvirt创建一个kvm虚机 中的虚机使用的是基于Linux网桥的虚拟网卡,如下xml文件中的定义 # ...

  6. 5分钟让免费的 Linux KVM 虚机管理跟 VMWare 一样好用

    KVM 是 Linux 上常用的虚机管理软件,但是使用 KVM 命令行管理虚机是一件既繁琐又容易出错的任务.本文介绍一种简单方法可以让用户方便地在 Windows 上像管理 VMWare 虚机那样管理 ...

  7. KVM之Nova通过libvirt管理QEMU/KVM虚机

    学习 KVM 的系列文章:  (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接 ...

  8. KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]...

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  9. 远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5)

    上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机.其实 virt-manager 也可以管理其他宿主机上的虚机.只需要简单的将宿主机添加进来 填入宿主机的相关信息,确定即 ...

最新文章

  1. spark on yarn提交后vcore数不对
  2. 教你9招最有效防电脑辐射方法
  3. boost::equal相关的测试程序
  4. php 点对点,浅析点对点(End-to-End)的场景文字识别
  5. I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
  6. mysql 元数据获取_[MySQL] 获取元数据的步骤
  7. 将毫秒转换_上海科大:超强电镜技术!原子级分辨率,毫秒级可视化
  8. python 函数特殊属性
  9. aswing学习笔记2-不规则外框-请教思路
  10. 威纶触摸屏与电脑连接_如何将威纶通tk6070ip触摸屏程序上传到电脑里。请大侠讲解具体步骤...
  11. 软考网络工程师-华为设备命令学习笔记
  12. IP子网划分(3分钟让你学会套用公式划分)!
  13. Ubuntu中vim脚本保存失败,E45错误提示。
  14. html图片顺时针倾斜50度,html – 使用transform进行垂直对齐:translateY(-50%);里面绝对定位的div...
  15. 关系抽取论文阅读笔记
  16. 第九届全国大学生GIS应用技能大赛下午(试题及参考答案含数据)
  17. 第四章USB数据流模型
  18. let , const , var , 的区别
  19. 用监控摄像机搭建视频直播系统的方式
  20. 再编写代码中报错:CS8107 C# 7.0 中不支持功能“xxxxxx”。请使用 7.1 或更高的语言版本。...

热门文章

  1. python字符串转list(python字符串转数字)
  2. Codeforces Round #717 (Div. 2)(ABCD)
  3. java控制电脑双屏模式_win10电脑双屏幕设置方法 双屏双桌面的设置步骤
  4. TensorFlow CRNN
  5. 168 PHP中Notice: iconv(): Unknown error (84) 的解决办法
  6. 在DW中制作网页中的表格
  7. networkx的安装及简单用法
  8. 树莓派与PCF8591模数转换器的那些事儿
  9. 视觉定位系统在机器人全场定位的应用
  10. dedecms注入漏洞feedback.php,织梦(Dedecms) 5.1 feedback_js.php 注入漏洞