一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)要介紹了操作系統(tǒng)虛擬化的概念,以及實(shí)現(xiàn)操作系統(tǒng)虛擬化的技術(shù)

Linux愛(ài)好者 ? 2018-01-10 15:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

操作系統(tǒng)級(jí)虛擬化

KVM、XEN等虛擬化技術(shù)允許各個(gè)虛擬機(jī)擁有自己獨(dú)立的操作系統(tǒng)。與KVM、XEN等虛擬化技術(shù)不同,所謂操作系統(tǒng)級(jí)虛擬化,也被稱作容器化,是操作系統(tǒng)自身的一個(gè)特性,它允許多個(gè)相互隔離的用戶空間實(shí)例的存在。這些用戶空間實(shí)例也被稱作為容器。普通的進(jìn)程可以看到計(jì)算機(jī)的所有資源而容器中的進(jìn)程只能看到分配給該容器的資源。通俗來(lái)講,操作系統(tǒng)級(jí)虛擬化將操作系統(tǒng)所管理的計(jì)算機(jī)資源,包括進(jìn)程、文件、設(shè)備、網(wǎng)絡(luò)等分組,然后交給不同的容器使用。容器中運(yùn)行的進(jìn)程只能看到分配給該容器的資源。從而達(dá)到隔離與虛擬化的目的。

實(shí)現(xiàn)操作系統(tǒng)虛擬化需要用到Namespace及cgroups技術(shù)。

命名空間(Namespace)

編程語(yǔ)言中,引入命名空間的概念是為了重用變量名或者服務(wù)例程名。在不同的命名空間中使用同一個(gè)變量名而不會(huì)產(chǎn)生沖突。Linux系統(tǒng)引入命名空間也有類似的作用。例如,在沒(méi)有操作系統(tǒng)級(jí)虛擬化的Linux系統(tǒng)中,用戶態(tài)進(jìn)程從1開始編號(hào)(PID)。引入操作系統(tǒng)虛擬化之后,不同容器有著不同的PID命名空間,每個(gè)容器中的進(jìn)程都可以從1開始編號(hào)而不產(chǎn)生沖突。

目前,Linux中的命名空間有6種類型,分別對(duì)應(yīng)操作系統(tǒng)管理的6種資源:

掛載點(diǎn)(mount point) CLONE_NEWNS

進(jìn)程(pid) CLONE_NEWPID

網(wǎng)絡(luò)(net) CLONE_NEWNET

進(jìn)程間通信(ipc) CLONE_NEWIPC

主機(jī)名(uts) CLONE_NEWUTS

用戶(uid) CLONW_NEWUSER

將來(lái)還會(huì)引入時(shí)間、設(shè)備等對(duì)應(yīng)的namespace.

Linux 2.4.19版本引入了第一個(gè)命名空間——掛載點(diǎn),因?yàn)槟菚r(shí)還沒(méi)有其他類型的命名空間,所以clone系統(tǒng)調(diào)用中引入的flag就叫做CLONE_NEWNS

與命名空間相關(guān)的三個(gè)系統(tǒng)調(diào)用(system calls)

下面3個(gè)系統(tǒng)調(diào)用用來(lái)操作命名空間:

clone() —— 用來(lái)創(chuàng)建新的進(jìn)程及新的命名空間,新的進(jìn)程會(huì)被放到新的命名空間中

unshare() —— 創(chuàng)建新的命名空間但并不創(chuàng)建新的子進(jìn)程,之后創(chuàng)建的子進(jìn)程會(huì)被放到新創(chuàng)建的命名空間中去

setns() —— 將進(jìn)程加入到已經(jīng)存在的命名空間中

注意:這3個(gè)系統(tǒng)調(diào)用都不會(huì)改變調(diào)用進(jìn)程(calling process)的pid命名空間,而是會(huì)影響其子進(jìn)程的pid命名空間

命名空間本身并沒(méi)用名字(囧),不同的命名空間用不同的inode號(hào)來(lái)標(biāo)識(shí),這也符合Linux用文件一統(tǒng)天下的慣例??梢栽趐roc文件系統(tǒng)中查看一個(gè)進(jìn)程所屬的命名空間,例如,查看PID為4123的進(jìn)程所屬的命名空間:

kelvin@desktop:~$ls -l /proc/4123/ns/

總用量0

lrwxrwxrwx1kelvin kelvin012月2616:28cgroup -> cgroup:[4026531835]

lrwxrwxrwx1kelvin kelvin012月2616:28ipc -> ipc:[4026531839]

lrwxrwxrwx1kelvin kelvin012月2616:28mnt -> mnt:[4026531840]

lrwxrwxrwx1kelvin kelvin012月2616:28net -> net:[4026531963]

lrwxrwxrwx1kelvin kelvin012月2616:28pid -> pid:[4026531836]

lrwxrwxrwx1kelvin kelvin012月2616:28user -> user:[4026531837]

lrwxrwxrwx1kelvin kelvin012月2616:28uts -> uts:[4026531838]

下面的代碼演示了如何利用上述3個(gè)系統(tǒng)調(diào)用來(lái)操作進(jìn)程的命名空間:

#define _GNU_SOURCE

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define STACK_SIZE (10 * 1024 * 1024)

charchild_stack[STACK_SIZE];

intchild_main(void* args){

pid_t child_pid = getpid();

printf("I'm child process and my pid is %d \n",child_pid);

// 子進(jìn)程會(huì)被放到clone系統(tǒng)調(diào)用新創(chuàng)建的pid命名空間中, 所以其pid應(yīng)該為1

sleep(300);

// 命名空間中的所有進(jìn)程退出后該命名空間的inode將會(huì)被刪除, 為后續(xù)操作保留它

return0;

}

intmain(){

/* Clone */

pid_t child_pid = clone(child_main,child_stack + STACK_SIZE,\

CLONE_NEWPID | SIGCHLD,NULL);

if(child_pid < 0){

perror("clone failed");

}

/* Unshare */

intret = unshare(CLONE_NEWPID);// 父進(jìn)程調(diào)用unshare, 創(chuàng)建了一個(gè)新的命名空間,

//但不會(huì)創(chuàng)建子進(jìn)程. 之后再創(chuàng)建的子進(jìn)程將會(huì)被加入到新的命名空間中

if(ret < 0){

perror("unshare failed");

}

intfpid = fork();

if(fpid < 0){

perror("fork error");

}elseif(fpid == 0){

printf("I am child process. My pid is %d\n",getpid());

// Fork后的子進(jìn)程會(huì)被加入到unshare創(chuàng)建的命名空間中, 所以pid應(yīng)該為1

exit(0);

}else{

}

waitpid(fpid,NULL,0);

/* Setns */

charpath[80] = "";

sprintf(path,"/proc/%d/ns/pid",child_pid);

intfd = open(path,O_RDONLY);

if(fd == -1)

perror("open error");

if(setns(fd,0) == -1)

// setns并不會(huì)改變當(dāng)前進(jìn)程的命名空間, 而是會(huì)設(shè)置之后創(chuàng)建的子進(jìn)程的命名空間

perror("setns error");

close(fd);

intnpid = fork();

if(npid < 0){

perror("fork error");

}elseif(npid == 0){

printf("I am child process. My pid is %d\n",getpid());

// 新的子進(jìn)程會(huì)被加入到第一個(gè)子進(jìn)程的pid命名空間中, 所以其pid應(yīng)該為2

exit(0);

}else{

}

return0;

}

運(yùn)行結(jié)果:

$sudo./ns

I'mchildprocess andmy pid is1

Iam childprocess.My pid is1

Iam childprocess.My pid is2

控制組(Cgroups)

如果說(shuō)命名空間是從命名和編號(hào)的角度進(jìn)行隔離,而控制組則是將進(jìn)程進(jìn)行分組,并真正的將各組進(jìn)程的計(jì)算資源進(jìn)行限制、隔離??刂平M是一種內(nèi)核機(jī)制,它可以對(duì)進(jìn)程進(jìn)行分組、跟蹤限制其使用的計(jì)算資源。對(duì)于每一類計(jì)算資源,控制組通過(guò)所謂的子系統(tǒng)(subsystem)來(lái)進(jìn)行控制,現(xiàn)階段已有的子系統(tǒng)包括:

cpusets: 用來(lái)分配一組CPU給指定的cgroup,該cgroup中的進(jìn)程只等被調(diào)度到該組CPU上去執(zhí)行

blkio : 限制cgroup的塊IO

cpuacct : 用來(lái)統(tǒng)計(jì)cgroup中的CPU使用

devices : 用來(lái)黑白名單的方式控制cgroup可以創(chuàng)建和使用的設(shè)備節(jié)點(diǎn)

freezer : 用來(lái)掛起指定的cgroup,或者喚醒掛起的cgroup

hugetlb : 用來(lái)限制cgroup中hugetlb的使用

memory : 用來(lái)跟蹤限制內(nèi)存及交換分區(qū)的使用

net_cls : 用來(lái)根據(jù)發(fā)送端的cgroup來(lái)標(biāo)記數(shù)據(jù)包,流量控制器(traffic controller)會(huì)根據(jù)這些標(biāo)記來(lái)分配優(yōu)先級(jí)

net_prio : 用來(lái)設(shè)置cgroup的網(wǎng)絡(luò)通信優(yōu)先級(jí)

cpu :用來(lái)設(shè)置cgroup中CPU的調(diào)度參數(shù)

perf_event : 用來(lái)監(jiān)控cgroup的CPU性能

與命名空間不同,控制組并沒(méi)有增加系統(tǒng)調(diào)用,而是實(shí)現(xiàn)了一個(gè)文件系統(tǒng),通過(guò)文件及目錄操作來(lái)管理控制組。下面通過(guò)一個(gè)例子來(lái)看一看cgroup是如何利用cpuset子系統(tǒng)來(lái)把進(jìn)程綁定到指定的CPU上去執(zhí)行的。

1. 創(chuàng)建一個(gè)一直執(zhí)行的shell腳本

#!/bin/bash

x=0

while[True];do

done;

2. 在后臺(tái)執(zhí)行這個(gè)腳本

# bash run.sh &

[1]20553

3. 查看該腳本在哪個(gè)CPU上運(yùn)行

# ps -eLo ruser,lwp,psr,args | grep 20553 | grep -v grep

root 20553 3bash run.sh

可以看到PID為20553的進(jìn)程運(yùn)行在編號(hào)為3的CPU上,下面利用cgroups將其綁定到編號(hào)為2的CPU上去執(zhí)行

4. 掛載cgroups類型的文件系統(tǒng)到一個(gè)新創(chuàng)建的目錄cgroups中

# mkdir cgroups

# mount -t cgroup -o cpuset cgroups ./cgroups/

# ls cgroups/

cgroup.clone_children cpuset.memory_pressure_enabled

cgroup.procscpuset.memory_spread_page

cgroup.sane_behaviorcpuset.memory_spread_slab

cpuset.cpu_exclusivecpuset.mems

cpuset.cpus cpuset.sched_load_balance

cpuset.effective_cpus cpuset.sched_relax_domain_level

cpuset.effective_mems docker

cpuset.mem_exclusivetasks

cpuset.mem_hardwall notify_on_release

cpuset.memory_migrate release_agent

cpuset.memory_pressure

5. 創(chuàng)建一個(gè)新的組group0

# mkdir group0

# ls group0/

cgroup.clone_childrencpuset.mem_exclusive cpuset.mems

cgroup.procs cpuset.mem_hardwallcpuset.sched_load_balance

cpuset.cpu_exclusive cpuset.memory_migratecpuset.sched_relax_domain_level

cpuset.cpuscpuset.memory_pressure notify_on_release

cpuset.effective_cpuscpuset.memory_spread_pagetasks

cpuset.effective_memscpuset.memory_spread_slab

6. 將上面的進(jìn)程20553加入到新建的控制組中:

# echo 20553 >> group0/tasks

# cat group0/tasks

20553

7. 限制該組的進(jìn)程只能運(yùn)行在編號(hào)為2的CPU上

# echo 2 > group0/cpuset.cpus

# cat group0/cpuset.cpus

2

8. 查看PID為20553的進(jìn)程所運(yùn)行的CPU編號(hào)

# ps -eLo ruser,lwp,psr,args | grep 20553 | grep -v grep

root 20553 2bash run.sh

上面的例子簡(jiǎn)單的展示了如何使用控制組。控制組通過(guò)文件和目錄來(lái)操作,文件系統(tǒng)又是樹形結(jié)構(gòu),因此如果不對(duì)cgroups的使用做一些限制的話,配置會(huì)變得異常復(fù)雜和混亂。因此,在新版的cgroups中做了一些限制。

小結(jié)

本文簡(jiǎn)要介紹了操作系統(tǒng)虛擬化的概念,以及實(shí)現(xiàn)操作系統(tǒng)虛擬化的技術(shù)——命名空間及控制組。并通過(guò)兩個(gè)簡(jiǎn)單的例子演示了命名空間及控制組的使用方法。
簡(jiǎn)要介紹了操作系統(tǒng)虛擬化的概念,以及實(shí)現(xiàn)操作系統(tǒng)虛擬化的技術(shù)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 虛擬化
    +關(guān)注

    關(guān)注

    1

    文章

    400

    瀏覽量

    30242
  • 命名空間
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    1897
  • 控制組
    +關(guān)注

    關(guān)注

    0

    文章

    1

    瀏覽量

    1277

原文標(biāo)題:操作系統(tǒng)級(jí)虛擬化概述

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    常見(jiàn)嵌入式操作系統(tǒng)介紹

    常見(jiàn)嵌入式操作系統(tǒng)介紹其實(shí),嵌入式系統(tǒng)并不是一個(gè)新生的事物,從八十年代起,國(guó)際上就有一些IT組織、公司,開始進(jìn)行商用嵌入式系統(tǒng)和專用操作系統(tǒng)
    發(fā)表于 08-12 00:31

    什么是QNX操作系統(tǒng)

    QNX是一個(gè)實(shí)時(shí)的、可擴(kuò)充的操作系統(tǒng);它部分遵循POSIX相關(guān)標(biāo)準(zhǔn),如POSIX.1b 實(shí)時(shí)擴(kuò)展;它提供一個(gè)很小的微內(nèi)核以及一些可選的配合進(jìn)程。其內(nèi)核僅提供4種服務(wù):進(jìn)程調(diào)度、進(jìn)程間通信、底層
    發(fā)表于 06-07 14:16

    實(shí)時(shí)操作系統(tǒng)概念

    對(duì)很多嵌入式系統(tǒng)來(lái)說(shuō),一個(gè)設(shè)計(jì)良好的實(shí)時(shí)操作系統(tǒng)可以讓開發(fā)工程師把握系統(tǒng)執(zhí)行任何任務(wù)或響應(yīng)任何關(guān)鍵事件的時(shí)間,滿足系統(tǒng)實(shí)時(shí)性要求。為了理解RTOS如何通過(guò)
    發(fā)表于 07-19 06:18

    Linux上的虛擬技術(shù)歷史回顧

    虛擬技術(shù)的應(yīng)用十分廣泛. 當(dāng)前虛擬技術(shù)主要關(guān)注于服務(wù)器的
    發(fā)表于 07-22 07:18

    幾種主要的虛擬技術(shù)有什么不同?

    虛擬技術(shù)作為建設(shè)綠色數(shù)據(jù)中心的一項(xiàng)重要技術(shù),一直在不斷發(fā)展完善,其應(yīng)用領(lǐng)域包括操作系統(tǒng)、服務(wù)器、存儲(chǔ)
    發(fā)表于 08-14 06:52

    掌握Linux操作系統(tǒng)虛擬機(jī)定制安裝

    、實(shí)驗(yàn)內(nèi)容和原理實(shí)驗(yàn)內(nèi)容:利用虛擬機(jī)軟件定制安裝Linux操作系統(tǒng),熟悉安裝過(guò)程中各個(gè)選項(xiàng)的意義。實(shí)驗(yàn)原理:虛擬機(jī)可以說(shuō)是一種軟件,也可以說(shuō)是一種技術(shù),它允許用戶在一臺(tái)主機(jī)上
    發(fā)表于 12-16 08:10

    什么是計(jì)算機(jī)虛擬

    長(zhǎng)期從事嵌入式軟件研制的單位。 隨著虛擬技術(shù)發(fā)展, 公司決策層決定在公司原有嵌入式實(shí)時(shí)操作系統(tǒng)基礎(chǔ)上, 研制具備虛擬
    發(fā)表于 12-21 06:42

    簡(jiǎn)要分析AArch64的虛擬

    上一篇介紹虛擬和hypervisor的基本概念。為了配合虛擬
    發(fā)表于 03-30 10:36

    ARM的虛擬技術(shù)是什么?如何去實(shí)現(xiàn)

    主流的操作系統(tǒng)都有一個(gè)假設(shè),就是這個(gè)系統(tǒng)有一個(gè)特權(quán)模式之下的OS,之上在跑多個(gè)非特權(quán)模式的APP;而ARM的虛擬技術(shù)就是在同一個(gè)
    發(fā)表于 05-09 09:55

    虛擬機(jī)內(nèi)存及云計(jì)算虛擬技術(shù)的研究

    及 HttpDisk.c,通過(guò)分析操作系統(tǒng)內(nèi)核,研究云計(jì)算原理、體系結(jié)構(gòu),以及云計(jì)算實(shí)現(xiàn)技術(shù)基礎(chǔ),從硬件的虛擬
    發(fā)表于 11-14 17:17 ?12次下載
    <b class='flag-5'>虛擬</b>機(jī)內(nèi)存及云計(jì)算<b class='flag-5'>虛擬</b><b class='flag-5'>化</b><b class='flag-5'>技術(shù)</b>的研究

    對(duì)虛擬操作系統(tǒng)進(jìn)行實(shí)時(shí)性調(diào)度的解決方案介紹

    目前,虛擬操作系統(tǒng)(hypervisor)廣泛應(yīng)用于服務(wù)器、PC機(jī)等,這些應(yīng)用領(lǐng)域?qū)?shí)時(shí)性要求較低。隨著一些嵌入式實(shí)時(shí)應(yīng)用領(lǐng)域的發(fā)展,比如下一代手機(jī)對(duì)安全性、應(yīng)用聚合和云計(jì)算等方面的需求,需要采用
    的頭像 發(fā)表于 04-25 08:10 ?2473次閱讀
    對(duì)<b class='flag-5'>虛擬</b><b class='flag-5'>化</b><b class='flag-5'>操作系統(tǒng)</b>進(jìn)行實(shí)時(shí)性調(diào)度的解決方案<b class='flag-5'>介紹</b>

    歐拉(openEuler)麒麟信安專場(chǎng):麒麟信安操作系統(tǒng)具有實(shí)時(shí)虛擬特性

    歐拉(openEuler)麒麟信安專場(chǎng):麒麟信安操作系統(tǒng)具有實(shí)時(shí)虛擬特性
    的頭像 發(fā)表于 11-09 15:25 ?1839次閱讀
    歐拉(openEuler)麒麟信安專場(chǎng):麒麟信安<b class='flag-5'>操作系統(tǒng)</b>具有實(shí)時(shí)<b class='flag-5'>虛擬</b><b class='flag-5'>化</b>特性

    云計(jì)算中的虛擬技術(shù)應(yīng)用

    : 一、虛擬技術(shù)的核心原理 虛擬技術(shù)通過(guò)引入一個(gè)虛擬
    的頭像 發(fā)表于 10-24 09:22 ?1850次閱讀

    如何在windows上emulate不同操作系統(tǒng)

    一、虛擬技術(shù)概述 虛擬技術(shù)允許在單個(gè)物理機(jī)器上創(chuàng)建多個(gè)
    的頭像 發(fā)表于 12-05 15:50 ?859次閱讀

    鴻道Intewell操作系統(tǒng):人形機(jī)器人底層操作系統(tǒng)

    操作系統(tǒng)的實(shí)時(shí)性賦能東土科技的鴻道(Intewell)工業(yè)操作系統(tǒng)作為國(guó)內(nèi)唯一通過(guò)汽車、工業(yè)控制、醫(yī)療、軌道交通四項(xiàng)功能安全認(rèn)證的系統(tǒng),為標(biāo)準(zhǔn)體系中的技術(shù)層架構(gòu)提供
    的頭像 發(fā)表于 05-16 14:44 ?234次閱讀