1.Linux内核源码解析---cgroup实现之整体架构与初始化
2.å¦ä½å¨Ubuntuä¸åå©Docker管çLinux容å¨
3.运维常见的容容器工具推荐
4.PVE部署LXC运行docker
5.docker是什么
6.å¦ä½è®¡ç®å®¹å¨çCPU使ç¨å¼
Linux内核源码解析---cgroup实现之整体架构与初始化
cgroup在年由Google工程师开发,于年被融入Linux 2.6.内核。器源它旨在管理不同进程组,容容器监控一组进程的器源行为和资源分配,是容容器Docker和Kubernetes的基石,同时也被高版本内核中的器源源码大亨LXC技术所使用。本文基于最早融入内核中的容容器代码进行深入分析。
理解cgroup的器源核心,首先需要掌握其内部的容容器常用术语,如子系统、器源层级、容容器cgroupfs_root、器源cgroup、容容器css_set、器源cgroup_subsys_state、容容器cg_cgroup_link等。子系统负责控制不同进程的行为,例如CPU子系统可以控制一组进程在CPU上执行的时间占比。层级在内核中表示为cgroupfs_root,一个层级控制一批进程,层级内部绑定一个或多个子系统,源码as每个进程只能在一个层级中存在,但一个进程可以被多个层级管理。cgroup以树形结构组织,每一棵树对应一个层级,层级内部可以关联一个或多个子系统。
每个层级内部包含的节点代表一个cgroup,进程结构体内部包含一个css_set,用于找到控制该进程的所有cgroup,多个进程可以共用一个css_set。cgroup_subsys_state用于保存一系列子系统,数组中的每一个元素都是cgroup_subsys_state。cg_cgroup_link收集不同层级的cgroup和css_set,通过该结构可以找到与之关联的进程。
了解了这些概念后,可以进一步探索cgroup内部用于结构转换的函数,如task_subsys_state、find_existing_css_set等,这些函数帮助理解cgroup的内部运作。此外,cgroup_init_early和cgroup_init函数是flashcache 源码初始化cgroup的关键步骤,它们负责初始化rootnode和子系统的数组,为cgroup的使用做准备。
最后,需要明确Linux内一切皆文件,cgroup基于VFS实现。内核启动时进行初始化,以确保系统能够正确管理进程资源。cgroup的初始化过程分为早期初始化和常规初始化,其中早期初始化用于准备cpuset和CPU子系统,确保它们在系统运行时能够正常工作。通过这些步骤,我们可以深入理解cgroup如何在Linux内核中实现资源管理和进程控制。
å¦ä½å¨Ubuntuä¸åå©Docker管çLinux容å¨
è½è¯´æ åç硬件èæåææ¯ï¼æ¯å¦KVMãXenæHyper-Vï¼æ é¿äºå¨ä¸ä¸ªç©ç主æºä¸è¿è¡å¤ä¸ªæä½ç³»ç»çå®å ¨é离çå®ä¾ï¼ä½è¿ç§èæåææ¯å¨æ§è½ãèµæºåèµæºé ç½®æ¶é´çæ¹é¢åå¨åç§åæ ·çå¼éãæ åçæºå¨èæåå®é ä¸å¯è½æ²¡æå¿ è¦ï¼è¿åå³äºä½ çå®é 使ç¨åºåã
å¦å¤ä¸ç§è½»åèæåæ¹æ³å°±æ¯æè°çLinux容å¨ï¼LXCï¼ï¼å®æä¾äºæä½ç³»ç»çº§å«çèæåãç±äºä¸åå¨è¿è¡èææºå¸¦æ¥çå¼éï¼LXC让ç¨æ·å¯ä»¥å¨è½»å容å¨æ²çéé¢è¿è¡æ åLinuxæä½ç³»ç»çå¤ä¸ªå®ä¾ãå¦æä½ æ建ä¸ä¸ªå¯å¤å¶çå¼å/æµè¯ç¯å¢ï¼æè å¨å®å ¨æ²çéé¢é¨ç½²åºç¨ç¨åºï¼å®¹å¨å°±æ´¾å¾ä¸å¤§ç¨åºã
Dockerå°±æ¯ä¸ºäºä¾¿äºé¨ç½²Linux容å¨èå¼åçè¿æ ·ä¸æ¬¾å¼æºå·¥å ·ãDockeræ£è¿ éæ为容å¨ææ¯æ¹é¢çä¸é¡¹äºå®ä¸çæ åï¼å·²ç»è¢«è¯¸å¦Ubuntuå红帽ä¹ç±»çå大Linuxåè¡çæéç¨ã
æå¨æ¬æç¨ä¸å°æ¼ç¤ºå¦ä½å¨Ubuntu .ä¸ï¼åå©Docker管çLinux容å¨ã请注æï¼å¯¹Ubuntuçæ©æçæ¬èè¨ï¼æä½æ¥éª¤å¯è½ç¥æä¸åã
ç¼ä¸ï¼Ubuntuä¸å¯ç¨çDockerç¨åºå åªæ¯æä½ç³»ç»ãæ³å¨ä½æºå¨ä¸è¿è¡å®ï¼ä½ å°±è¦å©ç¨æºä»£ç æ建ä½çæ¬çDockerï¼è¯¦è§è¿éï¼ã
å®è£ Docker
åå©apt-getå½ä»¤ï¼å®è£ Dockeræ¯ä»¶è½»èæ举çäºã
$ sudo apt-get install docker.io
为äºå 许éæ ¹ç¨æ·ä¹å¯ä»¥è¿è¡Dockerï¼å°ä½ èªå·±æ·»å å°docker群ç»ãä¸é¢è¿ä¸ªå½ä»¤ä¼å 许å½åç¨æ·è¿è¡Dockerï¼æ éæ ¹ç¨æ·æéã
$ sudo usermod -a -G docker $USER
éåºï¼ç¶åéæ°ç»å½ï¼ä»¥æ¿æ´»ç¾¤ç»æåçååã
ä¸ä¸æ¥ï¼ç¼è¾Dockeré ç½®æ件ï¼ä»¥ä¾¿æ´æ°Dockeräºè¿å¶ä»£ç çä½ç½®ã
$ sudo vi /etc/default/docker.io
DOCKER="/usr/bin/docker.io"
éå¯Dockeræå¡ã
$ sudo service docker.io restart
管çDocker容å¨
å¦æä½ æ³å¯å¨Ubuntuæä½ç³»ç»çä¸ä¸ªæ°çDocker容å¨ï¼é¦å éè¦è·åUbuntu Dockeræ åæ件ãä¸é¢è¿ä¸ªå½ä»¤ä¼éè¿ç½ç»ä¸è½½Dockeræ åæ件ã
$ docker pull ubuntu
ä½ å¯ä»¥ä»¥ä¸ç§äº¤äºæ¨¡å¼æ¥å¼å¯Ubuntu Dockerï¼å¦ä¸æ示ãæåä¸ä¸ªåæ°â/bin/bashâæ¯ä¸æ¦å¯å¨å°±å°å¨å®¹å¨éé¢æ§è¡çå½ä»¤ï¼è¿éæ¯ä¸ä¸ªç®åçbashå¤å£³å½ä»¤ã
$ docker run -i -t ubuntu /bin/bash
ä¸è¿°å½ä»¤ä¼ç«å³å¯å¨ä¸ä¸ªUbuntu容å¨ï¼è¿æ£æ¯å®¹å¨çé åæå¨ï¼ï¼ï¼å¹¶ä¸ºä½ æä¾å®¹å¨éé¢çå¤å£³æ示符ãè¿æ¶åï¼ä½ åºè¯¥è½å¤è®¿é®æ²çç¯å¢éé¢çæ åçUbuntuæä½ç³»ç»äºã
æ³éåºDocker容å¨ï¼å¨å®¹å¨éé¢çæ示符å¤é®å ¥âexitâã
ä½ å¯ä»¥å¯å¨ä¸åå½¢å¼ç容å¨ãæ¯å¦ï¼æ³å¯å¨Fedora容å¨ï¼è¯·æ§è¡ä¸é¢è¿ä¸ªå½ä»¤ï¼
$ docker.io run -i -t fedora /bin/bash
å¦ææ¬å°æ²¡æFedora Dockeræ åæ件ï¼è¯¥å½ä»¤å°±ä¼é¦å èªå¨ä¸è½½æ åæ件ï¼ç¶åå¯å¨Dockerã
å¦æä½ æ³å¯å¨éç¨æ个åè¡ççæ¬ç容å¨ï¼ä¹å¯ä»¥è¿ä¹åãæ¯å¦è¯´ï¼æ³å¯å¨Ubuntu . Dockerï¼è¯·æ§è¡ä¸é¢è¿ä¸ªå½ä»¤ï¼
$ docker.io run -i -t ubuntu:. /bin/bash
容å¨ç½ç»
Docker使ç¨Linuxç½æ¡¥å°å®¹å¨å½¼æ¤äºèèµ·æ¥ï¼å¹¶å°å®ä»¬è¿æ¥å°å¤é¨ç½ç»ãå®è£ äºDockeråï¼ä½ åºè¯¥ä¼çå°é»è®¤æ åµä¸èªå¨ç»å»ºçdocker0 Linuxç½æ¡¥ãä½ å建çæ¯ä¸ªå®¹å¨é½å°è¿æ¥å°docker0ç½æ¡¥æ¥å£ã
èªå®ä¹Linuxç½æ¡¥
å¦æä½ æ³ï¼ä¹å¯ä»¥ä½¿ç¨èªå®ä¹Linuxç½æ¡¥å°è¯¸å®¹å¨äºèèµ·æ¥ã为æ¤ï¼ä½ å¯ä»¥å»ºç«ä¸ä¸ªèªå®ä¹ç½æ¡¥ï¼å¹¶å¯¹å®è¿è¡é ç½®ï¼å¦ä¸æ示ãä½ å¯ä»¥ä¸ºè¯¥ç½æ¡¥åé ä¸ä¸ªåç¬çåç½ï¼å¹¶ä¸ä»åç½ä¸ºDockeråé IPå°åãæä¼ä½¿ç¨.0.0.0/ä½ä¸ºDockeråç½ã
$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0
$ sudo ifconfig br0 .0.0.1 netmask ...0
æ³è®©Docker使ç¨èªå®ä¹ç½æ¡¥ï¼å°â-b=br0âæ·»å å°/etc/default/docker.ioä¸çDOCKER_OPTSåéï¼ç¶åéå¯Dockeræå¡ã
$ sudo service docker.io restart
è³æ¤ï¼ä»»ä½æ°ç容å¨é½ä¼è¿æ¥å°br0ï¼å ¶IPå°åä¼èªå¨ä».0.0.0/æ¥åé ã
å ¶ä»å®å¶
è¿æå¦å¤å ç§æ¹æ³å¯ä»¥å®å¶Dockerçé»è®¤ç½ç»è®¾ç½®ï¼ä¸»è¦æ¯éè¿æ¹å¨/etc/default/docker.ioä¸çDOCKER_OPTSåéæ¥å®ç°ã
â-dns 8.8.8.8 -dns 8.8.4.4âï¼æå®å®¹å¨ä½¿ç¨çDNSæå¡å¨ã
â-icc=falseâï¼è®©è¯¸å®¹å¨å½¼æ¤é离å¼æ¥ã
æ éææ¥
1. è¿è¡docker.ioå½ä»¤æ¶ï¼ä½ ä¼éå°ä¸é¢è¿ä¸ªé误ã
dial unix /var/run/docker.sock: no such file or directoryï¼æ²¡ææ¤ç±»æ件æç®å½ï¼
åºç°è¿ä¸ªé误ï¼å¯è½æ¯ç±äºDockerå®æ¤ç¨åºæ²¡å¨è¿è¡ãæ£æ¥Dockerå®æ¤ç¨åºçç¶æï¼ç¡®ä¿å å¯å¨å®ã
$ sudo service docker.io status
$ sudo service docker.io start
运维常见的工具推荐
开源的工具在运维领域扮演着关键角色,它们能够有效地支持DevOps实践。以下是一些推荐的开源工具,涵盖了开发工具、自动化构建与测试、持续集成与交付、部署工具以及维护和监控等关键环节。 一、wmv源码开发工具Git: 分布式版本控制系统,用于管理项目版本,易于学习与使用。
GitLab: 基于Git的代码托管平台,提供Web界面访问,支持公开或私有项目。
Gerrit: 免费、开放源代码的代码审查工具,支持Git作为底层版本控制系统。
Mercurial: 轻量级分布式版本控制系统,适用于Python环境,易于学习与扩展。
Subversion: 版本控制系统,用于替代RCS、CVS,提供分支管理功能。
二、自动化构建与测试Apache Ant: 用于Java环境的自动化工具,支持软件编译、测试与部署。瓜田源码
Maven: 提供高级项目管理功能,简化构建规则,易于使用。
Selenium: Thoughtworks公司开发的集成测试工具。
PyUnit: Python单元测试框架,与JUnit兼容。
PHPUnit: PHP测试框架,基于xUnit设计。
三、持续集成与交付Jenkins: 可扩展的持续集成引擎,支持自动化构建与测试。
Capistrano: 并行执行命令的工具,适用于发布Rails应用。
BuildBot: 自动化编译/测试周期工具,验证代码变更。
Fabric: 提供UI和UX一致的中央管理平台,用于自动化操作、配置与监控。
Go: Google开发的编译型编程语言,支持并发与垃圾回收。
四、部署工具Docker: 开源应用容器引擎,支持应用与依赖打包移植。
Rocket (rkt): CoreOS推出的容器引擎,与Docker类似,用于打包应用。
Ubuntu (LXC): 基于LXC技术的容器平台,支持非特权与分布式。
Chef: 系统集成框架,提供配置管理功能。
Puppet: 集中管理系统配置的工具,支持多元素管理。
CFengine: Unix管理工具,简化管理任务。
Bash: Linux与MacOS的默认shell,广泛使用于自动化任务。
RunDeck: Java/Grails编写的工具,简化数据中心与云环境自动化。
Saltstack: 基于Python的配置管理工具,快速部署。
Ansible: 配置管理器,支持多节点发布与远程任务执行。
五、维护工具Logstash: 日志与事件传输、处理与管理平台。
CollectD: 用于收集系统性能与存储数据的守护进程。
StatsD: 简单的网络守护进程,用于收集统计信息。
六、监控、警告与分析工具Nagios: 监视系统运行状态与网络信息的工具。
Ganglia: 分布式监控系统,支持高性能计算环境。
zabbix: 基于Web的分布式系统监控与网络监视工具。
Kibana: Logstash与ElasticSearch的日志分析Web接口。
本文推荐的这些开源工具涵盖了运维流程的各个方面,从开发、构建、部署到维护与监控,能够有效地支持DevOps实践,提升工作效率与系统的可靠性。PVE部署LXC运行docker
PVE环境中成功部署了Ubuntu . LXC容器,并配置了docker。首先,确保PVE启用LXC嵌套功能,否则docker运行会遇到问题。接下来,安装vim用于编辑配置文件,虽然它可能不是必需的,但作者个人偏好使用它。
为了提升软件更新和系统下载速度,将默认软件源更改为清华大学的 mirrors.tuna.tsinghua.edu.cn。你可以找到详细的源码镜像配置在提供的链接中。
安装SSH或启用LXC的SSH功能是必要的,以便能够远程连接。随后,按照官方文档安装docker,以确保正确性。为了加速镜像的下载,需要更改docker的镜像源。
测试镜像下载、查看镜像信息、历史记录和搜索官方库是基本操作。在使用过程中,如果镜像被其他容器依赖,删除前需先停止相关容器。此外,可以临时运行docker实例,同时查看并管理所有容器,以及清理无用的镜像。
docker是什么
Docker 是一种开源的应用容器引擎,它允许开发者将应用程序及其依赖关系打包进容器镜像中,这个镜像可以在任何支持 Docker 的操作系统上运行。这些容器镜像包括运行应用程序所需的所有组件,如库、系统工具、代码和运行时环境。
作为软件平台,Docker 支持开发人员快速地构建、测试和部署容器化应用程序。其设计理念源自集装箱,即在大船上通过标准化的集装箱来整齐地装载各种货物,使得不同货物之间的相互影响得到隔离。
Docker 采用客户端-服务器 (C/S) 架构模式,通过远程 API 来管理和创建 Docker 容器。在这种架构中,Docker 守护进程作为服务端,接收并处理客户端的请求,负责容器的创建、运行和管理。客户端和服务端可以运行在同一台机器上,也可以通过 socket 通信或 RESTful API 进行远程通信。
Docker 的起源可以追溯到 PaaS 提供商 dotCloud 开源的一个基于 LXC 的容器引擎。这个项目源代码托管在 Github 上,并且是用 Go 语言编写的,遵循 Apache2.0 协议开源。
å¦ä½è®¡ç®å®¹å¨çCPU使ç¨å¼
å 为çæ§ç³»ç»è°æ´éè¦ï¼éè¦ä»å®¿ä¸»æºè·å容å¨ç CPU 使ç¨çã
以åå¨ç»å®¹å¨åé CPU èµæºçæ¶åï¼æ¯ç»å®æå® CPU çæ¹å¼ï¼é£å®¿ä¸»åªè¦è®¡ç®ä¸å容å¨ç»å®ç CPU 使ç¨çå³å¯ãä½æ¯æè¿å¯¹ CPU èµæºçåé æ¹å¼è¿è¡äºè°æ´ï¼éè¿ CPU使ç¨æ¶é´ çæ¹å¼å¯¹ CPU 使ç¨çè¿è¡éå¶ãï¼éè¿ CPU使ç¨æ¶é´ éå¶æä¸å°ä¼å¿ï¼å¦å¤åæç« ä»ç»ãï¼
åæ¥çæ¹æ³ä¸åéç¨ãæ¢ç¶ Cgroup å¯ä»¥éè¿ CPU æ¶é´å¯¹ CPU èµæºè¿è¡éå¶ï¼é£å¿ ç¶å¨æ个å°æ¹ä¼ç»è®¡ CPU ç使ç¨æ¶é´ãäºæ¯æå¨ç½ç»ä¸æç´¢äºä¸çªï¼å¤§é¨åçç»æé½æ¯åè¯æå¯ä»¥éè¿ä»¥ä¸å½ä»¤è·å容å¨ç CPU 使ç¨çã
æ¾ç¶ï¼ç°å¨ä¸æ¦è¯´å°å®¹å¨ï¼åºæ¬ä¸é½ä¼è®¤ä¸ºè¯´çæ¯ dockerï¼å ¶å®æç¨çæ¯LXCãä¸è¿ä¸ç®¡ææ ·ï¼è®¡ç®æ¹æ³åºè¯¥æ¯ä¸è´çã
æ¸ç´¢ä¸çªï¼åç°å¨ä»¥ä¸è·¯å¾å°±è½æ¾å°ä¸ä¸ªå®¹å¨ï¼è¿éæ¯LXCï¼ç CPU 使ç¨æ¶é´ï¼æ¶é´åä½æ¯çº³ç§ï¼
å©ç¨è¿ä¸ªæ¶é´ï¼å计ç®å®é ç»è¿çæ¶é´ï¼å°±è½å¾åºå¨ä¸æ®µæ¶é´å ï¼CPUç使ç¨çã
PS. éè¿è¿ä¸ªæ¹æ³ï¼ä¸ä» è½è®¡ç®æ´ä¸ª CPU 使ç¨çï¼è¿å¯ä»¥è®¡ç®åºç¨æ·æåå æ ¸æåå«ä½¿ç¨çæ åµï¼å¨ç¹å®æ åµä¼æ´æå©äºäºè§£åºç¨ç¨åºç使ç¨æ åµãï¼è§ cpuacct.usage_sys å cpuacct.usage_user )
CPU使ç¨æ¶é´å°±æ¯ä¸ä¸èæä¸æå°çcgroupæ件ä¸ç cpuacct.usage æ件éçæ¶é´ã
å½åæ¶é´ï¼ä»¥çº³ç§è®¡ç®ï¼å¯ä»¥éè¿ä»¥ä¸å½æ°è·åï¼
åªè¦ä¸¤ä¸ªæ¶é´ç¹çå½åæ¶é´ç¸åï¼å°±å¯ä»¥å¾å°æ»å ±ç»è¿çæ¶é´äºã
è¿ä¸ªç¨åºçæºç ä¹å¯ä»¥è´´åºæ¥ï¼æéè¦çæåä¹å¯ä»¥å»Githubä¸å¯å éï¼
/aaron/lxc-cpu-usage