精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡要介紹了操作系統虛擬化的概念,以及實現操作系統虛擬化的技術

Linux愛好者 ? 2018-01-10 15:00 ? 次閱讀

操作系統級虛擬化

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

實現操作系統虛擬化需要用到Namespace及cgroups技術。

命名空間(Namespace)

編程語言中,引入命名空間的概念是為了重用變量名或者服務例程名。在不同的命名空間中使用同一個變量名而不會產生沖突。Linux系統引入命名空間也有類似的作用。例如,在沒有操作系統級虛擬化的Linux系統中,用戶態進程從1開始編號(PID)。引入操作系統虛擬化之后,不同容器有著不同的PID命名空間,每個容器中的進程都可以從1開始編號而不產生沖突。

目前,Linux中的命名空間有6種類型,分別對應操作系統管理的6種資源:

掛載點(mount point) CLONE_NEWNS

進程(pid) CLONE_NEWPID

網絡(net) CLONE_NEWNET

進程間通信(ipc) CLONE_NEWIPC

主機名(uts) CLONE_NEWUTS

用戶(uid) CLONW_NEWUSER

將來還會引入時間、設備等對應的namespace.

Linux 2.4.19版本引入了第一個命名空間——掛載點,因為那時還沒有其他類型的命名空間,所以clone系統調用中引入的flag就叫做CLONE_NEWNS

與命名空間相關的三個系統調用(system calls)

下面3個系統調用用來操作命名空間:

clone() —— 用來創建新的進程及新的命名空間,新的進程會被放到新的命名空間中

unshare() —— 創建新的命名空間但并不創建新的子進程,之后創建的子進程會被放到新創建的命名空間中去

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

注意:這3個系統調用都不會改變調用進程(calling process)的pid命名空間,而是會影響其子進程的pid命名空間

命名空間本身并沒用名字(囧),不同的命名空間用不同的inode號來標識,這也符合Linux用文件一統天下的慣例。可以在proc文件系統中查看一個進程所屬的命名空間,例如,查看PID為4123的進程所屬的命名空間:

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個系統調用來操作進程的命名空間:

#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);

// 子進程會被放到clone系統調用新創建的pid命名空間中, 所以其pid應該為1

sleep(300);

// 命名空間中的所有進程退出后該命名空間的inode將會被刪除, 為后續操作保留它

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);// 父進程調用unshare, 創建了一個新的命名空間,

//但不會創建子進程. 之后再創建的子進程將會被加入到新的命名空間中

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后的子進程會被加入到unshare創建的命名空間中, 所以pid應該為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并不會改變當前進程的命名空間, 而是會設置之后創建的子進程的命名空間

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());

// 新的子進程會被加入到第一個子進程的pid命名空間中, 所以其pid應該為2

exit(0);

}else{

}

return0;

}

運行結果:

$sudo./ns

I'mchildprocess andmy pid is1

Iam childprocess.My pid is1

Iam childprocess.My pid is2

控制組(Cgroups)

如果說命名空間是從命名和編號的角度進行隔離,而控制組則是將進程進行分組,并真正的將各組進程的計算資源進行限制、隔離。控制組是一種內核機制,它可以對進程進行分組、跟蹤限制其使用的計算資源。對于每一類計算資源,控制組通過所謂的子系統(subsystem)來進行控制,現階段已有的子系統包括:

cpusets: 用來分配一組CPU給指定的cgroup,該cgroup中的進程只等被調度到該組CPU上去執行

blkio : 限制cgroup的塊IO

cpuacct : 用來統計cgroup中的CPU使用

devices : 用來黑白名單的方式控制cgroup可以創建和使用的設備節點

freezer : 用來掛起指定的cgroup,或者喚醒掛起的cgroup

hugetlb : 用來限制cgroup中hugetlb的使用

memory : 用來跟蹤限制內存及交換分區的使用

net_cls : 用來根據發送端的cgroup來標記數據包,流量控制器(traffic controller)會根據這些標記來分配優先級

net_prio : 用來設置cgroup的網絡通信優先級

cpu :用來設置cgroup中CPU的調度參數

perf_event : 用來監控cgroup的CPU性能

與命名空間不同,控制組并沒有增加系統調用,而是實現了一個文件系統,通過文件及目錄操作來管理控制組。下面通過一個例子來看一看cgroup是如何利用cpuset子系統來把進程綁定到指定的CPU上去執行的。

1. 創建一個一直執行的shell腳本

#!/bin/bash

x=0

while[True];do

done;

2. 在后臺執行這個腳本

# bash run.sh &

[1]20553

3. 查看該腳本在哪個CPU上運行

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

root 20553 3bash run.sh

可以看到PID為20553的進程運行在編號為3的CPU上,下面利用cgroups將其綁定到編號為2的CPU上去執行

4. 掛載cgroups類型的文件系統到一個新創建的目錄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. 創建一個新的組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. 將上面的進程20553加入到新建的控制組中:

# echo 20553 >> group0/tasks

# cat group0/tasks

20553

7. 限制該組的進程只能運行在編號為2的CPU上

# echo 2 > group0/cpuset.cpus

# cat group0/cpuset.cpus

2

8. 查看PID為20553的進程所運行的CPU編號

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

root 20553 2bash run.sh

上面的例子簡單的展示了如何使用控制組。控制組通過文件和目錄來操作,文件系統又是樹形結構,因此如果不對cgroups的使用做一些限制的話,配置會變得異常復雜和混亂。因此,在新版的cgroups中做了一些限制。

小結

本文簡要介紹了操作系統虛擬化的概念,以及實現操作系統虛擬化的技術——命名空間及控制組。并通過兩個簡單的例子演示了命名空間及控制組的使用方法。
簡要介紹了操作系統虛擬化的概念,以及實現操作系統虛擬化的技術

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 虛擬化
    +關注

    關注

    1

    文章

    368

    瀏覽量

    29775
  • 命名空間
    +關注

    關注

    0

    文章

    3

    瀏覽量

    1842
  • 控制組
    +關注

    關注

    0

    文章

    1

    瀏覽量

    1250

原文標題:操作系統級虛擬化概述

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    常見嵌入式操作系統介紹

    常見嵌入式操作系統介紹其實,嵌入式系統并不是一個新生的事物,從八十年代起,國際上就有一些IT組織、公司,開始進行商用嵌入式系統和專用操作系統
    發表于 08-12 00:31

    什么是QNX操作系統

    QNX是一個實時的、可擴充的操作系統;它部分遵循POSIX相關標準,如POSIX.1b 實時擴展;它提供一個很小的微內核以及一些可選的配合進程。其內核僅提供4種服務:進程調度、進程間通信、底層
    發表于 06-07 14:16

    實時操作系統概念

    對很多嵌入式系統來說,一個設計良好的實時操作系統可以讓開發工程師把握系統執行任何任務或響應任何關鍵事件的時間,滿足系統實時性要求。為了理解RTOS如何通過
    發表于 07-19 06:18

    Linux上的虛擬技術歷史回顧

    虛擬技術的應用十分廣泛. 當前虛擬技術主要關注于服務器的
    發表于 07-22 07:18

    幾種主要的虛擬技術有什么不同?

    虛擬技術作為建設綠色數據中心的一項重要技術,一直在不斷發展完善,其應用領域包括操作系統、服務器、存儲
    發表于 08-14 06:52

    操作系統的重要性如何?

    明白你學習操作系統的目的是什么?操作系統的重要性如何?學習操作系統會給我帶來什么?下面我會從這幾個方面為你回答下。操作系統也是一種軟件,但是操作系統
    發表于 07-23 08:26

    掌握Linux操作系統虛擬機定制安裝

    、實驗內容和原理實驗內容:利用虛擬機軟件定制安裝Linux操作系統,熟悉安裝過程中各個選項的意義。實驗原理:虛擬機可以說是一種軟件,也可以說是一種技術,它允許用戶在一臺主機上
    發表于 12-16 08:10

    什么是計算機虛擬

    長期從事嵌入式軟件研制的單位。 隨著虛擬技術發展, 公司決策層決定在公司原有嵌入式實時操作系統基礎上, 研制具備虛擬
    發表于 12-21 06:42

    簡要分析AArch64的虛擬

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

    ARM的虛擬技術是什么?如何去實現

    主流的操作系統都有一個假設,就是這個系統有一個特權模式之下的OS,之上在跑多個非特權模式的APP;而ARM的虛擬技術就是在同一個
    發表于 05-09 09:55

    基于嵌入式操作系統VxWorks的戰車虛擬儀表顯示技術分析

    基于嵌入式操作系統VxWorks的戰車虛擬儀表顯示技術分析
    發表于 03-29 12:27 ?22次下載

    虛擬機內存及云計算虛擬技術的研究

    及 HttpDisk.c,通過分析操作系統內核,研究云計算原理、體系結構,以及云計算實現技術基礎,從硬件的虛擬
    發表于 11-14 17:17 ?12次下載
    <b class='flag-5'>虛擬</b>機內存及云計算<b class='flag-5'>虛擬</b><b class='flag-5'>化</b><b class='flag-5'>技術</b>的研究

    虛擬操作系統進行實時性調度的解決方案介紹

    目前,虛擬操作系統(hypervisor)廣泛應用于服務器、PC機等,這些應用領域對實時性要求較低。隨著一些嵌入式實時應用領域的發展,比如下一代手機對安全性、應用聚合和云計算等方面的需求,需要采用
    的頭像 發表于 04-25 08:10 ?2182次閱讀
    對<b class='flag-5'>虛擬</b><b class='flag-5'>化</b><b class='flag-5'>操作系統</b>進行實時性調度的解決方案<b class='flag-5'>介紹</b>

    歐拉(openEuler)麒麟信安專場:麒麟信安操作系統具有實時虛擬特性

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

    云計算中的虛擬技術應用

    : 一、虛擬技術的核心原理 虛擬技術通過引入一個虛擬
    的頭像 發表于 10-24 09:22 ?393次閱讀