From 97bcc22bfcf660dc6b588c065948a4f361070150 Mon Sep 17 00:00:00 2001 From: amyMaYun Date: Sat, 21 Mar 2020 16:08:20 +0800 Subject: [PATCH 1/4] =?UTF-8?q?openEuler=2020.03=20LTS=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=96=B0=E5=A2=9EA-Tune=E7=94=A8=E6=88=B7=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/zh/docs/A-Tune/A-Tune.md | 1 + content/zh/docs/A-Tune/analysis.md | 45 ++ content/zh/docs/A-Tune/check.md | 32 ++ content/zh/docs/A-Tune/collection.md | 70 +++ content/zh/docs/A-Tune/define.md | 49 ++ .../A-Tune/figures/zh-cn_image_0213178479.png | Bin 0 -> 1607 bytes .../A-Tune/figures/zh-cn_image_0213178480.png | Bin 0 -> 1858 bytes .../A-Tune/figures/zh-cn_image_0214540398.png | Bin 0 -> 29933 bytes .../A-Tune/figures/zh-cn_image_0227497000.png | Bin 0 -> 186566 bytes .../A-Tune/figures/zh-cn_image_0227497343.png | Bin 0 -> 66620 bytes .../A-Tune/figures/zh-cn_image_0231122163.png | Bin 0 -> 12992 bytes content/zh/docs/A-Tune/info.md | 95 ++++ content/zh/docs/A-Tune/list.md | 43 ++ content/zh/docs/A-Tune/profile.md | 22 + .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../A-Tune/public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../A-Tune/public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes content/zh/docs/A-Tune/rollback.md | 16 + content/zh/docs/A-Tune/train.md | 43 ++ content/zh/docs/A-Tune/tuning.md | 465 ++++++++++++++++++ content/zh/docs/A-Tune/undefine.md | 18 + content/zh/docs/A-Tune/update.md | 18 + content/zh/docs/A-Tune/upgrade.md | 25 + ...77\347\224\250\346\226\271\346\263\225.md" | 3 + ...66\350\207\252\344\274\230\345\214\226.md" | 1 + .../docs/A-Tune/\345\211\215\350\250\200.md" | 36 ++ ...60\350\207\252\350\260\203\344\274\230.md" | 3 + .../A-Tune/\345\220\257\345\212\250A-Tune.md" | 22 + .../\345\233\236\346\273\232profile.md" | 1 + .../A-Tune/\345\256\211\350\243\205A-Tune.md" | 3 + ...05\344\270\216\351\203\250\347\275\262.md" | 3 + ...11\350\243\205\346\223\215\344\275\234.md" | 53 ++ ...41\345\274\217\344\273\213\347\273\215.md" | 17 + ...43\345\206\263\346\226\271\346\263\225.md" | 55 +++ ...73\344\275\223\350\257\264\346\230\216.md" | 17 + ...32\345\212\241\346\250\241\345\236\213.md" | 146 ++++++ .../\346\233\264\346\226\260profile.md" | 3 + ...60\346\225\260\346\215\256\345\272\223.md" | 1 + ...14\347\274\251\347\225\245\350\257\255.md" | 24 + .../docs/A-Tune/\346\236\266\346\236\204.md" | 10 + .../\346\237\245\350\257\242profile.md" | 2 + ...37\350\275\275\347\261\273\345\236\213.md" | 1 + ...25\345\276\213\347\224\263\346\230\216.md" | 14 + .../\346\277\200\346\264\273profile.md" | 1 + ...57\345\242\203\345\207\206\345\244\207.md" | 4 + .../docs/A-Tune/\347\256\200\344\273\213.md" | 14 + ...41\346\201\257\346\237\245\350\257\242.md" | 1 + ...32\344\271\211\346\250\241\345\236\213.md" | 10 + .../A-Tune/\350\256\244\350\257\206A-Tune.md" | 1 + ...54\344\273\266\350\246\201\346\261\202.md" | 10 + .../A-Tune/\351\203\250\347\275\262A-Tune.md" | 3 + ...15\347\275\256\344\273\213\347\273\215.md" | 101 ++++ .../docs/A-Tune/\351\231\204\345\275\225.md" | 2 + content/zh/menu/index.md | 60 +++ 57 files changed, 1564 insertions(+) create mode 100644 content/zh/docs/A-Tune/A-Tune.md create mode 100644 content/zh/docs/A-Tune/analysis.md create mode 100644 content/zh/docs/A-Tune/check.md create mode 100644 content/zh/docs/A-Tune/collection.md create mode 100644 content/zh/docs/A-Tune/define.md create mode 100644 content/zh/docs/A-Tune/figures/zh-cn_image_0213178479.png create mode 100644 content/zh/docs/A-Tune/figures/zh-cn_image_0213178480.png create mode 100644 content/zh/docs/A-Tune/figures/zh-cn_image_0214540398.png create mode 100644 content/zh/docs/A-Tune/figures/zh-cn_image_0227497000.png create mode 100644 content/zh/docs/A-Tune/figures/zh-cn_image_0227497343.png create mode 100644 content/zh/docs/A-Tune/figures/zh-cn_image_0231122163.png create mode 100644 content/zh/docs/A-Tune/info.md create mode 100644 content/zh/docs/A-Tune/list.md create mode 100644 content/zh/docs/A-Tune/profile.md create mode 100644 content/zh/docs/A-Tune/public_sys-resources/icon-caution.gif create mode 100644 content/zh/docs/A-Tune/public_sys-resources/icon-danger.gif create mode 100644 content/zh/docs/A-Tune/public_sys-resources/icon-note.gif create mode 100644 content/zh/docs/A-Tune/public_sys-resources/icon-notice.gif create mode 100644 content/zh/docs/A-Tune/public_sys-resources/icon-tip.gif create mode 100644 content/zh/docs/A-Tune/public_sys-resources/icon-warning.gif create mode 100644 content/zh/docs/A-Tune/rollback.md create mode 100644 content/zh/docs/A-Tune/train.md create mode 100644 content/zh/docs/A-Tune/tuning.md create mode 100644 content/zh/docs/A-Tune/undefine.md create mode 100644 content/zh/docs/A-Tune/update.md create mode 100644 content/zh/docs/A-Tune/upgrade.md create mode 100644 "content/zh/docs/A-Tune/\344\275\277\347\224\250\346\226\271\346\263\225.md" create mode 100644 "content/zh/docs/A-Tune/\345\210\206\346\236\220\350\264\237\350\275\275\347\261\273\345\236\213\345\271\266\350\207\252\344\274\230\345\214\226.md" create mode 100644 "content/zh/docs/A-Tune/\345\211\215\350\250\200.md" create mode 100644 "content/zh/docs/A-Tune/\345\217\202\346\225\260\350\207\252\350\260\203\344\274\230.md" create mode 100644 "content/zh/docs/A-Tune/\345\220\257\345\212\250A-Tune.md" create mode 100644 "content/zh/docs/A-Tune/\345\233\236\346\273\232profile.md" create mode 100644 "content/zh/docs/A-Tune/\345\256\211\350\243\205A-Tune.md" create mode 100644 "content/zh/docs/A-Tune/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" create mode 100644 "content/zh/docs/A-Tune/\345\256\211\350\243\205\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/A-Tune/\345\256\211\350\243\205\346\250\241\345\274\217\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/A-Tune/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" create mode 100644 "content/zh/docs/A-Tune/\346\200\273\344\275\223\350\257\264\346\230\216.md" create mode 100644 "content/zh/docs/A-Tune/\346\224\257\346\214\201\347\211\271\346\200\247\344\270\216\344\270\232\345\212\241\346\250\241\345\236\213.md" create mode 100644 "content/zh/docs/A-Tune/\346\233\264\346\226\260profile.md" create mode 100644 "content/zh/docs/A-Tune/\346\233\264\346\226\260\346\225\260\346\215\256\345\272\223.md" create mode 100644 "content/zh/docs/A-Tune/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" create mode 100644 "content/zh/docs/A-Tune/\346\236\266\346\236\204.md" create mode 100644 "content/zh/docs/A-Tune/\346\237\245\350\257\242profile.md" create mode 100644 "content/zh/docs/A-Tune/\346\237\245\350\257\242\350\264\237\350\275\275\347\261\273\345\236\213.md" create mode 100644 "content/zh/docs/A-Tune/\346\263\225\345\276\213\347\224\263\346\230\216.md" create mode 100644 "content/zh/docs/A-Tune/\346\277\200\346\264\273profile.md" create mode 100644 "content/zh/docs/A-Tune/\347\216\257\345\242\203\345\207\206\345\244\207.md" create mode 100644 "content/zh/docs/A-Tune/\347\256\200\344\273\213.md" create mode 100644 "content/zh/docs/A-Tune/\347\263\273\347\273\237\344\277\241\346\201\257\346\237\245\350\257\242.md" create mode 100644 "content/zh/docs/A-Tune/\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213.md" create mode 100644 "content/zh/docs/A-Tune/\350\256\244\350\257\206A-Tune.md" create mode 100644 "content/zh/docs/A-Tune/\350\275\257\347\241\254\344\273\266\350\246\201\346\261\202.md" create mode 100644 "content/zh/docs/A-Tune/\351\203\250\347\275\262A-Tune.md" create mode 100644 "content/zh/docs/A-Tune/\351\205\215\347\275\256\344\273\213\347\273\215.md" create mode 100644 "content/zh/docs/A-Tune/\351\231\204\345\275\225.md" diff --git a/content/zh/docs/A-Tune/A-Tune.md b/content/zh/docs/A-Tune/A-Tune.md new file mode 100644 index 000000000..6fa93cc92 --- /dev/null +++ b/content/zh/docs/A-Tune/A-Tune.md @@ -0,0 +1 @@ +本文档介绍openEuler系统性能自优化软件A-Tune的安装部署和使用方法,以指导用户快速了解并使用A-Tune。 \ No newline at end of file diff --git a/content/zh/docs/A-Tune/analysis.md b/content/zh/docs/A-Tune/analysis.md new file mode 100644 index 000000000..d6263be50 --- /dev/null +++ b/content/zh/docs/A-Tune/analysis.md @@ -0,0 +1,45 @@ +# analysis + +## 功能描述 + +采集系统的实时统计数据进行负载类型识别,并进行自动优化。 + +## 命令格式 + +**atune-adm analysis** \[OPTIONS\] + +## 参数说明 + +- OPTIONS + + + + + + + + + + +

参数

+

描述

+

--model, -m

+

用户自训练产生的新模型

+
+ + +## 使用示例 + +- 使用默认的模型进行分类识别 + + ``` + # atune-adm analysis + ``` + +- 使用自训练的模型进行识别 + + ``` + # atune-adm analysis --model /usr/libexec/atuned/analysis/models/new-model.m + ``` + + diff --git a/content/zh/docs/A-Tune/check.md b/content/zh/docs/A-Tune/check.md new file mode 100644 index 000000000..3baa376dd --- /dev/null +++ b/content/zh/docs/A-Tune/check.md @@ -0,0 +1,32 @@ +# check + +## 功能描述 + +检查系统当前的cpu、bios、os、网卡等信息。 + +## 命令格式 + +**atune-adm check** + +## 使用示例 + +``` +# atune-adm check + cpu information: + cpu:0 version: Kunpeng 920-6426 speed: 2600000000 HZ cores: 64 + cpu:1 version: Kunpeng 920-6426 speed: 2600000000 HZ cores: 64 + system information: + DMIBIOSVersion: 0.59 + OSRelease: 4.19.36-vhulk1906.3.0.h356.eulerosv2r8.aarch64 + network information: + name: eth0 product: HNS GE/10GE/25GE RDMA Network Controller + name: eth1 product: HNS GE/10GE/25GE Network Controller + name: eth2 product: HNS GE/10GE/25GE RDMA Network Controller + name: eth3 product: HNS GE/10GE/25GE Network Controller + name: eth4 product: HNS GE/10GE/25GE RDMA Network Controller + name: eth5 product: HNS GE/10GE/25GE Network Controller + name: eth6 product: HNS GE/10GE/25GE RDMA Network Controller + name: eth7 product: HNS GE/10GE/25GE Network Controller + name: docker0 product: +``` + diff --git a/content/zh/docs/A-Tune/collection.md b/content/zh/docs/A-Tune/collection.md new file mode 100644 index 000000000..60d34af41 --- /dev/null +++ b/content/zh/docs/A-Tune/collection.md @@ -0,0 +1,70 @@ +# collection + +## 功能描述 + +采集业务运行时系统的全局资源使用情况以及OS的各项状态信息,并将收集的结果保存到csv格式的输出文件中,作为模型训练的输入数据集。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 本命令依赖采样工具perf,mpstat,vmstat,iostat,sar。 +>- CPU型号目前仅支持鲲鹏920,可通过dmidecode -t processor检查CPU型号。 + +## 命令格式 + +**atune-adm collection** + +## 参数说明 + +- OPTIONS + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

描述

+

--filename, -f

+

生成的用于训练的csv文件名:名称-时间戳.csv

+

--output_path, -o

+

生成的csv文件的存放路径,需提供绝对路径

+

--disk, -b

+

业务运行时实际使用的磁盘,如/dev/sda

+

--network, -n

+

业务运行时使用的网络接口,如eth0

+

--workload_type, -t

+

标记业务的负载类型,作为训练时使用的标签

+

--duration, -d

+

业务运行时采集数据的时间,单位秒,默认采集时间1200秒

+

--interval,-i

+

采集数据的时间间隔,单位秒,默认采集间隔5秒

+
+ + +## 使用示例 + +``` +# atune-adm collection --filename name --interval 5 --duration 1200 --output_path /home/data --disk sda --network eth0 --workload_type test_type +``` + diff --git a/content/zh/docs/A-Tune/define.md b/content/zh/docs/A-Tune/define.md new file mode 100644 index 000000000..610ef8a01 --- /dev/null +++ b/content/zh/docs/A-Tune/define.md @@ -0,0 +1,49 @@ +# define + +## 功能描述 + +添加用户自定义的workload\_type,及对应的profile优化项。 + +## 命令格式 + +**atune-adm define** + +## 使用示例 + +新增一个workload type,workload type的名称为test\_type,profile name的名称为test\_name,优化项的配置文件为example.conf。 + +``` +# atune-adm define test_type test_name ./example.conf +``` + +example.conf 可以参考如下方式书写(以下各优化项非必填,仅供参考),也可通过**atune-adm info**查看已有的profile是如何书写的。 + +``` +[main] +# list its parent profile +[tip] +# the recommended optimization, which should be performed manunaly +[check] +# check the environment +[affinity.irq] +# to change the affinity of irqs +[affinity.task] +# to change the affinity of tasks +[bios] +# to change the bios config +[bootloader.grub2] +# to change the grub2 config +[kernel_config] +# to change the kernel config +[script] +# the script extention of cpi +[sysctl] +# to change the /proc/sys/* config +[sysfs] +# to change the /sys/* config +[systemctl] +# to change the system service config +[ulimit] +# to change the resources limit of user +``` + diff --git a/content/zh/docs/A-Tune/figures/zh-cn_image_0213178479.png b/content/zh/docs/A-Tune/figures/zh-cn_image_0213178479.png new file mode 100644 index 0000000000000000000000000000000000000000..d245d48dc07e2b01734e21ec1952e89fa9269bdb GIT binary patch literal 1607 zcmV-N2Dtf&P)pK`AI}URA}DqntM=Gbri=xcX!qSCDOwmk1w?y+bX_7Bg zbTUWnF+HrT$jr1!8o*vQHsx43<4l%so7B_{Q!8^S9bai!QkIH|E7Bq@i|k$(=#Pz? z7li0Bf%f~(?9A@|&i&1A&gcHlIlptSM8?7zgj$-ib;1WNQv!?tBP75GFhc(eFs`Kd ze?E!HNP0>au-mR`FoqVh61$C0=8j^=fkO8FaPBW%`pQ=Y;4KfqO^9Lbtl^lA2BZnE z3NZgv-#j}GTbPl~v5}1K*NIk!rfp^=Sk20UGq`^TGjm9H%tiwRg{4=tm*Zuobd7Bs z^tSy13_wIkLknsft@M!`ne%zW4-I$ZjbtXK#%qSc)Wg| zN^{k-y)nKGQ-&rrxRwj$0Rg5qugtxp4@$5)w5q;>^{zn%?H%6+vB3ixw9{=40;jDtWF0X&mM^qtmcs= zyHuyw4L9wh!zuFx(CegnyWsNtvUbV<>|sU<3QKuq(;?oNJ{Zrheq1kaQSBF`^#b6G z$ESgu2jqwx6LS9X`4f?`#GP^nba*=4;%x!jmOeRMdj40@L49VK(sXJn=K!)i7# z>gJBBO;L%Dm|1HW`@&Xs9z4y?gQtm^wT75kYdBYWQ8Qn9Vkm5t`4l!C`kuBXBW9z4 zt5wam@}y^0<4TBO|FKhGw=rXMPb3LkFK^-go*gxJ`#zvoVq5e&Nxl06N>DT3rXSC; zYG(lnas*GMxftmR%@JiYX~JL6glGY#Q3aF`6rk|MNwf|(@%FZFLyqs+@e1a_Mia9f z70!JlZa}A#7}`5d{XfcXX2E>}#E$u^TK(`yWQP^Er-JEgKL6YExZNINXRlR%Ki$78 zkB>{HsKlp9{>$&|uK_2(TtUkoNMlTD0)8b(x10?SP#Uzgm<$A~Y8u^vmnV7Wh!g;| ze6AfkccDTg|38D0p4y43ni{%ft*4^c19lr$r{jwDVP*r>HBEomdRw0kRQNAp4>Pj= z>CsnRC~Gz_2~Il}lb&g>?NIOLLvzyk`K3uD*GbTsu0+g61HQ^jO+Fteh+~44-RK&pAO_sO{H(=c1(VAs|xt=Gh>Me zH*vbSTvK|xPq{gK{5&@$wWF*&0JQujX0zp($ABu{-|^@JAD~_LFzI1e?`})nfR6hq5Ji596M+?yTQ^T)pdEN%4I7+*m4= zAi-cY_b&cKEe`4`J*5lFGl!wqNep>@3;U0qLXMY1Ij52H5Oy1KR5`DE4rz zO1!=#zz7L20*sIVBftm=FhT;103-CT$N*#uH?%nI`VBD002ovPDHLk FV1id93qSw> literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/figures/zh-cn_image_0213178480.png b/content/zh/docs/A-Tune/figures/zh-cn_image_0213178480.png new file mode 100644 index 0000000000000000000000000000000000000000..a32856aa08e459ed0f51f8fcf4c2f51511c12095 GIT binary patch literal 1858 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�A>i?Q#RyUl!(+26!D6xrd^q5Pcx-X4Vv=XD_jGJ&`` z6v3>8pGDYhwTpy}MeGt~^D-KWc-^IiA33WuT}~|5{L-13h=nXET#Kb8PYqgT7ymt$ zo212rXDe7}B?e7P29 z)dm8Ba^GxyCVv;G8d%pug3*WgL70JO)e2JeaslKt>(9^-(8Sj)D*oNZ01>Hu5IPQv zlCxfz+%j(7PpVX#elOej^dW~m;4qvsCUrb>jbt7@I^uPeD zKhI%&*GK^-n&g!D1v3+a1pm}NM#cf64e3wOm~h+P*bUi?3aA=;RW~^v5br=Cv(vEf z0W@M&n}IG`e{RH12FoGFM13wmRx0ZB&xyAZZD4fw@;;7I?j&^uMNAJ@h%2p*N$W>v zb5%4M`WvPVog-V;)ADf}&`#YS+TqL|{8ee#H5u<)%)~-1`xnL3HUy$oX63#4-@elS z=^BAertB-TIsM~*42XZMo8Wih*)>9^#{FNp@t-4>3xlr!VDG&4kMaMvVbo8Hq_c04 z-fzeFKd=2yGfN-p5EXofByb0=Y5a6;F}UgFH#PLB?0DCn95%x{$0WMcq3gUk5t>vu zZzX*qM6uO0xAJ0SVPTT6Nzn#J`NgajZQMG}awoLT!L_(89cgqeYg=#*vf9sxg0_altmVkG%d;|;(nmg7xzf&W$2GPt#O!Q(i>|*ZrUt#omL0`oF2bK5CUzD}ZF`T< zJ9NBmWZZ+tSq_e+ymZBO1(!Zu5JuN_^|qG;@fbHj-7NYTBk^ll=sgyW+awNvnPT+z z6mLLOZxW~Ac)8gfj;|JMiQQxkrNC{(#rN}Gs8W6E^@#JcFtBr=&KAOCb1h#NMLqfR zvpO&uFIsG&Ygt}!FQC<0v$8H4pW_KK6Ks=Y0ub!1{TzM%z3dWS7Ph@DHe{~|c3}_! z4Y;pAg3}NYHI@7a!oK{`*Y0IQCxUk^o-WxJeX*XwZmZ5--oc1TCBDB;vPR%`ivyA4 z%A85k^F5C4vT@WX^KBM*j6Ld!Sy^$0S=I-9?VNC{EY8ato#69Hq2@d9suyp9Z%3`k z-)I?7>`bi___aQJ8Z%S~Rh}<)nrg!Hog| z-6b~-D}&j@lk9?>w=flOGY+{5(jzb;g5rlQV@zmtl~+bA)bba2B)sf`bJr*YN39xg1$f*q=5NF@() zdPUy~71}z2m$P_f3tmBGy)BKU{P81CKYOa}7e6t%OzH4Smf~Tgg@4P;F_=v-sT>+! z9VEu$rm?C3Qd~$~Uyo3AH~c(#Yl_K*VFsFlprm(1u|YwR55tj;*jD^EgIwBw|*GwTU@58DyS>KTC$fW{X%*2_N|x3 zQLsTFR3?pu@kA#$E6EmKcoG!3rK{10t)ureVsURQI(WV;%XbaTEkU1du->BmWGAu- zUSS(L^T3}SJkb8(H33$bMgJ&Fh>TyjNwxXo?*3M{RAB=s z7?S#lO-agXc^4l{B^)-u7#iHP0gu?R_#H5dutO`+hDSk!%9@J{&tUJ7GiQkHOt;`x zJ&@CZ>msOVNOJoqDbbs-pHj+8HVIi|FlV=^oe>m9ixApe?b4ELZ7c!uAT5%XyFQ?emtmLqMZ>oNG|{uuV|ZggHx`klk97iR{KM zaMOqYY_#drfD^NW`s(f6kJ*xll*jUhOQLkrzxrI;8UFdJvO?~RR4C%ddijvhq{PHf z@qRL{7gxz$1FX?BHCDkmG3pdVP&S*se9+ScK1XpFT6cBz6P4=6iZr!k7>qcAazXrq zyT>a9Q-_aZf8kTddt*mNNjngS+vEkk2u*#$g_11N9;g}#43gCXS(1zs3 zjzu6GRt**w*ZOcuFC16OVos~&@n>9eoiGrQ;??}q*~Ww{_SMckL5EHao|0TkEA2I? zrz)o)zA(nH(RwA0>i9T8K5bXK{5hoSOq2nIYcBHRwd12}%IMj@#)L{d0l!|G0+d73 z|DUoix#aqfhxzkJ4fBuqa-M5S?jyG87hd!H5EwD@Gs|k$)KBy=B7fl*bWue9Yo)ch z_<swN#Cm;29p3a3Dul+mwsilHwdKa4{?so0ubY_hhfozWTgzF`kXx>ycsGYYK5{ zg?_j`<1TiPW|v_$>rUGP2;%f$jvJ4?E2iX7$x3L;H;Uy?t1Odrr*pDX@+5RzNm?Iu zND;&bE3b`#BaOSG1JLoeiahX2$%x|Rj5!{}c%6~}Zi2#9MLycTf-<%!L#NX{hZ;8f~~W(uY)ik;(|P%d4d(+N`#o5m=g>Os{-?+M?>G zufI!);V%*byn>K#BWOTxcRs;x>2khOlW$Ze2XtT~9uN=cE978P928;?1L+u@rAkhU zEsaxmgc~M>s(^uNCvXwYT+Qj>c`>IaomOTF?v$4f9Rs+T>tZY-1X@(pRQvA?n71>} zpnZ?rqO7rqGwdi&@l2D~mupHI;zYsl6^cdz4ceL>$w~pKfx%8LDb2yxk(0=#+`4u{ z_@J{Q=@CU$&F4BNYQBvy^y0A&S?N9r0f7M(cpG&3NE>9t`j&*?BJvz(D7VPF|)$f+mk7+;P~ALVe%+t;h`B5~(+b4Z!s%cHAK zR4Tw0^sd3VS!U{oPnI$H;byP5WTJgD?%LY&s0*eFW@tbuy2&P8G;B5dbzqwBQ}p_% zlhf|^_UOxvngIm|dG;k2iFfjvEq0r?&it}&D(zfub;%LQ-w!P5hYNqos&b_nW2@+{-^wL&_C#YkWY74{ zd{$g%86=?$aZ=Y^0^kxQh=Dai4YjTIqoQL|`>;&*%xR6Gcz<1uJgogaVaFjxP?Jkc z{RPrGTwI{Q^H9%o+ zVB3ze9o|&+%AB|-ANW(A*E@^VaTG^bSdP93PZQRY`C9*N#nE(~`I{@m2WTQdmAQBS z2l}0Pw{=^M3D)-)+x*S0B-o3X8#h~+0`GtMc+8DWeHr&B%0C5eiAYpI(_blw2*Yel z$0+9Kkj3vW6&O=nD2jYRg8zUN3JSu^C(WVq@s~5Iy2Y$IZimLiCaX)+@nDGRuk8pw zRw%zbczOQ_jGIP|tme&;EyHO!q;~hY?s)Lw#$kF@NF(kedl} zz>BlsW~;YdzBFbC%^5`|CFJVpZ9Hi@T1b-3z)n4gT*((dJdP79s@G}X-&(WI%kbRo z3IaXM*A}LzeP<)6JYDD5L_hG*)nJ>Pvv{o5@#?^8czQYke*AWO4u0&8XRYQOb4f-n&`zlG<~cd85;POR;1QlA7inYf}*2GPqG)8#P3-hCWMJgByv(Lm(y zk7#eFt2<73AcgX-2La)F^d3`N_m;dhPd=>tt2(z7cZsKw1`Yhl-fBOZE$-N42+>zs z-EYzWs~-xbZ-FG88I7wNC*MC?)uR)^%-Jv3z0Fr88S-_Ttj;Uui>42a4f&sq{_fkeKysd-WE>_a@Gd&v{<)DS zfIMka>5r!V^N;_$nikNH9}21Xx&A zp3L6IeUH3NvhG%#iIea}pP+8Ik%vx_e5WO??B%QiZc<}cqshL{SD$qS1-ipP+L3Z+ zytu@>p6fO{{Bp>$lQuR?qdW;egTyi{yi<5vobL4ZCg$Fig<%dl03?fSqVkbw(%@Q1 zY|0q8^{z8<*>m4Wce}edqpe+UZkF{daOrVJCk_R_=)7c8vo|=&Cqt6TvqEVDEn({* zx0M_Ri)Z!<2lDtNK(7#r`RAk(1_9AK2q6M*j>jr;H)ZI*Hy_J^7VZ07Zs%j-ECm} zwdV%F-(#H8FeCTAh%D{X%IX)>ZR_IJlP5L_oUAO>+;TaBxAyJDksH9CZwx5_50Cq& zWT+bRw5@Xuc2)b6;HLF4E%=?Rdm|gmcMZ2n>*|iP<=^|ZZuF>8i@!Fm!m=N73g8@1 z8Gcp0W$P`&cq2s->op-c-cquE=$xE;uEFB36qJDb`AE4KPR2}WfHEMW6m{B3_-(0V zro_{8E$4UQtN05sgQ7sDVf7$?d{}NY0r-@b$9>q^>Uz- zNPjmw@_3Nz1b?r567?1ZJnQ(mg15!NB|Y^r5mY(~_0kIC5@las1y(`*dY(^>xi9iQa(g^+h-i%o z9zDavwX$Zd4-ZIb5f`g^z0;Ueh@_aG@QYj;Tve1LdiN%L~<_n-xE z*2V+fq;KIJw>rrbu=a!B{qiPj;@(GQMnmcT3=UE{fkOiify{dr3$d|F%O$u%phOf- z@$~e&Ruv^Ig(h;YS?8dAfjTV+00wEl(cXOWotl@bi>l;4{e*_x1dpmgL4Tgv+7_GH zbY8>{qyW!8i(B;CP)(FH-i#Lrs|*1|J{fMR)RZ<(?ymFdPDOM!ZJw{{kt-N`SN#eL z#&Jmrlo}@`3fZ+%S6X;D9~9Dg)(+0eE9dxlP8ZInBov6H8?LA`_yN zy~^w_%2b9fB6Mk$BX%{{A9~T{4BN%WA2}l^^V%{Uh*)H+kvyfv6v&tLf5Ub(jkh}6g4Qtrf@9iLNp zTPls0-z}hXVO_{G| zbm7iNJ%|`It>B|q)O`0;8WxFC)dISkPu@@=G+W?um=C0mxOtcHLxmGzeKXG!beCsV zrl)C&9{7S!RiI@$N~`g`;aovm$K{S0g$Z$E4D#NV?_&ynGRuBK1ir)i=3#&Q);)XT zHN9I4R`+tkPdb!sM+0*j#-XG`lwUmEqhGSyF`Fb1uTu8r0pm#v1vW9a40xoP?2p9l z2j3z{SRV5M``a`?B0}znijzGy=b5i5SSdFNvQum+CDyeuW}2#A^dO3RaiSe*=k&t7 zs$Wwao;EB{^jH12dzNTg^mX5UP}H)^d{>?O#J~{f+I9lTVHCUo|5y63W9Xpsn@OFo zQ25&eNqhR#l_qc$j3bFIo#@9fB60v-D(PKQ_U>+Plm&PS4&t|zI>>S%B^wEeRhfF0 zs*>v5G54OzyDktyIo{7m?8Bch$APZyo?+Zh`%8Faxu2)1y7U;_;-^AtI~2m2tGFBY zZS~XpoRe}dZz9`VfGTbnVo-nK#zi%{cBg2IH)9lXX~yNBv$l?uGADg`^D!ifP*b8{ za597c220$}m;sK?e?iq~e+1}ArV+?eddpUez1SM-#zh?&kdk&f#mjTm&ooGlb5JgT z?aoA+G6u*haPkGJB{I5Y)ntW76ddY*NcXZ9E?A)3kavP2v$(8s#F#zF3w>nfIimJ# zI7sU4J2FpF`}jd6+u*VKZOx0qvRcEL!n8V%x8!c0}8kwNne_g=9z zQeBiNRao@O z-k$;gI$0H31nkk)A`ms|g3nmi;NJVmu zd;Bg;hDb+qKr|HVSy= z&H?E=9wF{upDXZNlx|v2dJWgMG%uLAY#KeYiyn33lYi}Tn1T=UL797h&;j=dIl7IZ!}2Dw`h6nwrC_OP;>EZU0CJJa=h)|byD>1 z7}@GqM*UEs6S4?2xqgD-6AU5;C0Lsb#e?Io`)Becd5U{%I zC?U)`^JGz7jIJ`p)-Ro{a61Z)Q%;>73jwHAX2fZwj>DQW!nn^>`wfcr8q%YP6tdMq z60oNu2Yu{DG;cjj!fIYb=5lXgY#C+CkQ86{a5HlpM(H#UC4We+P*q>nGyG*6`}0Q( zcY$18^Om|z*JrI$mpP@YT(nLys2h(YUhZ2*aQyr-4N#p~$N}O+!C)^-@Lgid?9u@G zM#*Hl$|T9c2-<3YM!>k>pvf6)?b8~qQIMz_c0FGOj`2+|r3OWz z2Q}-AQjWFvCtITpZUa8y0X0)Bew-REfk9-LM4M}RdF(1?mVqaYh8R-w0|&mAeli;X zrL0MZ(y9_iAeobbk3@sLj0rK^kDGi5z@hEz7ru%zUDQuW&v$o7Y2^z*l_55%;itu_ zlj)EgjYtx??-HinJGNwiqeI?BvP^O0BQH-+&!_v#qPHyRiD-9<(8X^gT9t*Gx+D07 zCr+v46jCe_&%9^*TZof=#F|;6vH}DZ(tc_DJXOVOhH(cfSgu($#@;KKEuM9UD5aq3 zKQeDB-cSQzMO&8y-8C`+TXEjs_+t8X;|nMO;wv2p%qqHLRg+P0^Zqdhr-~cm|@oyT1a-)iYl;ZDdl+?_`4Dr0xFWkOj7%UZ`N3$_wn&%B@r3 z_qus?8!>&ex5Z4^5S!=lpHEu9|8S%!-}OI{#-u|8r0O^c=FO-#!s_+XWxXx>PAZfFF{gvLcnA_5b>RUYMC8 literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/figures/zh-cn_image_0227497000.png b/content/zh/docs/A-Tune/figures/zh-cn_image_0227497000.png new file mode 100644 index 0000000000000000000000000000000000000000..db9b5ce8b6d211d54ea36930504cca415ddfb8ca GIT binary patch literal 186566 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

-P4*~d+9Aj~G2^S0gDiTXrl)`cx9;W!YsiXkq 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/figures/zh-cn_image_0231122163.png b/content/zh/docs/A-Tune/figures/zh-cn_image_0231122163.png new file mode 100644 index 0000000000000000000000000000000000000000..0a19e61233edce44c9ccfa4d8bb806238babb187 GIT binary patch literal 12992 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 literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/info.md b/content/zh/docs/A-Tune/info.md new file mode 100644 index 000000000..97f826acc --- /dev/null +++ b/content/zh/docs/A-Tune/info.md @@ -0,0 +1,95 @@ +# info + +## 功能描述 + +查看workload\_type对应的profile内容。 + +## 命令格式 + +**atune-adm info** _ + +## 使用示例 + +查看webserver的profile内容: + +``` +# atune-adm info webserver + +*** ssl_webserver: + +# +# webserver tuned configuration +# +[main] +#TODO CONFIG + +[kernel_config] +#TODO CONFIG + +[bios] +#TODO CONFIG + +[sysfs] +#TODO CONFIG + +[sysctl] +fs.file-max=6553600 +fs.suid_dumpable = 1 +fs.aio-max-nr = 1048576 +kernel.shmmax = 68719476736 +kernel.shmall = 4294967296 +kernel.shmmni = 4096 +kernel.sem = 250 32000 100 128 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_syncookies = 1 +net.ipv4.ip_local_port_range = 1024 65500 +net.ipv4.tcp_max_tw_buckets = 5000 +net.core.somaxconn = 65535 +net.core.netdev_max_backlog = 262144 +net.ipv4.tcp_max_orphans = 262144 +net.ipv4.tcp_max_syn_backlog = 262144 +net.ipv4.tcp_timestamps = 0 +net.ipv4.tcp_synack_retries = 1 +net.ipv4.tcp_syn_retries = 1 +net.ipv4.tcp_fin_timeout = 1 +net.ipv4.tcp_keepalive_time = 60 +net.ipv4.tcp_mem = 362619 483495 725238 +net.ipv4.tcp_rmem = 4096 87380 6291456 +net.ipv4.tcp_wmem = 4096 16384 4194304 +net.core.wmem_default = 8388608 +net.core.rmem_default = 8388608 +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 + +[systemctl] +sysmonitor=stop +irqbalance=stop + +[bootloader.grub2] +selinux=0 +iommu.passthrough=1 + +[tip] +bind your master process to the CPU near the network = affinity +bind your network interrupt to the CPU that has this network = affinity +relogin into the system to enable limits setting = OS + +[script] +openssl_hpre = 0 +prefetch = off + +[ulimit] +{user}.hard.nofile = 102400 +{user}.soft.nofile = 102400 + +[affinity.task] +#TODO CONFIG + +[affinity.irq] +#TODO CONFIG + +[check] +#TODO CONFIG + +``` + diff --git a/content/zh/docs/A-Tune/list.md b/content/zh/docs/A-Tune/list.md new file mode 100644 index 000000000..8bf3a6918 --- /dev/null +++ b/content/zh/docs/A-Tune/list.md @@ -0,0 +1,43 @@ +# list + +## 功能描述 + +查询系统当前支持的workload\_type和对应的profile,以及当前处于active状态的profile。 + +## 命令格式 + +**atune-adm list** + +## 使用示例 + +``` +# atune-adm list + +Support WorkloadTypes: ++-----------------------------------+------------------------+-----------+ +| WorkloadType | ProfileName | Active | ++===================================+========================+===========+ +| default | default | true | ++-----------------------------------+------------------------+-----------+ +| webserver | ssl_webserver | false | ++-----------------------------------+------------------------+-----------+ +| big_database | database | false | ++-----------------------------------+------------------------+-----------+ +| big_data | big_data | false | ++-----------------------------------+------------------------+-----------+ +| in-memory_computing | in-memory_computing | false | ++-----------------------------------+------------------------+-----------+ +| in-memory_database | in-memory_database | false | ++-----------------------------------+------------------------+-----------+ +| single_computer_intensive_jobs | compute-intensive | false | ++-----------------------------------+------------------------+-----------+ +| communication | rpc_communication | false | ++-----------------------------------+------------------------+-----------+ +| idle | default | false | ++-----------------------------------+------------------------+-----------+ + +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>Active为true表示当前激活的profile,示例表示当前激活的是default类型对应的profile。 + diff --git a/content/zh/docs/A-Tune/profile.md b/content/zh/docs/A-Tune/profile.md new file mode 100644 index 000000000..2425f92ef --- /dev/null +++ b/content/zh/docs/A-Tune/profile.md @@ -0,0 +1,22 @@ +# profile + +## 功能描述 + +手动激活workload\_type对应的profile,使得workload\_type处于active状态。 + +## 命令格式 + +**atune-adm profile **_<_WORKLOAD\_TYPE_\>_ + +## 参数说明 + +WORKLOAD\_TYPE支持的类型参考list命令查询结果。 + +## 使用示例 + +激活webserver对应的profile配置。 + +``` +# atune-adm profile webserver +``` + diff --git a/content/zh/docs/A-Tune/public_sys-resources/icon-caution.gif b/content/zh/docs/A-Tune/public_sys-resources/icon-caution.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/public_sys-resources/icon-danger.gif b/content/zh/docs/A-Tune/public_sys-resources/icon-danger.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/public_sys-resources/icon-note.gif b/content/zh/docs/A-Tune/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/public_sys-resources/icon-notice.gif b/content/zh/docs/A-Tune/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 GIT binary patch literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/content/zh/docs/A-Tune/rollback.md b/content/zh/docs/A-Tune/rollback.md new file mode 100644 index 000000000..1636bd126 --- /dev/null +++ b/content/zh/docs/A-Tune/rollback.md @@ -0,0 +1,16 @@ +# rollback + +## 功能描述 + +回退当前的配置到系统的初始配置。 + +## 命令格式 + +**atune-adm rollback** + +## 使用示例 + +``` +# atune-adm rollback +``` + diff --git a/content/zh/docs/A-Tune/train.md b/content/zh/docs/A-Tune/train.md new file mode 100644 index 000000000..bd1f90815 --- /dev/null +++ b/content/zh/docs/A-Tune/train.md @@ -0,0 +1,43 @@ +# train + +## 功能描述 + +使用采集的数据进行模型的训练。训练时至少采集两种workload\_type的数据,否则训练会出错。 + +## 命令格式 + +**atune-adm train** + +## 参数说明 + +- OPTIONS + + + + + + + + + + + + + +

参数

+

描述

+

--data_path, -d

+

存放模型训练所需的csv文件的目录

+

--output_file, -o

+

训练生成的新模型

+
+ + +## 使用示例 + +使用data目录下的csv文件作为训练输入,生成的新模型new-model.m存放在model目录下。 + +``` +# atune-adm train --data_path /home/data --output_file /usr/libexec/atuned/analysis/models/new-model.m +``` + diff --git a/content/zh/docs/A-Tune/tuning.md b/content/zh/docs/A-Tune/tuning.md new file mode 100644 index 000000000..6a4c49835 --- /dev/null +++ b/content/zh/docs/A-Tune/tuning.md @@ -0,0 +1,465 @@ +# tuning + +## 功能描述 + +使用指定的项目文件对参数进行动态空间的搜索,找到当前环境配置下的最优解。 + +## 命令格式 + +>![](public_sys-resources/icon-note.gif) **说明:** +>在运行命令前,需要满足如下条件: +>1. 编辑好服务端yaml配置文件,且需要服务端管理员将该配置文件放到服务端的/etc/atuned/tuning/目录下。 +>2. 编辑好客户端yaml配置文件并放在客户端任一目录。 + +**atune-adm tuning** \[OPTIONS\] + +## 参数说明 + +- OPTIONS + + + + + + + + + + + + + +

参数

+

描述

+

--restore, -r

+

恢复tuning优化前的初始配置

+

--project, -p

+

指定需要恢复的yaml文件中的项目名称

+
+ + >![](public_sys-resources/icon-note.gif) **说明:** + >当使用参数时,上述两个参数需要同时使用,且-p参数后需要跟具体的项目名称。 + + +- PROJECT\_YAML:客户端yaml配置文件。 + +## 配置说明 + +**表 1** 服务端yaml文件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置名称

+

配置说明

+

参数类型

+

取值范围

+

project

+

项目名称。

+

字符串

+

-

+

startworkload

+

待调优服务的启动脚本。

+

字符串

+

-

+

stopworkload

+

待调优服务的停止脚本。

+

字符串

+

-

+

maxiterations

+

最大调优迭代次数,用于限制客户端的迭代次数。一般来说,调优迭代次数越多,优化效果越好,但所需时间越长。用户必须根据实际的业务场景进行配置。

+

整型

+

>10

+

object

+

需要调节的参数项及信息。

+

object 配置项请参见表2

+

-

+

-

+
+ +**表 2** object项配置说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置名称

+

配置说明

+

参数类型

+

取值范围

+

name

+

待调参数名称

+

字符串

+

-

+

desc

+

待调参数描述

+

字符串

+

-

+

get

+

查询参数值的脚本

+

-

+

-

+

set

+

设置参数值的脚本

+

-

+

-

+

needrestart

+

参数生效是否需要重启业务

+

枚举

+

"true", "false"

+

type

+

参数的类型,目前支持discrete, continuous两种类型,对应离散型、连续型参数

+

枚举

+

"discrete", "continuous"

+

dtype

+

该参数仅在type为discrete类型时配置,目前支持int和string两种类型

+

枚举

+

int, string

+

scope

+

参数设置范围,仅在type为discrete且dtype为int时或者type为continuous时生效

+

整型

+

用户自定义,取值在该参数的合法范围

+

step

+

参数值步长,dtype为int时使用

+

整型

+

用户自定义

+

items

+

参数值在scope定义范围之外的枚举值,dtype为int时使用

+

整型

+

用户自定义,取值在该参数的合法范围

+

options

+

参数值的枚举范围,dtype为string时使用

+

字符串

+

用户自定义,取值在该参数的合法范围

+

ref

+

参数的推荐初始值

+

整型或字符串

+

用户自定义,取值在该参数的合法范围

+
+ +**表 3** 客户端yaml文件配置说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置名称

+

配置说明

+

参数类型

+

取值范围

+

project

+

项目名称,需要与服务端对应配置文件中的project匹配

+

字符串

+

-

+

iterations

+

调优迭代次数

+

整型

+

>=10

+

benchmark

+

性能测试脚本

+

-

+

-

+

evaluations

+

性能测试评估指标

+

evaluations 配置项请参见表4

+

-

+

-

+
+ +**表 4** evaluations项配置说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置名称

+

配置说明

+

参数类型

+

取值范围

+

name

+

评价指标名称

+

字符串

+

-

+

get

+

获取性能评估结果的脚本

+

-

+

-

+

type

+

评估结果的正负类型,positive代表最小化性能值,negative代表最大化对应性能值

+

枚举

+

"positive","negative"

+

weight

+

该指标的权重百分比,0-100

+

整型

+

0-100

+

threshold

+

该指标的最低性能要求

+

整型

+

用户指定

+
+ +## 配置示例 + +服务端yaml文件配置示例: + +``` +project: "example" +maxiterations: 10 +startworkload: "" +stopworkload: "" +object : + - + name : "vm.swappiness" + info : + desc : "the vm.swappiness" + get : "sysctl -a | grep vm.swappiness" + set : "sysctl -w vm.swappiness=$value" + needrestart: "false" + type : "continuous" + scope : + - 0 + - 10 + ref : 1 + - + name : "irqbalance" + info : + desc : "system irqbalance" + get : "systemctl status irqbalance" + set : "systemctl $value sysmonitor;systemctl $value irqbalance" + needrestart: "false" + type : "discrete" + options: + - "start" + - "stop" + dtype : "string" + ref : "start" + - + name : "net.tcp_min_tso_segs" + info : + desc : "the minimum tso number" + get : "cat /proc/sys/net/ipv4/tcp_min_tso_segs" + set : "echo $value > /proc/sys/net/ipv4/tcp_min_tso_segs" + needrestart: "false" + type : "continuous" + scope: + - 1 + - 16 + ref : 2 + - + name : "prefetcher" + info : + desc : "" + get : "cat /sys/class/misc/prefetch/policy" + set : "echo $value > /sys/class/misc/prefetch/policy" + needrestart: "false" + type : "discrete" + options: + - "0" + - "15" + dtype : "string" + ref : "15" + - + name : "kernel.sched_min_granularity_ns" + info : + desc : "Minimal preemption granularity for CPU-bound tasks" + get : "sysctl kernel.sched_min_granularity_ns" + set : "sysctl -w kernel.sched_min_granularity_ns=$value" + needrestart: "false" + type : "continuous" + scope: + - 5000000 + - 50000000 + ref : 10000000 + - + name : "kernel.sched_latency_ns" + info : + desc : "" + get : "sysctl kernel.sched_latency_ns" + set : "sysctl -w kernel.sched_latency_ns=$value" + needrestart: "false" + type : "continuous" + scope: + - 10000000 + - 100000000 + ref : 16000000 + +``` + +客户端yaml文件配置示例: + +``` +project: "example" +iterations : 10 +benchmark : "sh /home/Benchmarks/mysql/tunning_mysql.sh" +evaluations : + - + name: "tps" + info: + get: "echo -e '$out' |grep 'transactions:' |awk '{print $3}' | cut -c 2-" + type: "negative" + weight: 100 + threshold: 100 +``` + +## 使用示例 + +- 进行tuning调优 + + ``` + # atune-adm tuning example-client.yaml + ``` + +- 恢复tuning调优前的初始配置,example为yaml文件中的项目名称 + + ``` + # atune-adm tuning --restore --project example + ``` + + diff --git a/content/zh/docs/A-Tune/undefine.md b/content/zh/docs/A-Tune/undefine.md new file mode 100644 index 000000000..6b57dd1fd --- /dev/null +++ b/content/zh/docs/A-Tune/undefine.md @@ -0,0 +1,18 @@ +# undefine + +## 功能描述 + +删除用户自定义的workload\_type。 + +## 命令格式 + +**atune-adm undefine** + +## 使用示例 + +删除自定义的负载类型test\_type。 + +``` +# atune-adm undefine test_type +``` + diff --git a/content/zh/docs/A-Tune/update.md b/content/zh/docs/A-Tune/update.md new file mode 100644 index 000000000..44aaa83d7 --- /dev/null +++ b/content/zh/docs/A-Tune/update.md @@ -0,0 +1,18 @@ +# update + +## 功能描述 + +将workload\_type原来的优化项更新为new.conf中的内容。 + +## 命令格式 + +**atune-adm update** + +## 使用示例 + +更新负载类型为test\_type,优化项名称为test\_name的优化项为new.conf。 + +``` +# atune-adm update test_type test_name ./new.conf +``` + diff --git a/content/zh/docs/A-Tune/upgrade.md b/content/zh/docs/A-Tune/upgrade.md new file mode 100644 index 000000000..a22ebd983 --- /dev/null +++ b/content/zh/docs/A-Tune/upgrade.md @@ -0,0 +1,25 @@ +# upgrade + +## 功能描述 + +更新系统的数据库。 + +## 命令格式 + +**atune-adm upgrade** + +## 参数说明 + +- DB\_FILE + + 新的数据库文件路径 + + +## 使用示例 + +数据库更新为new\_sqlite.db。 + +``` +# atune-adm upgrade ./new_sqlite.db +``` + diff --git "a/content/zh/docs/A-Tune/\344\275\277\347\224\250\346\226\271\346\263\225.md" "b/content/zh/docs/A-Tune/\344\275\277\347\224\250\346\226\271\346\263\225.md" new file mode 100644 index 000000000..aaf6620d3 --- /dev/null +++ "b/content/zh/docs/A-Tune/\344\275\277\347\224\250\346\226\271\346\263\225.md" @@ -0,0 +1,3 @@ +# 使用方法 + +用户可以通过命令行客户端atune-adm使用A-Tune提供的功能。本章介绍A-Tune客户端包含的功能和使用方法。 diff --git "a/content/zh/docs/A-Tune/\345\210\206\346\236\220\350\264\237\350\275\275\347\261\273\345\236\213\345\271\266\350\207\252\344\274\230\345\214\226.md" "b/content/zh/docs/A-Tune/\345\210\206\346\236\220\350\264\237\350\275\275\347\261\273\345\236\213\345\271\266\350\207\252\344\274\230\345\214\226.md" new file mode 100644 index 000000000..e76149ff0 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\210\206\346\236\220\350\264\237\350\275\275\347\261\273\345\236\213\345\271\266\350\207\252\344\274\230\345\214\226.md" @@ -0,0 +1 @@ +# 分析负载类型并自优化 \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\345\211\215\350\250\200.md" "b/content/zh/docs/A-Tune/\345\211\215\350\250\200.md" new file mode 100644 index 000000000..adf753c68 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\211\215\350\250\200.md" @@ -0,0 +1,36 @@ +# 前言 + +## 概述 + +本文档介绍openEuler系统性能自优化软件A-Tune的安装部署和使用方法,以指导用户快速了解并使用A-Tune。 + +## 读者对象 + +本文档适用于使用openEuler系统并希望了解和使用A-Tune的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。 + +## 符号约定 + +在本文中可能出现下列标志,它们所代表的含义如下。 + + + + + + + + + + + + + +

符号

+

说明

+

+

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

+

“须知”不涉及人身伤害。

+

+

对正文中重点信息的补充说明。

+

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

+
+ diff --git "a/content/zh/docs/A-Tune/\345\217\202\346\225\260\350\207\252\350\260\203\344\274\230.md" "b/content/zh/docs/A-Tune/\345\217\202\346\225\260\350\207\252\350\260\203\344\274\230.md" new file mode 100644 index 000000000..4737c6df3 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\217\202\346\225\260\350\207\252\350\260\203\344\274\230.md" @@ -0,0 +1,3 @@ +# 参数自调优 + +A-Tune提供了最佳配置的自动搜索能力,免去人工反复做参数调整、性能评价的调优过程,极大地提升最优配置的搜寻效率。 \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\345\220\257\345\212\250A-Tune.md" "b/content/zh/docs/A-Tune/\345\220\257\345\212\250A-Tune.md" new file mode 100644 index 000000000..07144b247 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\220\257\345\212\250A-Tune.md" @@ -0,0 +1,22 @@ +# 启动A-Tune + +A-Tune安装完成后,需要启动A-Tune服务才能使用。 + +- 启动atuned服务: + + ``` + # systemctl start atuned + ``` + + +- 查询atuned服务状态: + + ``` + # systemctl status atuned + ``` + + 若回显为如下,则服务启动成功。 + + ![](figures/zh-cn_image_0214540398.png) + + diff --git "a/content/zh/docs/A-Tune/\345\233\236\346\273\232profile.md" "b/content/zh/docs/A-Tune/\345\233\236\346\273\232profile.md" new file mode 100644 index 000000000..209316a4c --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\233\236\346\273\232profile.md" @@ -0,0 +1 @@ +# 回滚profile \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\345\256\211\350\243\205A-Tune.md" "b/content/zh/docs/A-Tune/\345\256\211\350\243\205A-Tune.md" new file mode 100644 index 000000000..f8f643da8 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\256\211\350\243\205A-Tune.md" @@ -0,0 +1,3 @@ +# 安装A-Tune + +本章介绍A-Tune的安装模式和安装方法。 \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" "b/content/zh/docs/A-Tune/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" new file mode 100644 index 000000000..3d3cdaa82 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" @@ -0,0 +1,3 @@ +# 安装与部署 + +本章介绍如何安装和部署A-Tune。 diff --git "a/content/zh/docs/A-Tune/\345\256\211\350\243\205\346\223\215\344\275\234.md" "b/content/zh/docs/A-Tune/\345\256\211\350\243\205\346\223\215\344\275\234.md" new file mode 100644 index 000000000..7f60914b8 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\256\211\350\243\205\346\223\215\344\275\234.md" @@ -0,0 +1,53 @@ +# 安装操作 + +安装A-Tune的操作步骤如下: + +1. 挂载openEuler的iso文件。 + + ``` + # mount openEuler-20.03-LTS-aarch64-dvd.iso /mnt + ``` + +2. 配置本地yum源。 + + ``` + # vim /etc/yum.repos.d/local.repo + ``` + + 配置内容如下所示: + + ``` + [local] + name=local + baseurl=file:///mnt + gpgcheck=0 + enabled=1 + ``` + +3. 安装A-Tune服务端。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >本步骤会同时安装服务端和客户端软件包,对于单机部署模式,请跳过**步骤4**。 + + ``` + # yum install atune -y + ``` + +4. 若为分布式部署,请安装A-Tune客户端。 + + ``` + # yum install atune-client -y + ``` + +5. 验证是否安装成功。 + + ``` + # rpm -qa | grep atune + atune-client-xxx + atune-db-xxx + atune-xxx + ``` + + 有如上回显信息表示安装成功。 + + diff --git "a/content/zh/docs/A-Tune/\345\256\211\350\243\205\346\250\241\345\274\217\344\273\213\347\273\215.md" "b/content/zh/docs/A-Tune/\345\256\211\350\243\205\346\250\241\345\274\217\344\273\213\347\273\215.md" new file mode 100644 index 000000000..a3f22743b --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\256\211\350\243\205\346\250\241\345\274\217\344\273\213\347\273\215.md" @@ -0,0 +1,17 @@ +# 安装模式介绍 + +A-Tune支持单机模式和分布式模式安装: + +- 单机模式 + + client和server安装到同一台机器上。 + +- 分布式模式 + + client和server分别安装在不同的机器上。 + + +两种安装模式的简单图示如下: + +![](figures/zh-cn_image_0231122163.png) + diff --git "a/content/zh/docs/A-Tune/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" "b/content/zh/docs/A-Tune/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" new file mode 100644 index 000000000..242115221 --- /dev/null +++ "b/content/zh/docs/A-Tune/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" @@ -0,0 +1,55 @@ +# 常见问题与解决方法 + +**问题1:train命令训练模型出错,提示“training data faild”**。 + +原因:collection命令只采集一种类型的数据。 + +解决方法:至少采集两种数据类型的数据进行训练。 + +**问题2:atune-adm无法连接atuned服务。** + +可能原因: + +1. 检查atuned服务是否启动,并检查atuned侦听地址。 + + ``` + # systemctl status atuned + # netstat -nap | atuned + ``` + +2. 防火墙阻止了atuned的侦听端口。 +3. 系统配置了http代理导致无法连接。 + +解决方法: + +1. 如果atuned没有启动,启动该服务,参考命令如下: + + ``` + # systemctl start atuned + ``` + +2. 分别在atuned和atune-adm的服务器上执行如下命令,允许侦听端口接收网络包,其中60001为atuned的侦听端口号。 + + ``` + # iptables -I INPUT -p tcp --dport 60001 -j ACCEPT + # iptables -I INPUT -p tcp --sport 60001 -j ACCEPT + ``` + + +1. 不影响业务的前提下删除http代理,或对侦听IP不进行http代理,命令如下: + + ``` + # no_proxy=$no_proxy,侦听地址 + ``` + + +**问题3:atuned服务无法启动,提示“Job for atuned.service failed because a timeout was exceeded.”**。 + +原因:hosts文件中缺少localhost配置 + +解决方法:在/etc/hosts文件中127.0.0.1这一行添加上localhost + +``` +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +``` + diff --git "a/content/zh/docs/A-Tune/\346\200\273\344\275\223\350\257\264\346\230\216.md" "b/content/zh/docs/A-Tune/\346\200\273\344\275\223\350\257\264\346\230\216.md" new file mode 100644 index 000000000..9549cf71c --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\200\273\344\275\223\350\257\264\346\230\216.md" @@ -0,0 +1,17 @@ +# 总体说明 + +- atune-adm支持的命令可以通过 **atune-adm help/--help/-h** 查询。 +- 使用方法中所有命令的使用举例都是在单机部署模式下,如果是在分布式部署模式下,需要指定服务器IP和端口号,例如: + + ``` + # atune-adm -a 192.168.3.196 -p 60001 list + ``` + +- define、update、undefine、collection、train、upgrade不支持远程执行。 +- 命令格式中,\[ \] 表示参数可选,<\> 表示参数必选,具体参数由实际情况确定。 +- 命令格式中,各命令含义如下: + - WORKLOAD\_TYPE:用户自定义负载类型的名称,负载支持的类型参考list命令查询结果。 + - PROFILE\_NAME:用户自定义profile的名称 + - PROFILE\_PATH:用户自定义profile的路径 + + diff --git "a/content/zh/docs/A-Tune/\346\224\257\346\214\201\347\211\271\346\200\247\344\270\216\344\270\232\345\212\241\346\250\241\345\236\213.md" "b/content/zh/docs/A-Tune/\346\224\257\346\214\201\347\211\271\346\200\247\344\270\216\344\270\232\345\212\241\346\250\241\345\236\213.md" new file mode 100644 index 000000000..7d64cbc20 --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\224\257\346\214\201\347\211\271\346\200\247\344\270\216\344\270\232\345\212\241\346\250\241\345\236\213.md" @@ -0,0 +1,146 @@ +# 支持特性与业务模型 + +## 支持特性 + +A-Tune支持的主要特性、特性成熟度以及使用建议请参见[表1](#table1919220557576)。 + +**表 1** 特性成熟度 + + + + + + + + + + + + + + + + + + + + +

特性

+

成熟度

+

使用建议

+

七大类11款应用负载类型自动优化

+

已测试

+

试用

+

自定义负载类型和业务模型

+

已测试

+

试用

+

参数自调优

+

已测试

+

试用

+
+ +## 支持业务模型 + +根据应用的负载特征,A-Tune将业务分为七大类,各类型的负载特征和A-Tune支持的应用请参见[表2](#table2819164611311)。 + +**表 2** 支持的业务类型和应用 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

负载模型

+

业务类型

+

负载特征

+

支持的应用

+

default

+

默认类型

+

CPU、内存带宽、网络、IO各维度资源使用率都不高

+

N/A

+

webserver

+

https应用

+

CPU使用率高

+

Nginx

+

big_database

+

数据库

+
  • 关系型数据库

    读: CPU、内存带宽、网络使用率高

    +

    写:IO使用率高

    +
+
  • 非关系型数据库

    CPU、IO使用率高

    +
+

MongoDB、MySQL、PostgreSQL、MariaDB

+

big_data

+

大数据

+

CPU、IO使用率较高

+

Hadoop、Spark

+

in-memory_computing

+

内存密集型应用

+

CPU、内存带宽使用率高

+

SPECjbb2015

+

in-memory_database

+

计算+网络密集型应用

+

CPU单核使用率高,多实例下网络使用率高

+

Redis

+

single_computer_intensive_jobs

+

计算密集型应用

+

CPU单核使用率高,部分子项内存带宽使用率高

+

SPECCPU2006

+

communication

+

网络密集型应用

+

CPU、网络使用率高

+

Dubbo

+

idle

+

系统idle

+

系统处于空闲状态,无任何应用运行

+

N/A

+
+ diff --git "a/content/zh/docs/A-Tune/\346\233\264\346\226\260profile.md" "b/content/zh/docs/A-Tune/\346\233\264\346\226\260profile.md" new file mode 100644 index 000000000..5c2397420 --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\233\264\346\226\260profile.md" @@ -0,0 +1,3 @@ +# 更新profile + +用户根据需要更新已有profile。 \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\346\233\264\346\226\260\346\225\260\346\215\256\345\272\223.md" "b/content/zh/docs/A-Tune/\346\233\264\346\226\260\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 000000000..40d2cde3c --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\233\264\346\226\260\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1 @@ +# 更新数据库 \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" "b/content/zh/docs/A-Tune/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" new file mode 100644 index 000000000..d50d0a7cc --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" @@ -0,0 +1,24 @@ +# 术语和缩略语 + +**表 1** 术语表 + + + + + + + + + + + + + +

术语

+

含义

+

workload_type

+

负载类型,用于标记具有相同特征的一类业务

+

profile

+

优化项集合,最佳的参数配置

+
+ diff --git "a/content/zh/docs/A-Tune/\346\236\266\346\236\204.md" "b/content/zh/docs/A-Tune/\346\236\266\346\236\204.md" new file mode 100644 index 000000000..07492b4a3 --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\236\266\346\236\204.md" @@ -0,0 +1,10 @@ +# 架构 + +A-Tune核心技术架构如下图,主要包括智能决策、系统画像和交互系统三层。 + +- 智能决策层:包含感知和决策两个子系统,分别完成对应用的智能感知和对系统的调优决策。 +- 系统画像层:主要包括标注和学习系统,标注系统用于业务模型的聚类,学习系统用于业务模型的学习和分类。 +- 交互系统层:用于各类系统资源的监控和配置,调优策略执行在本层进行。 + +![](figures/zh-cn_image_0227497343.png) + diff --git "a/content/zh/docs/A-Tune/\346\237\245\350\257\242profile.md" "b/content/zh/docs/A-Tune/\346\237\245\350\257\242profile.md" new file mode 100644 index 000000000..40ef5f9d8 --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\237\245\350\257\242profile.md" @@ -0,0 +1,2 @@ +# 查询profile + diff --git "a/content/zh/docs/A-Tune/\346\237\245\350\257\242\350\264\237\350\275\275\347\261\273\345\236\213.md" "b/content/zh/docs/A-Tune/\346\237\245\350\257\242\350\264\237\350\275\275\347\261\273\345\236\213.md" new file mode 100644 index 000000000..3afdd929a --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\237\245\350\257\242\350\264\237\350\275\275\347\261\273\345\236\213.md" @@ -0,0 +1 @@ +# 查询负载类型 \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\346\263\225\345\276\213\347\224\263\346\230\216.md" "b/content/zh/docs/A-Tune/\346\263\225\345\276\213\347\224\263\346\230\216.md" new file mode 100644 index 000000000..e0afc931b --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\263\225\345\276\213\347\224\263\346\230\216.md" @@ -0,0 +1,14 @@ +# 法律申明 + +**版权所有 © 2020 华为技术有限公司。** + +您对“本文档”的复制,使用,修改及分发受知识共享\(Creative Commons\)署名—相同方式共享4.0国际公共许可协议\(以下简称“CC BY-SA 4.0”\)的约束。为了方便用户理解,您可以通过访问[https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) 了解CC BY-SA 4.0的概要 \(但不是替代\)。CC BY-SA 4.0的完整协议内容您可以访问如下网址获取:[https://creativecommons.org/licenses/by-sa/4.0/legalcode](https://creativecommons.org/licenses/by-sa/4.0/legalcode)。 + +**商标声明** + +A-Tune、openEuler为华为技术有限公司的商标。本文档提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**免责声明** + +本文档仅作为使用指导,除非适用法强制规定或者双方有明确书面约定, 华为技术有限公司对本文档中的所有陈述、信息和建议不做任何明示或默示的声明或保证,包括但不限于不侵权,时效性或满足特定目的的担保。 + diff --git "a/content/zh/docs/A-Tune/\346\277\200\346\264\273profile.md" "b/content/zh/docs/A-Tune/\346\277\200\346\264\273profile.md" new file mode 100644 index 000000000..936023328 --- /dev/null +++ "b/content/zh/docs/A-Tune/\346\277\200\346\264\273profile.md" @@ -0,0 +1 @@ +# 激活profile \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\347\216\257\345\242\203\345\207\206\345\244\207.md" "b/content/zh/docs/A-Tune/\347\216\257\345\242\203\345\207\206\345\244\207.md" new file mode 100644 index 000000000..8dc449cdd --- /dev/null +++ "b/content/zh/docs/A-Tune/\347\216\257\345\242\203\345\207\206\345\244\207.md" @@ -0,0 +1,4 @@ +# 环境准备 + +安装openEuler系统,安装方法参考《openEuler 20.03 LTS 安装指南》。 + diff --git "a/content/zh/docs/A-Tune/\347\256\200\344\273\213.md" "b/content/zh/docs/A-Tune/\347\256\200\344\273\213.md" new file mode 100644 index 000000000..45a82a034 --- /dev/null +++ "b/content/zh/docs/A-Tune/\347\256\200\344\273\213.md" @@ -0,0 +1,14 @@ +# 简介 + +操作系统作为衔接应用和硬件的基础软件,如何调整系统和应用配置,充分发挥软硬件能力,从而使业务性能达到最优,对用户至关重要。然而,运行在操作系统上的业务类型成百上千,应用形态千差万别,对资源的要求各不相同。当前硬件和基础软件组成的应用环境涉及高达7000多个配置对象,随着业务复杂度和调优对象的增加,调优所需的时间成本呈指数级增长,导致调优效率急剧下降,调优成为了一项极其复杂的工程,给用户带来巨大挑战。 + +其次,操作系统作为基础设施软件,提供了大量的软硬件管理能力,每种能力适用场景不尽相同,并非对所有的应用场景都通用有益,因此,不同的场景需要开启或关闭不同的能力,组合使用系统提供的各种能力,才能发挥应用程序的最佳性能。 + +另外,实际业务场景成千上万,计算、网络、存储等硬件配置也层出不穷,实验室无法遍历穷举所有的应用和业务场景,以及不同的硬件组合。 + +为了应对上述挑战,openEuler推出了A-Tune。 + +A-Tune是一款基于AI开发的系统性能优化引擎,它利用人工智能技术,对业务场景建立精准的系统画像,感知并推理出业务特征,进而做出智能决策,匹配并推荐最佳的系统参数配置组合,使业务处于最佳运行状态。 + +![](figures/zh-cn_image_0227497000.png) + diff --git "a/content/zh/docs/A-Tune/\347\263\273\347\273\237\344\277\241\346\201\257\346\237\245\350\257\242.md" "b/content/zh/docs/A-Tune/\347\263\273\347\273\237\344\277\241\346\201\257\346\237\245\350\257\242.md" new file mode 100644 index 000000000..da65f1b9c --- /dev/null +++ "b/content/zh/docs/A-Tune/\347\263\273\347\273\237\344\277\241\346\201\257\346\237\245\350\257\242.md" @@ -0,0 +1 @@ +# 系统信息查询 diff --git "a/content/zh/docs/A-Tune/\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213.md" "b/content/zh/docs/A-Tune/\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213.md" new file mode 100644 index 000000000..eebe018db --- /dev/null +++ "b/content/zh/docs/A-Tune/\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213.md" @@ -0,0 +1,10 @@ +# 自定义模型 + +A-Tune支持用户定义并学习新模型。定义新模型的操作流程如下: + +1. 用define命令定义workload\_type和profile +2. 用collection命令收集workload\_type对应的画像数据 +3. 用train命令训练得到模型 + + + diff --git "a/content/zh/docs/A-Tune/\350\256\244\350\257\206A-Tune.md" "b/content/zh/docs/A-Tune/\350\256\244\350\257\206A-Tune.md" new file mode 100644 index 000000000..92b835d57 --- /dev/null +++ "b/content/zh/docs/A-Tune/\350\256\244\350\257\206A-Tune.md" @@ -0,0 +1 @@ +# 认识A-Tune \ No newline at end of file diff --git "a/content/zh/docs/A-Tune/\350\275\257\347\241\254\344\273\266\350\246\201\346\261\202.md" "b/content/zh/docs/A-Tune/\350\275\257\347\241\254\344\273\266\350\246\201\346\261\202.md" new file mode 100644 index 000000000..b13b53bc7 --- /dev/null +++ "b/content/zh/docs/A-Tune/\350\275\257\347\241\254\344\273\266\350\246\201\346\261\202.md" @@ -0,0 +1,10 @@ +# 软硬件要求 + +## 硬件要求 + +- 鲲鹏920处理器 + +## 软件要求 + +- 操作系统:openEuler 20.03 LTS + diff --git "a/content/zh/docs/A-Tune/\351\203\250\347\275\262A-Tune.md" "b/content/zh/docs/A-Tune/\351\203\250\347\275\262A-Tune.md" new file mode 100644 index 000000000..0a55b929b --- /dev/null +++ "b/content/zh/docs/A-Tune/\351\203\250\347\275\262A-Tune.md" @@ -0,0 +1,3 @@ +# 部署A-Tune + +本章介绍A-Tune的配置部署。 diff --git "a/content/zh/docs/A-Tune/\351\205\215\347\275\256\344\273\213\347\273\215.md" "b/content/zh/docs/A-Tune/\351\205\215\347\275\256\344\273\213\347\273\215.md" new file mode 100644 index 000000000..b25ceb47a --- /dev/null +++ "b/content/zh/docs/A-Tune/\351\205\215\347\275\256\344\273\213\347\273\215.md" @@ -0,0 +1,101 @@ +# 配置介绍 + +A-Tune配置文件/etc/atuned/atuned.cnf的配置项说明如下: + +- A-Tune服务启动配置 + + 可根据需要进行修改。 + + - protocol:系统grpc服务使用的协议,unix或tcp,unix为本地socket通信方式,tcp为socket监听端口方式。默认为unix。 + + - address:系统grpc服务的侦听地址,默认为unix socket,若为分布式部署,需修改为侦听的ip地址。 + - port:系统grpc服务的侦听端口,范围为0\~65535未使用的端口。如果protocol配置是unix,则不需要配置。 + - rest\_port:系统restservice的侦听端口, 范围为0\~65535未使用的端口。 + - sample\_num:系统执行analysis流程时采集样本的数量。 + +- system信息 + + system为系统执行相关的优化需要用到的参数信息,必须根据系统实际情况进行修改。 + + - disk:执行analysis流程时需要采集的对应磁盘的信息或执行磁盘相关优化时需要指定的磁盘。 + - network:执行analysis时需要采集的对应的网卡的信息或执行网卡相关优化时需要指定的网卡。 + - user:执行ulimit相关优化时用到的用户名。目前只支持root用户。 + - tls:开启A-Tune的gRPC和http服务SSL/TLS证书校验,默认不开启。开启TLS后atune-adm命令在使用前需要设置以下环境变量方可与服务端进行通讯: + - export ATUNE\_TLS=yes + - export ATUNE\_CLICERT=<客户端证书路径\> + + - tlsservercertfile:gPRC服务端证书路径。 + - tlsserverkeyfile:gPRC服务端秘钥路径。 + - tlshttpcertfile:http服务端证书路径。 + - tlshttpkeyfile:http服务端秘钥路径。 + - tlshttpcacertfile:http服务端CA证书路径。 + +- 日志信息 + + 根据情况修改日志的路径和级别,默认的日志信息在/var/log/messages中。 + +- monitor信息 + + 为系统启动时默认采集的系统硬件信息。 + + +## 配置示例 + +``` +#################################### server ############################### +# atuned config +[server] +# the protocol grpc server running on +# ranges: unix or tcp +protocol = unix + +# the address that the grpc server to bind to +# default is unix socket /var/run/atuned/atuned.sock +# ranges: /var/run/atuned/atuned.sock or ip +address = /var/run/atuned/atuned.sock + +# the atuned grpc listening port, default is 60001 +# the port can be set between 0 to 65535 which not be used +port = 60001 + +# the rest service listening port, default is 8383 +# the port can be set between 0 to 65535 which not be used +rest_port = 8383 + +# when run analysis command, the numbers of collected data. +# default is 20 +sample_num = 20 + +# Enable gRPC and http server authentication SSL/TLS +# default is false +# tls = true +# tlsservercertfile = /etc/atuned/server.pem +# tlsserverkeyfile = /etc/atuned/server.key +# tlshttpcertfile = /etc/atuned/http/server.pem +# tlshttpkeyfile = /etc/atuned/http/server.key +# tlshttpcacertfile = /etc/atuned/http/cacert.pem + +#################################### log ############################### +# Either "debug", "info", "warn", "error", "critical", default is "info" +level = info + +#################################### monitor ############################### +[monitor] +# With the module and format of the MPI, the format is {module}_{purpose} +# The module is Either "mem", "net", "cpu", "storage" +# The purpose is "topo" +module = mem_topo, cpu_topo + +#################################### system ############################### +# you can add arbitrary key-value here, just like key = value +# you can use the key in the profile +[system] +# the disk to be analysis +disk = sda + +# the network to be analysis +network = enp189s0f0 + +user = root +``` + diff --git "a/content/zh/docs/A-Tune/\351\231\204\345\275\225.md" "b/content/zh/docs/A-Tune/\351\231\204\345\275\225.md" new file mode 100644 index 000000000..a805be531 --- /dev/null +++ "b/content/zh/docs/A-Tune/\351\231\204\345\275\225.md" @@ -0,0 +1,2 @@ +# 附录 + diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index 3396385eb..a5ccc674d 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -550,3 +550,63 @@ headless: true - [events]({{< relref "/docs/Container/events.md" >}}) - [info]({{< relref "/docs/Container/info.md" >}}) - [version]({{< relref "/docs/Container/version.md" >}}) + +- [A-Tune用户指南]({{< relref "/docs/A-Tune/{{< relref "/docs/A-Tune/A-Tune.md" >}}) + - [法律申明]({{< relref "/docs/A-Tune/{{< relref "/docs/A-Tune/法律申明.md" >}}) + - [前言]({{< relref "/docs/A-Tune/前言.md" >}}) + - [认识A-Tune]({{< relref "/docs/A-Tune/认识A-Tune.md" >}}) + - [简介]({{< relref "/docs/A-Tune/简介.md" >}}) + - [架构]({{< relref "/docs/A-Tune/架构.md" >}}) + - [支持特性与业务模型]({{< relref "/docs/A-Tune/支持特性与业务模型.md" >}}) + + - [安装与部署]({{< relref "/docs/A-Tune/安装与部署.md" >}}) + - [软硬件要求]({{< relref "/docs/A-Tune/软硬件要求.md" >}}) + - [环境准备]({{< relref "/docs/A-Tune/环境准备.md" >}}) + - [安装A-Tune]({{< relref "/docs/A-Tune/安装A-Tune.md" >}}) + - [安装模式介绍]({{< relref "/docs/A-Tune/安装模式介绍.md" >}}) + - [安装操作]({{< relref "/docs/A-Tune/安装操作.md" >}}) + + - [部署A-Tune]({{< relref "/docs/A-Tune/部署A-Tune.md" >}}) + - [配置介绍]({{< relref "/docs/A-Tune/配置介绍.md" >}}) + + - [启动A-Tune]({{< relref "/docs/A-Tune/启动A-Tune.md" >}}) + + - [使用方法]({{< relref "/docs/A-Tune/使用方法.md" >}}) + - [总体说明]({{< relref "/docs/A-Tune/总体说明.md" >}}) + - [查询负载类型]({{< relref "/docs/A-Tune/查询负载类型.md" >}}) + - [list]({{< relref "/docs/A-Tune/list.md" >}}) + + - [分析负载类型并自优化]({{< relref "/docs/A-Tune/分析负载类型并自优化.md" >}}) + - [analysis]({{< relref "/docs/A-Tune/analysis.md" >}}) + + - [自定义模型]({{< relref "/docs/A-Tune/自定义模型.md" >}}) + - [define]({{< relref "/docs/A-Tune/define.md" >}}) + - [collection]({{< relref "/docs/A-Tune/collection.md" >}}) + - [train]({{< relref "/docs/A-Tune/train.md" >}}) + - [undefine]({{< relref "/docs/A-Tune/undefine.md" >}}) + + - [查询profile]({{< relref "/docs/A-Tune/查询profile.md" >}}) + - [info]({{< relref "/docs/A-Tune/info.md" >}}) + + - [更新profile]({{< relref "/docs/A-Tune/更新profile.md" >}}) + - [update]({{< relref "/docs/A-Tune/update.md" >}}) + + - [激活profile]({{< relref "/docs/A-Tune/激活profile.md" >}}) + - [profile]({{< relref "/docs/A-Tune/profile.md" >}}) + + - [回滚profile]({{< relref "/docs/A-Tune/回滚profile.md" >}}) + - [rollback]({{< relref "/docs/A-Tune/rollback.md" >}}) + + - [更新数据库]({{< relref "/docs/A-Tune/更新数据库.md" >}}) + - [upgrade]({{< relref "/docs/A-Tune/upgrade.md" >}}) + + - [系统信息查询]({{< relref "/docs/A-Tune/系统信息查询.md" >}}) + - [check]({{< relref "/docs/A-Tune/check.md" >}}) + + - [参数自调优]({{< relref "/docs/A-Tune/参数自调优.md" >}}) + - [tuning]({{< relref "/docs/A-Tune/tuning.md" >}}) + + + - [常见问题与解决方法]({{< relref "/docs/A-Tune/常见问题与解决方法.md" >}}) + - [附录]({{< relref "/docs/A-Tune/附录.md" >}}) + - [术语和缩略语]({{< relref "/docs/A-Tune/术语和缩略语.md" >}}) -- Gitee From 38c3c565af4e6905017a325cc6e4be7ad35565b6 Mon Sep 17 00:00:00 2001 From: amyMaYun Date: Sat, 21 Mar 2020 16:39:43 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=85=8D=E5=A5=9720.03=20LTS=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=9B=B4=E6=96=B0=E5=AE=89=E5=85=A8=E5=8A=A0=E5=9B=BA?= =?UTF-8?q?=E6=8C=87=E5=8D=97=EF=BC=8C=E4=B8=BB=E8=A6=81=E6=98=AFSELinux?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=92=8C=E5=AE=89=E5=85=A8=E5=8A=A0=E5=9B=BA?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SELinux\351\205\215\347\275\256.md" | 67 ++++++++++ .../SecHarden/zh-cn_bookmap_0192073180.md | 50 -------- ...345\233\272SSH\346\234\215\345\212\241.md" | 2 +- ...05\346\240\270\345\217\202\346\225\260.md" | 2 +- ...40\345\233\272\346\223\215\344\275\234.md" | 115 ++++++++++++++++++ ...40\345\233\272\346\226\271\346\241\210.md" | 4 +- ...40\345\233\272\347\224\237\346\225\210.md" | 8 ++ ...40\345\233\272\345\267\245\345\205\267.md" | 1 + ...03\351\231\220\345\220\253\344\271\211.md" | 8 +- ...77\347\224\250\346\235\203\351\231\220.md" | 14 +++ content/zh/menu/index.md | 9 ++ 11 files changed, 223 insertions(+), 57 deletions(-) create mode 100644 "content/zh/docs/SecHarden/SELinux\351\205\215\347\275\256.md" delete mode 100644 content/zh/docs/SecHarden/zh-cn_bookmap_0192073180.md create mode 100644 "content/zh/docs/SecHarden/\345\212\240\345\233\272\346\223\215\344\275\234.md" create mode 100644 "content/zh/docs/SecHarden/\345\212\240\345\233\272\347\224\237\346\225\210.md" create mode 100644 "content/zh/docs/SecHarden/\345\256\211\345\205\250\345\212\240\345\233\272\345\267\245\345\205\267.md" create mode 100644 "content/zh/docs/SecHarden/\351\231\220\345\210\266sudo\345\221\275\344\273\244\347\232\204\344\275\277\347\224\250\346\235\203\351\231\220.md" diff --git "a/content/zh/docs/SecHarden/SELinux\351\205\215\347\275\256.md" "b/content/zh/docs/SecHarden/SELinux\351\205\215\347\275\256.md" new file mode 100644 index 000000000..3c8d1fcde --- /dev/null +++ "b/content/zh/docs/SecHarden/SELinux\351\205\215\347\275\256.md" @@ -0,0 +1,67 @@ +# SELinux配置 + +## 概述 + +自由访问控制DAC(Discretionary Access Control)基于用户、组和其他权限,决定一个资源是否能被访问的因素是某个资源是否拥有对应用户的权限,它不能使系统管理员创建全面和细粒度的安全策略。SELinux(Security-Enhanced Linux)是Linux内核的一个模块,也是Linux的一个安全子系统。SELinux的实现了强制访问控制MAC(Mandatory Access Control ),每个进程和系统资源都有一个特殊的安全标签,资源能否被访问除了DAC规定的原则外,还需要判断每一类进程是否拥有对某一类资源的访问权限。 + +openEuler默认使用SELinux提升系统安全性。SELinux分为三种模式: + +- permissive:SELinux仅打印告警而不强制执行。 +- enforcing:SELinux安全策略被强制执行。 +- disabled:不加载SELinux安全策略。 + +## 配置说明 + +openEuler默认开启SELinux,且默认模式为enforcing,用户可以通过修改/etc/selinux/config中配置项SELINUX的值变更SELinux模式。 + +- 关闭SELinux策略的配置如下: + + ``` + SELINUX=disabled + ``` + +- 使用permissive策略的配置如下: + + ``` + SELINUX=permissive + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>disabled与另两种模式切换时需重启系统生效。 +>``` +># reboot +>``` + +## SELinux相关命令 + +- 查询SELinux模式。例如下述查询的SELinux模式为Permissive: + + ``` + # getenforce + Permissive + ``` + +- 设置SELinux模式,0表示permissive模式,1表示enforcing模式,例如设置为enforcing模式的命令如下。该命令不能设置disabled模式,且系统重启后,恢复到/etc/selinux/config中设置的模式。 + + ``` + # setenforce 1 + ``` + +- 查询运行SELinux的系统状态。SELinux status表示SELinux的状态,enabled表示启用SELinux,disabled表示关闭SELinux。Current mode表示SELinux当前的安全策略。 + + ``` + # sestatus + SELinux status: enabled + SELinuxfs mount: /sys/fs/selinux + SELinux root directory: /etc/selinux + Loaded policy name: targeted + Current mode: enforcing + Mode from config file: enforcing + Policy MLS status: enabled + Policy deny_unknown status: allowed + Memory protection checking: actual (secure) + Max kernel policy version: 31 + ``` + + diff --git a/content/zh/docs/SecHarden/zh-cn_bookmap_0192073180.md b/content/zh/docs/SecHarden/zh-cn_bookmap_0192073180.md deleted file mode 100644 index 9014a51fe..000000000 --- a/content/zh/docs/SecHarden/zh-cn_bookmap_0192073180.md +++ /dev/null @@ -1,50 +0,0 @@ -# openEuler 1.0 安全加固指南 - -- [法律声明](法律声明.md) -- [前言](前言.md) -- [操作系统加固概述](操作系统加固概述.md) - - [加固目的](加固目的.md) - - [加固方案](加固方案.md) - - [加固影响](加固影响.md) - -- [加固指导](加固指导.md) - - [系统服务](系统服务.md) - - [加固SSH服务](加固SSH服务.md) - - - [文件权限](文件权限.md) - - [设置文件的权限和属主](设置文件的权限和属主.md) - - [删除无主文件](删除无主文件.md) - - [处理空链接文件](处理空链接文件.md) - - [设置守护进程的umask值](设置守护进程的umask值.md) - - [为全局可写目录添加粘滞位属性](为全局可写目录添加粘滞位属性.md) - - [删除非授权文件的全局可写属性](删除非授权文件的全局可写属性.md) - - [限制at命令的使用权限](限制at命令的使用权限.md) - - [限制cron命令的使用权限](限制cron命令的使用权限.md) - - - [内核参数](内核参数.md) - - [加固内核参数](加固内核参数.md) - - - [授权认证](授权认证.md) - - [设置网络远程登录的警告信息](设置网络远程登录的警告信息.md) - - [禁止通过CTRL+ALT+DEL重启系统](禁止通过CTRL+ALT+DEL重启系统.md) - - [设置终端的自动退出时间](设置终端的自动退出时间.md) - - [设置用户的默认umask值为077](设置用户的默认umask值为077.md) - - [设置GRUB2加密口令](设置GRUB2加密口令.md) - - [安全单用户模式](安全单用户模式.md) - - [禁止交互式启动](禁止交互式启动.md) - - - [账户口令](账户口令.md) - - [屏蔽系统帐户](屏蔽系统帐户.md) - - [限制使用su命令的帐户](限制使用su命令的帐户.md) - - [设置口令复杂度](设置口令复杂度.md) - - [设置口令有效期](设置口令有效期.md) - - [设置口令的加密算法](设置口令的加密算法.md) - - [登录失败超过三次后锁定](登录失败超过三次后锁定.md) - - [加固su命令](加固su命令.md) - - -- [附录](附录.md) - - [文件和目录权限含义](文件和目录权限含义.md) - - [umask值含义](umask值含义.md) - - diff --git "a/content/zh/docs/SecHarden/\345\212\240\345\233\272SSH\346\234\215\345\212\241.md" "b/content/zh/docs/SecHarden/\345\212\240\345\233\272SSH\346\234\215\345\212\241.md" index f7c3031fc..b08a41192 100644 --- "a/content/zh/docs/SecHarden/\345\212\240\345\233\272SSH\346\234\215\345\212\241.md" +++ "b/content/zh/docs/SecHarden/\345\212\240\345\233\272SSH\346\234\215\345\212\241.md" @@ -142,7 +142,7 @@ SSH(Secure Shell)是目前较可靠,专为远程登录会话和其他网

PermitRootLogin

-

是否允许root账户直接使用SSH登录系统

+

是否允许root账户直接使用SSH登录系统

说明:

若需要直接使用root账户通过SSH登录系统,请修改/etc/ssh/sshd_config文件的PermitRootLogin字段的值为yes。

diff --git "a/content/zh/docs/SecHarden/\345\212\240\345\233\272\345\206\205\346\240\270\345\217\202\346\225\260.md" "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\345\206\205\346\240\270\345\217\202\346\225\260.md" index f79030b5c..a7e64a825 100644 --- "a/content/zh/docs/SecHarden/\345\212\240\345\233\272\345\206\205\346\240\270\345\217\202\346\225\260.md" +++ "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\345\206\205\346\240\270\345\217\202\346\225\260.md" @@ -191,7 +191,7 @@ -2. 加载sysctl.conf文件中设置的内核参数 +2. 加载sysctl.conf文件中设置的内核参数。 ``` sysctl -p /etc/sysctl.conf diff --git "a/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\223\215\344\275\234.md" "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\223\215\344\275\234.md" new file mode 100644 index 000000000..c245a861a --- /dev/null +++ "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\223\215\344\275\234.md" @@ -0,0 +1,115 @@ +# 加固操作 + +## 概述 + +安全加固工具会根据usr-security.conf设置加固策略,使用加固工具设置加固策略需要用户修改usr-security.conf。本节介绍usr-security.conf的修改规则。用户可配置的加固项请参见[加固指导](加固指导.md)对应内容。 + +## 注意事项 + +- 修改配置后,需要重启安全加固服务使配置生效。重启方法请参见[加固生效](加固生效.md)对应内容。 +- 用户修改加固配置时,仅修改/etc/openEuler\_security/usr-security.conf文件,不建议修改/etc/openEuler\_security/security.conf。security.conf中为基本加固项,仅运行一次。 +- 当重启安全加固服务使配置生效后,在usr-security.conf中删除对应加固项并重启安全加固服务并不能清除之前的配置。 +- 安全加固操作记录在日志文件/var/log/openEuler-security.log中。 + +## 配置格式 + +usr-security.conf中的每一行代表一项配置,根据配置内容的不同有不同配置格式,这里给出各类配置的格式说明。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 所有配置项以执行ID开头,执行ID仅为了方便用户识别配置内容,取值为正整数,由用户自行定义。 +>- 配置项的各内容之间使用@作为分隔符。 +>- 若实际配置内容中包含@,需要使用@@表示以和分隔符区分,例如实际内容为xxx@yyy,则配置为xxx@@yyy。目前不支持@位于配置内容的开头和结尾。 + +- d:注释 + + 格式:执行ID@d@对象文件@匹配项 + + 功能:将对象文件中以匹配项开头(行首可以有空格)的行注释(在行首添加\#)。 + + 示例:执行ID为401,注释/etc/sudoers文件中以%wheel开头的行。 + + ``` + 401@d@/etc/sudoers@%wheel + ``` + + +- m:替换 + + 格式:执行ID@m@对象文件@匹配项@替换目标值 + + 功能:将对象文件中以匹配项开头(行首可以有空格)的行替换为“匹配项加替换目标值 ”。若匹配行开头有空格,替换后将删除这些空格。 + + 示例:执行ID为101,将/etc/ssh/sshd\_config文件中以Protocol 开头的行替换为Protocol 2。匹配和替换时也会考虑Protocol后的空格。 + + ``` + 101@m@/etc/ssh/sshd_config@Protocol @2 + ``` + +- sm:精确修改 + + 格式:执行ID@sm@对象文件@匹配项@替换目标值 + + 功能:将对象文件中以匹配项开头(行首可以有空格)的行替换为“匹配项加替换目标值 ”。若匹配行开头有空格,替换后将保留这些空格,这是sm和m的区别。 + + 示例:执行ID为201,将/etc/audit/hzqtest文件中以size开头的行替换为size 2048。 + + ``` + 201@sm@/etc/audit/hzqtest@size @2048 + ``` + + +- M:修改子项 + + 格式:执行ID@M@对象文件@匹配项@匹配子项\[@匹配子项的值\] + + 功能:匹配对象文件中以匹配项开头(行首可以有空格)的行,并将该行中以匹配子项开始的内容替换为“匹配子项和匹配子项的值”,其中匹配子项的值可选。 + + 示例:执行ID为101,找到file文件中以key开头的行,并将这些行中以key2开始的内容替换为key2value2。 + + ``` + 101@M@file@key@key2@value2 + ``` + +- systemctl:管理服务 + + 格式:执行ID@systemctl@对象服务@具体操作 + + 功能:使用systemctl管理对象服务,具体操作可取值为start、stop、restart、disable等systemctl所有可用的命令。 + + 示例:执行ID为218,停止cups.service服务,等同于systemctl stop cups.service的配置行。 + + ``` + 218@systemctl @cups.service@stop + ``` + +- 其他命令 + + 格式:执行ID@命令@对象文件 + + 功能:执行对应命令,即执行命令行“命令 对象文件”。 + + 示例一:执行ID为402,使用rm -f命令删除文件/etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem。 + + ``` + 402@rm -f @/etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem + ``` + + 示例二:执行ID为215,使用touch命令创建文件/etc/cron.allow。 + + ``` + 215@touch @/etc/cron.allow + ``` + + 示例三:执行ID为214,使用chown命令将文件/etc/at.allow的属主改为root:root。 + + ``` + 214@chown root:root @/etc/at.allow + ``` + + 示例四:执行ID为214,使用chmod命令去除文件/etc/at.allow属主所在群组及其他非属主用户的rwx权限。 + + ``` + 214@chmod og-rwx @/etc/at.allow + ``` + + diff --git "a/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\226\271\346\241\210.md" "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\226\271\346\241\210.md" index c67421e27..fac885380 100644 --- "a/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\226\271\346\241\210.md" +++ "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\346\226\271\346\241\210.md" @@ -4,7 +4,9 @@ ## 加固方式 -openEuler默认搭载系统安全加固包security-tool,在安装时生成安全加固服务。系统在首次启动时自动运行安全加固服务,执行默认的安全策略配置。用户可以根据需求定制安全加固工具或者通过修改相关配置定制加固方案,本文档介绍相关的加固方法。 +用户可以通过手动修改加固配置或执行相关命令对系统进行加固,也可以通过加固工具批量修改加固项。openEuler的安全加固工具security tool以openEuler-security.service服务的形式运行。系统首次启动时会自动运行该服务去执行默认加固策略,且自动设置后续开机不启动该服务。 + +用户可以通过修改security.conf,使用安全加固工具实现个性化安全加固的效果。 ## 加固内容 diff --git "a/content/zh/docs/SecHarden/\345\212\240\345\233\272\347\224\237\346\225\210.md" "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\347\224\237\346\225\210.md" new file mode 100644 index 000000000..f27767b47 --- /dev/null +++ "b/content/zh/docs/SecHarden/\345\212\240\345\233\272\347\224\237\346\225\210.md" @@ -0,0 +1,8 @@ +# 加固生效 + +完成修改usr-security.conf文件后,请运行如下命令使新添加的配置生效。 + +``` +systemctl restart openEuler-security.service +``` + diff --git "a/content/zh/docs/SecHarden/\345\256\211\345\205\250\345\212\240\345\233\272\345\267\245\345\205\267.md" "b/content/zh/docs/SecHarden/\345\256\211\345\205\250\345\212\240\345\233\272\345\267\245\345\205\267.md" new file mode 100644 index 000000000..2bbdb274f --- /dev/null +++ "b/content/zh/docs/SecHarden/\345\256\211\345\205\250\345\212\240\345\233\272\345\267\245\345\205\267.md" @@ -0,0 +1 @@ +# 安全加固工具 diff --git "a/content/zh/docs/SecHarden/\346\226\207\344\273\266\345\222\214\347\233\256\345\275\225\346\235\203\351\231\220\345\220\253\344\271\211.md" "b/content/zh/docs/SecHarden/\346\226\207\344\273\266\345\222\214\347\233\256\345\275\225\346\235\203\351\231\220\345\220\253\344\271\211.md" index afdbe2bcd..f590cb7fc 100644 --- "a/content/zh/docs/SecHarden/\346\226\207\344\273\266\345\222\214\347\233\256\345\275\225\346\235\203\351\231\220\345\220\253\344\271\211.md" +++ "b/content/zh/docs/SecHarden/\346\226\207\344\273\266\345\222\214\347\233\256\345\275\225\346\235\203\351\231\220\345\220\253\344\271\211.md" @@ -1,6 +1,6 @@ # 文件和目录权限含义 -Linux系统中文件和目录权限用于限定谁能通过何种方式对文件和目录进行访问和操作。文件和目录的访问权限分为只读、只写和可执行三种。 +Linux系统中文件和目录权限用于限定谁能通过何种方式对文件和目录进行访问和操作。文件和目录的访问权限分为只读,只写和可执行三种。 有三种不同类型的用户可对文件和目录进行访问: @@ -12,7 +12,7 @@ Linux系统中文件和目录权限用于限定谁能通过何种方式对文件 假设/usr/src的权限为755,将每位数字转化为二进制后为:111101101,含义如下: -- 左侧三个bit位"111"表示文件所有者的权限依次为:可读、可写、可执行。 -- 中间三个bit位"101"表示同组用户的权限依次为:可读、不可写、可执行。 -- 右侧三个bit位"101"表示其他用户的权限依次为:可读、不可写、可执行。 +- 左侧三个bit位111表示文件所有者的权限依次为:可读、可写、可执行。 +- 中间三个bit位101表示同组用户的权限依次为:可读、不可写、可执行。 +- 右侧三个bit位101表示其他用户的权限依次为:可读、不可写、可执行。 diff --git "a/content/zh/docs/SecHarden/\351\231\220\345\210\266sudo\345\221\275\344\273\244\347\232\204\344\275\277\347\224\250\346\235\203\351\231\220.md" "b/content/zh/docs/SecHarden/\351\231\220\345\210\266sudo\345\221\275\344\273\244\347\232\204\344\275\277\347\224\250\346\235\203\351\231\220.md" new file mode 100644 index 000000000..2a7f2637e --- /dev/null +++ "b/content/zh/docs/SecHarden/\351\231\220\345\210\266sudo\345\221\275\344\273\244\347\232\204\344\275\277\347\224\250\346\235\203\351\231\220.md" @@ -0,0 +1,14 @@ +# 限制sudo命令的使用权限 + +## 说明 + +sudo命令用于普通用户以root权限执行命令。为了增强系统安全性,有必要对sudo命令的使用权进行控制,只允许roo使用sudo命令,限制其他帐户使用。 + +## 实现 + +sudo命令的使用控制通过修改/etc/sudoers文件实现,需要注释掉如下配置行: + +``` +#%wheel ALL=(ALL) ALL +``` + diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index a5ccc674d..e7fe85153 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -215,6 +215,8 @@ headless: true - [删除非授权文件的全局可写属性]({{< relref "/docs/SecHarden/删除非授权文件的全局可写属性.md" >}}) - [限制at命令的使用权限]({{< relref "/docs/SecHarden/限制at命令的使用权限.md" >}}) - [限制cron命令的使用权限]({{< relref "/docs/SecHarden/限制cron命令的使用权限.md" >}}) + - [限制sudo命令的使用权限]({{< relref "/docs/SecHarden/限制sudo命令的使用权限.md" >}}) + - [内核参数]({{< relref "/docs/SecHarden/内核参数.md" >}}) - [加固内核参数]({{< relref "/docs/SecHarden/加固内核参数.md" >}}) - [授权认证]({{< relref "/docs/SecHarden/授权认证.md" >}}) @@ -233,6 +235,13 @@ headless: true - [设置口令的加密算法]({{< relref "/docs/SecHarden/设置口令的加密算法.md" >}}) - [登录失败超过三次后锁定]({{< relref "/docs/SecHarden/登录失败超过三次后锁定.md" >}}) - [加固su命令]({{< relref "/docs/SecHarden/加固su命令.md" >}}) + + + - [安全加固工具]({{< relref "/docs/SecHarden/安全加固工具.md" >}}) + - [加固操作]({{< relref "/docs/SecHarden/加固操作.md" >}}) + - [加固生效]({{< relref "/docs/SecHarden/加固生效.md" >}}) + + - [SELinux配置]({{< relref "/docs/SecHarden/SELinux配置.md" >}}) - [附录]({{< relref "/docs/SecHarden/附录.md" >}}) - [文件和目录权限含义]({{< relref "/docs/SecHarden/文件和目录权限含义.md" >}}) - [umask值含义]({{< relref "/docs/SecHarden/umask值含义.md" >}}) -- Gitee From e11f89e1f39e3f9e98fa29c068a2799bc98dcc56 Mon Sep 17 00:00:00 2001 From: amyMaYun Date: Sat, 21 Mar 2020 18:22:14 +0800 Subject: [PATCH 3/4] update doc of virtulization for openEuler 20.03 LTS --- .../IOThread\351\205\215\347\275\256.md" | 59 ++++++ .../Libvirt\351\211\264\346\235\203.md" | 84 +++++++++ .../PCI\347\233\264\351\200\232.md" | 84 +++++++++ .../SR-IOV\347\233\264\351\200\232.md" | 171 ++++++++++++++++++ ...07\344\273\266\347\244\272\344\276\213.md" | 92 +++++++++- ...M\346\236\266\346\236\204\345\233\276.png" | Bin 23364 -> 16018 bytes .../figures/zh-cn_image_0183148772.png | Bin 1124 -> 0 bytes .../figures/zh-cn_image_0183148773.png | Bin 1858 -> 0 bytes .../figures/zh-cn_image_0189777265.png | Bin 15817 -> 0 bytes ...1\350\275\254\346\215\242\345\233\276.png" | Bin 49213 -> 22222 bytes ...7\345\214\226\346\236\266\346\236\204.png" | Bin 15817 -> 14455 bytes ...4\347\273\223\346\236\204\345\233\276.png" | Bin 24765 -> 16684 bytes .../zh/docs/Virtualization/halt-polling.md | 8 +- ...24\347\246\273\347\273\221\345\256\232.md" | 14 ++ content/zh/docs/Virtualization/qemu-ga.md | 63 +++++++ .../sVirt\344\277\235\346\212\244.md" | 62 +++++++ .../zh-cn_bookmap_0183145741.md | 77 -------- ...70\345\205\263\351\205\215\347\275\256.md" | 59 ++++++ ...01\351\205\215\347\275\256\351\241\271.md" | 36 +--- ...70\347\224\250\350\256\276\345\244\207.md" | 12 +- ...05\345\255\230\345\244\247\351\241\265.md" | 4 +- ...\267\245\345\205\267\351\233\206EDK-II.md" | 35 ---- ...25\345\257\274\345\233\272\344\273\266.md" | 62 +++++++ ...06\345\244\207\347\216\257\345\242\203.md" | 1 - ...30\345\202\250\345\277\253\347\205\247.md" | 41 +++++ ...30\345\202\250\350\256\276\345\244\207.md" | 4 +- ...00\344\275\263\345\256\236\350\267\265.md" | 2 + ...11\350\243\205\346\214\207\345\215\227.md" | 2 + ...11\350\243\205\346\226\271\346\263\225.md" | 4 +- ...70\345\277\203\347\273\204\344\273\266.md" | 1 - ...00\344\275\263\345\256\236\350\267\265.md" | 1 + ...\344\275\223\344\273\213\347\273\215-0.md" | 4 +- ...73\347\272\277\351\205\215\347\275\256.md" | 4 +- ...54\344\273\266\350\246\201\346\261\202.md" | 3 +- ...00\344\275\263\345\256\236\350\267\265.md" | 1 + ...14\347\274\251\347\225\245\350\257\255.md" | 48 ++--- ...37\346\234\272\344\277\241\346\201\257.md" | 8 +- ...73\350\231\232\346\213\237\346\234\272.md" | 2 - ...06\345\221\230\346\214\207\345\215\227.md" | 1 - ...25\350\231\232\346\213\237\346\234\272.md" | 1 - ...41\347\220\206\345\221\275\344\273\244.md" | 2 +- ...347\220\206\350\231\232\346\213\237CPU.md" | 1 - ...32\346\213\237\345\206\205\345\255\230.md" | 1 + ...06\350\231\232\346\213\237\346\234\272.md" | 1 - ...350\231\232\346\213\237\346\234\272USB.md" | 3 + ...32\346\213\237\347\243\201\347\233\230.md" | 2 +- ...32\346\213\237\347\275\221\345\215\241.md" | 4 +- ...76\345\244\207\347\233\264\351\200\232.md" | 6 + ...350\207\263\347\211\251\347\220\206CPU.md" | 18 +- ...21\347\273\234\350\256\276\345\244\207.md" | 4 +- ...76\345\244\207\346\230\240\345\260\204.md" | 54 ++++++ ...06\350\231\232\346\213\237\345\214\226.md" | 10 +- .../\351\205\215\347\275\256Guest-NUMA.md" | 10 +- .../\351\205\215\347\275\256Host-NUMA.md" | 13 +- ...SB\346\216\247\345\210\266\345\231\250.md" | 45 +++++ ...64\351\200\232\350\256\276\345\244\207.md" | 91 ++++++++++ ...Ie\346\216\247\345\210\266\345\231\250.md" | 2 +- .../\351\231\204\345\275\225.md" | 1 + ...57\345\220\246\346\210\220\345\212\237.md" | 8 +- content/zh/menu/index.md | 47 ++++- 60 files changed, 1122 insertions(+), 251 deletions(-) create mode 100644 "content/zh/docs/Virtualization/IOThread\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Virtualization/Libvirt\351\211\264\346\235\203.md" create mode 100644 "content/zh/docs/Virtualization/PCI\347\233\264\351\200\232.md" create mode 100644 "content/zh/docs/Virtualization/SR-IOV\347\233\264\351\200\232.md" delete mode 100644 content/zh/docs/Virtualization/figures/zh-cn_image_0183148772.png delete mode 100644 content/zh/docs/Virtualization/figures/zh-cn_image_0183148773.png delete mode 100644 content/zh/docs/Virtualization/figures/zh-cn_image_0189777265.png create mode 100644 "content/zh/docs/Virtualization/kworker\351\232\224\347\246\273\347\273\221\345\256\232.md" create mode 100644 content/zh/docs/Virtualization/qemu-ga.md create mode 100644 "content/zh/docs/Virtualization/sVirt\344\277\235\346\212\244.md" delete mode 100644 content/zh/docs/Virtualization/zh-cn_bookmap_0183145741.md create mode 100644 "content/zh/docs/Virtualization/\344\275\223\347\263\273\346\236\266\346\236\204\347\233\270\345\205\263\351\205\215\347\275\256.md" delete mode 100644 "content/zh/docs/Virtualization/\345\207\206\345\244\207UEFI\345\274\225\345\257\274\345\267\245\345\205\267\351\233\206EDK-II.md" create mode 100644 "content/zh/docs/Virtualization/\345\207\206\345\244\207\345\274\225\345\257\274\345\233\272\344\273\266.md" create mode 100644 "content/zh/docs/Virtualization/\345\255\230\345\202\250\345\277\253\347\205\247.md" create mode 100644 "content/zh/docs/Virtualization/\345\256\211\345\205\250\346\234\200\344\275\263\345\256\236\350\267\265.md" create mode 100644 "content/zh/docs/Virtualization/\346\200\247\350\203\275\346\234\200\344\275\263\345\256\236\350\267\265.md" create mode 100644 "content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272USB.md" create mode 100644 "content/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207\347\233\264\351\200\232.md" create mode 100644 "content/zh/docs/Virtualization/\350\243\270\350\256\276\345\244\207\346\230\240\345\260\204.md" create mode 100644 "content/zh/docs/Virtualization/\351\205\215\347\275\256USB\346\216\247\345\210\266\345\231\250.md" create mode 100644 "content/zh/docs/Virtualization/\351\205\215\347\275\256USB\347\233\264\351\200\232\350\256\276\345\244\207.md" diff --git "a/content/zh/docs/Virtualization/IOThread\351\205\215\347\275\256.md" "b/content/zh/docs/Virtualization/IOThread\351\205\215\347\275\256.md" new file mode 100644 index 000000000..a81c17cab --- /dev/null +++ "b/content/zh/docs/Virtualization/IOThread\351\205\215\347\275\256.md" @@ -0,0 +1,59 @@ +# IOThread配置 + +## 概述 + +KVM平台上,对虚拟磁盘的读写在后端默认由QEMU主线程负责处理。这样会造成如下问题: + +- 虚拟机的I/O请求都由一个QEMU主线程进行处理,因此单线程的CPU利用率成为虚拟机I/O性能的瓶颈。 +- 虚拟机I/O在QEMU主线程处理时会持有QEMU全局锁\(qemu\_global\_mutex\),一旦I/O处理耗时较长,QEMU主线程长时间占有全局锁,会导致虚拟机vCPU无法正常调度,影响虚拟机整体性能及用户体验。 + +可以为virtio-blk磁盘或者virtio-scsi控制器配置IOThread属性,在QEMU后端单独开辟IOThread线程处理虚拟磁盘读写请求,IOThread线程和virtio-blk磁盘或virtio-scsi控制器可配置成一对一的映射关系,尽可能地减少对QEMU主线程的影响,提高虚拟机整体I/O性能,提升用户体验。 + +## 配置说明 + +使用IOThread线程处理虚拟机磁盘读写请求,需要修改虚拟机配置,这里给出具体的配置说明。 + +- 配置虚拟机高性能虚拟磁盘的总数。例如通过配置IOThread线程的总数为4: + + ``` + + VMName + 4194304 + 4194304 + 4 + 4 + ``` + +- 给virtio-blk磁盘配置IOThread属性。**<**iothread**\>**表示IOThread线程编号,编号从1开始配置,最大为的配置值,且编号不能重复使用。例如将编号为2的IOThread配置给virtio-blk磁盘使用: + + ``` + + + + +
+ + ``` + +- 给virtio-scsi控制器配置IOThread属性。例如将编号为2的IOThread配置给virtio-scsi控制器使用: + + ``` + + + +
+ + ``` + +- IOThread线程绑定物理CPU + + 虚拟磁盘IOThread线程的绑核配置,将IOThread线程绑定到用户指定的物理CPU范围内,不影响vCPU线程的资源占用诉求。表示IOThread线程编号,表示绑定的物理CPU编号。 + + ``` + + + + + ``` + + diff --git "a/content/zh/docs/Virtualization/Libvirt\351\211\264\346\235\203.md" "b/content/zh/docs/Virtualization/Libvirt\351\211\264\346\235\203.md" new file mode 100644 index 000000000..b2523aea5 --- /dev/null +++ "b/content/zh/docs/Virtualization/Libvirt\351\211\264\346\235\203.md" @@ -0,0 +1,84 @@ +# Libvirt鉴权 + +## 简介 + +用户使用libvirt远程调用功能时,如果不进行任何鉴权校验,所有连接到主机所在网络的第三方程序都可以通过libvirt的远程调用操作虚拟机,存在安全隐患。为了提升系统安全性,openEuler提供了libvirt鉴权功能,即用户通过libvirt远程调用操作虚拟机前,必须经过身份校验,只有特定用户允许访问虚拟机,从而保护组网中的虚拟机。 + +## 开启libvirt鉴权 + +openEuler默认关闭libvirt远程调用功能,这里给出开启libvirt远程调用和libvirt鉴权功能的方法。 + +1. 登录主机。 +2. 修改libvirt服务配置文件/etc/libvirt/libvirtd.conf,开启libvirt远程调用和libvirt鉴权功能。例如使用基于SASL(Simple Authentication and Security Layer)协议的TCP远程调用配置参考如下: + + ``` + # 传输层安全协议,0表示关闭,1表示开启,由用户自行配置 + listen_tls = 0 + # 开启基于TCP的远程调用,开启libvirt远程调用和libvirt鉴权功能必须配置为1 + listen_tcp = 1 + # TCP远程调用所使用的协议,由用户自行配置,此处以sasl为例 + auth_tcp = "sasl" + ``` + +3. 修改/etc/sasl2/libvirt.conf配置文件,设置SASL认证机制和sasldb数据库。 + + ``` + # sasl协议的认证机制 + mech_list: digest-md5 + # 存放用户和用户密码的数据库 + sasldb_path: /etc/libvirt/passwd.db + ``` + +4. 添加用于SASL验证的用户并设置其密码,假设用户名为userName,命令参考如下: + + ``` + # saslpasswd2 -a libvirt userName + Password: + Again (for verification): + ``` + +5. 修改/etc/sysconfig/libvirtd配置文件,开启libvirt侦听选项。 + + ``` + LIBVIRTD_ARGS="--listen" + ``` + +6. 重启libvirtd服务,使修改生效。 + + ``` + # systemctl restart libvirtd + ``` + +7. 确认libvirt远程调用的鉴权功能是否生效。根据提示输入用户名和密码能够成功连接libvirt服务,说明开启成功。 + + ``` + # virsh -c qemu+tcp://192.168.0.1/system + Please enter your authentication name: openeuler + Please enter your password: + Welcome to virsh, the virtualization interactive terminal. + + Type: 'help' for help with commands + 'quit' to quit + + virsh # + ``` + + +## 管理SASL + +这里给出管理SASL用户的操作。 + +- 查询数据库中存在的用户 + + ``` + # sasldblistusers2 -f /etc/libvirt/passwd.db + user@localhost.localdomain: userPassword + ``` + +- 从数据库中删除用户user + + ``` + # saslpasswd2 -a libvirt -d user + ``` + + diff --git "a/content/zh/docs/Virtualization/PCI\347\233\264\351\200\232.md" "b/content/zh/docs/Virtualization/PCI\347\233\264\351\200\232.md" new file mode 100644 index 000000000..6a5f81583 --- /dev/null +++ "b/content/zh/docs/Virtualization/PCI\347\233\264\351\200\232.md" @@ -0,0 +1,84 @@ +# PCI直通 + +PCI直通是指将host上的物理PCI设备直接呈现给一台虚拟机,供虚拟机直接访问的一种使用方式。PCI直通使用了vfio设备直通方式,为虚拟机配置PCI直通的xml配置如下: + +``` + + + +
+ + +
+ +``` + +**表 1** PCI直通设备配置项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

说明

+

取值

+

hostdev.source.address.domain

+

host OS上的PCI设备的domain号。

+

>=0

+

hostdev.source.address.bus

+

host OS上的PCI设备bus号。

+

>=1

+

hostdev.source.address.slot

+

host OS上的PCI设备的device号。

+

>=0

+

hostdev.source.address.function

+

host OS上的PCI设备的function号。

+

>=0

+

hostdev.driver.name

+

可选配置项,指定PCI直通的后端驱动。

+

vfio(默认配置项)

+

hostdev.rom

+

直通设备的ROM是否呈现给虚拟机。

+

可以配置为“on/off”,默认为“on”。

+
  • on:表示直通设备的ROM呈现给虚拟机,例如:直通网卡虚拟机需要从该网卡的PXE启动时,可以将该选项配置为“on”,HBA卡直通虚拟机需要从ROM中启动时可以将该选项配置为“on”。
  • off:表示直通设备的ROM不呈现给虚拟机。
+

hostdev.address type

+

PCI设备呈现的Guest内bdf号。

+

[0x03-0x1e](slot范围)

+

说明:

+
  • domain为域信息,bus为总线号,slot为插槽号,function为功能
  • 除了slot插槽号,这里其余均默认为0。
  • 第一个slot插槽号0x00被系统占用,第二个slot号0x01被IDE控制器和USB控制器占用,第三个slot号0x02被video占用。
  • 最后一个slot号0x1f被pvchannel占用。
+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>VFIO直通方式的最小直通单位是iommu\_group,host根据硬件上的ACS位,来划分iommu\_group。同一个iommu\_group中的设备只允许直通给同一台虚拟机(一个PCI设备上的若干个function,如果属于同一个iommu\_group,只允许直通给一个虚拟机使用)。 + diff --git "a/content/zh/docs/Virtualization/SR-IOV\347\233\264\351\200\232.md" "b/content/zh/docs/Virtualization/SR-IOV\347\233\264\351\200\232.md" new file mode 100644 index 000000000..26845f952 --- /dev/null +++ "b/content/zh/docs/Virtualization/SR-IOV\347\233\264\351\200\232.md" @@ -0,0 +1,171 @@ +# SR-IOV直通 + +## 概述 + +SR-IOV(Single Root I/O Virtualizaiton)是一种基于硬件的虚拟化解决方案,通过SR-IOV技术可以将一个PF(Physical Function)虚拟成多个VF(Virtual Function),每个VF都可以单独被直通给一个虚拟机,极大地提升了硬件资源利用率和虚拟机的I/O性能。一种典型的应用场景就是网卡SR-IOV设备直通,利用SR-IOV技术可以将一个物理网卡(PF)虚拟成多个VF网卡,再把VF直通给虚拟机使用。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- SR-IOV需要物理硬件支持,使用SR-IOV前请确保要直通的硬件设备支持该能力,并且Host侧的设备驱动程序工作在SR-IOV模式下。 +>- 查询网卡具体型号的办法如下: +>例如下述回显,第一列为网卡的PCI号,19e5:1822为网卡的厂商号设备号。 +>``` +># lspci | grep Ether +>05:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +>07:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +>09:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +>0b:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +>81:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) +>81:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) +>``` + +## 操作方法 + +配置SR-IOV直通网卡的操作步骤如下: + +1. 开启网卡的SR-IOV模式。 + 1. 请确保Guest OS有网卡供应商提供的VF驱动支持,否则Guest OS内VF无法正常工作。 + 2. 在host OS的BIOS中开启SMMU/IOMMU的支持。不同厂家服务器的开启方式可能不同,请参考各服务器的帮助文档。 + 3. HOST驱动配置,开启SR-IOV的VF模式。这里以Hi1822网卡为例,开启16个VF。 + + ``` + echo 16 > /sys/class/net/ethX/device/sriov_numvfs + ``` + +2. 获取PF和VF的PCI BDF信息。 + 1. 获取当前单板上的网卡资源列表,参考命令如下: + + ``` + # lspci | grep Eth + 03:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) + 04:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) + 05:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) + 06:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) + 7d:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Device a222 (rev 20) + 7d:00.1 Ethernet controller: Huawei Technologies Co., Ltd. Device a222 (rev 20) + 7d:00.2 Ethernet controller: Huawei Technologies Co., Ltd. Device a221 (rev 20) + 7d:00.3 Ethernet controller: Huawei Technologies Co., Ltd. Device a221 (rev 20) + ``` + + 2. 查看VF的PCI BDF信息,参考命令如下: + + ``` + # lspci | grep "Virtual Function" + 03:00.1 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:00.2 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:00.3 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:00.4 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:00.5 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:00.6 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:00.7 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:01.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:01.1 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + 03:01.2 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) + ``` + + 3. 选择一个可用的VF,根据其BDF信息将其配置写入虚拟机的配置文件中。以03:00.1设备为例,对应的bus号是03,slot号是00,function号是1。 + +3. 识别和管理PF/VF对应关系。 + 1. 识别PF对应的VF关系,以PF 03.00.0为例: + + ``` + # ls -l /sys/bus/pci/devices/0000\:03\:00.0/ + ``` + + 可下显示如下的软链接信息,根据信息可以获得其对应的VF编号(virtfnX)和PCI BDF号。 + + 2. 识别VF对应的PF关系,以VF 03:00.1为例: + + ``` + # ls -l /sys/bus/pci/devices/0000\:03\:00.1/ + ``` + + 可显示下述软连接信息,即可获得其对应PF的PCI BDF号。 + + ``` + lrwxrwxrwx 1 root root 0 Mar 28 22:44 physfn -> ../0000:03:00.0 + ``` + + 3. 获知PF/VF对应的网卡设备名称,例如: + + ``` + # ls /sys/bus/pci/devices/0000:03:00.0/net + eth0 + ``` + + 4. 设置VF的mac/vlan/qos信息,确保VF在直通之前处于UP状态。以VF 03:00.1为例,假设PF为eth0,VF编号为0。 + + ``` + # ip link set eth0 vf 0 mac 90:E2:BA:21:XX:XX # 设置mac地址 + # ifconfig eth0 up + # ip link set eth0 vf 0 rate 100 # 设置VF出口速率,单位Mbps + # ip link show eth0 # 查看mac/vlan/qos信息,确认设置成功 + ``` + +4. 挂载SR-IOV网卡到虚拟机中。 + + 创建虚拟机时,在虚拟机配置文件中增加SR-IOV直通的配置项。 + + ``` + + + +
+ + + + + + ``` + + **表 1** SR-IOV配置选项说明 + + + + + + + + + + + + + + + + + + + + + + + + +

参数名

+

说明

+

取值

+

hostdev.managed

+

libvirt处理PCI设备的两种模式。

+

no:默认配置,表示直通设备由用户自行管理。

+

yes:表示直通设备由libvirt管理。SR-IOV直通场景需要配置为yes。

+

hostdev.source.address.bus

+

host OS上的PCI设备bus号。

+

>=1

+

hostdev.source.address.slot

+

host OS上的PCI设备device号。

+

>=0

+

hostdev.source.address.function

+

host OS上的PCI设备function号。

+

>=0

+
+ + >![](public_sys-resources/icon-note.gif) **说明:** + >关闭SR-IOV功能。 + >在虚拟机使用完毕后(虚拟机关机,所有的VF均没有在使用中的时候),若要关闭SR-IOV功能。执行操作如下: + >这里以Hi1822网卡(eth0对应PF的网口名称)为例: + >``` + >echo 0 > /sys/class/net/eth0/device/sriov_numvfs + >``` + + diff --git "a/content/zh/docs/Virtualization/XML\351\205\215\347\275\256\346\226\207\344\273\266\347\244\272\344\276\213.md" "b/content/zh/docs/Virtualization/XML\351\205\215\347\275\256\346\226\207\344\273\266\347\244\272\344\276\213.md" index 61438cac9..a668c11af 100644 --- "a/content/zh/docs/Virtualization/XML\351\205\215\347\275\256\346\226\207\344\273\266\347\244\272\344\276\213.md" +++ "b/content/zh/docs/Virtualization/XML\351\205\215\347\275\256\346\226\207\344\273\266\347\244\272\344\276\213.md" @@ -2,11 +2,11 @@ ## 概述 -本节给出两个基本的虚拟机XML配置文件示例,供用户参考。 +本节给出两个基本的AArch64虚拟机和一个x86\_64虚拟机的XML配置文件示例,供用户参考。 ## 示例一 -一个包含基本元素的XML配置文件,其内容示例如下: +一个包含基本元素的AArch64架构虚拟机的XML配置文件,其内容示例如下: ``` @@ -14,7 +14,7 @@ 8 4 - hvm + hvm /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw /var/lib/libvirt/qemu/nvram/openEulerVM.fd @@ -40,7 +40,7 @@ - + @@ -64,7 +64,7 @@ ## 示例二 -一个包含基本元素及总线元素的XML配置文件,其配置示例如下: +一个包含基本元素及总线元素AArch64架构虚拟机的XML配置文件,其配置示例如下: ``` @@ -72,7 +72,7 @@ 8 4 - hvm + hvm /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw /var/lib/libvirt/qemu/nvram/openEulerVM.fd @@ -98,7 +98,85 @@ - + + + + + + + +
+ + +
+ + + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + +``` + +## 示例三 + +一个包含基本元素及总线元素x86\_64架构虚拟机的XML配置文件,其配置示例如下: + +``` + + openEulerVM + 8 + 4 + + hvm + /usr/share/edk2/ovmf/OVMF.fd + /usr/share/edk2/ovmf/OVMF_CODE.fd + + + + + + + + 1 + + destroy + restart + restart + + /usr/libexec/qemu-kvm + + + + + + + + + diff --git "a/content/zh/docs/Virtualization/figures/KVM\346\236\266\346\236\204\345\233\276.png" "b/content/zh/docs/Virtualization/figures/KVM\346\236\266\346\236\204\345\233\276.png" index 3ef69177b0b0e0d35c33b9b69c5402aa6f1a1e78..62b13a899ef6eb7ab3e6b2d4a754396734e3b6b3 100644 GIT binary patch literal 16018 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 S1pJPi@8ofdW7MP0;r|1UqGLG# literal 23364 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≠`aP8pc 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 diff --git "a/content/zh/docs/Virtualization/figures/\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" "b/content/zh/docs/Virtualization/figures/\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" index afe3885705f54703381f8f7d3c7a37b9d0618eed..e29d998e78064672bfc3641c26c0eb086d585000 100644 GIT binary patch literal 22222 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 E5A<&ZDF6Tf literal 49213 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

即虚拟机监视器VMM,是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。

-

客户机操作系统

- -

即Guest OS,指运行在虚拟机上的操作系统。

- - -

宿主机操作系统

- -

即Host OS,指被虚拟的物理机的操作系统。

- -

虚拟机

使用虚拟化技术,通过软件模拟完整的计算机硬件系统功能,构造出的完整虚拟计算机系统。

@@ -66,82 +56,82 @@

英文全称

-

中文全称

+

中文全称

-

含义

+

含义

NUMA

-

Non Uniform Memory Access Architecture

+

Non-Uniform Memory Access Architecture

-

非统一内存访问架构

+

非统一内存访问架构

-

NUMA是一种为多处理器计算机设计的内存架构。在NUMA下,处理器访问它自己的本地内存的速度比非本地内存(内存位于另一个处理器,或者是处理器之间共享的内存)快一些。

+

NUMA是一种为多处理器计算机设计的内存架构。在NUMA下,处理器访问它自己的本地内存的速度比非本地内存(内存位于另一个处理器,或者是处理器之间共享的内存)快一些。

KVM

Kernel-based Virtual Machine

-

基于内核的虚拟机

+

基于内核的虚拟机

-

KVM是基于内核的虚拟机,是Linux的一个内核模块,该模块使得Linux成为一个Hypervisor

+

KVM是基于内核的虚拟机,是Linux的一个内核模块,该模块使得Linux成为一个hypervisor

OVS

Open vSwitch

-

开放虚拟交换标准

+

开放虚拟交换标准

-

OVS是一个高质量的多层虚拟交换机,使用开源Apache2.0许可协议。

+

OVS是一个高质量的多层虚拟交换机,使用开源Apache2.0许可协议。

QEMU

Quick Emulator

-

快速模拟器

+

快速模拟器

-

QEMU是一个通用的可执行硬件虚拟化的开源模拟器。

+

QEMU是一个通用的可执行硬件虚拟化的开源模拟器。

SMP

Symmetric Multi-Processor

-

对称多处理

+

对称多处理

-

SMP是一种多处理器的计算机硬件架构。现在多数的处理器系统都采用对称多处理器架构。该架构系统拥有多个处理器,各处理器共享内存子系统和总线结构。

+

SMP是一种多处理器的计算机硬件架构。现在多数的处理器系统都采用对称多处理器架构。该架构系统拥有多个处理器,各处理器共享内存子系统和总线结构。

UEFI

Unified Extensible Firmware Interface

-

统一的可扩展固件接口

+

统一的可扩展固件接口

-

一种详细描述全新类型接口的标准。该接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。

+

一种详细描述全新类型接口的标准。该接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。

VM

Virtual Machine

-

虚拟机

+

虚拟机

-

使用虚拟化技术,通过软件模拟完整的计算机硬件系统功能,构造出的完整虚拟计算机系统。

+

使用虚拟化技术,通过软件模拟完整的计算机硬件系统功能,构造出的完整虚拟计算机系统。

VMM

Virtual Machine Monitor

-

虚拟机监视器

+

虚拟机监视器

-

是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。

+

是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。

diff --git "a/content/zh/docs/Virtualization/\346\237\245\350\257\242\350\231\232\346\213\237\346\234\272\344\277\241\346\201\257.md" "b/content/zh/docs/Virtualization/\346\237\245\350\257\242\350\231\232\346\213\237\346\234\272\344\277\241\346\201\257.md" index 0362fbd4b..18d38b742 100644 --- "a/content/zh/docs/Virtualization/\346\237\245\350\257\242\350\231\232\346\213\237\346\234\272\344\277\241\346\201\257.md" +++ "b/content/zh/docs/Virtualization/\346\237\245\350\257\242\350\231\232\346\213\237\346\234\272\344\277\241\346\201\257.md" @@ -82,7 +82,7 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟

virsh schedinfo <VMInstance>

-

包括vCPU份额信息。

+

包括vCPU份额信息。

vCPU数目

@@ -110,7 +110,7 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟

virsh iothreadinfo <VMInstance>

-

虚拟机I/O线程及其CPU亲和性。

+

查询虚拟机I/O线程及其CPU亲和性信息

@@ -118,7 +118,7 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 ## 示例 -- 使用virsh dominfo查询一个定义好的虚拟机的基本信息,从查询结果可知,虚拟机ID为5,UUID为ab472210-db8c-4018-9b3e-fc5319a769f7,内存大小为8GiB,vCPU数目为4个等。 +- 使用virsh dominfo查询一个创建好的虚拟机的基本信息,从查询结果可知,虚拟机ID为5,UUID为ab472210-db8c-4018-9b3e-fc5319a769f7,内存大小为8GiB,vCPU数目为4个等。 ``` # virsh dominfo openEulerVM @@ -177,7 +177,7 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 Target Source --------------------------------------------------------------------- sda /home/openeuler/vm/openEuler_aarch64.qcow2 - sdb /home/openeuler/vm/openEuler-1.0-base-aarch64-dvd.iso + sdb /home/openeuler/vm/openEuler-20.03-LTS-aarch64-dvd.iso ``` - 使用virsh domiflist查询虚拟机网卡信息,从查询结果可知,虚拟机有1张网卡,对应的后端是vnet0在主机br0网桥上,MAC地址为00:05:fe:d4:f1:cc。 diff --git "a/content/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" "b/content/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" index 5b5eac45b..58b8541b5 100644 --- "a/content/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" +++ "b/content/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" @@ -1,3 +1 @@ # 热迁移虚拟机 - - diff --git "a/content/zh/docs/Virtualization/\347\224\250\346\210\267\345\222\214\347\256\241\347\220\206\345\221\230\346\214\207\345\215\227.md" "b/content/zh/docs/Virtualization/\347\224\250\346\210\267\345\222\214\347\256\241\347\220\206\345\221\230\346\214\207\345\215\227.md" index ba1612561..8c1d462d7 100644 --- "a/content/zh/docs/Virtualization/\347\224\250\346\210\267\345\222\214\347\256\241\347\220\206\345\221\230\346\214\207\345\215\227.md" +++ "b/content/zh/docs/Virtualization/\347\224\250\346\210\267\345\222\214\347\256\241\347\220\206\345\221\230\346\214\207\345\215\227.md" @@ -1,4 +1,3 @@ # 用户和管理员指南 本章介绍如何在虚拟化平台上创建虚拟机,并对虚拟机进行生命周期管理、信息查询等操作,便于用户和管理员进行相应操作。 - diff --git "a/content/zh/docs/Virtualization/\347\231\273\345\275\225\350\231\232\346\213\237\346\234\272.md" "b/content/zh/docs/Virtualization/\347\231\273\345\275\225\350\231\232\346\213\237\346\234\272.md" index e0e0a2c94..00ebabc35 100644 --- "a/content/zh/docs/Virtualization/\347\231\273\345\275\225\350\231\232\346\213\237\346\234\272.md" +++ "b/content/zh/docs/Virtualization/\347\231\273\345\275\225\350\231\232\346\213\237\346\234\272.md" @@ -2,4 +2,3 @@ 本章介绍使用VNC登录虚拟机的方法。 - diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\345\221\275\344\273\244.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\345\221\275\344\273\244.md" index 627a0b38c..9efda4c56 100644 --- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\345\221\275\344\273\244.md" +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\345\221\275\344\273\244.md" @@ -55,7 +55,7 @@ virsh

关闭虚拟机。启动虚拟机关机流程,若关机失败可使用强制关闭

-

virsh destory <VMInstanse>

+

virsh destroy <VMInstanse>

强制关闭虚拟机

diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237CPU.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237CPU.md" index 48a841add..d7a8a0611 100644 --- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237CPU.md" +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237CPU.md" @@ -1,2 +1 @@ # 管理虚拟CPU - diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\345\206\205\345\255\230.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\345\206\205\345\255\230.md" index f33171a36..6443f6427 100644 --- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\345\206\205\345\255\230.md" +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\345\206\205\345\255\230.md" @@ -1 +1,2 @@ # 管理虚拟内存 + diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" index 54c7963c2..23b6e2715 100644 --- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" @@ -1,2 +1 @@ # 管理虚拟机 - diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272USB.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272USB.md" new file mode 100644 index 000000000..d39fdc58b --- /dev/null +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272USB.md" @@ -0,0 +1,3 @@ +# 管理虚拟机USB + +为了方便在虚拟机内部使用USBkey设备、USB海量存储设备等USB设备,openEuler提供了USB设备直通的功能。用户可以通过USB直通和热插拔相关接口给虚拟机配置直通USB设备、或者在虚拟机处于运行的状态下热插/热拔USB设备。 diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\243\201\347\233\230.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\243\201\347\233\230.md" index 9c062d269..50e2aed7c 100644 --- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\243\201\347\233\230.md" +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\243\201\347\233\230.md" @@ -10,7 +10,7 @@ ## 操作步骤 -虚拟磁盘的配置步骤,请参见"虚拟机配置 > 配置虚拟机设备 > 存储设备"。本节以virtio-scsi磁盘为例,介绍挂载和卸载虚拟磁盘的简单方法。 +虚拟磁盘的配置步骤,请参见[3.2.4.1 存储设备](存储设备.md)。本节以virtio-scsi磁盘为例,介绍挂载和卸载虚拟磁盘的简单方法。 - 挂载virtio-scsi磁盘: diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\275\221\345\215\241.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\275\221\345\215\241.md" index 717122ea2..5a74bbf3b 100644 --- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\275\221\345\215\241.md" +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\347\275\221\345\215\241.md" @@ -6,7 +6,7 @@ ## 操作步骤 -虚拟网卡的配置步骤,请参见"虚拟机配置 > 配置虚拟机设备 > 网络设备"。本节以vhost-net网卡为例,介绍挂载和卸载虚拟网卡的简单方法。 +虚拟网卡的配置步骤,请参见[3.2.4.2 网络设备](网络设备.md)。本节以vhost-net网卡为例,介绍挂载和卸载虚拟网卡的简单方法。 - 挂载vhost-net网卡: @@ -39,6 +39,6 @@ # virsh detach-device ``` - 其中,detach-device.xml指定了需要卸载的的XML信息,与动态挂载时的XML信息保持一致。 + 其中,detach-device.xml指定了需要卸载虚拟网卡的XML信息,与动态挂载时的XML信息保持一致。 diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207\347\233\264\351\200\232.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207\347\233\264\351\200\232.md" new file mode 100644 index 000000000..024f99f41 --- /dev/null +++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207\347\233\264\351\200\232.md" @@ -0,0 +1,6 @@ +# 管理设备直通 + +设备直通技术是指将host上的物理设备直接呈现给一台虚拟机,虚拟机可以直接访问该设备资源的一种使用方式。使用设备直通的方式可以让虚拟机获得良好的I/O性能。 + +当前设备直通使用的是VFIO方式,按照直通的设备类型可以分为PCI直通和SR-IOV直通两种类型。 + diff --git "a/content/zh/docs/Virtualization/\347\273\221\345\256\232qemu\350\277\233\347\250\213\350\207\263\347\211\251\347\220\206CPU.md" "b/content/zh/docs/Virtualization/\347\273\221\345\256\232qemu\350\277\233\347\250\213\350\207\263\347\211\251\347\220\206CPU.md" index 70f195166..7685ccfce 100644 --- "a/content/zh/docs/Virtualization/\347\273\221\345\256\232qemu\350\277\233\347\250\213\350\207\263\347\211\251\347\220\206CPU.md" +++ "b/content/zh/docs/Virtualization/\347\273\221\345\256\232qemu\350\277\233\347\250\213\350\207\263\347\211\251\347\220\206CPU.md" @@ -1,14 +1,14 @@ -# 绑定qemu进程至物理CPU +# 绑定QEMU进程至物理CPU ## 概述 -qemu主进程绑定特性是将qemu主进程绑定到特定的物理CPU范围内,从而保证了运行不同业务的虚拟机不会干扰到邻位虚拟机。例如在一个典型的云计算场景中,一台物理机上会运行多台虚拟机,而每台虚拟机的业务不同,造成了不同程度的资源占用,为了避免存储IO密集的虚拟机对邻位虚拟机的干扰,需要将不同虚拟机处理IO的存储进程完全隔离,由于qemu主进程是处理前后端的主要服务进程,故需要实现隔离。 +QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内,从而保证了运行不同业务的虚拟机不会干扰到邻位虚拟机。例如在一个典型的云计算场景中,一台物理机上会运行多台虚拟机,而每台虚拟机的业务不同,造成了不同程度的资源占用,为了避免存储IO密集的虚拟机对邻位虚拟机的干扰,需要将不同虚拟机处理IO的存储进程完全隔离,由于QEMU主进程是处理前后端的主要服务进程,故需要实现隔离。 ## 操作步骤 -通过virsh emulatorpin命令可以绑定qemu主进程到物理CPU。 +通过virsh emulatorpin命令可以绑定QEMU主进程到物理CPU。 -- 查看qemu进程当前绑定的物理CPU范围: +- 查看QEMU进程当前绑定的物理CPU范围: ``` # virsh emulatorpin openEulerVM @@ -17,9 +17,9 @@ qemu主进程绑定特性是将qemu主进程绑定到特定的物理CPU范围内 *: 0-63 ``` - 这说明虚拟机_openEulerVM_对应的qemu主进程可以在主机的所有物理CPU上调度。 + 这说明虚拟机_openEulerVM_对应的QEMU主进程可以在主机的所有物理CPU上调度。 -- 在线绑定:修改处于running状态的虚拟机对应的qemu进程的绑定关系,使用带**--live**参数的vcpu emulatorpin命令: +- 在线绑定:修改处于running状态的虚拟机对应的QEMU进程的绑定关系,使用带**--live**参数的vcpu emulatorpin命令: ``` # virsh emulatorpin openEulerVM --live 2-3 @@ -30,9 +30,9 @@ qemu主进程绑定特性是将qemu主进程绑定到特定的物理CPU范围内 *: 2-3 ``` - 以上命令把虚拟机_open__Euler__VM_对应的qemu进程绑定到物理CPU2、3上,即限制了qemu进程只在这两个物理CPU上调度。这一绑定关系的调整立即生效,但在虚拟机关机并重新启动后失效。 + 以上命令把虚拟机_open__Euler__VM_对应的QEMU进程绑定到物理CPU2、3上,即限制了QEMU进程只在这两个物理CPU上调度。这一绑定关系的调整立即生效,但在虚拟机关机并重新启动后失效。 -- 持久化绑定:在libvirt内部配置中修改虚拟机对应的qemu进程的绑定关系,使用带**--config**参数的virsh emulatorpin命令: +- 持久化绑定:在libvirt内部配置中修改虚拟机对应的QEMU进程的绑定关系,使用带**--config**参数的virsh emulatorpin命令: ``` # virsh emulatorpin openEulerVM --config 0-3,^1 @@ -43,6 +43,6 @@ qemu主进程绑定特性是将qemu主进程绑定到特定的物理CPU范围内 *: 0,2-3 ``` - 以上命令把虚拟机_open__Euler__VM_对应的qemu进程绑定到物理CPU0、2、3上,即限制了qemu进程只在这三个物理CPU上调度。这一绑定关系的调整不会立即生效,在虚拟机下一次启动后才生效,并持久生效。 + 以上命令把虚拟机_open__Euler__VM_对应的QEMU进程绑定到物理CPU0、2、3上,即限制了QEMU进程只在这三个物理CPU上调度。这一绑定关系的调整不会立即生效,在虚拟机下一次启动后才生效,并持久生效。 diff --git "a/content/zh/docs/Virtualization/\347\275\221\347\273\234\350\256\276\345\244\207.md" "b/content/zh/docs/Virtualization/\347\275\221\347\273\234\350\256\276\345\244\207.md" index 5cdf7c776..c8bd234a0 100644 --- "a/content/zh/docs/Virtualization/\347\275\221\347\273\234\350\256\276\345\244\207.md" +++ "b/content/zh/docs/Virtualization/\347\275\221\347\273\234\350\256\276\345\244\207.md" @@ -74,7 +74,7 @@ XML配置文件中使用元素“interface”,其属性“type”表示虚拟 ## 配置示例 -- 按照“准备虚拟机网络”章节创建了Linux网桥br0后,配置一个桥接在br0网桥上的virtio类型的虚拟网卡设备,对应的XML配置如下: +- 按照[准备虚拟机网络](准备虚拟机网络.md)创建了Linux网桥br0后,配置一个桥接在br0网桥上的virtio类型的虚拟网卡设备,对应的XML配置如下: ``` @@ -89,7 +89,7 @@ XML配置文件中使用元素“interface”,其属性“type”表示虚拟 ``` -- 如果按照“准备虚拟机网络”章节创建了OVS网桥,配置一个后端使用vhost驱动,且具有四个队列的virtio虚拟网卡设备。 +- 如果按照[准备虚拟机网络](准备虚拟机网络.md)创建了OVS网桥,配置一个后端使用vhost驱动,且具有四个队列的virtio虚拟网卡设备。 ``` diff --git "a/content/zh/docs/Virtualization/\350\243\270\350\256\276\345\244\207\346\230\240\345\260\204.md" "b/content/zh/docs/Virtualization/\350\243\270\350\256\276\345\244\207\346\230\240\345\260\204.md" new file mode 100644 index 000000000..ff7b2e4c9 --- /dev/null +++ "b/content/zh/docs/Virtualization/\350\243\270\350\256\276\345\244\207\346\230\240\345\260\204.md" @@ -0,0 +1,54 @@ +# 裸设备映射 + +## 概述 + +配置虚拟机存储设备时,除了将文件配置给虚拟机作为虚拟磁盘使用外,还可以将块设备(物理LUN、逻辑卷等)直接配置给虚拟机使用,从而提升存储性能。该配置方式称为裸设备映射。在该配置方式下,虚拟磁盘向虚拟机呈现为一个SCSI设备,且支持大部分SCSI命令。 + +裸设备映射根据后端实现特点,分为虚拟裸设备映射和物理裸设备映射,物理裸设备映射相对虚拟裸设备映射具有更优秀的性能和更丰富的SCSI命令,但物理裸设备映射需要将整块SCSI磁盘挂载给虚拟机使用,如果使用分区、逻辑卷等方式配置,虚拟机将无法识别。 + +## 配置示例 + +裸设备映射需要修改虚拟机配置文件,这里给出配置示例。 + +- 虚拟裸设备映射 + + 将主机上存在的SCSI磁盘“/dev/sdc”挂载给虚拟机作为虚拟裸设备的配置示例如下: + + ``` + + + ... + + + + + +
+ + ... + + + ``` + + +- 物理裸设备映射 + + 将主机上存在的SCSI磁盘“/dev/sdc”挂载给虚拟机作为物理裸设备的配置示例如下: + + ``` + + + ... + + + + + +
+ + ... + + + ``` + + diff --git "a/content/zh/docs/Virtualization/\350\256\244\350\257\206\350\231\232\346\213\237\345\214\226.md" "b/content/zh/docs/Virtualization/\350\256\244\350\257\206\350\231\232\346\213\237\345\214\226.md" index 29ec1d5a5..145473cb3 100644 --- "a/content/zh/docs/Virtualization/\350\256\244\350\257\206\350\231\232\346\213\237\345\214\226.md" +++ "b/content/zh/docs/Virtualization/\350\256\244\350\257\206\350\231\232\346\213\237\345\214\226.md" @@ -15,14 +15,14 @@ - Hypervisor模型 - 在这种模型中,VMM被看做是一个完备的操作系统,同时还具备虚拟化功能,VMM直接管理所有的物理资源,包括处理器,内存和IO设备等,如XEN,VMware vSphere。 + 在这种模型中,VMM被看做是一个完备的操作系统,同时还具备虚拟化功能,VMM直接管理所有的物理资源,包括处理器,内存和I/O设备等。 - 宿主模型 - 这种模型中,物理资源是由宿主机操作系统管理,宿主机操作系统是传统的操作系统,如Linux,Windows等,宿主机操作系统不提供虚拟化能力,提供虚拟化能力的VMM作为系统的一个驱动或者软件运行在宿主操作系统上,VMM通过调用Host OS的服务获得资源,实现处理器,内存和IO设备的模拟,这种模型的虚拟化实现有KVM、Virtual Box等。 + 这种模型中,物理资源是由宿主机操作系统管理,宿主机操作系统是传统的操作系统,如Linux,Windows等,宿主机操作系统不提供虚拟化能力,提供虚拟化能力的VMM作为系统的一个驱动或者软件运行在宿主操作系统上,VMM通过调用host OS的服务获得资源,实现处理器,内存和I/O设备的模拟,这种模型的虚拟化实现有KVM、Virtual Box等。 -KVM(Kernel-based Virtual Machine)即基于内核的虚拟机,是Linux的一个内核模块,该内核模块使Linux成为一个Hypervisor。KVM架构如[图2](#fig310953013541)所示。KVM本身未模拟任何硬件设备,它用于使能硬件提供的虚拟化能力,比如Intel VT-x, AMD-V, ARM virtualization extensions等。主板、内存及I/O等设备的模拟由用户态的QEMU完成。用户态QEMU配合内核KVM模块共同完成虚拟机的硬件模拟,客户操作系统运行在QEMU和KVM模拟的硬件上。 +KVM(Kernel-based Virtual Machine)即基于内核的虚拟机,是Linux的一个内核模块,该内核模块使Linux成为一个hypervisor。KVM架构如[图2](#fig310953013541)所示。KVM本身未模拟任何硬件设备,它用于使能硬件提供的虚拟化能力,比如Intel VT-x, AMD-V, ARM virtualization extensions等。主板、内存及I/O等设备的模拟由用户态的QEMU完成。用户态QEMU配合内核KVM模块共同完成虚拟机的硬件模拟,客户操作系统运行在QEMU和KVM模拟的硬件上。 **图 2** KVM架构图 ![](figures/KVM架构图.png "KVM架构图") @@ -31,7 +31,7 @@ KVM(Kernel-based Virtual Machine)即基于内核的虚拟机,是Linux的 openEuler软件包中提供的虚拟化相关组件: -- KVM:提供核心的虚拟化基础设施,使Linux系统成为一个Hypervisor,支持多个虚拟机同时在该主机上运行。 +- KVM:提供核心的虚拟化基础设施,使Linux系统成为一个hypervisor,支持多个虚拟机同时在该主机上运行。 - QEMU:模拟处理器并提供一组设备模型,配合KVM实现基于硬件的虚拟化模拟加速。 - Libvirt:为管理虚拟机提供工具集,主要包含统一、稳定、开放的应用程序接口(API)、守护进程 (Libvirtd)和一个默认命令行管理工具(virsh)。 - Open vSwitch:为虚拟机提供虚拟网络的工具集,支持编程扩展,以及标准的管理接口和协议(如NetFlow, sFlow,IPFIX, RSPAN, CLI, LACP, 802.1ag)。 @@ -62,7 +62,7 @@ openEuler软件包中提供的虚拟化相关组件: ## 虚拟化优势 -虚拟化为IT基础设施带来了众多优势: +虚拟化为数据中心的基础设施带来了众多优势: - 灵活性和可扩展性 diff --git "a/content/zh/docs/Virtualization/\351\205\215\347\275\256Guest-NUMA.md" "b/content/zh/docs/Virtualization/\351\205\215\347\275\256Guest-NUMA.md" index 91a9ff778..bb6007813 100644 --- "a/content/zh/docs/Virtualization/\351\205\215\347\275\256Guest-NUMA.md" +++ "b/content/zh/docs/Virtualization/\351\205\215\347\275\256Guest-NUMA.md" @@ -6,7 +6,7 @@ ## 操作步骤 -在虚拟机的XML配置文件中,配置了Guest NUMA后,就可以在虚拟机内部查看NUMA拓扑结构。numa项是Guest NUMA的必配项。 +在虚拟机的XML配置文件中,配置了Guest NUMA后,就可以在虚拟机内部查看NUMA拓扑结构。项是Guest NUMA的必配项。 ``` @@ -29,8 +29,8 @@ ``` >![](public_sys-resources/icon-note.gif) **说明:** ->- numa项提供虚拟机内部呈现NUMA拓扑功能,“cell id”表示vNode编号,“cpus”表示vCPU编号,“memory”表示对应vNode上的内存大小。 ->- 如果希望通过Guest NUMA提供更好的性能,则需要配置numatune和cputune,使vCPU和对应的内存分布在同一个物理NUMA NODE上: ->- numatune中的“cellid”和numa中的“cell id”是对应的;“mode”可以配置为“strict”(严格从指定node上申请内存,内存不够则失败)、“preferred”(优先从某一node上申请内存,如果不够则从其他node上申请)、“interleave”(从指定的node上交叉申请内存);“nodeset”表示指定物理NUMA NODE。 ->- cputune中需要将同一cell id中的vCPU绑定到与memnode相同的物理NUMA NODE上。 +>- 项提供虚拟机内部呈现NUMA拓扑功能,“cell id”表示vNode编号,“cpus”表示vCPU编号,“memory”表示对应vNode上的内存大小。 +>- 如果希望通过Guest NUMA提供更好的性能,则需要配置,使vCPU和对应的内存分布在同一个物理NUMA NODE上: +> - 中的“cellid”和中的“cell id”是对应的;“mode”可以配置为“strict”(严格从指定node上申请内存,内存不够则失败)、“preferred”(优先从某一node上申请内存,如果不够则从其他node上申请)、“interleave”(从指定的node上交叉申请内存);“nodeset”表示指定物理NUMA NODE。 +> - 中需要将同一cell id中的vCPU绑定到与memnode相同的物理NUMA NODE上。 diff --git "a/content/zh/docs/Virtualization/\351\205\215\347\275\256Host-NUMA.md" "b/content/zh/docs/Virtualization/\351\205\215\347\275\256Host-NUMA.md" index 9be01110b..0cd775ac5 100644 --- "a/content/zh/docs/Virtualization/\351\205\215\347\275\256Host-NUMA.md" +++ "b/content/zh/docs/Virtualization/\351\205\215\347\275\256Host-NUMA.md" @@ -2,12 +2,9 @@ 为提升虚拟机性能,在虚拟机启动前,用户可以通过虚拟机XML配置文件为虚拟机指定主机的NUMA节点,使虚拟机内存分配在指定的NUMA节点上。本特性一般与vCPU绑定一起使用,从而避免vCPU远端访问内存。 ->![](public_sys-resources/icon-notice.gif) **须知:** ->如果在指定的NODE上内存不够时,启动虚拟机会失败,并且存在系统OOM(Out Of Memory)强制关闭进程的可能性。 - ## 操作步骤 -- 查看Host的NUMA拓扑结构: +- 查看host的NUMA拓扑结构: ``` # numactl -H @@ -32,7 +29,7 @@ 3: 20 20 15 10 ``` -- 在虚拟机XML配置文件中添加numatune字段,创建并启动虚拟机。配置参数如下: +- 在虚拟机XML配置文件中添加numatune字段,创建并启动虚拟机。例如使用主机上的NUMA node 0给虚拟机分配内存,配置参数如下: ``` @@ -40,6 +37,10 @@ ``` - 以上配置表示虚拟机的内存将在Host的NUMA NODE0上分配。假设虚拟机的vCPU也绑定在NODE0的PCPU上,就可以避免由于vCPU访问远端内存带来的性能下降。 + 假设虚拟机的vCPU也绑定在NODE0的物理CPU上,就可以避免由于vCPU访问远端内存带来的性能下降。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 分配给虚拟机的内存不要超过该NUMA节点剩余的可用内存,否则可能导致虚拟机启动失败。 + >- 建议虚拟机内存和vCPU都绑定在同一NUMA节点,避免vCPU访问远端内存造成性能下降。例如将上例中vCPU也绑定在NUMA node 0上。 diff --git "a/content/zh/docs/Virtualization/\351\205\215\347\275\256USB\346\216\247\345\210\266\345\231\250.md" "b/content/zh/docs/Virtualization/\351\205\215\347\275\256USB\346\216\247\345\210\266\345\231\250.md" new file mode 100644 index 000000000..fb093fe6a --- /dev/null +++ "b/content/zh/docs/Virtualization/\351\205\215\347\275\256USB\346\216\247\345\210\266\345\231\250.md" @@ -0,0 +1,45 @@ +# 配置USB控制器 + +## 概述 + +USB控制器是为虚拟机上的USB设备提供具体USB功能的虚拟控制器设备,在虚拟机内部使用USB设备必须给虚拟机配置USB控制器。当前openEuler支持如下三种USB控制器: + +- UHCI(Universal Host Controller Interface):通用主机控制器接口,也称为USB 1.1主机控制器规范。 +- EHCI(Enhanced Host Controller):增强主机控制器接口,也称为USB 2.0主机控制器规范。 +- xHCI(eXtensible Host Controller Interface):可扩展主机控制器接口,也称为USB 3.0主机控制器规范。 + +## 注意事项 + +- 主机服务器上需存在支持USB 1.1、USB 2.0和USB 3.0标准的USB控制器硬件和模块。 +- 为虚拟机配置USB控制器时,请按照USB 1.1、USB 2.0到USB 3.0的顺序来配置。 +- 一个xHCI控制器有8个端口,最多可以挂载4个USB 3.0设备和4个USB 2.0设备。一个EHCI控制器有6个端口,最多可以挂载6个USB2.0设备。一个UHCI控制器有2个端口,最多可以挂载2个USB 1.1设备。 +- 每台虚拟机最多支持配置一个相同类型的USB控制器。 +- 不支持热插拔USB控制器。 +- 若虚拟机没有安装USB 3.0的驱动,可能无法识别xHCI控制器,USB 3.0驱动下载和安装方法请参见对应OS发行商官方说明。 +- 为了不影响操作系统的兼容性,为虚拟机配置USB接口的tablet设备时,请指定USB控制器bus号为0(默认挂载到USB 1.1控制器上)。 + +## 配置方法 + +这里介绍为虚拟机配置USB控制器的配置内容说明。建议同时配置USB 1.1、USB 2.0和USB 3.0,做到同时兼容三种设备。 + +USB 1.1控制器(UHCI)的XML配置项为: + +``` + + +``` + +USB 2.0控制器(EHCI)的XML配置为: + +``` + + +``` + +USB 3.0控制器(xHCI)的XML配置为: + +``` + + +``` + diff --git "a/content/zh/docs/Virtualization/\351\205\215\347\275\256USB\347\233\264\351\200\232\350\256\276\345\244\207.md" "b/content/zh/docs/Virtualization/\351\205\215\347\275\256USB\347\233\264\351\200\232\350\256\276\345\244\207.md" new file mode 100644 index 000000000..aadd8e4cd --- /dev/null +++ "b/content/zh/docs/Virtualization/\351\205\215\347\275\256USB\347\233\264\351\200\232\350\256\276\345\244\207.md" @@ -0,0 +1,91 @@ +# 配置USB直通设备 + +## 概述 + +当虚拟机配置好USB控制器后,就可以通过设备直通的方式将主机上的物理USB设备挂载到虚拟机内部供虚拟机使用。在虚拟化场景下,除了支持静态配置以外还同时支持USB设备的热插/拔操作,即在虚拟机处于运行状态的时候挂载/卸载USB设备。 + +## 注意事项 + +- 一个USB设备只能直通给一台虚拟机使用 +- 配置了直通USB设备的虚拟机不支持热迁移 +- 虚拟机配置文件中直通的USB设备不存在时,虚拟机会创建失败 +- 对一个正在读写的USB存储设备进行强制热拔操作有可能会损坏USB设备内的文件 + +## 配置说明 + +这里介绍为虚拟机配置USB设备的配置内容说明。 + +USB设备的XML描述: + +``` + + +
+ +
+ +``` + +-
,其中,m表示该USB设备在主机上的bus地址,n表示device ID编号。 +-
表示该USB设备要挂载到虚拟机指定的USB控制器。其中x表示控制器ID,与虚拟机所配置的USB控制器index编号相对应,y表示port地址。用户配置直通USB设备的时候需要配置这个字段,确保设备挂载的控制器与预期相符。 + +## 配置方法 + +配置USB直通的步骤如下: + +1. 为虚拟机配置USB控制器,配置方法请参见[配置USB控制器](配置USB控制器.md)。 +2. 查询主机上的USB设备信息。 + + 通过lsusb命令(需要安装usbutils软件包)查询主机上的USB设备信息,包含bus地址、device地址、设备厂商ID、设备ID和产品描述信息等。例如: + + ``` + # lsusb + ``` + + ``` + Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub + Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub + Bus 006 Device 002: ID 0bda:0411 Realtek Semiconductor Corp. + Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub + Bus 005 Device 003: ID 136b:0003 STEC + Bus 005 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. + Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + Bus 001 Device 003: ID 12d1:0003 Huawei Technologies Co., Ltd. + Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. + Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub + ``` + +3. 准备USB设备的XML描述文件,注意在设备热拔之前,请确保USB设备当前不在使用当中,否则可能造成数据丢失。 +4. 执行热插、热拔命令。 + + 假设虚拟机名称为openEulerVM,对应的配置文件为usb.xml。 + + - 热插USB设备,只对当前运行的虚拟机有效,虚拟机冷重启后需要重新配置。 + + ``` + # virsh attach-device openEulerVM usb.xml --live + ``` + + - 热插USB设备,持久化该配置,即该虚拟机重启后该设备会自动直通给该虚拟机使用。 + + ``` + # virsh attach-device openEulerVM usb.xml --config + ``` + + - 热拔USB设备,只对当前运行的虚拟机有效,持久化配置的USB设备在虚拟机重启后USB设备会自动直通给该虚拟机。 + + ``` + # virsh detach-device openEulerVM usb.xml --live + ``` + + - 热拔USB设备,持久化该配置。 + + ``` + # virsh detach-device openEulerVM usb.xml --config + ``` + + + diff --git "a/content/zh/docs/Virtualization/\351\205\215\347\275\256\350\231\232\346\213\237\346\234\272PCIe\346\216\247\345\210\266\345\231\250.md" "b/content/zh/docs/Virtualization/\351\205\215\347\275\256\350\231\232\346\213\237\346\234\272PCIe\346\216\247\345\210\266\345\231\250.md" index af0ff4c6b..bd5b6f023 100644 --- "a/content/zh/docs/Virtualization/\351\205\215\347\275\256\350\231\232\346\213\237\346\234\272PCIe\346\216\247\345\210\266\345\231\250.md" +++ "b/content/zh/docs/Virtualization/\351\205\215\347\275\256\350\231\232\346\213\237\346\234\272PCIe\346\216\247\345\210\266\345\231\250.md" @@ -10,7 +10,7 @@ - 简化配置方法 - 在虚拟机的XML文件中写入以下内容,controller的其他属性由Libvirt自动填充: + 在虚拟机的XML文件中写入以下内容,controller的其他属性由libvirt自动填充: ``` diff --git "a/content/zh/docs/Virtualization/\351\231\204\345\275\225.md" "b/content/zh/docs/Virtualization/\351\231\204\345\275\225.md" index e4b59a9c3..29508be42 100644 --- "a/content/zh/docs/Virtualization/\351\231\204\345\275\225.md" +++ "b/content/zh/docs/Virtualization/\351\231\204\345\275\225.md" @@ -1 +1,2 @@ # 附录 + diff --git "a/content/zh/docs/Virtualization/\351\252\214\350\257\201\345\256\211\350\243\205\346\230\257\345\220\246\346\210\220\345\212\237.md" "b/content/zh/docs/Virtualization/\351\252\214\350\257\201\345\256\211\350\243\205\346\230\257\345\220\246\346\210\220\345\212\237.md" index 1508f1a86..e22dc6b3d 100644 --- "a/content/zh/docs/Virtualization/\351\252\214\350\257\201\345\256\211\350\243\205\346\230\257\345\220\246\346\210\220\345\212\237.md" +++ "b/content/zh/docs/Virtualization/\351\252\214\350\257\201\345\256\211\350\243\205\346\230\257\345\220\246\346\210\220\345\212\237.md" @@ -14,14 +14,14 @@ 若上述文件存在,说明内核支持KVM虚拟化。若上述文件不存在,则说明系统内核编译时未开启KVM虚拟化,需要更换支持KVM虚拟化的Linux内核。 -2. 确认qemu是否安装成功。若安装成功则可以看到qemu软件包信息,命令和回显如下: +2. 确认QEMU是否安装成功。若安装成功则可以看到QEMU软件包信息,命令和回显如下: ``` # rpm -qi qemu Name : qemu - Epoch : 10 - Version : 4.0.0 - Release : 1 + Epoch : 2 + Version : 4.0.1 + Release : 10 Architecture: aarch64 Install Date: Wed 24 Jul 2019 04:04:47 PM CST Group : Unspecified diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index e7fe85153..092699111 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -255,11 +255,14 @@ headless: true - [安装虚拟化核心组件]({{< relref "/docs/Virtualization/安装虚拟化核心组件.md" >}}) - [安装方法]({{< relref "/docs/Virtualization/安装方法.md" >}}) - [验证安装是否成功]({{< relref "/docs/Virtualization/验证安装是否成功.md" >}}) + + - [用户和管理员指南]({{< relref "/docs/Virtualization/用户和管理员指南.md" >}}) - [准备环境]({{< relref "/docs/Virtualization/准备环境.md" >}}) - [准备虚拟机镜像]({{< relref "/docs/Virtualization/准备虚拟机镜像.md" >}}) - [准备虚拟机网络]({{< relref "/docs/Virtualization/准备虚拟机网络.md" >}}) - - [准备UEFI引导工具集EDK II]({{< relref "/docs/Virtualization/准备UEFI引导工具集EDK-II.md" >}}) + - [准备引导固件]({{< relref "/docs/Virtualization/准备引导固件.md" >}}) + - [虚拟机配置]({{< relref "/docs/Virtualization/虚拟机配置.md" >}}) - [总体介绍]({{< relref "/docs/Virtualization/总体介绍.md" >}}) - [虚拟机描述]({{< relref "/docs/Virtualization/虚拟机描述.md" >}}) @@ -269,40 +272,72 @@ headless: true - [网络设备]({{< relref "/docs/Virtualization/网络设备.md" >}}) - [总线配置]({{< relref "/docs/Virtualization/总线配置.md" >}}) - [其它常用设备]({{< relref "/docs/Virtualization/其它常用设备.md" >}}) + + - [体系架构相关配置]({{< relref "/docs/Virtualization/体系架构相关配置.md" >}}) - [其他常见配置项]({{< relref "/docs/Virtualization/其他常见配置项.md" >}}) - [XML配置文件示例]({{< relref "/docs/Virtualization/XML配置文件示例.md" >}}) + - [管理虚拟机]({{< relref "/docs/Virtualization/管理虚拟机.md" >}}) - [虚拟机生命周期]({{< relref "/docs/Virtualization/虚拟机生命周期.md" >}}) - [总体介绍]({{< relref "/docs/Virtualization/总体介绍-0.md" >}}) - [管理命令]({{< relref "/docs/Virtualization/管理命令.md" >}}) - [示例]({{< relref "/docs/Virtualization/示例.md" >}}) + - [在线修改虚拟机配置]({{< relref "/docs/Virtualization/在线修改虚拟机配置.md" >}}) - [查询虚拟机信息]({{< relref "/docs/Virtualization/查询虚拟机信息.md" >}}) - [登录虚拟机]({{< relref "/docs/Virtualization/登录虚拟机.md" >}}) - [使用VNC密码登录]({{< relref "/docs/Virtualization/使用VNC密码登录.md" >}}) - [配置VNC TLS登录]({{< relref "/docs/Virtualization/配置VNC-TLS登录.md" >}}) + - [使用VNC密码登录]({{< relref "/docs/Virtualization/使用VNC密码登录.md" >}}) + - [配置VNC TLS登录]({{< relref "/docs/Virtualization/配置VNC-TLS登录.md" >}}) + + - [热迁移虚拟机]({{< relref "/docs/Virtualization/热迁移虚拟机.md" >}}) - [总体介绍]({{< relref "/docs/Virtualization/总体介绍-1.md" >}}) - [应用场景]({{< relref "/docs/Virtualization/应用场景.md" >}}) - [注意事项和约束限制]({{< relref "/docs/Virtualization/注意事项和约束限制.md" >}}) - [热迁移操作]({{< relref "/docs/Virtualization/热迁移操作.md" >}}) + - [管理系统资源]({{< relref "/docs/Virtualization/管理系统资源.md" >}}) - [管理虚拟CPU]({{< relref "/docs/Virtualization/管理虚拟CPU.md" >}}) - [CPU份额]({{< relref "/docs/Virtualization/CPU份额.md" >}}) - - [绑定qemu进程至物理CPU]({{< relref "/docs/Virtualization/绑定qemu进程至物理CPU.md" >}}) + - [绑定QEMU进程至物理CPU]({{< relref "/docs/Virtualization/绑定QEMU进程至物理CPU.md" >}}) - [调整虚拟CPU绑定关系]({{< relref "/docs/Virtualization/调整虚拟CPU绑定关系.md" >}}) + - [管理虚拟内存]({{< relref "/docs/Virtualization/管理虚拟内存.md" >}}) - [NUMA简介]({{< relref "/docs/Virtualization/NUMA简介.md" >}}) - [配置Host NUMA]({{< relref "/docs/Virtualization/配置Host-NUMA.md" >}}) - [配置Guest NUMA]({{< relref "/docs/Virtualization/配置Guest-NUMA.md" >}}) + + - [管理设备]({{< relref "/docs/Virtualization/管理设备.md" >}}) - [配置虚拟机PCIe控制器]({{< relref "/docs/Virtualization/配置虚拟机PCIe控制器.md" >}}) - [管理虚拟磁盘]({{< relref "/docs/Virtualization/管理虚拟磁盘.md" >}}) - [管理虚拟网卡]({{< relref "/docs/Virtualization/管理虚拟网卡.md" >}}) - [配置虚拟串口]({{< relref "/docs/Virtualization/配置虚拟串口.md" >}}) + - [管理设备直通]({{< relref "/docs/Virtualization/管理设备直通.md" >}}) + - [PCI直通]({{< relref "/docs/Virtualization/PCI直通.md" >}}) + - [SR-IOV直通]({{< relref "/docs/Virtualization/SR-IOV直通.md" >}}) + + - [管理虚拟机USB]({{< relref "/docs/Virtualization/管理虚拟机USB.md" >}}) + - [配置USB控制器]({{< relref "/docs/Virtualization/配置USB控制器.md" >}}) + - [配置USB直通设备]({{< relref "/docs/Virtualization/配置USB直通设备.md" >}}) + + - [存储快照]({{< relref "/docs/Virtualization/存储快照.md" >}}) + - [最佳实践]({{< relref "/docs/Virtualization/最佳实践.md" >}}) - - [halt-polling]({{< relref "/docs/Virtualization/halt-polling.md" >}}) - - [内存大页]({{< relref "/docs/Virtualization/内存大页.md" >}}) + - [性能最佳实践]({{< relref "/docs/Virtualization/性能最佳实践.md" >}}) + - [halt-polling]({{< relref "/docs/Virtualization/halt-polling.md" >}}) + - [IOThread配置]({{< relref "/docs/Virtualization/IOThread配置.md" >}}) + - [裸设备映射]({{< relref "/docs/Virtualization/裸设备映射.md" >}}) + - [kworker隔离绑定]({{< relref "/docs/Virtualization/kworker隔离绑定.md" >}}) + - [内存大页]({{< relref "/docs/Virtualization/内存大页.md" >}}) + + - [安全最佳实践]({{< relref "/docs/Virtualization/安全最佳实践.md" >}}) + - [Libvirt鉴权]({{< relref "/docs/Virtualization/Libvirt鉴权.md" >}}) + - [qemu-ga]({{< relref "/docs/Virtualization/qemu-ga.md" >}}) + - [sVirt保护]({{< relref "/docs/Virtualization/sVirt保护.md" >}}) + + + - [附录]({{< relref "/docs/Virtualization/附录.md" >}}) - [术语和缩略语]({{< relref "/docs/Virtualization/术语和缩略语.md" >}}) -- Gitee From 67122558e568b9131fb361ca3aff05bec409f454 Mon Sep 17 00:00:00 2001 From: amyMaYun Date: Sat, 21 Mar 2020 18:52:54 +0800 Subject: [PATCH 4/4] update doc of container for openEuler 20.03 LTS --- content/zh/docs/Container/Attach.md | 67 +- ...15\347\275\256\345\217\202\346\225\260.md" | 4 +- .../Container/CRI\346\216\245\345\217\243.md" | 2 - content/zh/docs/Container/ContainerStats.md | 8 +- content/zh/docs/Container/ContainerStatus.md | 6 +- content/zh/docs/Container/CreateContainer.md | 14 +- ...43\347\232\204\347\273\221\345\256\232.md" | 4 +- .../Docker\345\256\271\345\231\250.md" | 1 - content/zh/docs/Container/Exec.md | 98 +-- content/zh/docs/Container/ExecSync.md | 4 +- content/zh/docs/Container/ImageFsInfo.md | 14 +- .../zh/docs/Container/ListContainerStats.md | 8 +- content/zh/docs/Container/ListContainers.md | 8 +- content/zh/docs/Container/ListImages.md | 4 +- content/zh/docs/Container/ListPodSandbox.md | 8 +- content/zh/docs/Container/PodSandboxStatus.md | 6 +- content/zh/docs/Container/PortForward.md | 4 - content/zh/docs/Container/RemoveContainer.md | 20 +- content/zh/docs/Container/RemoveImage.md | 14 +- content/zh/docs/Container/RemovePodSandbox.md | 4 +- content/zh/docs/Container/RunPodSandbox.md | 13 +- .../Runtime\346\234\215\345\212\241.md" | 1 - ...15\347\275\256\345\234\272\346\231\257.md" | 2 + content/zh/docs/Container/StartContainer.md | 6 +- content/zh/docs/Container/Status.md | 6 +- content/zh/docs/Container/StopContainer.md | 20 +- content/zh/docs/Container/StopPodSandbox.md | 6 +- .../Container/UpdateContainerResources.md | 23 +- .../zh/docs/Container/UpdateRuntimeConfig.md | 18 +- content/zh/docs/Container/attach-1.md | 67 +- content/zh/docs/Container/build.md | 32 +- ...15\347\275\256\345\234\272\346\231\257.md" | 1 - content/zh/docs/Container/commit.md | 2 + content/zh/docs/Container/create.md | 4 +- .../daemon-umask\351\205\215\347\275\256.md" | 2 +- ...57\345\212\250\346\227\266\351\227\264.md" | 4 +- content/zh/docs/Container/diff.md | 2 + ...34\345\203\217\347\256\241\347\220\206.md" | 2 - ...34\345\203\217\347\256\241\347\220\206.md" | 2 - content/zh/docs/Container/events.md | 2 + content/zh/docs/Container/exec-1.md | 77 ++- content/zh/docs/Container/export.md | 2 + content/zh/docs/Container/history.md | 2 + ...71\345\231\250\345\274\225\346\223\216.md" | 3 - ...16\347\232\204\351\205\215\347\275\256.md" | 34 ++ content/zh/docs/Container/images.md | 2 + content/zh/docs/Container/import.md | 2 + content/zh/docs/Container/info.md | 2 + content/zh/docs/Container/inspect.md | 6 +- content/zh/docs/Container/logs.md | 4 + ...02\346\225\260\345\217\257\345\206\231.md" | 2 + content/zh/docs/Container/pause-unpause.md | 4 + ...7\246\273\357\274\210lxcfs\357\274\211.md" | 10 +- content/zh/docs/Container/pull.md | 2 +- content/zh/docs/Container/push.md | 6 +- content/zh/docs/Container/rename.md | 6 +- content/zh/docs/Container/restart.md | 2 +- content/zh/docs/Container/rmi.md | 2 +- content/zh/docs/Container/run.md | 4 +- content/zh/docs/Container/search.md | 2 + ...15\347\275\256\345\234\272\346\231\257.md" | 1 + content/zh/docs/Container/start.md | 4 +- content/zh/docs/Container/stats.md | 2 + content/zh/docs/Container/stop.md | 2 +- content/zh/docs/Container/update.md | 2 +- content/zh/docs/Container/version.md | 2 + content/zh/docs/Container/wait.md | 8 +- .../Container/zh-cn_bookmap_0183409509.md | 301 --------- ...15\347\275\256\347\275\221\347\273\234.md" | 108 ++++ ...13\344\273\266\346\266\210\346\201\257.md" | 50 ++ ...77\347\224\250\346\214\207\345\215\227.md" | 1 - ...347\224\250\346\214\207\345\257\274-17.md" | 44 ++ ...347\224\250\346\226\271\346\263\225-23.md" | 5 - ...347\224\250\346\226\271\346\263\225-26.md" | 3 + ...77\347\224\250\346\226\271\346\263\225.md" | 3 - ...347\224\250\351\231\220\345\210\266-16.md" | 14 + ...347\224\250\351\231\220\345\210\266-20.md" | 29 +- ...\347\224\250\351\231\220\345\210\266-8.md" | 1 + ...0\201\224\347\273\204\344\273\266audit.md" | 2 + ...01\224\347\273\204\344\273\266iptables.md" | 2 +- ...345\273\272\345\256\271\345\231\250-33.md" | 576 +++++++++--------- ...33\345\273\272\345\256\271\345\231\250.md" | 91 ++- ...1\250\344\275\277\347\224\250hook-spec.md" | 2 + ...351\231\244\351\225\234\345\203\217-35.md" | 12 +- ...\351\231\244\351\225\234\345\203\217-6.md" | 1 + ...05\346\240\270\346\250\241\345\235\227.md" | 2 +- ...07\347\272\247\346\226\271\346\263\225.md" | 21 + ...14\345\220\221\350\256\244\350\257\201.md" | 6 +- ...11\345\205\250\345\256\271\345\231\250.md" | 33 +- ...02\346\225\260\350\257\264\346\230\216.md" | 8 +- ...44\350\241\214\345\217\202\350\200\203.md" | 1 - ...14\346\226\260\345\221\275\344\273\244.md" | 2 +- ...346\231\257\350\257\264\346\230\216-15.md" | 4 + ...11\350\243\205\351\205\215\347\275\256.md" | 26 - ...61\345\212\250\351\205\215\347\275\256.md" | 4 +- ...11\345\205\250\347\211\271\346\200\247.md" | 2 - ...05\344\270\216\351\203\250\347\275\262.md" | 1 + ...350\243\205\346\226\271\346\263\225-24.md" | 36 +- ...350\243\205\351\203\250\347\275\262-30.md" | 1 + ...11\350\243\205\351\203\250\347\275\262.md" | 2 - ...60\346\215\256\346\213\267\350\264\235.md" | 2 +- ...66\346\200\201\346\243\200\346\237\245.md" | 1 - ...345\231\250\345\206\205reboot-shutdown.md" | 2 +- ...71\345\231\250\345\274\225\346\223\216.md" | 16 +- ...345\231\250\347\256\241\347\220\206-28.md" | 1 - ...345\231\250\347\256\241\347\220\206-32.md" | 230 +------ ...345\231\250\347\256\241\347\220\206-36.md" | 231 +++++++ ...71\345\231\250\347\256\241\347\220\206.md" | 1 - ...06\357\274\210iSulad-tools\357\274\211.md" | 10 - ...\274\210syscontainer-tools\357\274\211.md" | 9 + ...04\346\272\220\347\256\241\347\220\206.md" | 3 - ...13\347\232\204\345\275\261\345\223\215.md" | 1 - ...42\345\244\215\345\256\271\345\231\250.md" | 45 ++ ...02\345\215\267\347\256\241\347\220\206.md" | 2 +- ...45\345\205\245\345\256\271\345\231\250.md" | 2 +- .../Container/\346\216\245\345\217\243-19.md" | 32 +- .../Container/\346\216\245\345\217\243-2.md" | 4 - .../Container/\346\216\245\345\217\243.md" | 9 +- ...45\345\217\243\345\210\227\350\241\250.md" | 4 +- .../Container/\346\217\217\350\277\260-1.md" | 2 +- .../Container/\346\217\217\350\277\260-18.md" | 94 +-- ...346\214\201CNI\347\275\221\347\273\234.md" | 1 - .../\346\224\257\346\214\201OCI-hooks.md" | 1 - ...50\346\204\217\344\272\213\351\241\271.md" | 2 +- ...02\345\201\234\345\256\271\345\231\250.md" | 47 ++ ...04\346\225\260\351\231\220\345\210\266.md" | 2 +- ...33\347\250\213\344\277\241\346\201\257.md" | 4 +- ...50\347\232\204\350\265\204\346\272\220.md" | 6 +- ...45\350\257\242\344\277\241\346\201\257.md" | 1 - ...71\345\231\250\344\277\241\346\201\257.md" | 2 +- ...71\345\231\250\344\277\241\346\201\257.md" | 8 +- .../Container/\346\246\202\350\277\260-21.md" | 8 +- .../Container/\346\246\202\350\277\260-23.md" | 52 +- .../Container/\346\246\202\350\277\260-29.md" | 8 +- ...25\345\276\213\345\243\260\346\230\216.md" | 4 + ...71\346\235\203\345\256\271\345\231\250.md" | 2 - ...71\345\231\250\351\200\200\345\207\272.md" | 2 +- ...37\345\221\275\345\221\250\346\234\237.md" | 2 - ...73\347\273\237\345\256\271\345\231\250.md" | 2 - ...46\346\235\237\351\231\220\345\210\266.md" | 1 + ...37\350\256\241\344\277\241\346\201\257.md" | 1 + ...71\345\231\250\346\227\245\345\277\227.md" | 4 +- ...347\232\204\345\205\261\344\272\253-27.md" | 12 +- ...20\350\241\214\345\256\271\345\231\250.md" | 57 +- ...21\347\273\234\345\210\227\350\241\250.md" | 4 +- ...57\345\212\250\345\256\271\345\231\250.md" | 1 + ...50\347\275\262\346\226\271\345\274\217.md" | 163 ++--- ...347\275\262\351\205\215\347\275\256-25.md" | 3 +- ...34\347\250\213\350\256\277\351\227\256.md" | 1 + ...345\202\250\351\251\261\345\212\250-31.md" | 46 ++ ...30\345\202\250\351\251\261\345\212\250.md" | 169 ++++- ...30\345\202\250\351\251\261\345\212\250.md" | 4 + ...15\347\275\256\346\226\271\346\263\225.md" | 4 +- ...345\203\217\347\256\241\347\220\206-34.md" | 4 +- ...345\203\217\347\256\241\347\220\206-37.md" | 7 +- ...34\345\203\217\347\256\241\347\220\206.md" | 2 + .../Container/\351\231\204\345\275\225-22.md" | 3 +- .../Container/\351\231\204\345\275\225-28.md" | 3 +- .../Container/\351\231\204\345\275\225.md" | 4 - ...5\210\266Blkio\350\265\204\346\272\220.md" | 2 +- ...345\210\266CPU\350\265\204\346\272\220.md" | 10 +- ...05\345\255\230\350\265\204\346\272\220.md" | 6 +- content/zh/menu/index.md | 106 +++- 163 files changed, 2016 insertions(+), 1558 deletions(-) delete mode 100644 content/zh/docs/Container/PortForward.md create mode 100644 "content/zh/docs/Container/SELinux\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" create mode 100644 "content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216\347\232\204\351\205\215\347\275\256.md" delete mode 100644 content/zh/docs/Container/zh-cn_bookmap_0183409509.md create mode 100644 "content/zh/docs/Container/\344\273\216\346\234\215\345\212\241\347\253\257\345\256\236\346\227\266\350\216\267\345\217\226\344\272\213\344\273\266\346\266\210\346\201\257.md" create mode 100644 "content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\257\274-17.md" delete mode 100644 "content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-23.md" create mode 100644 "content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-26.md" create mode 100644 "content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-16.md" rename "content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-17.md" => "content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-20.md" (98%) rename "content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-29.md" => "content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-33.md" (89%) rename "content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-31.md" => "content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-35.md" (98%) create mode 100644 "content/zh/docs/Container/\345\215\207\347\272\247\346\226\271\346\263\225.md" create mode 100644 "content/zh/docs/Container/\345\234\272\346\231\257\350\257\264\346\230\216-15.md" rename "content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-21.md" => "content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-24.md" (84%) rename "content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-27.md" => "content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-30.md" (98%) delete mode 100644 "content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-28.md" create mode 100644 "content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-36.md" delete mode 100644 "content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210iSulad-tools\357\274\211.md" create mode 100644 "content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210syscontainer-tools\357\274\211.md" create mode 100644 "content/zh/docs/Container/\346\201\242\345\244\215\345\256\271\345\231\250.md" rename "content/zh/docs/Container/\346\216\245\345\217\243-16.md" => "content/zh/docs/Container/\346\216\245\345\217\243-19.md" (97%) rename "content/zh/docs/Container/\346\217\217\350\277\260-15.md" => "content/zh/docs/Container/\346\217\217\350\277\260-18.md" (97%) create mode 100644 "content/zh/docs/Container/\346\232\202\345\201\234\345\256\271\345\231\250.md" rename "content/zh/docs/Container/\346\246\202\350\277\260-18.md" => "content/zh/docs/Container/\346\246\202\350\277\260-21.md" (99%) rename "content/zh/docs/Container/\346\246\202\350\277\260-20.md" => "content/zh/docs/Container/\346\246\202\350\277\260-23.md" (98%) rename "content/zh/docs/Container/\346\246\202\350\277\260-26.md" => "content/zh/docs/Container/\346\246\202\350\277\260-29.md" (62%) rename "content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-24.md" => "content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-27.md" (98%) rename "content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-22.md" => "content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-25.md" (94%) create mode 100644 "content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250-31.md" rename "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-30.md" => "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-34.md" (96%) rename "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-33.md" => "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-37.md" (94%) rename "content/zh/docs/Container/\351\231\204\345\275\225-19.md" => "content/zh/docs/Container/\351\231\204\345\275\225-22.md" (93%) rename "content/zh/docs/Container/\351\231\204\345\275\225-25.md" => "content/zh/docs/Container/\351\231\204\345\275\225-28.md" (93%) diff --git a/content/zh/docs/Container/Attach.md b/content/zh/docs/Container/Attach.md index 3fd648438..c80613f2f 100644 --- a/content/zh/docs/Container/Attach.md +++ b/content/zh/docs/Container/Attach.md @@ -1,64 +1,19 @@ -# Attach +# attach -## 接口原型 +用法:**docker attach \[OPTIONS\] CONTAINER** -``` -rpc Attach(AttachRequest) returns (AttachResponse) {} -``` - -## 接口描述 +功能:附加到一个运行着的容器 -接管容器的1号进程,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。 +选项: -## 参数: AttachRequest +--no-stdin=false 不附加STDIN - - - - - - - - - - - - - - - - - - - - -

参数成员

-

描述

-

string container_id

-

容器ID

-

bool tty

-

是否在TTY中执行命令

-

bool stdin

-

是否流式标准输入

-

bool stdout

-

是否流式标准输出

-

bool stderr

-

是否流式输出标准错误

-
+--sig-proxy=true 代理所有到容器内部的信号,不代理SIGCHLD, SIGKILL, SIGSTOP -## 返回值: ExecResponse +示例: - - - - - - - - -

返回值

-

描述

-

string url

-

attach流服务器的完全限定URL

-
+``` +$ sudo docker attach attach_test +root@2988b8658669:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var +``` diff --git "a/content/zh/docs/Container/CNI\351\205\215\347\275\256\345\217\202\346\225\260.md" "b/content/zh/docs/Container/CNI\351\205\215\347\275\256\345\217\202\346\225\260.md" index 573d66dc7..f2a72e856 100644 --- "a/content/zh/docs/Container/CNI\351\205\215\347\275\256\345\217\202\346\225\260.md" +++ "b/content/zh/docs/Container/CNI\351\205\215\347\275\256\345\217\202\346\225\260.md" @@ -271,7 +271,7 @@

可选

- +

capabilities

@@ -280,7 +280,7 @@

可选

- + diff --git "a/content/zh/docs/Container/CRI\346\216\245\345\217\243.md" "b/content/zh/docs/Container/CRI\346\216\245\345\217\243.md" index 11b1a7c3d..095db4ad8 100644 --- "a/content/zh/docs/Container/CRI\346\216\245\345\217\243.md" +++ "b/content/zh/docs/Container/CRI\346\216\245\345\217\243.md" @@ -1,4 +1,2 @@ # CRI接口 - - diff --git a/content/zh/docs/Container/ContainerStats.md b/content/zh/docs/Container/ContainerStats.md index 1b10ec703..e6a43d3d3 100644 --- a/content/zh/docs/Container/ContainerStats.md +++ b/content/zh/docs/Container/ContainerStats.md @@ -8,9 +8,9 @@ rpc ContainerStats(ContainerStatsRequest) returns (ContainerStatsResponse) {} ## 接口描述 -返回单个容器占用资源信息 +返回单个容器占用资源信息,仅支持runtime类型为lcr的容器。 -## 参数: ContainerStatsRequest +## 参数

参数成员

@@ -26,7 +26,7 @@ rpc ContainerStats(ContainerStatsRequest) returns (ContainerStatsResponse) {}
-## 返回值: ContainerStatsResponse +## 返回值 - diff --git a/content/zh/docs/Container/ContainerStatus.md b/content/zh/docs/Container/ContainerStatus.md index 545b85464..ad0b0a5ea 100644 --- a/content/zh/docs/Container/ContainerStatus.md +++ b/content/zh/docs/Container/ContainerStatus.md @@ -10,9 +10,7 @@ rpc ContainerStatus(ContainerStatusRequest) returns (ContainerStatusResponse) {} 返回容器状态信息,如果容器不存在,则返回错误。 -## 注意事项 - -## 参数: ContainerStatusRequest +## 参数

返回值

@@ -36,7 +36,7 @@ rpc ContainerStats(ContainerStatsRequest) returns (ContainerStatsResponse) {}

ContainerStats stats

容器信息,具体内容参考左侧链接。注:disk和inodes只支持oci格式镜像起的容器查询

+

容器信息。注:disk和inodes只支持oci格式镜像起的容器查询

参数成员

@@ -33,7 +31,7 @@ rpc ContainerStatus(ContainerStatusRequest) returns (ContainerStatusResponse) {}
-## 返回值: ContainerStatusResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/CreateContainer.md b/content/zh/docs/Container/CreateContainer.md index 804fe38de..4d0fd786c 100644 --- a/content/zh/docs/Container/CreateContainer.md +++ b/content/zh/docs/Container/CreateContainer.md @@ -6,15 +6,15 @@ grpc::Status CreateContainer(grpc::ServerContext *context, const runtime::Create ## 接口描述 -在PodSandbox内创建一个容器 +在PodSandbox内创建一个容器。 ## 注意事项 -1. 请求CreateContainerRequest 中的sandbox\_config与传递给RunPodSandboxRequest以创建PodSandbox的配置相同。 它再次传递,只是为了方便参考。 PodSandboxConfig是不可变的,在pod的整个生命周期内保持不变。 +- 请求CreateContainerRequest 中的sandbox\_config与传递给RunPodSandboxRequest以创建PodSandbox的配置相同。 它再次传递,只是为了方便参考。 PodSandboxConfig是不可变的,在pod的整个生命周期内保持不变。 +- 由于容器命名以[ContainerMetadata](接口-2.md#zh-cn_topic_0182207110_li17135914132319)中的字段为来源,且以下划线"\_"为分割字符,因此限制metadata中的数据不能包含下划线,否则会出现sandbox运行成功,但无法使用[ListContainers](ListContainers.md#ZH-CN_TOPIC_0184808103)接口查询的现象。 +- CreateContainerRequest中无runtime\_handler字段,创建container时的runtime类型和其对应的sandbox的runtime相同。 -2. 由于容器命名以[ContainerMetadata](接口-2.md#zh-cn_topic_0182207110_li17135914132319)中的字段为来源,且以下划线"\_"为分割字符,因此限制metadata中的数据不能包含下划线,否则会出现sandbox运行成功,但无法使用[ListContainers](ListContainers.md#ZH-CN_TOPIC_0184808103)接口查询的现象。 - -## 参数: CreateContainerRequest +## 参数

参数成员

@@ -40,7 +40,7 @@ grpc::Status CreateContainer(grpc::ServerContext *context, const runtime::Create
-## 补充 :annotations +## 补充 可用于存储和检索任意元数据的非结构化键值映射。有一些字段由于cri接口没有提供特定的参数,可通过该字段将参数传入 @@ -61,7 +61,7 @@ grpc::Status CreateContainer(grpc::ServerContext *context, const runtime::Create
-## 返回值 :CreateContainerResponse +## 返回值

返回值

diff --git "a/content/zh/docs/Container/DAEMON\345\244\232\347\253\257\345\217\243\347\232\204\347\273\221\345\256\232.md" "b/content/zh/docs/Container/DAEMON\345\244\232\347\253\257\345\217\243\347\232\204\347\273\221\345\256\232.md" index 9c156a810..11f93e14c 100644 --- "a/content/zh/docs/Container/DAEMON\345\244\232\347\253\257\345\217\243\347\232\204\347\273\221\345\256\232.md" +++ "b/content/zh/docs/Container/DAEMON\345\244\232\347\253\257\345\217\243\347\232\204\347\273\221\345\256\232.md" @@ -2,7 +2,7 @@ ## 描述 -daemon端可以绑定多个unix socket或者tcp端口,并在这些端口上监听,客户端可以通过这些端口和daemon端进行交互。 +daemon端可以绑定多个unix socket或者tcp端口,并在这些端口上侦听,客户端可以通过这些端口和daemon端进行交互。 ## 接口 @@ -24,7 +24,7 @@ daemon端可以绑定多个unix socket或者tcp端口,并在这些端口上监 OPTIONS='-H unix:///var/run/isulad.sock --host tcp://127.0.0.1:6789' ``` -如果用户在daemon.json文件及iSulad中均未指定hosts,则daemon在启动之后将默认监听unix:///var/run/isulad.sock。 +如果用户在daemon.json文件及iSulad中均未指定hosts,则daemon在启动之后将默认侦听unix:///var/run/isulad.sock。 ## 限制 diff --git "a/content/zh/docs/Container/Docker\345\256\271\345\231\250.md" "b/content/zh/docs/Container/Docker\345\256\271\345\231\250.md" index cd3143280..05f03370e 100644 --- "a/content/zh/docs/Container/Docker\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/Docker\345\256\271\345\231\250.md" @@ -1,3 +1,2 @@ # Docker容器 - diff --git a/content/zh/docs/Container/Exec.md b/content/zh/docs/Container/Exec.md index 1a15e2803..061dc0130 100644 --- a/content/zh/docs/Container/Exec.md +++ b/content/zh/docs/Container/Exec.md @@ -14,60 +14,60 @@ rpc Exec(ExecRequest) returns (ExecResponse) {} 执行执行一条单独的命令,也能打开终端与容器交互。stdin/stdout/stderr之一必须是真的。如果tty为真,stderr必须是假的。 不支持多路复用, 在这种情况下, stdout和stderr的输出将合并为单流。 -## 参数: ExecRequest +## 参数 - - - - - - - - - - - - - - - - - - - - - - +

参数成员

-

描述

-

string container_id

-

容器ID

-

repeated string cmd

-

待执行的命令

-

bool tty

-

是否在TTY中执行命令

-

bool stdin

-

是否流式标准输入

-

bool stdout

-

是否流式标准输出

-

bool stderr

-

是否流式输出标准错误

-
+ + + + + + + + + + + + + + + + + + + + +

参数成员

+

描述

+

string container_id

+

容器ID

+

repeated string cmd

+

待执行的命令

+

bool tty

+

是否在TTY中执行命令

+

bool stdin

+

是否流式标准输入

+

bool stdout

+

是否流式标准输出

+

bool stderr

+

是否流式输出标准错误

+
-## 返回值: ExecResponse +## 返回值 - - - - - - - +

返回值

-

描述

-

string url

-

exec流服务器的完全限定URL

-
+ + + + + +

返回值

+

描述

+

string url

+

exec流服务器的完全限定URL

+
diff --git a/content/zh/docs/Container/ExecSync.md b/content/zh/docs/Container/ExecSync.md index b7f8b07c1..664567372 100644 --- a/content/zh/docs/Container/ExecSync.md +++ b/content/zh/docs/Container/ExecSync.md @@ -14,7 +14,7 @@ rpc ExecSync(ExecSyncRequest) returns (ExecSyncResponse) {} 执行执行一条单独的命令,不能打开终端与容器交互。 -## 参数:ExecSyncRequest +## 参数

参数成员

@@ -40,7 +40,7 @@ rpc ExecSync(ExecSyncRequest) returns (ExecSyncResponse) {}
-## 返回值: ExecSyncResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/ImageFsInfo.md b/content/zh/docs/Container/ImageFsInfo.md index 5a748bdb3..bb456ca4a 100644 --- a/content/zh/docs/Container/ImageFsInfo.md +++ b/content/zh/docs/Container/ImageFsInfo.md @@ -16,19 +16,7 @@ rpc ImageFsInfo(ImageFsInfoRequest) returns (ImageFsInfoResponse) {} ## 参数 - - - - - - - - -

参数成员

-

描述

-

-

-
+无 ## 返回值 diff --git a/content/zh/docs/Container/ListContainerStats.md b/content/zh/docs/Container/ListContainerStats.md index e87db4ecb..88963f0ba 100644 --- a/content/zh/docs/Container/ListContainerStats.md +++ b/content/zh/docs/Container/ListContainerStats.md @@ -10,7 +10,7 @@ rpc ListContainerStats(ListContainerStatsRequest) returns (ListContainerStatsRes 返回多个容器占用资源信息,支持条件过滤 -## 参数: ListContainerStatsRequest +## 参数 -

参数成员

@@ -20,13 +20,13 @@ rpc ListContainerStats(ListContainerStatsRequest) returns (ListContainerStatsRes

ContainerStatsFilter filter

条件过滤参数,具体内容参考左侧链接

+

条件过滤参数

-## 返回值: ListContainerStatsResponse +## 返回值 - diff --git a/content/zh/docs/Container/ListContainers.md b/content/zh/docs/Container/ListContainers.md index ac86c8f69..30e46e7aa 100644 --- a/content/zh/docs/Container/ListContainers.md +++ b/content/zh/docs/Container/ListContainers.md @@ -10,9 +10,7 @@ rpc ListContainers(ListContainersRequest) returns (ListContainersResponse) {} 返回container信息的列表,支持条件过滤。 -## 注意事项 - -## 参数: ListContainersRequest +## 参数

返回值

@@ -36,7 +36,7 @@ rpc ListContainerStats(ListContainerStatsRequest) returns (ListContainerStatsRes

repeated ContainerStats stats

容器信息的列表,具体内容参考左侧链接。注:disk和inodes只支持oci格式镜像启动的容器查询

+

容器信息的列表。注:disk和inodes只支持oci格式镜像启动的容器查询

-

参数成员

@@ -22,13 +20,13 @@ rpc ListContainers(ListContainersRequest) returns (ListContainersResponse) {}

ContainerFilter filter

条件过滤参数,具体内容参考左侧链接

+

条件过滤参数

-## 返回值: ListContainersResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/ListImages.md b/content/zh/docs/Container/ListImages.md index abd0e1bb9..bc18449ba 100644 --- a/content/zh/docs/Container/ListImages.md +++ b/content/zh/docs/Container/ListImages.md @@ -14,8 +14,8 @@ rpc ListImages(ListImagesRequest) returns (ListImagesResponse) {} 为统一接口,对于embedded格式镜像,可以通过cri images查询到。但是因embedded镜像不是标准OCI镜像,因此查询得到的结果有以下限制: -1. 因embedded镜像无镜像ID,显示的镜像ID为 镜像的config digest。 -2. 因embedded镜像本身无digest仅有config的digest,且格式不符合OCI镜像规范,因此无法显示digest。 +- 因embedded镜像无镜像ID,显示的镜像ID为镜像的config digest。 +- 因embedded镜像本身无digest仅有config的digest,且格式不符合OCI镜像规范,因此无法显示digest。 ## 参数 diff --git a/content/zh/docs/Container/ListPodSandbox.md b/content/zh/docs/Container/ListPodSandbox.md index ea0d7fc3f..705bab804 100644 --- a/content/zh/docs/Container/ListPodSandbox.md +++ b/content/zh/docs/Container/ListPodSandbox.md @@ -10,9 +10,7 @@ rpc ListPodSandbox(ListPodSandboxRequest) returns (ListPodSandboxResponse) {} 返回sandbox信息的列表,支持条件过滤。 -## 注意事项 - -## 参数: ListPodSandboxRequest +## 参数 -

参数成员

@@ -22,13 +20,13 @@ rpc ListPodSandbox(ListPodSandboxRequest) returns (ListPodSandboxResponse) {}

PodSandboxFilter filter

条件过滤参数,具体内容参考左侧链接

+

条件过滤参数

-## 返回值: ListPodSandboxResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/PodSandboxStatus.md b/content/zh/docs/Container/PodSandboxStatus.md index 43b21a9ba..966501d16 100644 --- a/content/zh/docs/Container/PodSandboxStatus.md +++ b/content/zh/docs/Container/PodSandboxStatus.md @@ -10,9 +10,7 @@ rpc PodSandboxStatus(PodSandboxStatusRequest) returns (PodSandboxStatusResponse) 查询sandbox的状态,如果sandbox不存在,返回错误。 -## 注意事项 - -## 参数: PodSandboxStatusRequest +## 参数

参数成员

@@ -33,7 +31,7 @@ rpc PodSandboxStatus(PodSandboxStatusRequest) returns (PodSandboxStatusResponse)
-## 返回值: PodSandboxStatusResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/PortForward.md b/content/zh/docs/Container/PortForward.md deleted file mode 100644 index 0bca28f01..000000000 --- a/content/zh/docs/Container/PortForward.md +++ /dev/null @@ -1,4 +0,0 @@ -# PortForward - -暂不支持 - diff --git a/content/zh/docs/Container/RemoveContainer.md b/content/zh/docs/Container/RemoveContainer.md index 384ea07aa..25fae7f72 100644 --- a/content/zh/docs/Container/RemoveContainer.md +++ b/content/zh/docs/Container/RemoveContainer.md @@ -10,9 +10,7 @@ rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse) {} 删除一个容器,如果容器正在运行,必须强制停止,如果容器已经被删除,不能返回错误。 -## 注意事项 - -## 参数: RemoveContainerRequest +## 参数

参数成员

@@ -28,19 +26,7 @@ rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse) {}
-## 返回值: RemoveContainerResponse +## 返回值 - - - - - - - - -

返回值

-

描述

-

-

-
+无 diff --git a/content/zh/docs/Container/RemoveImage.md b/content/zh/docs/Container/RemoveImage.md index efe1c5000..9f1363174 100644 --- a/content/zh/docs/Container/RemoveImage.md +++ b/content/zh/docs/Container/RemoveImage.md @@ -32,17 +32,5 @@ rpc RemoveImage(RemoveImageRequest) returns (RemoveImageResponse) {} ## 返回值 - - - - - - - - -

返回值

-

描述

-

-

-
+无 diff --git a/content/zh/docs/Container/RemovePodSandbox.md b/content/zh/docs/Container/RemovePodSandbox.md index 26e377e74..89e16bc77 100644 --- a/content/zh/docs/Container/RemovePodSandbox.md +++ b/content/zh/docs/Container/RemovePodSandbox.md @@ -14,7 +14,7 @@ rpc RemovePodSandbox(RemovePodSandboxRequest) returns (RemovePodSandboxResponse) 1. 删除sandbox时,不会删除sandbox的网络资源,在删除pod前必须先调用StopPodSandbox才能清理网络资源,调用者应当保证在删除sandbox之前至少调用一次StopPodSandbox。 -## 参数: RemovePodSandboxRequest +## 参数

参数成员

@@ -30,7 +30,7 @@ rpc RemovePodSandbox(RemovePodSandboxRequest) returns (RemovePodSandboxResponse)
-## 返回值: RemovePodSandboxResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/RunPodSandbox.md b/content/zh/docs/Container/RunPodSandbox.md index 077d512ce..d1504ba97 100644 --- a/content/zh/docs/Container/RunPodSandbox.md +++ b/content/zh/docs/Container/RunPodSandbox.md @@ -15,7 +15,7 @@ rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse) {} 1. 启动sandbox的默认镜像为rnd-dockerhub.huawei.com/library/pause-$\{machine\}:3.0, 其中$\{machine\}为架构,在x86\_64上,machine的值为amd64,在arm64上,machine的值为aarch64,当前rnd-dockerhub仓库上只有amd64和aarch64镜像可供下载,若机器上无此镜像,请确保机器能从rnd-dockerhub下载,若要使用其它镜像,请参考[iSulad部署配置](部署配置.md#ZH-CN_TOPIC_0184808042)中的pod-sandbox-image指定镜像。 2. 由于容器命名以[PodSandboxMetadata](接口-2.md#zh-cn_topic_0182207110_li2359918134912)中的字段为来源,且以下划线"\_"为分割字符,因此限制metadata中的数据不能包含下划线,否则会出现sandbox运行成功,但无法使用[ListPodSandbox](ListPodSandbox.md#ZH-CN_TOPIC_0184808098)接口查询的现象。 -## 参数:RunPodSandboxRequest +## 参数 - + + +

参数成员

@@ -25,13 +25,18 @@ rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse) {}

PodSandboxConfig config

sandbox的配置,具体参数含义参考左侧链接。

+

sandbox的配置

+

string runtime_handler

+

指定创建sandbox的runtime运行时,当前支持lcr、kata-runtime运行时类型。

-## 返回值:RunPodSandboxResponse +## 返回值 - diff --git "a/content/zh/docs/Container/Runtime\346\234\215\345\212\241.md" "b/content/zh/docs/Container/Runtime\346\234\215\345\212\241.md" index b78529a9e..c6d36bddb 100644 --- "a/content/zh/docs/Container/Runtime\346\234\215\345\212\241.md" +++ "b/content/zh/docs/Container/Runtime\346\234\215\345\212\241.md" @@ -3,4 +3,3 @@ Runtime服务中包含操作pod和容器的接口,以及查询runtime自身配置和状态信息的接口。 - diff --git "a/content/zh/docs/Container/SELinux\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" "b/content/zh/docs/Container/SELinux\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" new file mode 100644 index 000000000..d42f1521f --- /dev/null +++ "b/content/zh/docs/Container/SELinux\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" @@ -0,0 +1,2 @@ +# SELinux安全配置场景 + diff --git a/content/zh/docs/Container/StartContainer.md b/content/zh/docs/Container/StartContainer.md index 1879276a2..6ec1007dc 100644 --- a/content/zh/docs/Container/StartContainer.md +++ b/content/zh/docs/Container/StartContainer.md @@ -10,9 +10,7 @@ rpc StartContainer(StartContainerRequest) returns (StartContainerResponse) {} 启动一个容器。 -## 注意事项 - -## 参数: StartContainerRequest +## 参数

返回值

@@ -41,7 +46,7 @@ rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse) {}

string pod_sandbox_id

成功,返回response数据,具体参数参考左侧链接

+

成功,返回response数据

参数成员

@@ -28,7 +26,7 @@ rpc StartContainer(StartContainerRequest) returns (StartContainerResponse) {}
-## 返回值: StartContainerResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/Status.md b/content/zh/docs/Container/Status.md index bf891a9ba..0e6dda294 100644 --- a/content/zh/docs/Container/Status.md +++ b/content/zh/docs/Container/Status.md @@ -8,13 +8,13 @@ rpc Status(StatusRequest) returns (StatusResponse) {}; ## 接口描述 -获取runtime和pod的网络状态,在获取网络状态时,会触发网络配置的刷新。 +获取runtime和pod的网络状态,在获取网络状态时,会触发网络配置的刷新。仅支持runtime类型为lcr的容器。 ## 注意事项 如果网络配置刷新失败,不会影响原有配置;只有刷新成功时,才会覆盖原有配置。 -## 参数: StatusRequest +## 参数

参数成员

@@ -30,7 +30,7 @@ rpc Status(StatusRequest) returns (StatusResponse) {};
-## 返回值: StatusResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/StopContainer.md b/content/zh/docs/Container/StopContainer.md index cec16a6f0..51775b588 100644 --- a/content/zh/docs/Container/StopContainer.md +++ b/content/zh/docs/Container/StopContainer.md @@ -10,9 +10,7 @@ rpc StopContainer(StopContainerRequest) returns (StopContainerResponse) {} 停止一个running的容器,支持配置优雅停止时间timeout,如果容器已经停止,不能返回错误。 -## 注意事项 - -## 参数: StopContainerRequest +## 参数

参数成员

@@ -33,19 +31,7 @@ rpc StopContainer(StopContainerRequest) returns (StopContainerResponse) {}
-## 返回值: StopContainerResponse +## 返回值 - - - - - - - - -

返回值

-

描述

-

-

-
+无 diff --git a/content/zh/docs/Container/StopPodSandbox.md b/content/zh/docs/Container/StopPodSandbox.md index 14b709b35..a5141d74d 100644 --- a/content/zh/docs/Container/StopPodSandbox.md +++ b/content/zh/docs/Container/StopPodSandbox.md @@ -10,9 +10,7 @@ rpc StopPodSandbox(StopPodSandboxRequest) returns (StopPodSandboxResponse) {} 停止pod sandbox,停止sandbox容器,回收分配给sandbox的网络资源(比如IP地址)。如果有任何running的容器属于该sandbox,则必须被强制停止。 -## 注意事项 - -## 参数: StopPodSandboxRequest +## 参数

参数成员

@@ -28,7 +26,7 @@ rpc StopPodSandbox(StopPodSandboxRequest) returns (StopPodSandboxResponse) {}
-## 返回值: StopPodSandboxResponse +## 返回值

返回值

diff --git a/content/zh/docs/Container/UpdateContainerResources.md b/content/zh/docs/Container/UpdateContainerResources.md index d11b44f18..ee20086d0 100644 --- a/content/zh/docs/Container/UpdateContainerResources.md +++ b/content/zh/docs/Container/UpdateContainerResources.md @@ -12,11 +12,10 @@ rpc UpdateContainerResources(UpdateContainerResourcesRequest) returns (UpdateCon ## 注意事项 -1. 该接口仅用于更新容器的资源配置,不能用于更新Pod的资源配置。 +- 该接口仅用于更新容器的资源配置,不能用于更新Pod的资源配置。 +- 当前不支持更新容器oom\_score\_adj配置。 -2. 当前不支持更新容器oom\_score\_adj配置 - -## 参数: UpdateContainerResourcesRequest +## 参数

参数成员

@@ -37,19 +36,7 @@ rpc UpdateContainerResources(UpdateContainerResourcesRequest) returns (UpdateCon
-## 返回值: UpdateContainerResourcesResponse +## 返回值 - - - - - - - - -

返回值

-

描述

-

-

-
+无 diff --git a/content/zh/docs/Container/UpdateRuntimeConfig.md b/content/zh/docs/Container/UpdateRuntimeConfig.md index 397721ab7..96caaf851 100644 --- a/content/zh/docs/Container/UpdateRuntimeConfig.md +++ b/content/zh/docs/Container/UpdateRuntimeConfig.md @@ -14,7 +14,7 @@ rpc UpdateRuntimeConfig(UpdateRuntimeConfigRequest) returns (UpdateRuntimeConfig 接口操作不会对系统管理信息修改,只是记录一条日志。 -## 参数: UpdateRuntimeConfigRequest +## 参数

参数成员

@@ -30,19 +30,7 @@ rpc UpdateRuntimeConfig(UpdateRuntimeConfigRequest) returns (UpdateRuntimeConfig
-## 返回值: UpdateRuntimeConfigResponse +## 返回值 - - - - - - - - -

返回值

-

描述

-

-

-
+无 diff --git a/content/zh/docs/Container/attach-1.md b/content/zh/docs/Container/attach-1.md index bffed307c..c5844661e 100644 --- a/content/zh/docs/Container/attach-1.md +++ b/content/zh/docs/Container/attach-1.md @@ -1,19 +1,64 @@ -# attach +# Attach -用法:**docker attach \[OPTIONS\] CONTAINER** +## 接口原型 -功能:附加到一个运行着的容器 +``` +rpc Attach(AttachRequest) returns (AttachResponse) {} +``` -选项: +## 接口描述 ---no-stdin=false 不附加STDIN +接管容器的1号进程,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。仅支持runtime类型为lcr的容器。 ---sig-proxy=true 代理所有到容器内部的信号,不代理SIGCHLD, SIGKILL, SIGSTOP +## 参数 -示例: + + + + + + + + + + + + + + + + + + + + +

参数成员

+

描述

+

string container_id

+

容器ID

+

bool tty

+

是否在TTY中执行命令

+

bool stdin

+

是否流式标准输入

+

bool stdout

+

是否流式标准输出

+

bool stderr

+

是否流式输出标准错误

+
-``` -$ sudo docker attach attach_test -root@2988b8658669:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var -``` +## 返回值 + + + + + + + + + +

返回值

+

描述

+

string url

+

attach流服务器的完全限定URL

+
diff --git a/content/zh/docs/Container/build.md b/content/zh/docs/Container/build.md index 7330667d5..033adb0c2 100644 --- a/content/zh/docs/Container/build.md +++ b/content/zh/docs/Container/build.md @@ -67,12 +67,16 @@ Dockerfile介绍: Dockerfile是一个镜像的表示,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器,所有的 Dockerfile 命令格式都是:**INSTRUCTION arguments** +   + **FROM命令** 格式:FROM 或 FROM : 功能:该命令指定基本镜像,是所有Dockerfile文件的第一个命令,如果没有指定基本镜像的tag,使用默认tag名latest。 +   + **RUN命令** 格式:RUN \(the command is run in a shell - \`/bin/sh -c\`\) 或者 @@ -85,58 +89,78 @@ docker run image command docker commit container\_id +   + **注释** 使用\#注释 +   + **MAINTAINER命令** 格式:MAINTAINER 功能:命令用来指定维护者的姓名和联系方式 +   + **ENTRYPOINT命令** 格式:ENTRYPOINT cmd param1 param2 ... 或者ENTRYPOINT \["cmd", "param1", "param2"...\] 功能:设置在容器启动时执行命令 +   + **USER命令** 格式:USER name 功能:指定 memcached 的运行用户 +   + **EXPOSE命令** 格式:EXPOSE \[...\] 功能:开放镜像的一个或多个端口 +   + **ENV命令** 格式:ENV 功能:设置环境变量,设置了后,后续的RUN命令都可以使用 +   + **ADD命令** 格式:ADD 功能:从src复制文件到container的dest路径, 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url, 是container中的绝对路径 +   + **VOLUME命令** 格式:VOLUME \[""\] 功能:创建一个挂载点用于共享目录 +   + **WORKDIR命令** 格式:workdir 功能:配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令 +   + **CMD命令** 格式:CMD \["executable","param1","param2"\] \(like an exec, preferred form\) @@ -147,6 +171,8 @@ CMD command param1 param2 \(as a shell\) 功能:一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效 +   + **ONBUILD命令** 格式:ONBUILD \[其它指令\] @@ -156,7 +182,7 @@ CMD command param1 param2 \(as a shell\) 下面是Dockerfile的一个完整例子,该Dockerfile将构建一个安装了sshd服务的image -
FROM ubuntu:14.04
+
FROM busybox
 ENV  http_proxy http://192.168.0.226:3128
 ENV  https_proxy https://192.168.0.226:3128
 RUN apt-get update && apt-get install -y openssh-server
@@ -173,13 +199,13 @@ ENTRYPOINT /usr/sbin/sshd -D
1. 以上文的Dockerfile构建一个image ``` - $ sudo docker build -t ubuntu:latest + $ sudo docker build -t busybox:latest ``` 2. 通过以下命令可以看到这个生成的image: ``` - docker images | grep ubuntu + docker images | grep busybox ``` diff --git "a/content/zh/docs/Container/capabilities\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" "b/content/zh/docs/Container/capabilities\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" index a13d2a4b4..5a0af9977 100644 --- "a/content/zh/docs/Container/capabilities\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" +++ "b/content/zh/docs/Container/capabilities\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" @@ -1,2 +1 @@ # capabilities安全配置场景 - diff --git a/content/zh/docs/Container/commit.md b/content/zh/docs/Container/commit.md index 16e1a00e5..b79edf74a 100644 --- a/content/zh/docs/Container/commit.md +++ b/content/zh/docs/Container/commit.md @@ -25,3 +25,5 @@ REPOSITORY TAG IMAGE ID CREATED busybox latest e02e811dd08f 2 years ago 1.09MB ``` +   + diff --git a/content/zh/docs/Container/create.md b/content/zh/docs/Container/create.md index 842456908..20f82a1c1 100644 --- a/content/zh/docs/Container/create.md +++ b/content/zh/docs/Container/create.md @@ -380,9 +380,9 @@ 示例: -创建了一个名为ubuntu的容器,创建之后的容器用docker start命令启动。 +创建了一个名为busybox的容器,创建之后的容器用docker start命令启动。 ``` -$ sudo docker create -ti --name=ubuntu ubuntu /bin/bash +$ sudo docker create -ti --name=busybox busybox /bin/bash ``` diff --git "a/content/zh/docs/Container/daemon-umask\351\205\215\347\275\256.md" "b/content/zh/docs/Container/daemon-umask\351\205\215\347\275\256.md" index 171fe4c3c..025fb20c1 100644 --- "a/content/zh/docs/Container/daemon-umask\351\205\215\347\275\256.md" +++ "b/content/zh/docs/Container/daemon-umask\351\205\215\347\275\256.md" @@ -1,6 +1,6 @@ # daemon umask配置 -容器主进程和exec进程的默认umask为0022,为了满足安全性需求,避免容器受到攻击,修改runc了实现,将默认umask修改为0027。修改后others群组将无法访问新建文件或目录。 +容器主进程和exec进程的默认umask为0022,为了满足安全性需求,避免容器受到攻击,修改runc的实现,将默认umask修改为0027。修改后others群组将无法访问新建文件或目录。 docker启动容器时的默认umask值为0027,可以在dockerd启动时,使用--exec-opt native.umask=normal参数将容器启动时的umask修改为0022。 diff --git "a/content/zh/docs/Container/daemon\345\220\257\345\212\250\346\227\266\351\227\264.md" "b/content/zh/docs/Container/daemon\345\220\257\345\212\250\346\227\266\351\227\264.md" index a3dee78ec..15819abad 100644 --- "a/content/zh/docs/Container/daemon\345\220\257\345\212\250\346\227\266\351\227\264.md" +++ "b/content/zh/docs/Container/daemon\345\220\257\345\212\250\346\227\266\351\227\264.md" @@ -4,7 +4,9 @@ Docker服务由systemd管理,systemd对各个服务的启动时间有限制, - 如果使用devicemapper且为第一次启动,docker daemon需要对该设备做文件系统初始化操作,而该操作会进行大量磁盘IO操作,在磁盘性能不佳或存在大量IO竞争时,很可能会导致docker daemon启动超时。devicemapper设备只需要初始化一次,后续docker daemon启动时不再需要重复初始化。 - 如果当前系统资源占用太高,导致系统卡顿,系统所有的操作都会变慢,也可能会出现docker服务启动超时的情况。 -- daemon重启过程中,需要遍历并读取docker工作目录下每一个容器的配置文件、容器init层和可写层的配置,如果当前系统存在过多容器(包含created和exited的容器)、并且磁盘读写性能受限,也会出现daemon遍历文件过久导致docker服务启动超时的情况。 +- daemon重启过程中,需要遍历并读取docker工作目录下每一个容器的配置文件、容器init层和可写层的配置,如果当前系统存在过多容器(包含created和exited的容器),并且磁盘读写性能受限,也会出现daemon遍历文件过久导致docker服务启动超时的情况。 + +   出现服务启动超时情况,建议对以下两种情况进行排查调整: diff --git a/content/zh/docs/Container/diff.md b/content/zh/docs/Container/diff.md index 205522807..601c746df 100644 --- a/content/zh/docs/Container/diff.md +++ b/content/zh/docs/Container/diff.md @@ -15,3 +15,5 @@ A /root/.bash_history A /test ``` +   + diff --git "a/content/zh/docs/Container/docker\351\225\234\345\203\217\347\256\241\347\220\206.md" "b/content/zh/docs/Container/docker\351\225\234\345\203\217\347\256\241\347\220\206.md" index 75ed01c32..962ea2a53 100644 --- "a/content/zh/docs/Container/docker\351\225\234\345\203\217\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Container/docker\351\225\234\345\203\217\347\256\241\347\220\206.md" @@ -1,3 +1 @@ # docker镜像管理 - - diff --git "a/content/zh/docs/Container/embedded\351\225\234\345\203\217\347\256\241\347\220\206.md" "b/content/zh/docs/Container/embedded\351\225\234\345\203\217\347\256\241\347\220\206.md" index d30286481..058ed0232 100644 --- "a/content/zh/docs/Container/embedded\351\225\234\345\203\217\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Container/embedded\351\225\234\345\203\217\347\256\241\347\220\206.md" @@ -1,3 +1 @@ # embedded镜像管理 - - diff --git a/content/zh/docs/Container/events.md b/content/zh/docs/Container/events.md index 5b7221ca6..684ddeb4a 100644 --- a/content/zh/docs/Container/events.md +++ b/content/zh/docs/Container/events.md @@ -23,3 +23,5 @@ $ sudo docker events 2019-08-28T16:23:09.924121158+08:00 container resize 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (height=48, image=busybox:latest, name=eager_wu, width=210) ``` +   + diff --git a/content/zh/docs/Container/exec-1.md b/content/zh/docs/Container/exec-1.md index 827426696..54855cbcf 100644 --- a/content/zh/docs/Container/exec-1.md +++ b/content/zh/docs/Container/exec-1.md @@ -1,26 +1,73 @@ -# exec +# Exec -用法:**docker exec \[OPTIONS\] CONTAINER COMMAND \[ARG...\]** +## 接口原型 -功能:在一个运行的容器内执行命令 +``` +rpc Exec(ExecRequest) returns (ExecResponse) {} +``` -选项: +## 接口描述 --d, --detach=false 在后台运行 +在容器中执行命令,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。 --i, --interactive=false 保持容器的STDIN打开 +## 注意事项 --t, --tty=false 分配一个虚拟终端 +执行执行一条单独的命令,也能打开终端与容器交互。stdin/stdout/stderr之一必须是真的。如果tty为真,stderr必须是假的。 不支持多路复用, 在这种情况下, stdout和stderr的输出将合并为单流。 ---privileged 以特权模式执行命令 +## 参数 --u, --user 指定用户名或者UID + + + + + + + + + + + + + + + + + + + + + + + +

参数成员

+

描述

+

string container_id

+

容器ID

+

repeated string cmd

+

待执行的命令

+

bool tty

+

是否在TTY中执行命令

+

bool stdin

+

是否流式标准输入

+

bool stdout

+

是否流式标准输出

+

bool stderr

+

是否流式输出标准错误

+
-示例: +## 返回值 -``` -$ sudo docker exec -ti exec_test ls -bin etc lib media opt root sbin sys tmp var -dev home lib64 mnt proc run srv test usr -``` + + + + + + + + +

返回值

+

描述

+

string url

+

exec流服务器的完全限定URL

+
diff --git a/content/zh/docs/Container/export.md b/content/zh/docs/Container/export.md index 71cad0ad6..08af03739 100644 --- a/content/zh/docs/Container/export.md +++ b/content/zh/docs/Container/export.md @@ -16,3 +16,5 @@ $ ls busybox.tar ``` +   + diff --git a/content/zh/docs/Container/history.md b/content/zh/docs/Container/history.md index 107fffd09..f77e342b3 100644 --- a/content/zh/docs/Container/history.md +++ b/content/zh/docs/Container/history.md @@ -21,3 +21,5 @@ be4672959e8b 15 minutes ago bash 23B 21970dfada48 4 weeks ago 128MB Imported from - ``` +   + diff --git "a/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216.md" "b/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216.md" index ba5a421cf..0dd7ea15a 100644 --- "a/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216.md" +++ "b/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216.md" @@ -1,4 +1 @@ # iSula容器引擎 - - - diff --git "a/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216\347\232\204\351\205\215\347\275\256.md" "b/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216\347\232\204\351\205\215\347\275\256.md" new file mode 100644 index 000000000..03794b86c --- /dev/null +++ "b/content/zh/docs/Container/iSula\345\256\271\345\231\250\345\274\225\346\223\216\347\232\204\351\205\215\347\275\256.md" @@ -0,0 +1,34 @@ +# iSula容器引擎的配置 + +与docker-engine容器引擎类似,为了让iSula容器引擎支持新的容器运行时kata-runtime,需要通过以下步骤对iSula容器引擎进行配置: + +1. 请保证环境上所有的软件包(iSulad、kata-containers)都已经安装完毕。 +2. 停止isulad。 + + ``` + systemctl stop isulad + ``` + +3. 修改iSula容器引擎的配置文件/etc/isulad/daemon.json,并新增如下配置: + + ``` + { + "runtimes": { + "kata-runtime": { + "path": "/usr/bin/kata-runtime", + "runtime-args": [ + "--kata-config", + "/usr/share/defaults/kata-containers/configuration.toml" + ] + } + } + } + ``` + +4. 重新启动isulad。 + + ``` + systemctl start isulad + ``` + + diff --git a/content/zh/docs/Container/images.md b/content/zh/docs/Container/images.md index fa6de983d..3209e26f5 100644 --- a/content/zh/docs/Container/images.md +++ b/content/zh/docs/Container/images.md @@ -22,3 +22,5 @@ REPOSITORY TAG IMAGE ID CREATED busybox latest e02e811dd08f 2 years ago 1.09MB ``` +   + diff --git a/content/zh/docs/Container/import.md b/content/zh/docs/Container/import.md index ad2dc4050..67104ef58 100644 --- a/content/zh/docs/Container/import.md +++ b/content/zh/docs/Container/import.md @@ -18,3 +18,5 @@ REPOSITORY TAG IMAGE ID CREATED busybox test a79d8ae12403 2 seconds ago 1.3MB ``` +   + diff --git a/content/zh/docs/Container/info.md b/content/zh/docs/Container/info.md index b16f26158..d17248145 100644 --- a/content/zh/docs/Container/info.md +++ b/content/zh/docs/Container/info.md @@ -35,3 +35,5 @@ Storage Driver: devicemapper ...... ``` +   + diff --git a/content/zh/docs/Container/inspect.md b/content/zh/docs/Container/inspect.md index ebf246f03..dd7c2776c 100644 --- a/content/zh/docs/Container/inspect.md +++ b/content/zh/docs/Container/inspect.md @@ -42,10 +42,12 @@ ...... ``` -2. 按照给定格式返回一个容器的指定信息,下面的例子返回ubuntu\_test容器IP地址 +    + +2. 按照给定格式返回一个容器的指定信息,下面的例子返回busybox\_test容器IP地址 ``` - $ sudo docker inspect -f {{.NetworkSettings.IPAddress}} ubuntu_test + $ sudo docker inspect -f {{.NetworkSettings.IPAddress}} busybox_test 172.17.0.91 ``` diff --git a/content/zh/docs/Container/logs.md b/content/zh/docs/Container/logs.md index 386c4a631..51cdd2c41 100644 --- a/content/zh/docs/Container/logs.md +++ b/content/zh/docs/Container/logs.md @@ -30,6 +30,8 @@ {"level":"info","ts":1566979103.4577134,"caller":"all-in-one/main.go:256","msg":"Listening for Zipkin HTTP traffic","zipkin.http-port":9411} ``` +    + 2. 加上-f选项,实时打印jaegertracing容器的日志信息 ``` @@ -41,4 +43,6 @@ {"level":"info","ts":1566979103.3922884,"caller":"all-in-one/main.go:186","msg":"Starting agent"} ``` +    + diff --git "a/content/zh/docs/Container/namespace\345\214\226\345\206\205\346\240\270\345\217\202\346\225\260\345\217\257\345\206\231.md" "b/content/zh/docs/Container/namespace\345\214\226\345\206\205\346\240\270\345\217\202\346\225\260\345\217\257\345\206\231.md" index 2f6ede86b..12143c332 100644 --- "a/content/zh/docs/Container/namespace\345\214\226\345\206\205\346\240\270\345\217\202\346\225\260\345\217\257\345\206\231.md" +++ "b/content/zh/docs/Container/namespace\345\214\226\345\206\205\346\240\270\345\217\202\346\225\260\345\217\257\345\206\231.md" @@ -8,6 +8,8 @@ 在允许用户在容器内修改时,部分内核参数是全局有效的,某个容器修改后,会影响主机上所有的程序,安全性降低。 +   + 系统容器提供--ns-change-opt参数,可以指定namespace化的内核参数在容器内动态设置,当前仅支持net、ipc。 ## 参数说明 diff --git a/content/zh/docs/Container/pause-unpause.md b/content/zh/docs/Container/pause-unpause.md index 0e4daf6e7..9550bae91 100644 --- a/content/zh/docs/Container/pause-unpause.md +++ b/content/zh/docs/Container/pause-unpause.md @@ -24,6 +24,8 @@ $ sudo curl -v 127.0.0.1:5000 ``` +    + 2. 暂停这个容器内的进程 ``` @@ -40,4 +42,6 @@ 此时步骤2中的curl访问将恢复运行,请求状态码返回200 OK。 +    + diff --git "a/content/zh/docs/Container/proc\346\226\207\344\273\266\347\263\273\347\273\237\351\232\224\347\246\273\357\274\210lxcfs\357\274\211.md" "b/content/zh/docs/Container/proc\346\226\207\344\273\266\347\263\273\347\273\237\351\232\224\347\246\273\357\274\210lxcfs\357\274\211.md" index 18f177a5a..4a63d21cf 100644 --- "a/content/zh/docs/Container/proc\346\226\207\344\273\266\347\263\273\347\273\237\351\232\224\347\246\273\357\274\210lxcfs\357\274\211.md" +++ "b/content/zh/docs/Container/proc\346\226\207\344\273\266\347\263\273\347\273\237\351\232\224\347\246\273\357\274\210lxcfs\357\274\211.md" @@ -6,12 +6,12 @@ ## 接口说明 -系统容器对外提供两个工具包:一个是lxcfs软件,另外一个是配合lxcfs一起使用的isulad-lxcfs-toolkit工具。其中lxcfs作为宿主机daemon进程常驻,isulad-lxcfs-toolkit通过hook机制将宿主机的lxcfs文件系统绑定挂载到容器。 +系统容器对外提供两个工具包:一个是lxcfs软件,另外一个是配合lxcfs一起使用的lxcfs-toolkit工具。其中lxcfs作为宿主机daemon进程常驻,lxcfs-toolkit通过hook机制将宿主机的lxcfs文件系统绑定挂载到容器。 -isulad-lxcfs-toolkit命令行格式如下: +lxcfs-toolkit命令行格式如下: ``` -isulad-lxcfs-toolkit [OPTIONS] COMMAND [COMMAND_OPTIONS] +lxcfs-toolkit [OPTIONS] COMMAND [COMMAND_OPTIONS] ``` @@ -76,10 +76,10 @@ isulad-lxcfs-toolkit [OPTIONS] COMMAND [COMMAND_OPTIONS] ## 使用示例 -1. 首先需要安装lxcfs和isulad-lxcfs-toolkit这两个包,并启动lxcfs服务。 +1. 首先需要安装lxcfs和lxcfs-toolkit这两个包,并启动lxcfs服务。 ``` - [root@localhost ~]# yum install lxcfs isulad-lxcfs-toolkit + [root@localhost ~]# yum install lxcfs lxcfs-toolkit [root@localhost ~]# systemctl start lxcfs ``` diff --git a/content/zh/docs/Container/pull.md b/content/zh/docs/Container/pull.md index b1135d43d..d1df4a8b3 100644 --- a/content/zh/docs/Container/pull.md +++ b/content/zh/docs/Container/pull.md @@ -6,7 +6,7 @@ 选项: --a, --all-tags=false 下载一个镜像仓库的所有镜像(一个镜像仓库可以被打多个标签,比如一个ubuntu镜像库,可能有多个标签如ubuntu:14.04,ubuntu:13.10,ubuntu:latest等,使用-a选项后,将所有标签的ubuntu镜像拉取下来) +-a, --all-tags=false 下载一个镜像仓库的所有镜像(一个镜像仓库可以被打多个标签,比如一个busybox镜像库,可能有多个标签如busybox:14.04,busybox:13.10,busybox:latest等,使用-a选项后,将所有标签的busybox镜像拉取下来) 示例: diff --git a/content/zh/docs/Container/push.md b/content/zh/docs/Container/push.md index e1e3c08d8..d68f02b91 100644 --- a/content/zh/docs/Container/push.md +++ b/content/zh/docs/Container/push.md @@ -9,16 +9,16 @@ 示例: 1. 将一个image推送到私有镜像库192.168.1.110:5000中 -2. 将要推送的镜像打标签(docker tag命令将在下文介绍),本例中要推送的镜像为ubuntu:sshd +2. 将要推送的镜像打标签(docker tag命令将在下文介绍),本例中要推送的镜像为busybox:sshd ``` - $ sudo docker tag ubuntu:sshd 192.168.1.110:5000/ubuntu:sshd + $ sudo docker tag ubuntu:sshd 192.168.1.110:5000/busybox:sshd ``` 3. 将打好标签的镜像推送到私有镜像库中 ``` - $ sudo docker push 192.168.1.110:5000/ubuntu:sshd + $ sudo docker push 192.168.1.110:5000/busybox:sshd ``` 推送的时候会自动检测所依赖的层在镜像库中是否已存在,如果以存在,跳过该层。 diff --git a/content/zh/docs/Container/rename.md b/content/zh/docs/Container/rename.md index 020170c84..2382acb22 100644 --- a/content/zh/docs/Container/rename.md +++ b/content/zh/docs/Container/rename.md @@ -1,11 +1,9 @@ # rename -用法:**docker rename \[OPTIONS\] OLD\_NAME NEW\_NAME** +用法:**docker rename OLD\_NAME NEW\_NAME** 功能:重命名容器 -选项: - 示例: 示例中,用docker run创建并启动一个容器,使用docker rename对容器重命名,并查看容器名是否改变。 @@ -20,3 +18,5 @@ CONTAINER ID IMAGE COMMAND CREATED b15976967abb busybox:latest "bash" 34 seconds ago Up 33 seconds new_name ``` +   + diff --git a/content/zh/docs/Container/restart.md b/content/zh/docs/Container/restart.md index d34ab4d6f..3f523956a 100644 --- a/content/zh/docs/Container/restart.md +++ b/content/zh/docs/Container/restart.md @@ -11,7 +11,7 @@ 示例: ``` -$ sudo docker restart ubuntu +$ sudo docker restart busybox ``` >![](public_sys-resources/icon-note.gif) **说明:** diff --git a/content/zh/docs/Container/rmi.md b/content/zh/docs/Container/rmi.md index ce833dc92..6fc24244f 100644 --- a/content/zh/docs/Container/rmi.md +++ b/content/zh/docs/Container/rmi.md @@ -13,6 +13,6 @@ 示例: ``` -$ sudo docker rmi 192.168.1.110:5000/ubuntu:sshd +$ sudo docker rmi 192.168.1.110:5000/busybox:sshd ``` diff --git a/content/zh/docs/Container/run.md b/content/zh/docs/Container/run.md index 8bf72a845..e6a635f11 100644 --- a/content/zh/docs/Container/run.md +++ b/content/zh/docs/Container/run.md @@ -14,9 +14,9 @@ 示例: -使用ubuntu镜像运行一个容器,在容器启动后执行/bin/bash +使用busybox镜像运行一个容器,在容器启动后执行/bin/sh ``` -$ sudo docker run -ti ubuntu /bin/bash +$ sudo docker run -ti busybox /bin/sh ``` diff --git a/content/zh/docs/Container/search.md b/content/zh/docs/Container/search.md index 72140e467..0428d224c 100644 --- a/content/zh/docs/Container/search.md +++ b/content/zh/docs/Container/search.md @@ -27,6 +27,8 @@ tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 51 [OK] ``` +    + 2. 在私有镜像库中搜寻busybox,在私有镜像库中搜寻时要加上私有镜像库的地址 ``` diff --git "a/content/zh/docs/Container/seccomp\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" "b/content/zh/docs/Container/seccomp\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" index 9d16b3513..a9880f179 100644 --- "a/content/zh/docs/Container/seccomp\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" +++ "b/content/zh/docs/Container/seccomp\345\256\211\345\205\250\351\205\215\347\275\256\345\234\272\346\231\257.md" @@ -1 +1,2 @@ # seccomp安全配置场景 + diff --git a/content/zh/docs/Container/start.md b/content/zh/docs/Container/start.md index 3a9d3be66..fbf3e4035 100644 --- a/content/zh/docs/Container/start.md +++ b/content/zh/docs/Container/start.md @@ -12,11 +12,11 @@ 实例: -启动一个名为ubuntu的容器,添加-i -a选项附加标准输入输出,容器启动后直接进入容器内部,输入exit可以退出容器。 +启动一个名为busybox的容器,添加-i -a选项附加标准输入输出,容器启动后直接进入容器内部,输入exit可以退出容器。 如果启动容器时不加-i -a选项,容器将在后台启动。 ``` -$ sudo docker start -i -a ubuntu +$ sudo docker start -i -a busybox ``` diff --git a/content/zh/docs/Container/stats.md b/content/zh/docs/Container/stats.md index 55fad0f28..b9682e4a6 100644 --- a/content/zh/docs/Container/stats.md +++ b/content/zh/docs/Container/stats.md @@ -22,3 +22,5 @@ CONTAINER ID NAME CPU % MEM USAGE / LIMI deb9e49fdef1 hardcore_montalcini 0.01% 12.79MiB / 125.8GiB 0.01% 0B / 0B 0B / 0B 9 ``` +   + diff --git a/content/zh/docs/Container/stop.md b/content/zh/docs/Container/stop.md index d3c6cc216..d3f2fa653 100644 --- a/content/zh/docs/Container/stop.md +++ b/content/zh/docs/Container/stop.md @@ -11,6 +11,6 @@ 示例: ``` -$ sudo docker stop -t=15 ubuntu +$ sudo docker stop -t=15 busybox ``` diff --git a/content/zh/docs/Container/update.md b/content/zh/docs/Container/update.md index 365ccf932..79569c50d 100644 --- a/content/zh/docs/Container/update.md +++ b/content/zh/docs/Container/update.md @@ -87,7 +87,7 @@ 示例: -变更一个容器名为ubuntu的cpu和mem配置,包括容器获得主机CPU的相对权重值为512,容器中进程允许运行的CPU核心为0,1,2,3,容器运行内存限制为512m。 +变更一个容器名为busybox的cpu和mem配置,包括容器获得主机CPU的相对权重值为512,容器中进程允许运行的CPU核心为0,1,2,3,容器运行内存限制为512m。 ``` $ sudo docker update --cpu-shares 512 --cpuset-cpus=0,3 --memory 512m ubuntu diff --git a/content/zh/docs/Container/version.md b/content/zh/docs/Container/version.md index cd026e372..d6499380f 100644 --- a/content/zh/docs/Container/version.md +++ b/content/zh/docs/Container/version.md @@ -32,3 +32,5 @@ Server: Experimental: false ``` +   + diff --git a/content/zh/docs/Container/wait.md b/content/zh/docs/Container/wait.md index ab9205343..e0721d128 100644 --- a/content/zh/docs/Container/wait.md +++ b/content/zh/docs/Container/wait.md @@ -8,18 +8,18 @@ 示例: -先开启一个名为ubuntu的容器 +先开启一个名为busybox的容器 ``` -$ sudo docker start -i -a ubuntu +$ sudo docker start -i -a busybox ``` 执行docker wait ``` -$ sudo docker wait ubuntu +$ sudo docker wait busybox 0 ``` -将阻塞等待ubuntu容器的退出,退出ubuntu容器后将看到打印退出码“0”。 +将阻塞等待busybox容器的退出,退出busybox容器后将看到打印退出码“0”。 diff --git a/content/zh/docs/Container/zh-cn_bookmap_0183409509.md b/content/zh/docs/Container/zh-cn_bookmap_0183409509.md deleted file mode 100644 index fdf5e4d5b..000000000 --- a/content/zh/docs/Container/zh-cn_bookmap_0183409509.md +++ /dev/null @@ -1,301 +0,0 @@ -# openEuler 1.0 容器用户指南 - -- [法律声明](法律声明.md) -- [前言](前言.md) -- [iSula容器引擎](iSula容器引擎.md) - - [概述](概述.md) - - [安装与部署](安装与部署.md) - - [安装方法](安装方法.md) - - [部署配置](部署配置.md) - - [部署方式](部署方式.md) - - [存储说明](存储说明.md) - - [约束限制](约束限制.md) - - [DAEMON多端口的绑定](DAEMON多端口的绑定.md) - - [配置TLS认证与开启远程访问](配置TLS认证与开启远程访问.md) - - - [卸载](卸载.md) - - - [使用方法](使用方法.md) - - [容器管理](容器管理.md) - - [创建容器](创建容器.md) - - [启动容器](启动容器.md) - - [运行容器](运行容器.md) - - [停止容器](停止容器.md) - - [强制停止容器](强制停止容器.md) - - [删除容器](删除容器.md) - - [接入容器](接入容器.md) - - [重命名容器](重命名容器.md) - - [在容器中执行新命令](在容器中执行新命令.md) - - [查询单个容器信息](查询单个容器信息.md) - - [查询所有容器信息](查询所有容器信息.md) - - [重启容器](重启容器.md) - - [等待容器退出](等待容器退出.md) - - [查看容器中进程信息](查看容器中进程信息.md) - - [查看容器使用的资源](查看容器使用的资源.md) - - [获取容器日志](获取容器日志.md) - - [容器与主机之间数据拷贝](容器与主机之间数据拷贝.md) - - - [支持CNI网络](支持CNI网络.md) - - [描述](描述.md) - - [接口](接口.md) - - [CNI网络配置说明](CNI网络配置说明.md) - - [加入CNI网络列表](加入CNI网络列表.md) - - [退出CNI网络列表](退出CNI网络列表.md) - - - [使用限制](使用限制.md) - - - [容器资源管理](容器资源管理.md) - - [资源的共享](资源的共享.md) - - [限制运行时的CPU资源](限制运行时的CPU资源.md) - - [限制运行时的内存](限制运行时的内存.md) - - [限制运行时的IO资源](限制运行时的IO资源.md) - - [限制容器rootfs存储空间](限制容器rootfs存储空间.md) - - [限制容器内文件句柄数](限制容器内文件句柄数.md) - - [限制容器内可以创建的进程/线程数](限制容器内可以创建的进程-线程数.md) - - [配置容器内的ulimit值](配置容器内的ulimit值.md) - - - [特权容器](特权容器.md) - - [场景说明](场景说明.md) - - [使用限制](使用限制-0.md) - - [使用指导](使用指导.md) - - - [CRI接口](CRI接口.md) - - [描述](描述-1.md) - - [接口](接口-2.md) - - [Runtime服务](Runtime服务.md) - - [RunPodSandbox](RunPodSandbox.md) - - [StopPodSandbox](StopPodSandbox.md) - - [RemovePodSandbox](RemovePodSandbox.md) - - [PodSandboxStatus](PodSandboxStatus.md) - - [ListPodSandbox](ListPodSandbox.md) - - [CreateContainer](CreateContainer.md) - - [StartContainer](StartContainer.md) - - [StopContainer](StopContainer.md) - - [RemoveContainer](RemoveContainer.md) - - [ListContainers](ListContainers.md) - - [ContainerStatus](ContainerStatus.md) - - [UpdateContainerResources](UpdateContainerResources.md) - - [ExecSync](ExecSync.md) - - [Exec](Exec.md) - - [Attach](Attach.md) - - [PortForward](PortForward.md) - - [ContainerStats](ContainerStats.md) - - [ListContainerStats](ListContainerStats.md) - - [UpdateRuntimeConfig](UpdateRuntimeConfig.md) - - [Status](Status.md) - - - [Image服务](Image服务.md) - - [ListImages](ListImages.md) - - [ImageStatus](ImageStatus.md) - - [PullImage](PullImage.md) - - [RemoveImage](RemoveImage.md) - - [ImageFsInfo](ImageFsInfo.md) - - - - [约束](约束.md) - - - [镜像管理](镜像管理.md) - - [docker镜像管理](docker镜像管理.md) - - [登录到镜像仓库](登录到镜像仓库.md) - - [从镜像仓库退出登录](从镜像仓库退出登录.md) - - [从镜像仓库拉取镜像](从镜像仓库拉取镜像.md) - - [删除镜像](删除镜像.md) - - [加载镜像](加载镜像.md) - - [列出镜像](列出镜像.md) - - [检视镜像](检视镜像.md) - - [双向认证](双向认证.md) - - - [embedded镜像管理](embedded镜像管理.md) - - [加载镜像](加载镜像-3.md) - - [列出镜像](列出镜像-4.md) - - [检视镜像](检视镜像-5.md) - - [删除镜像](删除镜像-6.md) - - - - [容器健康状态检查](容器健康状态检查.md) - - [场景说明](场景说明-7.md) - - [配置方法](配置方法.md) - - [检查规则](检查规则.md) - - [使用限制](使用限制-8.md) - - - [查询信息](查询信息.md) - - [查询服务版本信息](查询服务版本信息.md) - - [查询系统级信息](查询系统级信息.md) - - - [安全特性](安全特性.md) - - [seccomp安全配置场景](seccomp安全配置场景.md) - - [场景说明](场景说明-9.md) - - [使用限制](使用限制-10.md) - - [使用指导](使用指导-11.md) - - - [capabilities安全配置场景](capabilities安全配置场景.md) - - [场景说明](场景说明-12.md) - - [使用限制](使用限制-13.md) - - [使用指导](使用指导-14.md) - - - - [支持OCI hooks](支持OCI-hooks.md) - - [描述](描述-15.md) - - [接口](接口-16.md) - - [使用限制](使用限制-17.md) - - - - [附录](附录.md) - - [命令行参数说明](命令行参数说明.md) - - [CNI配置参数](CNI配置参数.md) - - -- [系统容器](系统容器.md) - - [概述](概述-18.md) - - [安装指导](安装指导.md) - - [使用指南](使用指南.md) - - [简介](简介.md) - - [指定rootfs创建容器](指定rootfs创建容器.md) - - [通过systemd启动容器](通过systemd启动容器.md) - - [容器内reboot/shutdown](容器内reboot-shutdown.md) - - [cgroup路径可配置](cgroup路径可配置.md) - - [namespace化内核参数可写](namespace化内核参数可写.md) - - [共享内存通道](共享内存通道.md) - - [动态加载内核模块](动态加载内核模块.md) - - [环境变量持久化](环境变量持久化.md) - - [最大句柄数限制](最大句柄数限制.md) - - [安全性和隔离性](安全性和隔离性.md) - - [user namespace多对多](user-namespace多对多.md) - - [用户权限控制](用户权限控制.md) - - [proc文件系统隔离(lxcfs)](proc文件系统隔离(lxcfs).md) - - - [容器资源动态管理(isulad-tools)](容器资源动态管理(isulad-tools).md) - - [设备管理](设备管理.md) - - [网卡管理](网卡管理.md) - - [路由管理](路由管理.md) - - [挂卷管理](挂卷管理.md) - - - - [附录](附录-19.md) - - [命令行接口列表](命令行接口列表.md) - - -- [安全容器](安全容器.md) - - [概述](概述-20.md) - - [安装部署](安装部署.md) - - [安装方法](安装方法-21.md) - - [部署配置](部署配置-22.md) - - [docker-engine容器引擎的配置](docker-engine容器引擎的配置.md) - - [安全容器全局配置文件configuration.toml](安全容器全局配置文件configuration-toml.md) - - - - [使用方法](使用方法-23.md) - - [管理安全容器的生命周期](管理安全容器的生命周期.md) - - [启动安全容器](启动安全容器.md) - - [停止安全容器](停止安全容器.md) - - [删除安全容器](删除安全容器.md) - - [在容器中执行一条新的命令](在容器中执行一条新的命令.md) - - - [为安全容器配置资源](为安全容器配置资源.md) - - [资源的共享](资源的共享-24.md) - - [限制CPU资源](限制CPU资源.md) - - [限制内存资源](限制内存资源.md) - - [限制Blkio资源](限制Blkio资源.md) - - [限制文件描述符资源](限制文件描述符资源.md) - - - [为安全容器配置网络](为安全容器配置网络.md) - - [监控安全容器](监控安全容器.md) - - - [附录](附录-25.md) - - [configuration.toml配置说明](configuration-toml配置说明.md) - - [接口列表](接口列表.md) - - -- [Docker容器](Docker容器.md) - - [概述](概述-26.md) - - [安装部署](安装部署-27.md) - - [安装配置介绍及注意事项](安装配置介绍及注意事项.md) - - [基本安装配置](基本安装配置.md) - - [配置daemon参数](配置daemon参数.md) - - [daemon运行目录配置](daemon运行目录配置.md) - - [daemon自带网络配置](daemon自带网络配置.md) - - [daemon umask配置](daemon-umask配置.md) - - [daemon启动时间](daemon启动时间.md) - - [关联组件journald](关联组件journald.md) - - [关联组件firewalld](关联组件firewalld.md) - - [关联组件iptables](关联组件iptables.md) - - [关联组件audit](关联组件audit.md) - - [安全配置seccomp](安全配置seccomp.md) - - [禁止修改docker daemon的私有目录](禁止修改docker-daemon的私有目录.md) - - [普通用户大量部署容器场景下的配置注意事项](普通用户大量部署容器场景下的配置注意事项.md) - - - [存储驱动配置](存储驱动配置.md) - - [配置overlay2存储驱动](配置overlay2存储驱动.md) - - [配置devicemapper存储驱动](配置devicemapper存储驱动.md) - - - [强杀docker相关后台进程的影响](强杀docker相关后台进程的影响.md) - - [信号量残留](信号量残留.md) - - [网卡残留](网卡残留.md) - - [重启容器失败](重启容器失败.md) - - [服务无法正常重启](服务无法正常重启.md) - - - [系统掉电影响](系统掉电影响.md) - - - - [容器管理](容器管理-28.md) - - [创建容器](创建容器-29.md) - - [创建容器使用hook-spec](创建容器使用hook-spec.md) - - [创建容器配置健康检查](创建容器配置健康检查.md) - - [停止与删除容器](停止与删除容器.md) - - [容器信息查询](容器信息查询.md) - - [修改操作](修改操作.md) - - - [镜像管理](镜像管理-30.md) - - [创建镜像](创建镜像.md) - - [查看镜像](查看镜像.md) - - [删除镜像](删除镜像-31.md) - - - [命令行参考](命令行参考.md) - - [容器引擎](容器引擎.md) - - [容器管理](容器管理-32.md) - - [attach](attach.md) - - [commit](commit.md) - - [cp](cp.md) - - [create](create.md) - - [diff](diff.md) - - [exec](exec.md) - - [export](export.md) - - [inspect](inspect.md) - - [logs](logs.md) - - [pause/unpause](pause-unpause.md) - - [port](port.md) - - [ps](ps.md) - - [rename](rename.md) - - [restart](restart.md) - - [rm](rm.md) - - [run](run.md) - - [start](start.md) - - [stats](stats.md) - - [stop](stop.md) - - [top](top.md) - - [update](update.md) - - [wait](wait.md) - - - [镜像管理](镜像管理-33.md) - - [build](build.md) - - [history](history.md) - - [images](images.md) - - [import](import.md) - - [load](load.md) - - [login](login.md) - - [logout](logout.md) - - [pull](pull.md) - - [push](push.md) - - [rmi](rmi.md) - - [save](save.md) - - [search](search.md) - - [tag](tag.md) - - - [统计信息](统计信息.md) - - [events](events.md) - - [info](info.md) - - [version](version.md) - - - - diff --git "a/content/zh/docs/Container/\344\270\272\345\256\211\345\205\250\345\256\271\345\231\250\351\205\215\347\275\256\347\275\221\347\273\234.md" "b/content/zh/docs/Container/\344\270\272\345\256\211\345\205\250\345\256\271\345\231\250\351\205\215\347\275\256\347\275\221\347\273\234.md" index 2c687926b..373fca5d1 100644 --- "a/content/zh/docs/Container/\344\270\272\345\256\211\345\205\250\345\256\271\345\231\250\351\205\215\347\275\256\347\275\221\347\273\234.md" +++ "b/content/zh/docs/Container/\344\270\272\345\256\211\345\205\250\345\256\271\345\231\250\351\205\215\347\275\256\347\275\221\347\273\234.md" @@ -94,6 +94,26 @@
+ kata-runtime kata-network add-iface添加网卡命令执行返回结果说明: + + - 命令执行成功:从**命令的标准输出**返回json格式插入网卡的信息,json格式内容和传入的网卡信息相同。 + + 例如: + + ``` + $ kata-runtime kata-network add-iface net.json + {"device":"tap_test","name":"eth-test","IPAddresses":[{"Family":2,"Address":"173.85.100.1","Mask":"24"}],"mtu":1500,"hwAddr":"02:42:20:6e:03:01","pciAddr":"01.0/00"} + ``` + + - 命令执行失败:从**命令的标准输出**返回字符串null。 + + 例如: + + ``` + $ kata-runtime kata-network add-iface netbad.json 2>/dev/null + null + ``` + >![](public_sys-resources/icon-note.gif) **说明:** >当网卡添加成功时,如果为其指定了IP地址,则kata会为新添加的网卡添加一条destination为同网段地址的默认路由,如上例中添加网卡之后容器内有如下路由被添加: >``` @@ -110,6 +130,33 @@ 可以查询到我们刚才添加的网卡信息。 + kata-runtime kata-network list-ifaces列出已添加网卡命令执行返回结果说明: + + - 命令执行成功:从**命令的标准输出**返回json格式的Pod中所有插入网卡的信息。 + + 如果Pod中插入了多个网卡设备,返回的是一个json数组格式的网卡信息 + + ``` + $ kata-runtime kata-network list-ifaces + [{"name":"container_eth","mac":"02:42:20:6e:a2:59","ip":["172.17.25.23/8"],"mtu":1500},{"name":"container_eth_2","mac":"02:90:50:6b:a2:29","ip":["192.168.0.34/24"],"mtu":1500}] + ``` + + 如果Pod中没有插入任何网卡设备,从**命令的标准输出**返回字符串null。 + + ``` + $ kata-runtime kata-network list-ifaces + null + ``` + + - 命令执行失败:从**命令的标准输出**返回字符串null,从**命令的标准错误输出**返回错误描述信息。 + + 例如: + + ``` + $ kata-runtime kata-network list-ifaces + null + ``` + 3. **为指定网卡添加一条路由** ``` @@ -117,6 +164,26 @@ [{"dest":"default","gateway":"172.16.0.1","device":"eth-test"}] ``` + kata-runtime kata-network add-route为指定网卡添加一条路由命令执行返回结果说明: + + - 命令执行成功:从**命令的标准输出**返回json格式的添加的路由信息。 + + 例如: + + ``` + $ kata-runtime kata-network add-route route.json + [{"dest":"177.17.0.0/24","gateway":"177.17.25.1","device":"netport_test_1"}] + ``` + + - 命令执行失败:从**命令的标准输出**返回字符串null,从**命令的标准错误输出**返回错误描述信息。 + + 例如: + + ``` + $ kata-runtime kata-network add-route routebad.json 2>/dev/null + null + ``` + 字段说明如下: - dest:设置路由对应的网段。格式为/必选。分如下3种情况: @@ -138,6 +205,26 @@ test-route.json字段与添加路由输入json文件的字段相同。 + kata-runtime kata-network del-route删除指定路由命令执行返回结果说明: + + - 命令执行成功:从**命令的标准输出**返回json格式的添加的路由信息。 + + 例如: + + ``` + $ kata-runtime kata-network del-route route.json + [{"dest":"177.17.0.0/24","gateway":"177.17.25.1","device":"netport_test_1"}] + ``` + + - 命令执行失败:从**命令的标准输出**返回字符串null,从**命令的标准错误输出**返回错误描述信息。 + + 例如: + + ``` + $ kata-runtime kata-network del-route routebad.json 2>/dev/null + null + ``` + >![](public_sys-resources/icon-note.gif) **说明:** >- 输入字段中dest为必选,device/gateway均为可选。kata根据不同字段进行模糊匹配,删除对应的路由规则。例如指定了dest为某个IP,则所有该IP的规则都会被删除。 >- 如果删除的是容器内回环设备lo的路由时,路由配置文件中的"device"字段对应的设备名称为"lo"。 @@ -151,6 +238,27 @@ >![](public_sys-resources/icon-note.gif) **说明:** >删除网卡时,仅根据网卡容器内名称(name字段)来删除。即便填写其他字段,kata也不会使用。 + kata-runtime kata-network del-iface删除网卡命令执行返回结果说明: + + - 命令执行成功:从**命令标准输出**返回null字符串。 + + 例如: + + ``` + $ kata-runtime kata-network del-iface net.json + null + ``` + + - 命令执行失败:从**命令标准输出**返回删除失败网卡json格式的信息,从**命令的标准错误输出**返回错误描述信息。 + + 例如: + + ``` + $ kata-runtime kata-network del-iface net.json + {"device":"tapname_fun_012","name":"netport_test_1","IPAddresses":[{"Family":0,"Address":"177.17.0.1","Mask":"8"}],"mtu":1500,"hwAddr":"02:42:20:6e:a2:59","linkType":"tap"} + ``` + + 以上为常用场景和命令行示例,具体命令行接口见附录[接口列表](接口列表.md#ZH-CN_TOPIC_0184808188)。 diff --git "a/content/zh/docs/Container/\344\273\216\346\234\215\345\212\241\347\253\257\345\256\236\346\227\266\350\216\267\345\217\226\344\272\213\344\273\266\346\266\210\346\201\257.md" "b/content/zh/docs/Container/\344\273\216\346\234\215\345\212\241\347\253\257\345\256\236\346\227\266\350\216\267\345\217\226\344\272\213\344\273\266\346\266\210\346\201\257.md" new file mode 100644 index 000000000..e163aa944 --- /dev/null +++ "b/content/zh/docs/Container/\344\273\216\346\234\215\345\212\241\347\253\257\345\256\236\346\227\266\350\216\267\345\217\226\344\272\213\344\273\266\346\266\210\346\201\257.md" @@ -0,0 +1,50 @@ +# 从服务端实时获取事件消息 + +## 描述 + +isula events用于从服务端实时获取容器镜像生命周期、运行等事件消息, 仅支持runtime类型为lcr的容器。 + +## 用法 + +``` +isula events [OPTIONS] +``` + +## 参数 + + + + + + + + + + + + + + + + + +

命令

+

参数

+

说明

+

events

+

-H, --host

+

指定要连接的iSulad socket文件路径

+

-n, --name

+

获取指定容器的事件消息

+

-S, --since

+

获取指定时间以来的事件消息

+
+ +## 示例 + +从服务端实时获取事件消息,命令示例如下: + +``` +$ isula events +``` + diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\215\227.md" index ccb0760dc..fba9c46a0 100644 --- "a/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -2,4 +2,3 @@ - diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\257\274-17.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\257\274-17.md" new file mode 100644 index 000000000..885b3b2d0 --- /dev/null +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\346\214\207\345\257\274-17.md" @@ -0,0 +1,44 @@ +# 使用指导 + +- daemon端使能selinux: + + ``` + isulad --selinux-enabled + ``` + + +   + +- 启动容器时配置selinux标签安全上下文 + + --security-opt="label=user:USER" 配置安全上下文用户 + + --security-opt="label=role:ROLE" 配置安全上下文角色 + + --security-opt="label=type:TYPE" 配置安全上下文类型 + + --security-opt="label=level:LEVEL" 配置安全上下文域 + + --security-opt="label=disable" 容器禁用SELinux配置 + + ``` + $ isula run -itd --security-opt label=type:container_t --security-opt label=level:s0:c1,c2 rnd-dockerhub.huawei.com/official/centos + 9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370 + ``` + + +   + +- 为挂载卷打selinux标签\('z'为共享模式\) + + ``` + $ isula run -itd -v /test:/test:z rnd-dockerhub.huawei.com/official/centos + 9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370 + + $ls -Z /test + system_u:object_r:container_file_t:s0 file + ``` + +    + + diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-23.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-23.md" deleted file mode 100644 index f3507041a..000000000 --- "a/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-23.md" +++ /dev/null @@ -1,5 +0,0 @@ -# 使用方法 - -iSula使用docker-engine作为安全容器的容器引擎,此处使用方法均使用docker命令行作为示例,当您使用Kubernetes等进行对接的时候也可以使用docker-engine提供的RESTFUL接口调用,相应的参数转换请参考docker-engine RESTFUL API一节。 - - diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-26.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-26.md" new file mode 100644 index 000000000..29d232217 --- /dev/null +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225-26.md" @@ -0,0 +1,3 @@ +# 使用方法 + +本章介绍使用安全容器的方法。 diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225.md" index a261a4f09..82e88d002 100644 --- "a/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225.md" +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\346\226\271\346\263\225.md" @@ -1,4 +1 @@ # 使用方法 - - - diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-16.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-16.md" new file mode 100644 index 000000000..838a7649e --- /dev/null +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-16.md" @@ -0,0 +1,14 @@ +# 使用限制 + +- 确保宿主机已使能SELinux,且daemon端已打开SELinux使能开发(/etc/isulad/daemon.json中“selinux-enabled”字段为true, 或者命令行参数添加--selinux-enabled) +- 确保宿主机上已配置合适的selinux策略,推荐使用container-selinux进行配置 +- 引入SELinux会影响性能,设置SELinux之前需要对场景进行评估,确定必要时打开daemon端SELinux开关并设置容器SELinux配置 +- 对挂载卷进行标签配置时,源目录不允许为/、/usr、/etc、/tmp、/home、/run、/var、/root以及/usr的子目录。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 目前iSulad不支持对容器的文件系统打标签,确保容器文件系统及配置目录打上容器可访问标签,需使用chcon命令对其打上标签。 +>- 若iSulad启用SELinux访问控制,建议daemon启动前对/var/lib/isulad目录打上标签,容器容器创建时目录下生产的文件及文件夹将默认继承其标签,例如: +> ``` +> chcon -R system_u:object_r:container_file_t:s0 /var/lib/isulad +> ``` + diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-17.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-20.md" similarity index 98% rename from "content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-17.md" rename to "content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-20.md" index 6b06af8f5..10446d079 100644 --- "a/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-17.md" +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-20.md" @@ -1,13 +1,16 @@ -# 使用限制 - -- hook-spec指定的路径必须是绝对路径。 -- hook-spec指定的文件必须存在。 -- hook-spec指定的路径对应的必须是普通文本文件,格式为json。 -- hook-spec指定的文件大小不能超过10MB。 -- hooks配置的path字段必须为绝对路径。 -- hooks配置的path字段指定文件必须存在。 -- hooks配置的path字段指定文件必须有可执行权限。 -- hooks配置的path字段指定文件的owner必须是root。 -- hooks配置的path字段指定文件必须只有root有写权限。 -- hooks配置的timeout必须大于0。 - +# 使用限制 + +- hook-spec指定的路径必须是绝对路径。 +- hook-spec指定的文件必须存在。 +- hook-spec指定的路径对应的必须是普通文本文件,格式为json。 +- hook-spec指定的文件大小不能超过10MB。 +- hooks配置的path字段必须为绝对路径。 +- hooks配置的path字段指定文件必须存在。 +- hooks配置的path字段指定文件必须有可执行权限。 +- hooks配置的path字段指定文件的owner必须是root。 +- hooks配置的path字段指定文件必须只有root有写权限。 +- hooks配置的timeout必须大于0。 + +    + + diff --git "a/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-8.md" "b/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-8.md" index b2e8bfdc6..dbc4096cc 100644 --- "a/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-8.md" +++ "b/content/zh/docs/Container/\344\275\277\347\224\250\351\231\220\345\210\266-8.md" @@ -4,4 +4,5 @@ - 容器启动时若健康检查相关参数配置为0,则按照默认值处理。 - 带有健康检查配置的容器启动后,若iSulad daemon退出,则健康检查不会执行。iSulad daemon再次启动后,正在运行且带有健康检查配置的容器其健康状态会变为starting。之后检查规则同上。 - 如果健康检查从第一次开始便一直失败,其状态保持与之前一致(starting),直到达到指定失败次数(--health-retries)后变为unhealthy,或者检查成功后变为healthy。 +- 对于OCI类型的runtime的容器,健康检查功能待完善。目前仅完整支持lcr类型的容器。 diff --git "a/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266audit.md" "b/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266audit.md" index cd8b147fc..503e75320 100644 --- "a/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266audit.md" +++ "b/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266audit.md" @@ -30,3 +30,5 @@ docker支持配置audit,但不是强制的。例如: type=SYSCALL msg=audit(1517656451.457:8097): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=1b955b0 a2=90800 a3=0 items=1 ppid=17821 pid=1925 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts6 ses=4 comm="ls" exe="/usr/bin/ls" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="docker"type=CWD msg=audit(1517656451.457:8097): cwd="/root"type=PATH msg=audit(1517656451.457:8097): item=0 name="/var/lib/docker/containers" inode=1049112 dev=fd:00 mode=040700 ouid=0 ogid=0 rdev=00:00 obj=unconfined_u:object_r:container_var_lib_t:s0 objtype=NORMAL ``` +   + diff --git "a/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266iptables.md" "b/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266iptables.md" index d37aac412..c00cf1eb0 100644 --- "a/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266iptables.md" +++ "b/content/zh/docs/Container/\345\205\263\350\201\224\347\273\204\344\273\266iptables.md" @@ -11,7 +11,7 @@ Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) ... ``` -在Chain FORWARD中,DROP上面多出了一条ACCEP icmp的规则,造成加了--icc=false后,容器之间也能ping能通,但udp/tcp仍然是不通的。 +在Chain FORWARD中,DROP上面多出了一条ACCEPT icmp的规则,造成加了--icc=false后,容器之间也能ping通,但容器之间如果使用udp/tcp协议,对端仍然是不可达的。 因此,在容器os中使用docker,如果需要使用--icc=false选项时,建议先在host上清理一下iptables相关的规则。 diff --git "a/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-29.md" "b/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-33.md" similarity index 89% rename from "content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-29.md" rename to "content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-33.md" index 0cd3b8133..0bbd1d517 100644 --- "a/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-29.md" +++ "b/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250-33.md" @@ -1,288 +1,288 @@ -# 创建容器 - -## 下载镜像 - -运行docker命令需要root权限,当你使用普通用户登录时,需要用sudo权限执行docker命令。 - -``` -[root@localhost ~]# docker pull ubuntu -``` - -该命令行将在docker官方的镜像库中下载ubunt:latest(命令行中没指定TAG,所以使用默认的TAG名latest),镜像在下载过程中将检测所依赖的层本地是否存在,如果存在就跳过。从私有镜像库下载镜像时,请带上registry描述,例如:假如建立了一个私有镜像库,地址为192.168.1.110:5000,里面有一些常用镜像。使用下面命令行从私有镜像库中下载镜像。 - -``` -[root@localhost ~]# docker pull 192.168.1.110:5000/ubuntu -``` - -从私有镜像库中下载下来的image名字带有镜像库地址的信息名字比较长,可以用docker tag命令生成一个名字简单点的image。 - -``` -[root@localhost ~]# docker tag 192.168.1.110:5000/ubuntu ubuntu -``` - -可以通过docker images命令查看本地镜像列表。 - -## 运行一个简单的应用 - -``` -[root@localhost ~]# docker run ubuntu /bin/echo "Hello world" -Hello world -``` - -该命令行使用ubuntu:latest(命令行中没有指定tag,所以使用默认的tag名latest)镜像创建了一个容器,在容器内执行了echo "Hello world"。使用下面命令行可以查看刚才创建的这个容器。 - -``` -[root@localhost ~]# docker ps -l -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -d8c0a3315bc0 ubuntu "/bin/echo 'Hello wo…" 5 seconds ago Exited (0) 3 seconds ago practical_franklin -``` - -## 创建一个交互式的容器 - -``` -[root@localhost ~]# docker run -it ubuntu /bin/bash -root@bf22919af2cf:/# ls -bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var -root@bf22919af2cf:/# pwd -/ -``` - --ti选项分配一个伪终端给容器并可以使用STDIN进行交互,可以看到这时可以在容器内执行一些命令。这时的容器看起来完全是一个独立的linux虚拟机。使用exit命令退出容器。 - -## 后台运行容器 - -执行下面命令行,-d指示这个容器在后台运行,--name=container1 指定容器的名字为container1。 - -``` -[root@localhost ~]# docker run -d --name=container1 ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" -7804d3e16d69b41aac5f9bf20d5f263e2da081b1de50044105b1e3f536b6db1c -``` - -命令行的执行结果是返回了这个容器的ID,没有返回命令的执行结果hello world,此时容器在后台运行,可以用docker ps命令查看正在运行的容器: - -``` -[root@localhost ~]# docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -7804d3e16d69 ubuntu "/bin/sh -c 'while tr" 11 seconds ago Up 10 seconds container1 -``` - -用docker logs查看容器运行的输出: - -``` -[root@localhost ~]# docker logs container1 -hello world -hello world -hello world -... -``` - -## 容器网络连接 - -默认情况下,容器可以访问外部网络,而外部网络访问容器时需要通过端口映射,下面以在docker中运行私有镜像库服务registry为例。下面的命令行中-P使registry镜像中开放的端口暴露给主机。 - -``` -[root@localhost ~]# docker run --name=container_registry -d -P registry -cb883f6216c2b08a8c439b3957fb396c847a99079448ca741cc90724de4e4731 -``` - -container\_registry这个容器已经启动了,但是并不知道容器中的服务映射到主机的哪个端口,通过docker port查看端口映射。 - -``` -[root@localhost ~]# docker port container_registry -5000/tcp -> 0.0.0.0:49155 -``` - -从输出可以看出,容器内的5000端口映射到了主机的49155端口。通过主机IP:49155就可以访问registry服务了,在浏览器中输入http://localhost:49155就可以返回registry的版本信息。 - -在运行registry镜像的时候还可以直接指定端口映射如: - -``` -docker run --name=container_registry -d -p 5000:5000 registry -``` - -通过-p 5000:5000指定容器的5000端口映射到主机的5000端口。 - -## 注意事项 - -- **启动容器不能单独加-a stdin** - - 启动容器时,不能单独加-a stdin,必须要同时加上-a stdout或者-a stderr,否则会导致终端即使在容器退出后也会卡住。 - - -- **避免使用已有容器的长id、短id作为新容器的name** - - 创建容器时,避免使用已有容器A的长id或短id作为新容器B的name。若使用容器A的长id作为容器B的name,当使用容器B的name作为指定容器进行操作时,docker匹配到的是容器A。若使用容器A的短id作为容器B的name,当使用容器A的短id作为指定容器进行相关操作时,docker匹配到的是容器B。这是因为,docker在匹配容器时,先精确匹配所有容器的长id。若未匹配成功,再根据container\_name进行精确匹配;若还未匹配成功,直接对容器id进行模糊匹配。 - -- **使用sh/bash等依赖标准输入输出的容器应该使用\`-ti\`参数,避免出现异常** - - 正常情况:不用\`-ti\`参数启动sh/bash等进程容器,容器会马上退出。 - - 出现这种问题的原因在于,docker会先创建一个匹配用于容器内业务的stdin,在不设置-ti等交互式参数时,docker会在容器启动后关闭该pipe,而业务容器进程sh/bash在检测到stdin被关闭后会直接退出。 - - 异常情况:如果在上述过程中的特定阶段(关闭该pipe之前)强制杀死docker daemon,会导致该pipe的daemon端没有被及时关闭,这样即使不带\`-ti\`的sh/bash进程也不会退出,导致异常场景,这种容器就需要手动清理。 - - Daemon重启后会接管原有的容器stream,而不带\`-ti\`参数的容器可能就无法处理(因为正常情况下这些容器不存在stream需要接管);真实业务下几乎不存在这种使用方式\(不带 \`-ti\`的sh/bash没有任何作用\),为了避免这类问题发生,限制交互类容器应该使用 \`-ti\`参数。 - -- **容器存储卷** - - 启动容器时如果通过\`-v\`参数将主机上的文件挂载到容器中,在主机或容器中使用vi或sed命令修改文件可能会使文件inode发生改变,从而导致主机和容器内的文件不同步。容器中挂载文件时应该尽量避免使用这种文件挂载的方式(或不与vi和sed同时使用),也可以通过挂载文件上层目录来避免该问题。在docker挂载卷时“nocopy”选项可以避免将容器内挂载点目录下原有的文件拷贝到主机源目录下,但是这个选项只能在挂载匿名卷时使用,不能在bind mount的场景下使用。 - -- **避免使用可能会对host造成影响的选项** - - --privileged 选项会让容器获得所有权限,容器可以做挂载操作和修改/proc、/sys等目录,可能会对host造成影响,普通容器需要避免使用该选项。 - - 共享host的namespace,比如--pid host/--ipc host/--net host等选项可以让容器跟host共享命名空间,同样会导致容器影响host的结果,需要避免使用。 - -- **kernel memory cgroup不稳定,禁止使用** - - kernel memory cgroup在小于4.0版本的Linux内核上仍属于实验阶段,运行起来不稳定,虽然Docker的Warning说是小于4.0就可以,但是我们评估认为,kmemcg在高版本内核仍然不稳定,所以不管是低版本还是高版本,均禁止使用。 - - 当docker run --kernel-memory时,会产生如下告警: - - ``` - WARNING: You specified a kernel memory limit on a kernel older than 4.0. Kernel memory limits are experimental on older kernels, it won't work as expected as expected and can cause your system to be unstable. - ``` - -- **blkio-weight参数在支持blkio精确控制的内核下不可用** - - --blkio-weight-device 可以实现容器内更为精确的blkio控制,该控制需要指定磁盘设备,可以通过docker --blkio-weight-device参数实现。同时在这种内核下docker不再提供--blkio-weight方式限制容器blkio,使用该参数创建容器将会报错: - - ``` - docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:398: container init caused \"process_linux.go:369: setting cgroup config for ready process caused \\\"blkio.weight not supported, use weight_device instead\\\"\"" - ``` - -- **使用--blkio-weight-device需要磁盘支持CFQ调度策略** - - --blkio-weight-device参数需要磁盘工作于完全公平队列调度(CFQ:Completely Fair Queuing)的策略时才能工作。 - - 通过查看磁盘scheduler文件(/sys/block/<磁盘\>/queue/scheduler)可以获知磁盘支持的策略以及当前所采用的策略,如查看sda: - - ``` - # cat /sys/block/sda/queue/scheduler noop [deadline] cfq - ``` - - 当前sda支持三种调度策略:noop, deadline, cfq,并且正在使用deadline策略。通过echo修改策略为cfq: - - ``` - # echo cfq > /sys/block/sda/queue/scheduler - ``` - - -- **容器基础镜像中systemd使用限制** - - 通过基础镜像创建的容器在使用过程中,容器基础镜像中的systemd仅用于系统容器,普通容器不支持使用。 - - -## 并发性能 - -- docker内部的消息缓冲有一个上限,超过这个上限就会将消息丢弃,因此在并发执行命令时建议不要超过1000条命令,否则有可能会造成docker内部消息丢失,从而造成容器无法启动等严重问题。 -- 并发创建容器并对容器执行restart时会偶现“oci runtime error: container init still running”报错,这是因为containerd对事件等待队列进行了性能优化,容器stop过程中执行runc delete,尝试在1s内kill掉容器的init进程,如果1s内init进程还没有被kill掉的话runc会返回该错误。由于containerd的GC(垃圾回收机制)每隔10s会回收之前runc delete的残留资源, 所以并不影响下次对容器的操作,一般出现上述报错的话等待4\~5s之后再次启动容器即可。 - -## 安全特性解读 - -1. docker默认的权能配置分析 - - 原生的docker默认配置如下,默认进程携带的Cap如下: - - ``` - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - ``` - - 默认的seccomp配置是白名单,不在白名单的syscall默认会返回SCMP\_ACT\_ERRNO,根据给docker不同的Cap开放不同的系统调用,不在上面的权限,默认docker都不会给到容器。 - -2. CAP\_SYS\_MODULE - - CAP\_SYS\_MODULE这个Cap是让容器可以插入ko,增加该Cap可以让容器逃逸,甚至破坏内核。因为容器最大的隔离是Namespace,在ko中只要把他的Namespace指向init\_nsproxy即可。 - -3. CAP\_SYS\_ADMIN - - sys\_admin权限给容器带来的能力有: - - - 文件系统(mount,umount,quotactl) - - namespace设置相关的(setns,unshare,clone new namespace) - - driver ioctl - - 对pci的控制,pciconfig\_read, pciconfig\_write, pciconfig\_iobase - - sethostname - -4. CAP\_NET\_ADMIN - - 容器中有访问网络接口的和sniff网络流量的权限,容器可以获取到所有容器包括host的网络流量,对网络隔离破坏极大。 - -5. CAP\_DAC\_READ\_SEARCH - - 该权限开放了,两个系统调用open\_by\_handle\_at,name\_to\_handle\_at,如果host上没有selinux保护,容器中可通过暴力搜索file\_handle结构的inode号,进而可以打开host上的任意文件,影响文件系统的隔离性。 - -6. CAP\_SYS\_RAWIO - - 容器中可对host写入io端口,可造成host内核崩溃。 - -7. CAP\_SYS\_PTRACE - - 容器中有ptrace权限,可对容器的进程进行ptrace调试。现runc已经修补该漏洞,但有些工具比如nsenter和docker-enter并没有改保护,容器中可对这些工具执行的进程进行调试,获取这些工具带入的资源信息(Namespace、fd等),另外, ptrace可以绕过seccomp,极大增加内核攻击面。 - -8. Docker Cap接口 --cap-add all - - --cap-add all表示赋予容器所有的权能,包括本节提到的比较危险的权能,使得容器可以逃逸。 - -9. 不要禁用docker的seccomp特性 - - 默认的docker有一个seccomp的配置,配置中使用的是白名单,不在配置的sys\_call会被seccomp禁掉,使用接口--security-opt 'seccomp:unconfined'可以禁止使用seccomp特性。如果禁用seccomp或使用自定义seccomp配置但过滤名单不全,都会增加容器对内核的攻击面。 - -10. 不要配置/sys和/proc目录可写 - - /sys和/proc目录包含了linux维护内核参数、设备管理的接口,容器中配置该目录可写可能会导致容器逃逸。 - -11. Docker开放Cap --CAP\_AUDIT\_CONTROL - - 容器可以通过控制系统audit系统,并且通过AUDIT\_TTY\_GET/AUDIT\_TTY\_SET等命令可以获取审计系统中记录的tty执行输入记录,包括root密码。 - -12. CAP\_BLOCK\_SUSPEND和CAP\_WAKE\_ALARM - - 容器可拥有阻塞系统挂起\(epoll\)的能力。 - -13. CAP\_IPC\_LOCK - - 容器拥有该权限后,可以突破ulimit中的max locked memory限制,任意mlock超大内存块,造成一定意义的DoS攻击。 - -14. CAP\_SYS\_LOG - - 容器拥有该权限后,可以dmesg读取系统内核日志,突破内核kaslr防护。 - -15. CAP\_SYS\_NICE - - 容器拥有该权限后,可以改变进程的调度策略和优先级,造成一定意义的DoS攻击。 - -16. CAP\_SYS\_RESOURCE - - 容器可以绕过对其的一些资源限制,比如磁盘空间资源限制、keymaps数量限制、pipe-size-max限制等,造成一定意义的DoS攻击。 - -17. CAP\_SYS\_TIME - - 容器可以改变host上的时间。 - -18. Docker默认Cap风险分析 - - Docker默认的Cap,包含了CAP\_SETUID和CAP\_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行+s设置,host上的普通用户可使用其进行提权CAP\_AUDIT\_WRITE,容器可以对host写入,容器可以对host写入日志,host需配置日志防爆措施。 - -19. Docker和host共享namespace参数,比如--pid,--ipc, --uts - - 该参数为容器和host共享namespace空间,容器和host的namespace隔离没有了,容器可对host进行攻击。比如,使用--pid 和host共享pid namespace,容器中可以看到host上的进程pid号,可以随意杀死host的进程。 - -20. --device 把host的敏感目录或者设备,映射到容器中 - - Docker管理面有接口可以把host上的目录或者设备映射到容器中,比如--device,-v等参数,不要把host上的敏感目录或者设备映射到容器中。 - - +# 创建容器 + +## 下载镜像 + +运行docker命令需要root权限,当你使用普通用户登录时,需要用sudo权限执行docker命令。 + +``` +[root@localhost ~]# docker pull busybox +``` + +该命令行将在docker官方的镜像库中下载busybox:latest(命令行中没指定TAG,所以使用默认的TAG名latest),镜像在下载过程中将检测所依赖的层本地是否存在,如果存在就跳过。从私有镜像库下载镜像时,请带上registry描述,例如:假如建立了一个私有镜像库,地址为192.168.1.110:5000,里面有一些常用镜像。使用下面命令行从私有镜像库中下载镜像。 + +``` +[root@localhost ~]# docker pull 192.168.1.110:5000/busybox +``` + +从私有镜像库中下载下来的image名字带有镜像库地址的信息名字比较长,可以用docker tag命令生成一个名字简单点的image。 + +``` +[root@localhost ~]# docker tag 192.168.1.110:5000/busybox busybox +``` + +可以通过docker images命令查看本地镜像列表。 + +## 运行一个简单的应用 + +``` +[root@localhost ~]# docker run busybox /bin/echo "Hello world" +Hello world +``` + +该命令行使用busybox:latest(命令行中没有指定tag,所以使用默认的tag名latest)镜像创建了一个容器,在容器内执行了echo "Hello world"。使用下面命令行可以查看刚才创建的这个容器。 + +``` +[root@localhost ~]# docker ps -l +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +d8c0a3315bc0 busybox "/bin/echo 'Hello wo…" 5 seconds ago Exited (0) 3 seconds ago practical_franklin +``` + +## 创建一个交互式的容器 + +``` +[root@localhost ~]# docker run -it busybox /bin/bash +root@bf22919af2cf:/# ls +bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var +root@bf22919af2cf:/# pwd +/ +``` + +-ti选项分配一个伪终端给容器并可以使用STDIN进行交互,可以看到这时可以在容器内执行一些命令。这时的容器看起来完全是一个独立的linux虚拟机。使用exit命令退出容器。 + +## 后台运行容器 + +执行下面命令行,-d指示这个容器在后台运行,--name=container1 指定容器的名字为container1。 + +``` +[root@localhost ~]# docker run -d --name=container1 busybox /bin/sh -c "while true;do echo hello world;sleep 1;done" +7804d3e16d69b41aac5f9bf20d5f263e2da081b1de50044105b1e3f536b6db1c +``` + +命令行的执行结果是返回了这个容器的ID,没有返回命令的执行结果hello world,此时容器在后台运行,可以用docker ps命令查看正在运行的容器: + +``` +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +7804d3e16d69 busybox "/bin/sh -c 'while tr" 11 seconds ago Up 10 seconds container1 +``` + +用docker logs查看容器运行的输出: + +``` +[root@localhost ~]# docker logs container1 +hello world +hello world +hello world +... +``` + +## 容器网络连接 + +默认情况下,容器可以访问外部网络,而外部网络访问容器时需要通过端口映射,下面以在docker中运行私有镜像库服务registry为例。下面的命令行中-P使registry镜像中开放的端口暴露给主机。 + +``` +[root@localhost ~]# docker run --name=container_registry -d -P registry +cb883f6216c2b08a8c439b3957fb396c847a99079448ca741cc90724de4e4731 +``` + +container\_registry这个容器已经启动了,但是并不知道容器中的服务映射到主机的哪个端口,通过docker port查看端口映射。 + +``` +[root@localhost ~]# docker port container_registry +5000/tcp -> 0.0.0.0:49155 +``` + +从输出可以看出,容器内的5000端口映射到了主机的49155端口。通过主机IP:49155就可以访问registry服务了,在浏览器中输入http://localhost:49155就可以返回registry的版本信息。 + +在运行registry镜像的时候还可以直接指定端口映射如: + +``` +docker run --name=container_registry -d -p 5000:5000 registry +``` + +通过-p 5000:5000指定容器的5000端口映射到主机的5000端口。 + +## 注意事项 + +- **启动容器不能单独加-a stdin** + + 启动容器时,不能单独加-a stdin,必须要同时加上-a stdout或者-a stderr,否则会导致终端即使在容器退出后也会卡住。 + + +- **避免使用已有容器的长id、短id作为新容器的name** + + 创建容器时,避免使用已有容器A的长id或短id作为新容器B的name。若使用容器A的长id作为容器B的name,当使用容器B的name作为指定容器进行操作时,docker匹配到的是容器A。若使用容器A的短id作为容器B的name,当使用容器A的短id作为指定容器进行相关操作时,docker匹配到的是容器B。这是因为,docker在匹配容器时,先精确匹配所有容器的长id。若未匹配成功,再根据container\_name进行精确匹配;若还未匹配成功,直接对容器id进行模糊匹配。 + +- **使用sh/bash等依赖标准输入输出的容器应该使用\`-ti\`参数,避免出现异常** + + 正常情况:不用\`-ti\`参数启动sh/bash等进程容器,容器会马上退出。 + + 出现这种问题的原因在于,docker会先创建一个匹配用于容器内业务的stdin,在不设置-ti等交互式参数时,docker会在容器启动后关闭该pipe,而业务容器进程sh/bash在检测到stdin被关闭后会直接退出。 + + 异常情况:如果在上述过程中的特定阶段(关闭该pipe之前)强制杀死docker daemon,会导致该pipe的daemon端没有被及时关闭,这样即使不带\`-ti\`的sh/bash进程也不会退出,导致异常场景,这种容器就需要手动清理。 + + Daemon重启后会接管原有的容器stream,而不带\`-ti\`参数的容器可能就无法处理(因为正常情况下这些容器不存在stream需要接管);真实业务下几乎不存在这种使用方式\(不带 \`-ti\`的sh/bash没有任何作用\),为了避免这类问题发生,限制交互类容器应该使用 \`-ti\`参数。 + +- **容器存储卷** + + 启动容器时如果通过\`-v\`参数将主机上的文件挂载到容器中,在主机或容器中使用vi或sed命令修改文件可能会使文件inode发生改变,从而导致主机和容器内的文件不同步。容器中挂载文件时应该尽量避免使用这种文件挂载的方式(或不与vi和sed同时使用),也可以通过挂载文件上层目录来避免该问题。在docker挂载卷时“nocopy”选项可以避免将容器内挂载点目录下原有的文件拷贝到主机源目录下,但是这个选项只能在挂载匿名卷时使用,不能在bind mount的场景下使用。 + +- **避免使用可能会对host造成影响的选项** + + --privileged 选项会让容器获得所有权限,容器可以做挂载操作和修改/proc、/sys等目录,可能会对host造成影响,普通容器需要避免使用该选项。 + + 共享host的namespace,比如--pid host/--ipc host/--net host等选项可以让容器跟host共享命名空间,同样会导致容器影响host的结果,需要避免使用。 + +- **kernel memory cgroup不稳定,禁止使用** + + kernel memory cgroup在小于4.0版本的Linux内核上仍属于实验阶段,运行起来不稳定,虽然Docker的Warning说是小于4.0就可以,但是我们评估认为,kmemcg在高版本内核仍然不稳定,所以不管是低版本还是高版本,均禁止使用。 + + 当docker run --kernel-memory时,会产生如下告警: + + ``` + WARNING: You specified a kernel memory limit on a kernel older than 4.0. Kernel memory limits are experimental on older kernels, it won't work as expected as expected and can cause your system to be unstable. + ``` + +- **blkio-weight参数在支持blkio精确控制的内核下不可用** + + --blkio-weight-device 可以实现容器内更为精确的blkio控制,该控制需要指定磁盘设备,可以通过docker --blkio-weight-device参数实现。同时在这种内核下docker不再提供--blkio-weight方式限制容器blkio,使用该参数创建容器将会报错: + + ``` + docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:398: container init caused \"process_linux.go:369: setting cgroup config for ready process caused \\\"blkio.weight not supported, use weight_device instead\\\"\"" + ``` + +- **使用--blkio-weight-device需要磁盘支持CFQ调度策略** + + --blkio-weight-device参数需要磁盘工作于完全公平队列调度(CFQ:Completely Fair Queuing)的策略时才能工作。 + + 通过查看磁盘scheduler文件(/sys/block/<磁盘\>/queue/scheduler)可以获知磁盘支持的策略以及当前所采用的策略,如查看sda: + + ``` + # cat /sys/block/sda/queue/scheduler noop [deadline] cfq + ``` + + 当前sda支持三种调度策略:noop, deadline, cfq,并且正在使用deadline策略。通过echo修改策略为cfq: + + ``` + # echo cfq > /sys/block/sda/queue/scheduler + ``` + + +- **容器基础镜像中systemd使用限制** + + 通过基础镜像创建的容器在使用过程中,容器基础镜像中的systemd仅用于系统容器,普通容器不支持使用。 + + +## 并发性能 + +- docker内部的消息缓冲有一个上限,超过这个上限就会将消息丢弃,因此在并发执行命令时建议不要超过1000条命令,否则有可能会造成docker内部消息丢失,从而造成容器无法启动等严重问题。 +- 并发创建容器并对容器执行restart时会偶现“oci runtime error: container init still running”报错,这是因为containerd对事件等待队列进行了性能优化,容器stop过程中执行runc delete,尝试在1s内kill掉容器的init进程,如果1s内init进程还没有被kill掉的话runc会返回该错误。由于containerd的GC(垃圾回收机制)每隔10s会回收之前runc delete的残留资源, 所以并不影响下次对容器的操作,一般出现上述报错的话等待4\~5s之后再次启动容器即可。 + +## 安全特性解读 + +1. docker默认的权能配置分析 + + 原生的docker默认配置如下,默认进程携带的Cap如下: + + ``` + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + ``` + + 默认的seccomp配置是白名单,不在白名单的syscall默认会返回SCMP\_ACT\_ERRNO,根据给docker不同的Cap开放不同的系统调用,不在上面的权限,默认docker都不会给到容器。 + +2. CAP\_SYS\_MODULE + + CAP\_SYS\_MODULE这个Cap是让容器可以插入ko,增加该Cap可以让容器逃逸,甚至破坏内核。因为容器最大的隔离是Namespace,在ko中只要把他的Namespace指向init\_nsproxy即可。 + +3. CAP\_SYS\_ADMIN + + sys\_admin权限给容器带来的能力有: + + - 文件系统(mount,umount,quotactl) + - namespace设置相关的(setns,unshare,clone new namespace) + - driver ioctl + - 对pci的控制,pciconfig\_read, pciconfig\_write, pciconfig\_iobase + - sethostname + +4. CAP\_NET\_ADMIN + + 容器中有访问网络接口的和sniff网络流量的权限,容器可以获取到所有容器包括host的网络流量,对网络隔离破坏极大。 + +5. CAP\_DAC\_READ\_SEARCH + + 该权限开放了,两个系统调用open\_by\_handle\_at,name\_to\_handle\_at,如果host上没有selinux保护,容器中可通过暴力搜索file\_handle结构的inode号,进而可以打开host上的任意文件,影响文件系统的隔离性。 + +6. CAP\_SYS\_RAWIO + + 容器中可对host写入io端口,可造成host内核崩溃。 + +7. CAP\_SYS\_PTRACE + + 容器中有ptrace权限,可对容器的进程进行ptrace调试。现runc已经修补该漏洞,但有些工具比如nsenter和docker-enter并没有改保护,容器中可对这些工具执行的进程进行调试,获取这些工具带入的资源信息(Namespace、fd等),另外, ptrace可以绕过seccomp,极大增加内核攻击面。 + +8. Docker Cap接口 --cap-add all + + --cap-add all表示赋予容器所有的权能,包括本节提到的比较危险的权能,使得容器可以逃逸。 + +9. 不要禁用docker的seccomp特性 + + 默认的docker有一个seccomp的配置,配置中使用的是白名单,不在配置的sys\_call会被seccomp禁掉,使用接口--security-opt 'seccomp:unconfined'可以禁止使用seccomp特性。如果禁用seccomp或使用自定义seccomp配置但过滤名单不全,都会增加容器对内核的攻击面。 + +10. 不要配置/sys和/proc目录可写 + + /sys和/proc目录包含了linux维护内核参数、设备管理的接口,容器中配置该目录可写可能会导致容器逃逸。 + +11. Docker开放Cap --CAP\_AUDIT\_CONTROL + + 容器可以通过控制系统audit系统,并且通过AUDIT\_TTY\_GET/AUDIT\_TTY\_SET等命令可以获取审计系统中记录的tty执行输入记录,包括root密码。 + +12. CAP\_BLOCK\_SUSPEND和CAP\_WAKE\_ALARM + + 容器可拥有阻塞系统挂起\(epoll\)的能力。 + +13. CAP\_IPC\_LOCK + + 容器拥有该权限后,可以突破ulimit中的max locked memory限制,任意mlock超大内存块,造成一定意义的DoS攻击。 + +14. CAP\_SYS\_LOG + + 容器拥有该权限后,可以dmesg读取系统内核日志,突破内核kaslr防护。 + +15. CAP\_SYS\_NICE + + 容器拥有该权限后,可以改变进程的调度策略和优先级,造成一定意义的DoS攻击。 + +16. CAP\_SYS\_RESOURCE + + 容器可以绕过对其的一些资源限制,比如磁盘空间资源限制、keymaps数量限制、pipe-size-max限制等,造成一定意义的DoS攻击。 + +17. CAP\_SYS\_TIME + + 容器可以改变host上的时间。 + +18. Docker默认Cap风险分析 + + Docker默认的Cap,包含了CAP\_SETUID和CAP\_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行+s设置,host上的普通用户可使用其进行提权CAP\_AUDIT\_WRITE,容器可以对host写入,容器可以对host写入日志,host需配置日志防爆措施。 + +19. Docker和host共享namespace参数,比如--pid,--ipc, --uts + + 该参数为容器和host共享namespace空间,容器和host的namespace隔离没有了,容器可对host进行攻击。比如,使用--pid 和host共享pid namespace,容器中可以看到host上的进程pid号,可以随意杀死host的进程。 + +20. --device 把host的敏感目录或者设备,映射到容器中 + + Docker管理面有接口可以把host上的目录或者设备映射到容器中,比如--device,-v等参数,不要把host上的敏感目录或者设备映射到容器中。 + + diff --git "a/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250.md" index a41b3fa92..f19a4b07d 100644 --- "a/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250.md" @@ -17,18 +17,27 @@ create命令支持参数参考下表。 **表 1** create命令参数列表 -

命令

+ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -88,7 +88,7 @@ @@ -149,7 +149,7 @@ diff --git "a/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\350\200\203.md" "b/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\350\200\203.md" index 96dc60cf7..75509a1e6 100644 --- "a/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\350\200\203.md" +++ "b/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\350\200\203.md" @@ -1,3 +1,2 @@ # 命令行参考 - diff --git "a/content/zh/docs/Container/\345\234\250\345\256\271\345\231\250\344\270\255\346\211\247\350\241\214\346\226\260\345\221\275\344\273\244.md" "b/content/zh/docs/Container/\345\234\250\345\256\271\345\231\250\344\270\255\346\211\247\350\241\214\346\226\260\345\221\275\344\273\244.md" index e8044999c..7ecf717dc 100644 --- "a/content/zh/docs/Container/\345\234\250\345\256\271\345\231\250\344\270\255\346\211\247\350\241\214\346\226\260\345\221\275\344\273\244.md" +++ "b/content/zh/docs/Container/\345\234\250\345\256\271\345\231\250\344\270\255\346\211\247\350\241\214\346\226\260\345\221\275\344\273\244.md" @@ -25,7 +25,7 @@ exec命令支持参数参考下表。 diff --git "a/content/zh/docs/Container/\345\234\272\346\231\257\350\257\264\346\230\216-15.md" "b/content/zh/docs/Container/\345\234\272\346\231\257\350\257\264\346\230\216-15.md" new file mode 100644 index 000000000..d613053ce --- /dev/null +++ "b/content/zh/docs/Container/\345\234\272\346\231\257\350\257\264\346\230\216-15.md" @@ -0,0 +1,4 @@ +# 场景说明 + +SELinux\(Security-Enhanced Linux\)是一个linux内核的安全模块,提供了访问控制安全策略机制,iSulad将采用MCS(多级分类安全)实现对容器内进程打上标签限制容器访问资源的方式,减少提权攻击的风险,防止造成更为重要的危害。 + diff --git "a/content/zh/docs/Container/\345\237\272\346\234\254\345\256\211\350\243\205\351\205\215\347\275\256.md" "b/content/zh/docs/Container/\345\237\272\346\234\254\345\256\211\350\243\205\351\205\215\347\275\256.md" index f0365863a..6893c5938 100644 --- "a/content/zh/docs/Container/\345\237\272\346\234\254\345\256\211\350\243\205\351\205\215\347\275\256.md" +++ "b/content/zh/docs/Container/\345\237\272\346\234\254\345\256\211\350\243\205\351\205\215\347\275\256.md" @@ -1,27 +1 @@ # 基本安装配置 - -- **[配置daemon参数](配置daemon参数.md)** - -- **[daemon运行目录配置](daemon运行目录配置.md)** - -- **[daemon自带网络配置](daemon自带网络配置.md)** - -- **[daemon umask配置](daemon-umask配置.md)** - -- **[daemon启动时间](daemon启动时间.md)** - -- **[关联组件journald](关联组件journald.md)** - -- **[关联组件firewalld](关联组件firewalld.md)** - -- **[关联组件iptables](关联组件iptables.md)** - -- **[关联组件audit](关联组件audit.md)** - -- **[安全配置seccomp](安全配置seccomp.md)** - -- **[禁止修改docker daemon的私有目录](禁止修改docker-daemon的私有目录.md)** - -- **[普通用户大量部署容器场景下的配置注意事项](普通用户大量部署容器场景下的配置注意事项.md)** - - diff --git "a/content/zh/docs/Container/\345\255\230\345\202\250\351\251\261\345\212\250\351\205\215\347\275\256.md" "b/content/zh/docs/Container/\345\255\230\345\202\250\351\251\261\345\212\250\351\205\215\347\275\256.md" index b07130bfa..b911dc090 100644 --- "a/content/zh/docs/Container/\345\255\230\345\202\250\351\251\261\345\212\250\351\205\215\347\275\256.md" +++ "b/content/zh/docs/Container/\345\255\230\345\202\250\351\251\261\345\212\250\351\205\215\347\275\256.md" @@ -1,5 +1,3 @@ # 存储驱动配置 -本发行版docker支持overlay2和devicemapper两种存储驱动。由于overlay2较devicemapper而言,拥有更好的性能,建议用户在生成环境中优先考虑。 - - +本发行版docker支持overlay2和devicemapper两种存储驱动。由于overlay2较devicemapper而言,拥有更好的性能,建议用户在生产环境中优先考虑。 diff --git "a/content/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" "b/content/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" index f78bf2355..928b182dc 100644 --- "a/content/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" +++ "b/content/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" @@ -1,4 +1,2 @@ # 安全特性 - - diff --git "a/content/zh/docs/Container/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" "b/content/zh/docs/Container/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" index ae9b8fa4a..76da56739 100644 --- "a/content/zh/docs/Container/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" +++ "b/content/zh/docs/Container/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" @@ -1,3 +1,4 @@ # 安装与部署 + diff --git "a/content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-21.md" "b/content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-24.md" similarity index 84% rename from "content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-21.md" rename to "content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-24.md" index 88cfb7ab2..6855a55d6 100644 --- "a/content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-21.md" +++ "b/content/zh/docs/Container/\345\256\211\350\243\205\346\226\271\346\263\225-24.md" @@ -1,18 +1,18 @@ -# 安装方法 - -## 前提条件 - -- 为了获取更好的性能体验,安全容器需要运行在裸金属服务器上,**暂不支持安全容器运行在虚拟机内**。 -- 安全容器运行依赖以下组件,请确保环境上已安装所需版本的依赖组件。以下组件来自配套的openEuler 1.0版本。 - - docker-engine - - qemu - - -## 安装操作 - -安全容器发布组件集成在同一个kata-containers-<_version_\>.rpm包中,使用rpm命令可以直接安装对应的软件,其中version为。 - -``` -rpm -ivh kata-containers-.rpm -``` - +# 安装方法 + +## 前提条件 + +- 为了获取更好的性能体验,安全容器需要运行在裸金属服务器上,**暂不支持安全容器运行在虚拟机内**。 +- 安全容器运行依赖以下组件,请确保环境上已安装所需版本的依赖组件。以下组件来自配套的openEuler版本。如果使用iSula容器引擎,请参考iSula容器引擎的[安装方法](安装方法.md)章节安装iSulad。 + - docker-engine + - qemu + + +## 安装操作 + +安全容器发布组件集成在同一个kata-containers-<_version_\>.rpm包中,使用rpm命令可以直接安装对应的软件,其中version为。 + +``` +rpm -ivh kata-containers-.rpm +``` + diff --git "a/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-27.md" "b/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-30.md" similarity index 98% rename from "content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-27.md" rename to "content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-30.md" index 1bb9f1252..2e108aca9 100644 --- "a/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-27.md" +++ "b/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262-30.md" @@ -1 +1,2 @@ # 安装部署 + diff --git "a/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262.md" "b/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262.md" index d7b88d43d..8d85d4eaa 100644 --- "a/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262.md" +++ "b/content/zh/docs/Container/\345\256\211\350\243\205\351\203\250\347\275\262.md" @@ -1,3 +1 @@ # 安装部署 - - diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\344\270\216\344\270\273\346\234\272\344\271\213\351\227\264\346\225\260\346\215\256\346\213\267\350\264\235.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\344\270\216\344\270\273\346\234\272\344\271\213\351\227\264\346\225\260\346\215\256\346\213\267\350\264\235.md" index 8b93adc8b..2bb4d941b 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\344\270\216\344\270\273\346\234\272\344\271\213\351\227\264\346\225\260\346\215\256\346\213\267\350\264\235.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\344\270\216\344\270\273\346\234\272\344\271\213\351\227\264\346\225\260\346\215\256\346\213\267\350\264\235.md" @@ -2,7 +2,7 @@ ## 描述 -isula cp 用于容器与主机之间的数据拷贝。 +isula cp 用于容器与主机之间的数据拷贝,仅支持runtime类型为lcr的容器。 ## 用法 diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\345\201\245\345\272\267\347\212\266\346\200\201\346\243\200\346\237\245.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\345\201\245\345\272\267\347\212\266\346\200\201\346\243\200\346\237\245.md" index acdae4429..c2d49b0f6 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\345\201\245\345\272\267\347\212\266\346\200\201\346\243\200\346\237\245.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\345\201\245\345\272\267\347\212\266\346\200\201\346\243\200\346\237\245.md" @@ -1,3 +1,2 @@ # 容器健康状态检查 - diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\345\206\205reboot-shutdown.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\345\206\205reboot-shutdown.md" index bbd5ee02e..5305112f1 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\345\206\205reboot-shutdown.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\345\206\205reboot-shutdown.md" @@ -20,7 +20,7 @@ diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\345\274\225\346\223\216.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\345\274\225\346\223\216.md" index 704d17fd7..709b8dbb1 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\345\274\225\346\223\216.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\345\274\225\346\223\216.md" @@ -2,6 +2,8 @@ Docker daemon是一个常驻后台的系统进程,docker 子命令执行前先要启动docker daemon。 +   + 如果是通过rpm包或者系统包管理工具安装的,就可以使用systemctl start docker来启动docker daemon。 docker命令支持多个参数选项,对于参数选项有以下约定: @@ -9,26 +11,26 @@ docker命令支持多个参数选项,对于参数选项有以下约定: 1. 单个字符的选项可以合并在一起,如: ``` - docker run -t -i ubuntu:14.04 /bin/bash + docker run -t -i busybox /bin/sh ``` 可以写成 ``` - docker run -ti ubuntu:14.04 /bin/bash + docker run -ti busybox /bin/sh ``` 2. 在命令帮助中看到的如--icc=true之类的bool命令选项,如果没有使用这个选项,则这个标志位的值就是在命令帮助中看到的默认值,如果使用了这个选项则这个标志位的值就是命令帮助中看的值的相反值,如果启动docker daemon没有加上使用--icc选项,则默认设置了--icc=true,如果使用了--icc选项则表示是--icc=false。 3. 在命令帮助中看到的--attach=\[\]之类的选项,表示这类的选项可以多次设置,如: ``` - docker run --attach=stdin --attach=stdout -i -t ubuntu:14.04 /bin/bash + docker run --attach=stdin --attach=stdout -i -t busybox /bin/sh ``` 4. 在命令帮助中看到的-a, --attach=\[\]之类的选项,表示这种选项既可以用-a value指定也可以用--attach=value指定。如: ``` - docker run -a stdin --attach=stdout -i -t ubuntu:14.04 /bin/bash + docker run -a stdin --attach=stdout -i -t busybox /bin/sh ``` 5. --name=””之类的选项需要的是一个字符串,只能指定一次,-c=0之类的选项需要的是一个整数,只能指定一次。 @@ -44,8 +46,7 @@ docker命令支持多个参数选项,对于参数选项有以下约定: - - diff --git "a/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\270\255\350\277\233\347\250\213\344\277\241\346\201\257.md" "b/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\270\255\350\277\233\347\250\213\344\277\241\346\201\257.md" index 448a7c49c..e314b0a83 100644 --- "a/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\270\255\350\277\233\347\250\213\344\277\241\346\201\257.md" +++ "b/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\270\255\350\277\233\347\250\213\344\277\241\346\201\257.md" @@ -2,7 +2,7 @@ ## 描述 -isula top用于查看容器中的进程信息。 +isula top用于查看容器中的进程信息。仅支持runtime类型为lcr的容器。 ## 用法 @@ -25,7 +25,7 @@ top命令支持参数参考下表。 diff --git "a/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\275\277\347\224\250\347\232\204\350\265\204\346\272\220.md" "b/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\275\277\347\224\250\347\232\204\350\265\204\346\272\220.md" index b2f334ee5..92a0d53be 100644 --- "a/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\275\277\347\224\250\347\232\204\350\265\204\346\272\220.md" +++ "b/content/zh/docs/Container/\346\237\245\347\234\213\345\256\271\345\231\250\344\275\277\347\224\250\347\232\204\350\265\204\346\272\220.md" @@ -2,7 +2,7 @@ ## 描述 -isula stats用于实时显示资源使用的统计信息。 +isula stats用于实时显示资源使用的统计信息。仅支持runtime类型为lcr的容器。 ## 用法 @@ -25,8 +25,8 @@ stats命令支持参数参考下表。 diff --git "a/content/zh/docs/Container/\346\237\245\350\257\242\344\277\241\346\201\257.md" "b/content/zh/docs/Container/\346\237\245\350\257\242\344\277\241\346\201\257.md" index db4a48dbe..0fc9ede75 100644 --- "a/content/zh/docs/Container/\346\237\245\350\257\242\344\277\241\346\201\257.md" +++ "b/content/zh/docs/Container/\346\237\245\350\257\242\344\277\241\346\201\257.md" @@ -1,3 +1,2 @@ # 查询信息 - diff --git "a/content/zh/docs/Container/\346\237\245\350\257\242\345\215\225\344\270\252\345\256\271\345\231\250\344\277\241\346\201\257.md" "b/content/zh/docs/Container/\346\237\245\350\257\242\345\215\225\344\270\252\345\256\271\345\231\250\344\277\241\346\201\257.md" index adfff00e7..6fbef6256 100644 --- "a/content/zh/docs/Container/\346\237\245\350\257\242\345\215\225\344\270\252\345\256\271\345\231\250\344\277\241\346\201\257.md" +++ "b/content/zh/docs/Container/\346\237\245\350\257\242\345\215\225\344\270\252\345\256\271\345\231\250\344\277\241\346\201\257.md" @@ -25,7 +25,7 @@ inspect命令支持参数参考下表。 diff --git "a/content/zh/docs/Container/\346\237\245\350\257\242\346\211\200\346\234\211\345\256\271\345\231\250\344\277\241\346\201\257.md" "b/content/zh/docs/Container/\346\237\245\350\257\242\346\211\200\346\234\211\345\256\271\345\231\250\344\277\241\346\201\257.md" index bc2e55d98..2c27b99bc 100644 --- "a/content/zh/docs/Container/\346\237\245\350\257\242\346\211\200\346\234\211\345\256\271\345\231\250\344\277\241\346\201\257.md" +++ "b/content/zh/docs/Container/\346\237\245\350\257\242\346\211\200\346\234\211\345\256\271\345\231\250\344\277\241\346\201\257.md" @@ -25,10 +25,10 @@ ps命令支持参数参考下表。 diff --git "a/content/zh/docs/Container/\346\246\202\350\277\260-18.md" "b/content/zh/docs/Container/\346\246\202\350\277\260-21.md" similarity index 99% rename from "content/zh/docs/Container/\346\246\202\350\277\260-18.md" rename to "content/zh/docs/Container/\346\246\202\350\277\260-21.md" index 06faf343a..ea35a7f71 100644 --- "a/content/zh/docs/Container/\346\246\202\350\277\260-18.md" +++ "b/content/zh/docs/Container/\346\246\202\350\277\260-21.md" @@ -1,4 +1,4 @@ -# 概述 - -系统容器主要应对在重计算、高性能、大并发的场景下,重型应用和业务云化的问题。相比较虚拟机技术,系统容器可直接继承物理机特性,同时具备性能更优良,较少overhead的优点。从系统资源分配来看,系统容器在有限资源上相比虚拟机可分配更多计算单元,降低成本,通过系统容器可以构建产品的差异化竞争力,提供计算密度更高,价格更便宜,性能更优良的的计算单元实例。 - +# 概述 + +系统容器主要应对在重计算、高性能、大并发的场景下,重型应用和业务云化的问题。相比较虚拟机技术,系统容器可直接继承物理机特性,同时具备性能更优良,较少overhead的优点。从系统资源分配来看,系统容器在有限资源上相比虚拟机可分配更多计算单元,降低成本,通过系统容器可以构建产品的差异化竞争力,提供计算密度更高,价格更便宜,性能更优良的的计算单元实例。 + diff --git "a/content/zh/docs/Container/\346\246\202\350\277\260-20.md" "b/content/zh/docs/Container/\346\246\202\350\277\260-23.md" similarity index 98% rename from "content/zh/docs/Container/\346\246\202\350\277\260-20.md" rename to "content/zh/docs/Container/\346\246\202\350\277\260-23.md" index 254b8cd05..951853729 100644 --- "a/content/zh/docs/Container/\346\246\202\350\277\260-20.md" +++ "b/content/zh/docs/Container/\346\246\202\350\277\260-23.md" @@ -1,26 +1,26 @@ -# 概述 - -安全容器是虚拟化技术和容器技术的有机结合,相比普通linux容器,安全容器具有更好的隔离性。 - -普通linux容器利用namespace进行进程间运行环境的隔离,并使用cgroup进行资源限制;因此普通linux容器本质上还是共用同一个内核,单个容器有意或无意影响到内核都会影响到整台宿主机上的容器。 - -安全容器是使用虚拟化层进行容器间的隔离,同一个主机上不同的容器间运行互相不受影响。 - -**图 1** 安全容器架构 - - -![](figures/kata-arch.png) - -安全容器与Kubernetes中的Pod概念紧密联系,Kubernetes为容器调度管理平台的开源生态标准,它定义了一组容器操作相关接口(Container Runtime Interface 简称CRI)。 - -在CRI标准中,Pod为完成一组服务需要的一组容器集合,是编排调度的最小单元,通常共享IPC和网络namespace;一个Pod必然包含一个占位容器(pause容器)以及一个或多个业务容器,其中pause容器与的生命周期相同。 - -其中安全容器中的一个轻量级虚拟机对应为一个Pod,在此虚拟机中启动的第一个容器为pause容器,以后依次启动的容器为业务容器。 - -安全容器同时提供启动单个容器与启动Pod的功能。 - -安全容器与周边组件的关系如[图2](#fig17734185518269)所示。 - -**图 2** 安全容器与周边组件的关系 -![](figures/安全容器与周边组件的关系.png "安全容器与周边组件的关系") - +# 概述 + +安全容器是虚拟化技术和容器技术的有机结合,相比普通linux容器,安全容器具有更好的隔离性。 + +普通linux容器利用namespace进行进程间运行环境的隔离,并使用cgroup进行资源限制;因此普通linux容器本质上还是共用同一个内核,单个容器有意或无意影响到内核都会影响到整台宿主机上的容器。 + +安全容器是使用虚拟化层进行容器间的隔离,同一个主机上不同的容器间运行互相不受影响。 + +**图 1** 安全容器架构 + + +![](figures/kata-arch.png) + +安全容器与Kubernetes中的Pod概念紧密联系,Kubernetes为容器调度管理平台的开源生态标准,它定义了一组容器操作相关接口(Container Runtime Interface 简称CRI)。 + +在CRI标准中,Pod为完成一组服务需要的一组容器集合,是编排调度的最小单元,通常共享IPC和网络namespace;一个Pod必然包含一个占位容器(pause容器)以及一个或多个业务容器,其中pause容器与的生命周期相同。 + +其中安全容器中的一个轻量级虚拟机对应为一个Pod,在此虚拟机中启动的第一个容器为pause容器,以后依次启动的容器为业务容器。 + +安全容器同时提供启动单个容器与启动Pod的功能。 + +安全容器与周边组件的关系如[图2](#fig17734185518269)所示。 + +**图 2** 安全容器与周边组件的关系 +![](figures/安全容器与周边组件的关系.png "安全容器与周边组件的关系") + diff --git "a/content/zh/docs/Container/\346\246\202\350\277\260-26.md" "b/content/zh/docs/Container/\346\246\202\350\277\260-29.md" similarity index 62% rename from "content/zh/docs/Container/\346\246\202\350\277\260-26.md" rename to "content/zh/docs/Container/\346\246\202\350\277\260-29.md" index 882bdee9b..9044f0b7f 100644 --- "a/content/zh/docs/Container/\346\246\202\350\277\260-26.md" +++ "b/content/zh/docs/Container/\346\246\202\350\277\260-29.md" @@ -1,4 +1,4 @@ -# 概述 - -Docker是一个开源的Linux容器引擎项目, 用以实现应用的快速打包、部署和交付。docker的英文本意是码头工人,码头工人的工作就是将商品打包到container\(集装箱\)并且搬运container、装载container。 对应到Linux中,docker就是将app打包到container,通过container实现App在各种平台上的部署、运行。docker通过Linux Container技术将app变成一个标准化的、可移植的、自管理的组件,从而实现应用的“一次构建,到处运行”。docker技术特点就是:应用快速发布、部署简单、管理方便,应用密度更高。 - +# 概述 + +Docker是一个开源的Linux容器引擎项目, 用以实现应用的快速打包、部署和交付。Docker的英文本意是码头工人,码头工人的工作就是将商品打包到container\(集装箱\)并且搬运container、装载container。 对应到Linux中,Docker就是将app打包到container,通过container实现app在各种平台上的部署、运行。Docker通过Linux Container技术将app变成一个标准化的、可移植的、自管理的组件,从而实现应用的“一次构建,到处运行”。Docker技术特点就是:应用快速发布、部署简单、管理方便,应用密度更高。 + diff --git "a/content/zh/docs/Container/\346\263\225\345\276\213\345\243\260\346\230\216.md" "b/content/zh/docs/Container/\346\263\225\345\276\213\345\243\260\346\230\216.md" index 6ebb0e522..62308e77f 100644 --- "a/content/zh/docs/Container/\346\263\225\345\276\213\345\243\260\346\230\216.md" +++ "b/content/zh/docs/Container/\346\263\225\345\276\213\345\243\260\346\230\216.md" @@ -4,10 +4,14 @@ 您对“本文档”的复制、使用、修改及分发受知识共享\(Creative Commons\)署名—相同方式共享4.0国际公共许可协议\(以下简称“CC BY-SA 4.0”\)的约束。为了方便用户理解,您可以通过访问[https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) 了解CC BY-SA 4.0的概要 \(但不是替代\)。CC BY-SA 4.0的完整协议内容您可以访问如下网址获取:[https://creativecommons.org/licenses/by-sa/4.0/legalcode](https://creativecommons.org/licenses/by-sa/4.0/legalcode)。 +   + **商标声明** openEuler为华为技术有限公司的商标。本文档提及的其他所有商标或注册商标,由各自的所有人拥有。 +   + **免责声明** 本文档仅作为使用指导,除非适用法强制规定或者双方有明确书面约定, 华为技术有限公司对本文档中的所有陈述、信息和建议不做任何明示或默示的声明或保证,包括但不限于不侵权,时效性或满足特定目的的担保。 diff --git "a/content/zh/docs/Container/\347\211\271\346\235\203\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\347\211\271\346\235\203\345\256\271\345\231\250.md" index 080264ceb..daa8df992 100644 --- "a/content/zh/docs/Container/\347\211\271\346\235\203\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\347\211\271\346\235\203\345\256\271\345\231\250.md" @@ -1,3 +1 @@ # 特权容器 - - diff --git "a/content/zh/docs/Container/\347\255\211\345\276\205\345\256\271\345\231\250\351\200\200\345\207\272.md" "b/content/zh/docs/Container/\347\255\211\345\276\205\345\256\271\345\231\250\351\200\200\345\207\272.md" index dc1a7576b..cd8996ce4 100644 --- "a/content/zh/docs/Container/\347\255\211\345\276\205\345\256\271\345\231\250\351\200\200\345\207\272.md" +++ "b/content/zh/docs/Container/\347\255\211\345\276\205\345\256\271\345\231\250\351\200\200\345\207\272.md" @@ -2,7 +2,7 @@ ## 描述 -isula wait用于等待一个或者多个容器退出。 +isula wait用于等待一个或者多个容器退出。仅支持runtime类型为lcr的容器。 ## 用法 diff --git "a/content/zh/docs/Container/\347\256\241\347\220\206\345\256\211\345\205\250\345\256\271\345\231\250\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.md" "b/content/zh/docs/Container/\347\256\241\347\220\206\345\256\211\345\205\250\345\256\271\345\231\250\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.md" index 09fb0a9c4..47ecc885a 100644 --- "a/content/zh/docs/Container/\347\256\241\347\220\206\345\256\211\345\205\250\345\256\271\345\231\250\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.md" +++ "b/content/zh/docs/Container/\347\256\241\347\220\206\345\256\211\345\205\250\345\256\271\345\231\250\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237.md" @@ -1,4 +1,2 @@ # 管理安全容器的生命周期 - - diff --git "a/content/zh/docs/Container/\347\263\273\347\273\237\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\347\263\273\347\273\237\345\256\271\345\231\250.md" index c09ab6578..7d2686361 100644 --- "a/content/zh/docs/Container/\347\263\273\347\273\237\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\347\263\273\347\273\237\345\256\271\345\231\250.md" @@ -1,3 +1 @@ # 系统容器 - - diff --git "a/content/zh/docs/Container/\347\272\246\346\235\237\351\231\220\345\210\266.md" "b/content/zh/docs/Container/\347\272\246\346\235\237\351\231\220\345\210\266.md" index 34a05a1c3..81b9ba852 100644 --- "a/content/zh/docs/Container/\347\272\246\346\235\237\351\231\220\345\210\266.md" +++ "b/content/zh/docs/Container/\347\272\246\346\235\237\351\231\220\345\210\266.md" @@ -43,4 +43,5 @@ - 启动一个isulad容器,不能够以非root用户进行isula run -i/-t/-ti以及isula attach/exec操作。 +- iSulad对接OCI容器时,仅支持kata-runtime启动OCI容器。 diff --git "a/content/zh/docs/Container/\347\273\237\350\256\241\344\277\241\346\201\257.md" "b/content/zh/docs/Container/\347\273\237\350\256\241\344\277\241\346\201\257.md" index 2965a92e1..d6e96f1e4 100644 --- "a/content/zh/docs/Container/\347\273\237\350\256\241\344\277\241\346\201\257.md" +++ "b/content/zh/docs/Container/\347\273\237\350\256\241\344\277\241\346\201\257.md" @@ -1 +1,2 @@ # 统计信息 + diff --git "a/content/zh/docs/Container/\350\216\267\345\217\226\345\256\271\345\231\250\346\227\245\345\277\227.md" "b/content/zh/docs/Container/\350\216\267\345\217\226\345\256\271\345\231\250\346\227\245\345\277\227.md" index c1bbebc88..f9bd0a54a 100644 --- "a/content/zh/docs/Container/\350\216\267\345\217\226\345\256\271\345\231\250\346\227\245\345\277\227.md" +++ "b/content/zh/docs/Container/\350\216\267\345\217\226\345\256\271\345\231\250\346\227\245\345\277\227.md" @@ -2,7 +2,7 @@ ## 描述 -isula logs用于获取容器的日志。 +isula logs用于获取容器的日志。仅支持runtime类型为lcr的容器。 ## 用法 @@ -25,7 +25,7 @@ logs命令支持参数参考下表。 diff --git "a/content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-24.md" "b/content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-27.md" similarity index 98% rename from "content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-24.md" rename to "content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-27.md" index 735e66a32..d692fe32b 100644 --- "a/content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-24.md" +++ "b/content/zh/docs/Container/\350\265\204\346\272\220\347\232\204\345\205\261\344\272\253-27.md" @@ -1,6 +1,6 @@ -# 资源的共享 - -由于安全容器运行于虚拟化隔离的轻量虚拟机内,故无法访问Host上某些namespace下的资源,因此启动时不支持--net host,--ipc host,--pid host,--uts host。 - -当启动一个Pod时,同一个Pod中的所有容器默认共享同一个net namespace和ipc namespace。如果同一个Pod中的容器需要共享pid namespace,则可以通过Kubernetes进行配置,Kubernetes 1.11版本该值为默认关闭。 - +# 资源的共享 + +由于安全容器运行于虚拟化隔离的轻量虚拟机内,故无法访问Host上某些namespace下的资源,因此启动时不支持--net host,--ipc host,--pid host,--uts host。 + +当启动一个Pod时,同一个Pod中的所有容器默认共享同一个net namespace和ipc namespace。如果同一个Pod中的容器需要共享pid namespace,则可以通过Kubernetes进行配置,Kubernetes 1.11版本该值为默认关闭。 + diff --git "a/content/zh/docs/Container/\350\277\220\350\241\214\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\350\277\220\350\241\214\345\256\271\345\231\250.md" index 8fdc92d96..b8b472150 100644 --- "a/content/zh/docs/Container/\350\277\220\350\241\214\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\350\277\220\350\241\214\345\256\271\345\231\250.md" @@ -24,7 +24,7 @@ run命令支持参数参考下表。 - @@ -74,6 +74,21 @@ run命令支持参数参考下表。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

命令

参数

+

参数

说明

+

说明

create

+

create

+

  

--cap-drop

+

--annotation

删除Linux 权限功能

+

设置容器的annotations。例如支持native.umask选项:

+
--annotation native.umask=normal # 启动的容器umask值为0022
+--annotation native.umask=secure # 启动的容器umask值为0027
+

注意如果没有配置该参数,则使用isulad中的umask配置。

+

--cap-drop

+

删除Linux 权限功能

--cgroup-parent

@@ -56,11 +65,31 @@ create命令支持参数参考下表。

为容器添加一个主机设备

--dns

+

添加DNS服务器

+

--dns-opt

+

添加DNS选项

+

--dns-search

+

设定容器的搜索域

+

-e, --env

设置环境变量

--env-file

+

通过文件配置环境变量

+

--entrypoint

启动容器时要运行的入口点

@@ -86,6 +115,36 @@ create命令支持参数参考下表。

打印帮助信息

--health-cmd

+

在容器内执行的命令

+

--health-exit-on-unhealthy

+

检测到容器非健康时是否杀死容器

+

--health-interval

+

相邻两次命令执行的间隔时间

+

--health-retries

+

健康检查失败最大的重试次数

+

--health-start-period

+

容器初始化时间

+

--health-timeout

+

单次检查命令执行的时间上限

+

--hook-spec

钩子配置文件

@@ -116,6 +175,16 @@ create命令支持参数参考下表。

日志驱动程序选项,默认禁用记录容器串口日志功能,可以通过"--log-opt disable-log=false"来开启。

-l,--label

+

为容器设置标签

+

--lablel-file

+

通过文件设置容器标签

+

-m, --memory

内存限制

@@ -131,11 +200,21 @@ create命令支持参数参考下表。

正整数,内存 + 交换空间,-1 表示不限制

--memory-swappiness

+

正整数,swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间,默认值为-1,表示使用系统默认值。

+

--mount

挂载主机目录到容器中

--no-healthcheck

+

禁用健康检查配置

+

--name=NAME

容器名

diff --git "a/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250\344\275\277\347\224\250hook-spec.md" "b/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250\344\275\277\347\224\250hook-spec.md" index 779400200..0f6da50f8 100644 --- "a/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250\344\275\277\347\224\250hook-spec.md" +++ "b/content/zh/docs/Container/\345\210\233\345\273\272\345\256\271\345\231\250\344\275\277\347\224\250hook-spec.md" @@ -58,6 +58,8 @@ type Hooks struct{ 指定prestart hook增加一个网络hook的执行。路径是/var/lib/docker/hooks/network-hook,args代表程序的参数,第一个参数一般是程序名字,第二个是程序接受的参数。对于network-hook这个hook程序,需要两个参数,第一个是主机上的网卡名字,第二个是在容器内的网卡重命名。 +   + - 注意事项 1. hook path必须为docker的graph目录(--graph)下的hooks文件夹下,默认一般为 /var/lib/docker/hooks,可以通过docker info命令查看root路径。 diff --git "a/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-31.md" "b/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-35.md" similarity index 98% rename from "content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-31.md" rename to "content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-35.md" index 376200228..57bff1abe 100644 --- "a/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-31.md" +++ "b/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-35.md" @@ -1,6 +1,6 @@ -# 删除镜像 - -## 注意事项 - -禁止使用docker rmi –f XXX删除镜像。如果使用强制删除,docker rmi会忽略过程中的错误,可能导致容器或者镜像关元数据残留。如果使用普通删除,如果删除过程出错,则会删除失败,不会导致元数据残留。 - +# 删除镜像 + +## 注意事项 + +禁止使用docker rmi –f XXX删除镜像。如果使用强制删除,docker rmi会忽略过程中的错误,可能导致容器或者镜像关元数据残留。如果使用普通删除,如果删除过程出错,则会删除失败,不会导致元数据残留。 + diff --git "a/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-6.md" "b/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-6.md" index 4b7382332..bfbe5e08b 100644 --- "a/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-6.md" +++ "b/content/zh/docs/Container/\345\210\240\351\231\244\351\225\234\345\203\217-6.md" @@ -1,3 +1,4 @@ + # 删除镜像 ## 描述 diff --git "a/content/zh/docs/Container/\345\212\250\346\200\201\345\212\240\350\275\275\345\206\205\346\240\270\346\250\241\345\235\227.md" "b/content/zh/docs/Container/\345\212\250\346\200\201\345\212\240\350\275\275\345\206\205\346\240\270\346\250\241\345\235\227.md" index 260f9e125..281454362 100644 --- "a/content/zh/docs/Container/\345\212\250\346\200\201\345\212\240\350\275\275\345\206\205\346\240\270\346\250\241\345\235\227.md" +++ "b/content/zh/docs/Container/\345\212\250\346\200\201\345\212\240\350\275\275\345\206\205\346\240\270\346\250\241\345\235\227.md" @@ -2,7 +2,7 @@ ## 功能描述 -容器内业务可能依赖某些内核模块,可通过设置环境变量的方式,在系统容器启动前动态加载容器中业务需要的内核模块到宿主机,此特性需要配合isulad-hooks一起使用,具体使用可参看[容器资源动态管理(isulad-tools)](容器资源动态管理(isulad-tools).md)章节。 +容器内业务可能依赖某些内核模块,可通过设置环境变量的方式,在系统容器启动前动态加载容器中业务需要的内核模块到宿主机,此特性需要配合isulad-hooks一起使用,具体使用可参看"容器资源动态管理(syscontainer-tools)"章节。 ## 参数说明 diff --git "a/content/zh/docs/Container/\345\215\207\347\272\247\346\226\271\346\263\225.md" "b/content/zh/docs/Container/\345\215\207\347\272\247\346\226\271\346\263\225.md" new file mode 100644 index 000000000..d088e4aa6 --- /dev/null +++ "b/content/zh/docs/Container/\345\215\207\347\272\247\346\226\271\346\263\225.md" @@ -0,0 +1,21 @@ +# 升级方法 + +- 若为相同大版本之间的升级,例如从2.x.x版本升级到2.x.x版本,请执行如下命令: + + ``` + $ sudo yum update -y iSulad + ``` + +- 若为不同大版本之间的升级,例如从1.x.x版本升级到2.x.x版本,请先保存当前的配置文件/etc/isulad/daemon.json,并卸载已安装的iSulad软件包,然后安装待升级的iSulad软件包,随后恢复配置文件。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 可通过** sudo rpm -qa |grep iSulad** 或 **isula version** 命令确认当前iSulad的版本号。 +>- 相同大版本之间,如果希望手动升级,请下载iSulad及其所有依赖库的RPM包进行升级,参考命令如下: +> ``` +> $ sudo rpm -Uhv iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm +> ``` +> 若升级失败,可通过--force选项进行强制升级,参考命令如下: +> ``` +> $ sudo rpm -Uhv --force iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm +> ``` + diff --git "a/content/zh/docs/Container/\345\217\214\345\220\221\350\256\244\350\257\201.md" "b/content/zh/docs/Container/\345\217\214\345\220\221\350\256\244\350\257\201.md" index 5a18f4666..868cde1de 100644 --- "a/content/zh/docs/Container/\345\217\214\345\220\221\350\256\244\350\257\201.md" +++ "b/content/zh/docs/Container/\345\217\214\345\220\221\350\256\244\350\257\201.md" @@ -86,8 +86,8 @@ $ systemctl restart isulad 执行pull命令从仓库下载镜像 ``` -$ isula pull my.csp-edge.com:5000/ubuntu -Image "my.csp-edge.com:5000/ubuntu" pulling -Image "my.csp-edge.com:5000/ubuntu@sha256:f1bdc62115dbfe8f54e52e19795ee34b4473babdeb9bc4f83045d85c7b2ad5c0" pulled +$ isula pull my.csp-edge.com:5000/busybox +Image "my.csp-edge.com:5000/busybox" pulling +Image "my.csp-edge.com:5000/busybox@sha256:f1bdc62115dbfe8f54e52e19795ee34b4473babdeb9bc4f83045d85c7b2ad5c0" pulled ``` diff --git "a/content/zh/docs/Container/\345\220\257\345\212\250\345\256\211\345\205\250\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\345\220\257\345\212\250\345\256\211\345\205\250\345\256\271\345\231\250.md" index 4d18fb148..275692c25 100644 --- "a/content/zh/docs/Container/\345\220\257\345\212\250\345\256\211\345\205\250\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\345\220\257\345\212\250\345\256\211\345\205\250\345\256\271\345\231\250.md" @@ -1,38 +1,57 @@ # 启动安全容器 +用户可以使用docker-engine或者iSulad作为安全容器的容器引擎,两者的调用方式类似,请用户自行选择一种方式启动安全容器。 + +启动安全容器的操作步骤如下: + 1. 确保安全容器组件已经正确安装部署。 -2. 准备容器镜像。例如使用docker-engine下载容器镜像,此处假设容器镜像为busybox。 +2. 准备容器镜像。假设容器镜像为busybox,使用docker-engine和iSula容器引擎下载容器镜像的命令分别如下: ``` docker pull busybox ``` -3. 启动一个安全容器。 + ``` + isula pull busybox + ``` + +3. 启动一个安全容器。使用docker-engine和iSula容器引擎启动安全容器的命令分别如下: ``` docker run -tid --runtime kata-runtime --network none busybox - 此处获取container-id + ``` + + ``` + isula run -tid --runtime kata-runtime --network none busybox ``` >![](public_sys-resources/icon-note.gif) **说明:** >安全容器网络使用仅支持CNI网络,不支持CNM网络,不支持使用-p和--expose暴露容器端口,使用安全容器时需指定参数--net=none。 4. 启动一个Pod - - 启动pause容器。 + 1. 启动pause容器并根据回显获取pod的sandbox-id。使用docker-engine和iSula容器引擎启动的命令分别如下: ``` docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox ``` - 此处获取pod的sandbox-id。 + ``` + isula run -tid --runtime kata-runtime --network none --annotation io.kubernetes.cri.container-type=sandbox + ``` + +    - - 创建业务容器并加入到这个pod中。 + 1. 创建业务容器并加入到这个pod中。使用docker-engine和iSula容器引擎创建的命令分别如下: ``` docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id= busybox ``` - 这里利用--annotation来作为容器类型的标注,当前iSula提供配套的docker-engine带有该字段,开源docker引擎并不提供。 + ``` + isula run -tid --runtime kata-runtime --network none --annotation io.kubernetes.cri.container-type=container --annotation io.kubernetes.cri.sandbox-id= busybox + ``` + + --annotation用于容器类型的标注,这里的docker-engine和isula提供该字段,上游社区的开源docker引擎则不提供。 diff --git "a/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\350\257\264\346\230\216.md" "b/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\350\257\264\346\230\216.md" index 77f497ac8..23b8bb2ed 100644 --- "a/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\350\257\264\346\230\216.md" +++ "b/content/zh/docs/Container/\345\221\275\344\273\244\350\241\214\345\217\202\346\225\260\350\257\264\346\230\216.md" @@ -11,8 +11,8 @@

login

-

-

+

  

+

  

-H, --host

rmi

-

+

  

-H, --host

images

-

+

  

-H, --host

exec

-

+

  

-d, --detach

--restart

  • 字符串变量。
  • 可取指定值:

    on-reboot:表示重启系统容器。

    -

    +

      

--api-cors-header

开放远程API调用的 CORS -头信息。这个接口开关对想进行二次开发的上层应用提供了支持。为remote API设置CORS头信息。

+

开放远程API调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持。为remote API设置CORS头信息。

--authorization-plugin=[]

@@ -55,8 +56,7 @@ docker命令支持多个参数选项,对于参数选项有以下约定:

-b, --bridge=""

挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none -可以停用容器里的网络。

+

挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。

--bip=""

diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-28.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-28.md" deleted file mode 100644 index 05e18f7fa..000000000 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-28.md" +++ /dev/null @@ -1 +0,0 @@ -# 容器管理 diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-32.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-32.md" index b22b28f92..d17c8fa2a 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-32.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-32.md" @@ -1,230 +1,2 @@ -# 容器管理 - -当前docker支持的子命令,按照功能划分为以下几组: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能划分

-

命令

-

命令功能

-

主机环境相关

-

version

-

查看docker版本信息

-

info

-

查看docker系统和主机环境信息

-

容器相关

-

容器生命周期管理

-

create

-

由image创建一个容器

-

run

-

由image创建一个容器并运行

-

start

-

开始一个已停止运行的容器

-

stop

-

停止一个运行中的容器

-

restart

-

重启一个容器

-

wait

-

等待一个容器停止,并打印出退出码

-

rm

-

删除一个容器

-

容器内进程管理

-

pause

-

暂停一个容器内的所有进程

-

unpause

-

恢复一个容器内被暂停的所用进程

-

top

-

查看容器内的进程

-

exec

-

在容器内执行进程

-

容器检视工具

-

ps

-

查看运行中的容器(不加任何选项)

-

logs

-

显示一个容器的日志信息

-

attach

-

连接到一个容器的标准输入输出

-

inspect

-

返回容器的底层信息

-

port

-

列出容器与主机的端口映射

-

diff

-

返回容器相对于镜像中的rootfs所作的改动

-

cp

-

容器与主机之间复制文件

-

export

-

将一个容器中的文件系统导出为一个tar包

-

stats

-

实时查看容器的资源占用情况

-

images相关

-

生成一个新image

-

build

-

通过一个Dockerfile构建一个image

-

commit

-

基于容器的rootfs创建一个新的image

-

import

-

将tar包中的内容作为文件系统创建一个image

-

load

-

从一个tar包中加载一个image

-

与image仓库有关

-

login

-

登录一个registry

-

logout

-

登出一个registry

-

pull

-

从registry中拉取一个image

-

push

-

将一个image推送到registry中

-

search

-

在registry中搜寻image

-

与image管理有关

-

images

-

显示系统中的image

-

history

-

显示一个image的变化历史

-

rmi

-

删除image

-

tag

-

给image打标签

-

save

-

将一个image保存到一个tar包中

-

其他

-

events

-

从docker daemon中获取实时事件

-

rename

-

重命名容器

-
- -其中有些子命令还有一些参数选项如docker run,通过docker COMMAND --help可以查看相应COMMAND命令的帮助,命令选项参考上文的命令选项约定。下面详细介绍每个命令的使用。 - - +# 容器管理 diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-36.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-36.md" new file mode 100644 index 000000000..e466652a9 --- /dev/null +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206-36.md" @@ -0,0 +1,231 @@ +# 容器管理 + +当前docker支持的子命令,按照功能划分为以下几组: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能划分

+

命令

+

命令功能

+

主机环境相关

+

version

+

查看docker版本信息

+

info

+

查看docker系统和主机环境信息

+

容器相关

+

容器生命周期管理

+

create

+

由image创建一个容器

+

run

+

由image创建一个容器并运行

+

start

+

开始一个已停止运行的容器

+

stop

+

停止一个运行中的容器

+

restart

+

重启一个容器

+

wait

+

等待一个容器停止,并打印出退出码

+

rm

+

删除一个容器

+

容器内进程管理

+

pause

+

暂停一个容器内的所有进程

+

unpause

+

恢复一个容器内被暂停的所用进程

+

top

+

查看容器内的进程

+

exec

+

在容器内执行进程

+

容器检视工具

+

ps

+

查看运行中的容器(不加任何选项)

+

logs

+

显示一个容器的日志信息

+

attach

+

连接到一个容器的标准输入输出

+

inspect

+

返回容器的底层信息

+

port

+

列出容器与主机的端口映射

+

diff

+

返回容器相对于镜像中的rootfs所作的改动

+

cp

+

容器与主机之间复制文件

+

export

+

将一个容器中的文件系统导出为一个tar包

+

stats

+

实时查看容器的资源占用情况

+

images相关

+

生成一个新image

+

build

+

通过一个Dockerfile构建一个image

+

commit

+

基于容器的rootfs创建一个新的image

+

import

+

将tar包中的内容作为文件系统创建一个image

+

load

+

从一个tar包中加载一个image

+

与image仓库有关

+

login

+

登录一个registry

+

logout

+

登出一个registry

+

pull

+

从registry中拉取一个image

+

push

+

将一个image推送到registry中

+

search

+

在registry中搜寻image

+

与image管理有关

+

images

+

显示系统中的image

+

history

+

显示一个image的变化历史

+

rmi

+

删除image

+

tag

+

给image打标签

+

save

+

将一个image保存到一个tar包中

+

其他

+

events

+

从docker daemon中获取实时事件

+

rename

+

重命名容器

+
+ +其中有些子命令还有一些参数选项如docker run,通过docker COMMAND --help可以查看相应COMMAND命令的帮助,命令选项参考上文的命令选项约定。下面详细介绍每个命令的使用。 + + + + diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206.md" index 61fd5204c..837392ffe 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\347\256\241\347\220\206.md" @@ -1,4 +1,3 @@ # 容器管理 - diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210iSulad-tools\357\274\211.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210iSulad-tools\357\274\211.md" deleted file mode 100644 index 24e040417..000000000 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210iSulad-tools\357\274\211.md" +++ /dev/null @@ -1,10 +0,0 @@ -# 容器资源动态管理(isulad-tools) - -普通容器无法支持对容器内的资源进行管理,例如添加一个块设备到容器、插入一块物理/虚拟网卡到容器。系统容器场景下,通过isulad-tools工具可以实现动态为容器挂载/卸载块设备,网络设备,路由和卷等资源。 - -要使用此功能,需要安装isulad-tools工具: - -``` -[root@localhost ~]# yum install isulad-tools -``` - diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210syscontainer-tools\357\274\211.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210syscontainer-tools\357\274\211.md" new file mode 100644 index 000000000..b2b2fc0fc --- /dev/null +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\345\212\250\346\200\201\347\256\241\347\220\206\357\274\210syscontainer-tools\357\274\211.md" @@ -0,0 +1,9 @@ +# 容器资源动态管理(syscontainer-tools) + +普通容器无法支持对容器内的资源进行管理,例如添加一个块设备到容器、插入一块物理/虚拟网卡到容器。系统容器场景下,通过syscontainer-tools工具可以实现动态为容器挂载/卸载块设备,网络设备,路由和卷等资源。 + +要使用此功能,需要安装syscontainer-tools工具: + +``` +[root@localhost ~]# yum install syscontainer-tools +``` diff --git "a/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\347\256\241\347\220\206.md" "b/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\347\256\241\347\220\206.md" index b4bc7a087..2414c7aed 100644 --- "a/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Container/\345\256\271\345\231\250\350\265\204\346\272\220\347\256\241\347\220\206.md" @@ -1,4 +1 @@ # 容器资源管理 - - - diff --git "a/content/zh/docs/Container/\345\274\272\346\235\200docker\347\233\270\345\205\263\345\220\216\345\217\260\350\277\233\347\250\213\347\232\204\345\275\261\345\223\215.md" "b/content/zh/docs/Container/\345\274\272\346\235\200docker\347\233\270\345\205\263\345\220\216\345\217\260\350\277\233\347\250\213\347\232\204\345\275\261\345\223\215.md" index ef8746103..93e4ca696 100644 --- "a/content/zh/docs/Container/\345\274\272\346\235\200docker\347\233\270\345\205\263\345\220\216\345\217\260\350\277\233\347\250\213\347\232\204\345\275\261\345\223\215.md" +++ "b/content/zh/docs/Container/\345\274\272\346\235\200docker\347\233\270\345\205\263\345\220\216\345\217\260\350\277\233\347\250\213\347\232\204\345\275\261\345\223\215.md" @@ -2,4 +2,3 @@ docker的调用链很长,强杀docker相关后台进程可能会导致一些数据状态不一致,本章节列举一些强杀可能导致的问题。 - diff --git "a/content/zh/docs/Container/\346\201\242\345\244\215\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\346\201\242\345\244\215\345\256\271\345\231\250.md" new file mode 100644 index 000000000..b6dc2c028 --- /dev/null +++ "b/content/zh/docs/Container/\346\201\242\345\244\215\345\256\271\345\231\250.md" @@ -0,0 +1,45 @@ +# 恢复容器 + +## 描述 + +isula unpause用于恢复容器中所有的进程, 为isula pause的逆过程,仅支持runtime类型为lcr的容器。 + +## 用法 + +``` +isula unpause CONTAINER [CONTAINER...] +``` + +## 参数 + + + + + + + + + + + +

命令

+

参数

+

说明

+

pause

+

-H, --host

+

指定要连接的iSulad socket文件路径

+
+ +## 约束限制 + +- 只有状态为paused的容器可以被执行unpause操作 + +## 示例 + +恢复一个被暂停的容器,命令示例如下: + +``` +$ isula unpause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac + 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac +``` + diff --git "a/content/zh/docs/Container/\346\214\202\345\215\267\347\256\241\347\220\206.md" "b/content/zh/docs/Container/\346\214\202\345\215\267\347\256\241\347\220\206.md" index d193e242c..8653e0910 100644 --- "a/content/zh/docs/Container/\346\214\202\345\215\267\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Container/\346\214\202\345\215\267\347\256\241\347\220\206.md" @@ -22,7 +22,7 @@ ARG:命令对应的参数。 ## 接口说明 -**表 1** +**表 1**   

命令

diff --git "a/content/zh/docs/Container/\346\216\245\345\205\245\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\346\216\245\345\205\245\345\256\271\345\231\250.md" index 68900b7df..30f264f1f 100644 --- "a/content/zh/docs/Container/\346\216\245\345\205\245\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\346\216\245\345\205\245\345\256\271\345\231\250.md" @@ -2,7 +2,7 @@ ## 描述 -isula attach命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。 +isula attach命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。仅支持runtime类型为lcr的容器。 ## 用法 diff --git "a/content/zh/docs/Container/\346\216\245\345\217\243-16.md" "b/content/zh/docs/Container/\346\216\245\345\217\243-19.md" similarity index 97% rename from "content/zh/docs/Container/\346\216\245\345\217\243-16.md" rename to "content/zh/docs/Container/\346\216\245\345\217\243-19.md" index af9890d0e..59e3adb4a 100644 --- "a/content/zh/docs/Container/\346\216\245\345\217\243-16.md" +++ "b/content/zh/docs/Container/\346\216\245\345\217\243-19.md" @@ -1,16 +1,16 @@ -# 接口 - -isulad和isula都提供了hook的接口,isulad提供了默认的hook配置,会作用于所有容器;而isula提供的hook接口,只会作用于当前创建的容器。 - -isulad提供的默认OCI hooks配置: - -- 通过/etc/isulad/daemon.json配置文件的hook-spec配置项设置hook配置的文件路径:"hook-spec": "/etc/default/isulad/hooks/default.json"。 -- 通过isulad --hook-spec参数设置hook配置的文件路径。 - -isula提供的OCI hooks配置: - -- isula create --hook-spec:指定hook配置的json文件的路径。 -- isula run --hook-spec:指定hook配置的json文件的路径。 - -run的配置其实也是在create阶段生效了。 - +# 接口 + +isulad和isula都提供了hook的接口,isulad提供了默认的hook配置,会作用于所有容器;而isula提供的hook接口,只会作用于当前创建的容器。 + +isulad提供的默认OCI hooks配置: + +- 通过/etc/isulad/daemon.json配置文件的hook-spec配置项设置hook配置的文件路径:"hook-spec": "/etc/default/isulad/hooks/default.json"。 +- 通过isulad --hook-spec参数设置hook配置的文件路径。 + +isula提供的OCI hooks配置: + +- isula create --hook-spec:指定hook配置的json文件的路径。 +- isula run --hook-spec:指定hook配置的json文件的路径。 + +run的配置其实也是在create阶段生效了。 + diff --git "a/content/zh/docs/Container/\346\216\245\345\217\243-2.md" "b/content/zh/docs/Container/\346\216\245\345\217\243-2.md" index cd7ca09a2..528b6278f 100644 --- "a/content/zh/docs/Container/\346\216\245\345\217\243-2.md" +++ "b/content/zh/docs/Container/\346\216\245\345\217\243-2.md" @@ -1651,8 +1651,4 @@
-- **[Runtime服务](Runtime服务.md)** - -- **[Image服务](Image服务.md)** - diff --git "a/content/zh/docs/Container/\346\216\245\345\217\243.md" "b/content/zh/docs/Container/\346\216\245\345\217\243.md" index 7d06c2b76..8a875b484 100644 --- "a/content/zh/docs/Container/\346\216\245\345\217\243.md" +++ "b/content/zh/docs/Container/\346\216\245\345\217\243.md" @@ -2,13 +2,14 @@ CNI对用户可见的接口,主要涉及CNI网络配置和Pod配置中CNI网络相关的项。 -- CNI网络配置相关的接口,主要是isulad指定CNI网络配置文件所在路径、CNI网络插件二进制文件所在的路径以及使用的网络模式;[表1 CNI网络配置接口](#zh-cn_topic_0183259146_table18221919589)。 +- CNI网络配置相关的接口,主要是isulad指定CNI网络配置文件所在路径、CNI网络插件二进制文件所在的路径以及使用的网络模式。详情请参见[表1 CNI网络配置接口](#zh-cn_topic_0183259146_table18221919589)。 - Pod配置中CNI网络相关的项,主要是设置Pod加入的附加CNI网络列表,默认情况Pod只会加入到default CNI网络平面中,可以通过该配置把Pod加入到多个CNI网络平面中。 **表 1** CNI网络配置接口 - +
  
diff --git "a/content/zh/docs/Container/\346\217\217\350\277\260-1.md" "b/content/zh/docs/Container/\346\217\217\350\277\260-1.md" index 2ee01501d..d4046d5d4 100644 --- "a/content/zh/docs/Container/\346\217\217\350\277\260-1.md" +++ "b/content/zh/docs/Container/\346\217\217\350\277\260-1.md" @@ -11,5 +11,5 @@ CRI API 接口是由kubernetes 推出的容器运行时接口,CRI定义了容 ISulad使用的为pass使用的1.14版本API描述文件,与官方API略有出入,以本文档描述的接口为准。 >![](public_sys-resources/icon-note.gif) **说明:** ->CRI接口websocket流式服务,服务端监听地址为127.0.0.1,端口为10350,端口可通过命令行--websocket-server-listening-port参数接口或者daemon.json配置文件进行配置。 +>CRI接口websocket流式服务,服务端侦听地址为127.0.0.1,端口为10350,端口可通过命令行--websocket-server-listening-port参数接口或者daemon.json配置文件进行配置。 diff --git "a/content/zh/docs/Container/\346\217\217\350\277\260-15.md" "b/content/zh/docs/Container/\346\217\217\350\277\260-18.md" similarity index 97% rename from "content/zh/docs/Container/\346\217\217\350\277\260-15.md" rename to "content/zh/docs/Container/\346\217\217\350\277\260-18.md" index 47c0f12b8..7031017c6 100644 --- "a/content/zh/docs/Container/\346\217\217\350\277\260-15.md" +++ "b/content/zh/docs/Container/\346\217\217\350\277\260-18.md" @@ -1,47 +1,47 @@ -# 描述 - -支持在容器的生命周期中,运行OCI标准hooks。包括三种类型的hooks: - -- prestart hook:在执行isula start命令之后,而在容器的1号进程启动之前,被执行。 -- poststart hook:在容器1号进程启动之后,而在isula start命令返回之前,被执行。 -- poststop hook:在容器被停止之后,但是在停止命令返回之前,被执行。 - -OCI hooks的配置格式规范如下: - -- path:格式是字符串,必须项,必须为绝对路径,指定的文件必须有可执行权限。 -- args:格式是字符串数组,可选项,语义和execv的args一致。 -- env:格式是字符串数组,可选项,语义和环境变量一致,内容为键值对,如:"PATH=/usr/bin"。 -- timeout:格式是整数,可选项,必须大于0,表示钩子执行的超时时间。如果钩子进程运行时间超过配置的时间,那么钩子进程会被杀死。 - -hook的配置为json格式,一般存放在json结尾的文件中,示例如下: - -``` -{ - "prestart": [ - { - "path": "/usr/bin/echo", - "args": ["arg1", "arg2"], - "env": [ "key1=value1"], - "timeout": 30 - }, - { - "path": "/usr/bin/ls", - "args": ["/tmp"] - } - ], - "poststart": [ - { - "path": "/usr/bin/ls", - "args": ["/tmp"], - "timeout": 5 - } - ], - "poststop": [ - { - "path": "/tmp/cleanup.sh", - "args": ["cleanup.sh", "-f"] - } - ] -} -``` - +# 描述 + +支持在容器的生命周期中,运行OCI标准hooks。包括三种类型的hooks: + +- prestart hook:在执行isula start命令之后,而在容器的1号进程启动之前,被执行。 +- poststart hook:在容器1号进程启动之后,而在isula start命令返回之前,被执行。 +- poststop hook:在容器被停止之后,但是在停止命令返回之前,被执行。 + +OCI hooks的配置格式规范如下: + +- path:格式是字符串,必须项,必须为绝对路径,指定的文件必须有可执行权限。 +- args:格式是字符串数组,可选项,语义和execv的args一致。 +- env:格式是字符串数组,可选项,语义和环境变量一致,内容为键值对,如:"PATH=/usr/bin"。 +- timeout:格式是整数,可选项,必须大于0,表示钩子执行的超时时间。如果钩子进程运行时间超过配置的时间,那么钩子进程会被杀死。 + +hook的配置为json格式,一般存放在json结尾的文件中,示例如下: + +``` +{ + "prestart": [ + { + "path": "/usr/bin/echo", + "args": ["arg1", "arg2"], + "env": [ "key1=value1"], + "timeout": 30 + }, + { + "path": "/usr/bin/ls", + "args": ["/tmp"] + } + ], + "poststart": [ + { + "path": "/usr/bin/ls", + "args": ["/tmp"], + "timeout": 5 + } + ], + "poststop": [ + { + "path": "/tmp/cleanup.sh", + "args": ["cleanup.sh", "-f"] + } + ] +} +``` + diff --git "a/content/zh/docs/Container/\346\224\257\346\214\201CNI\347\275\221\347\273\234.md" "b/content/zh/docs/Container/\346\224\257\346\214\201CNI\347\275\221\347\273\234.md" index 4fb1645cf..a7fe955cd 100644 --- "a/content/zh/docs/Container/\346\224\257\346\214\201CNI\347\275\221\347\273\234.md" +++ "b/content/zh/docs/Container/\346\224\257\346\214\201CNI\347\275\221\347\273\234.md" @@ -1,3 +1,2 @@ # 支持CNI网络 - diff --git "a/content/zh/docs/Container/\346\224\257\346\214\201OCI-hooks.md" "b/content/zh/docs/Container/\346\224\257\346\214\201OCI-hooks.md" index ce05939ad..a75f1789f 100644 --- "a/content/zh/docs/Container/\346\224\257\346\214\201OCI-hooks.md" +++ "b/content/zh/docs/Container/\346\224\257\346\214\201OCI-hooks.md" @@ -1,3 +1,2 @@ # 支持OCI hooks - diff --git "a/content/zh/docs/Container/\346\231\256\351\200\232\347\224\250\346\210\267\345\244\247\351\207\217\351\203\250\347\275\262\345\256\271\345\231\250\345\234\272\346\231\257\344\270\213\347\232\204\351\205\215\347\275\256\346\263\250\346\204\217\344\272\213\351\241\271.md" "b/content/zh/docs/Container/\346\231\256\351\200\232\347\224\250\346\210\267\345\244\247\351\207\217\351\203\250\347\275\262\345\256\271\345\231\250\345\234\272\346\231\257\344\270\213\347\232\204\351\205\215\347\275\256\346\263\250\346\204\217\344\272\213\351\241\271.md" index 7c57fbcc6..8629bd774 100644 --- "a/content/zh/docs/Container/\346\231\256\351\200\232\347\224\250\346\210\267\345\244\247\351\207\217\351\203\250\347\275\262\345\256\271\345\231\250\345\234\272\346\231\257\344\270\213\347\232\204\351\205\215\347\275\256\346\263\250\346\204\217\344\272\213\351\241\271.md" +++ "b/content/zh/docs/Container/\346\231\256\351\200\232\347\224\250\346\210\267\345\244\247\351\207\217\351\203\250\347\275\262\345\256\271\345\231\250\345\234\272\346\231\257\344\270\213\347\232\204\351\205\215\347\275\256\346\263\250\346\204\217\344\272\213\351\241\271.md" @@ -1,6 +1,6 @@ # 普通用户大量部署容器场景下的配置注意事项 -普通用户在OS主机上能创建的进程数的上限,例如可以由系统中“/etc/security/limits.d/20-nproc.conf”文件对应的值决定;普通用户在容器里能创建的进程数的上限,由容器镜像中“/etc/security/limits.d/20-nproc.conf”文件对应的值决定,如下所示: +普通用户在OS主机上能创建的进程数的上限,例如:可以在系统中创建配置文件“/etc/security/limits.d/20-nproc.conf”限制;类似的,普通用户在容器里也能创建的进程数的上限,由容器镜像中“/etc/security/limits.d/20-nproc.conf”文件对应的值决定,如下所示: ``` cat /etc/security/limits.conf diff --git "a/content/zh/docs/Container/\346\232\202\345\201\234\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\346\232\202\345\201\234\345\256\271\345\231\250.md" new file mode 100644 index 000000000..7f781d7c1 --- /dev/null +++ "b/content/zh/docs/Container/\346\232\202\345\201\234\345\256\271\345\231\250.md" @@ -0,0 +1,47 @@ +# 暂停容器 + +## 描述 + +isula pause用于暂停容器中所有的进程,仅支持runtime类型为lcr的容器。 + +## 用法 + +``` +isula pause CONTAINER [CONTAINER...] +``` + +## 参数 + + +

  

+

命令行

配置文件

@@ -64,4 +65,8 @@ CNI对用户可见的接口,主要涉及CNI网络配置和Pod配置中CNI网 } ``` +   + + + diff --git "a/content/zh/docs/Container/\346\216\245\345\217\243\345\210\227\350\241\250.md" "b/content/zh/docs/Container/\346\216\245\345\217\243\345\210\227\350\241\250.md" index ccd7e5435..6573e17de 100644 --- "a/content/zh/docs/Container/\346\216\245\345\217\243\345\210\227\350\241\250.md" +++ "b/content/zh/docs/Container/\346\216\245\345\217\243\345\210\227\350\241\250.md" @@ -24,7 +24,7 @@

add-iface

说明:
  • 一个interface只能添加到1个容器中。
  • 执行结果以返回值为准(非零返回值)。
-

+

  

{

"device":"tap1",

@@ -34,7 +34,7 @@

"hwAddr":"02:42:20:6f:a2:80"

"vhostUserSocket":"/usr/local/var/run/openvswitch/vhost-user1"

}

-

+

  

device

+ + + + + + + + +

命令

+

参数

+

说明

+

pause

+

-H, --host

+

指定要连接的iSulad socket文件路径

+
+ +## 约束限制 + +- 只有状态为running的容器可以被执行pause操作 +- 当容器被pause后,无法执行其他生命周期管理操作(如restart/exec/attach/kill/stop/rm等) +- 当带有健康检查配置的容器被pause后,容器状态最终变为unhealthy状态 + +## 示例 + +暂停一个正在运行的容器,命令示例如下: + +``` +$ isula pause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac + 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac +``` + diff --git "a/content/zh/docs/Container/\346\234\200\345\244\247\345\217\245\346\237\204\346\225\260\351\231\220\345\210\266.md" "b/content/zh/docs/Container/\346\234\200\345\244\247\345\217\245\346\237\204\346\225\260\351\231\220\345\210\266.md" index 6d6305976..cc4d73633 100644 --- "a/content/zh/docs/Container/\346\234\200\345\244\247\345\217\245\346\237\204\346\225\260\351\231\220\345\210\266.md" +++ "b/content/zh/docs/Container/\346\234\200\345\244\247\345\217\245\346\237\204\346\225\260\351\231\220\345\210\266.md" @@ -18,7 +18,7 @@

isula create/run

--files-limit

-

+

  

  • 整数值,不能为负数。
  • 指定为0表示不受限制,最大值限制由当前内核files cgroup决定。

top

-

+

  

-H, --host

stats

-

-

+

  

+

  

-H, --host

inspect

-

+

  

-H, --host

ps

-

-

-

-

+

  

+

  

+

  

+

  

-a, --all

logs

-

+

  

-H, --host

说明

run

+

run

--annotation

为容器添加一个主机设备

--dns

+

添加DNS服务器

+

--dns-opt

+

添加DNS选项

+

--dns-search

+

设定容器的搜索域

+

-e, --env

设置环境变量

@@ -109,6 +124,36 @@ run命令支持参数参考下表。

打印帮助信息

--health-cmd

+

在容器内执行的命令

+

--health-exit-on-unhealthy

+

检测到容器非健康时是否杀死容器

+

--health-interval

+

相邻两次命令执行的间隔时间

+

--health-retries

+

健康检查失败最大的重试次数

+

--health-start-period

+

容器初始化时间

+

--health-timeout

+

单次检查命令执行的时间上限

+

--hook-spec

钩子配置文件

@@ -154,11 +199,21 @@ run命令支持参数参考下表。

正整数,内存 + 交换空间,-1 表示不限制

--memory-swappiness

+

正整数,swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间,默认值为-1,表示使用系统默认值。

+

--mount

挂载主机目录到容器中

--no-healthcheck

+

禁用健康检查配置

+

--name=NAME

容器名

diff --git "a/content/zh/docs/Container/\351\200\200\345\207\272CNI\347\275\221\347\273\234\345\210\227\350\241\250.md" "b/content/zh/docs/Container/\351\200\200\345\207\272CNI\347\275\221\347\273\234\345\210\227\350\241\250.md" index 23e7651d8..24bd3e54c 100644 --- "a/content/zh/docs/Container/\351\200\200\345\207\272CNI\347\275\221\347\273\234\345\210\227\350\241\250.md" +++ "b/content/zh/docs/Container/\351\200\200\345\207\272CNI\347\275\221\347\273\234\345\210\227\350\241\250.md" @@ -2,7 +2,7 @@ StopPodSandbox的时候,会调用退出CNI网络的接口,清理网络相关的资源。 ->![](public_sys-resources/icon-warning.gif) **警告:** +>![](public_sys-resources/icon-note.gif) **说明:** >1. 在调用RemovePodSandbox接口之前,至少要调用一次StopPodSandbox接口 ->2. StopPodSandbox调用CNI接口失败,导致的网络资源残留,由canal组件负责清理。 +>2. StopPodSandbox调用CNI接口失败,可能导致的网络资源残留。 diff --git "a/content/zh/docs/Container/\351\200\232\350\277\207systemd\345\220\257\345\212\250\345\256\271\345\231\250.md" "b/content/zh/docs/Container/\351\200\232\350\277\207systemd\345\220\257\345\212\250\345\256\271\345\231\250.md" index b9ee10390..43f33b3ca 100644 --- "a/content/zh/docs/Container/\351\200\232\350\277\207systemd\345\220\257\345\212\250\345\256\271\345\231\250.md" +++ "b/content/zh/docs/Container/\351\200\232\350\277\207systemd\345\220\257\345\212\250\345\256\271\345\231\250.md" @@ -33,6 +33,7 @@ - 系统容器内支持运行各类服务,服务的启停通过systemctl来管理,服务之间可能会出现相互依赖关系导致异常情况下某些服务进程出现D/Z状态,使得容器无法正常退出。 - 系统容器内的某些服务进程可能会影响其它操作结果,例如容器内若运行了NetworkManager服务,可能会影响向容器添加网卡的行为(网卡添加成功然后被NetworkManger停掉),导致不可预期的结果。 - 系统容器和主机暂时无法实现udev事件隔离,所以fstab配置也暂不支持。 +- systemd服务可能和libcgroup提供的cgconfig服务在功能上出现冲突,建议在容器内去掉libcgroup相关的包或者配置cgconfig服务的Delegate值为no。 ## 使用示例 diff --git "a/content/zh/docs/Container/\351\203\250\347\275\262\346\226\271\345\274\217.md" "b/content/zh/docs/Container/\351\203\250\347\275\262\346\226\271\345\274\217.md" index 1b57ba24f..6eae39634 100644 --- "a/content/zh/docs/Container/\351\203\250\347\275\262\346\226\271\345\274\217.md" +++ "b/content/zh/docs/Container/\351\203\250\347\275\262\346\226\271\345\274\217.md" @@ -66,9 +66,9 @@ isulad配置文件为/etc/isulad/daemon.json,各配置字段说明如下: -

配置参数

+ - @@ -76,63 +76,63 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + @@ -176,18 +202,18 @@ - - - - @@ -197,36 +223,36 @@ overlay2.basesize=${size} #等价于overlay2.size - - - - - - - - @@ -236,92 +262,92 @@ secure # 启动的容器umask值为0027(默认值) - - - - - - - - - - - - - - - - - - - - - - - - @@ -351,9 +377,9 @@

注意:如果启了一个容器A,然后启一个容器B,容器B的cgroup父路径指定为容器A的cgroup路径,在删除容器的时候需要先删除容器B再删除容器A,否则会导致cgroup资源残留。

- - - - - - - + + + + +

配置参数

配置文件示例

+

配置文件示例

参数解释

-e, --engine

+

-e, --engine

"engine": "lcr"

+

"engine": "lcr"

iSulad的运行时,默认是lcr

-G, --group

+

-G, --group

"group": "isulad"

+

"group": "isulad"

socket所属组

--hook-spec

+

--hook-spec

"hook-spec": "/etc/default/isulad/hooks/default.json"

+

"hook-spec": "/etc/default/isulad/hooks/default.json"

针对所有容器的默认钩子配置文件

-H, --host

+

-H, --host

"hosts": "unix:///var/run/isulad.sock"

+

"hosts": "unix:///var/run/isulad.sock"

通信方式

除本地socket外,还支持tcp://ip:port方式,port范围(0-65535,排除被占用端口)

--log-driver

+

--log-driver

"log-driver": "file"

+

"log-driver": "file"

日志驱动配置

-l, --log-level

+

-l, --log-level

"log-level": "ERROR"

+

"log-level": "ERROR"

设置日志输出级别

--log-opt

+

--log-opt

"log-opts": {

+

"log-opts": {

"log-file-mode": "0600",

"log-path": "/var/lib/isulad",

"max-file": "1",

@@ -144,18 +144,44 @@

可以指定max-file,max-size,log-path。max-file指日志文件个数;max-size指日志触发防爆的阈值,若max-file为1,max-size失效;log-path指定日志文件存储路径;log-file-mode用于设置日志文件的读写权限,格式要求必须为八进制格式,如0666。

--start-timeout

+

--start-timeout

"start-timeout": "2m"

+

"start-timeout": "2m"

启动容器的耗时

-p, --pidfile

+

--runtime

"pidfile": "/var/run/isulad.pid"

+

"default-runtime": "lcr"

+

创建容器时的runtime运行时,默认是lcr

+

当命令行和配置文件均未指定时,默认为lcr,runtime的三种指定方式优先级:命令行>配置文件>默认lcr,当前支持lcr、kata-runtime。

+

+
"runtimes":  {
+        "kata-runtime": {
+          "path": "/usr/bin/kata-runtime",
+          "runtime-args": [
+            "--kata-config",
+            "/usr/share/defaults/kata-containers/configuration.toml"
+          ]
+        }
+    }
+

启动容器时,通过此字段指定多runtimes配置,在此集合中的元素均为有效的启动容器的runtime运行时。

+

容器的runtime白名单,在此集合中的自定义runtime才是有效的。示例为以kata-runtime为例的配置。

+

-p, --pidfile

+

"pidfile": "/var/run/isulad.pid"

保存pid的文件

执行文件的根目录

--storage-driver

+

--storage-driver

"storage-driver": "overlay2"

+

"storage-driver": "overlay2"

镜像存储驱动,默认为overlay2

当前只支持overlay2

-s, --storage-opt

+

-s, --storage-opt

"storage-opts": [ "overlay2.override_kernel_check=true" ]

+

"storage-opts": [ "overlay2.override_kernel_check=true" ]

镜像存储驱动配置选项

--image-opt-timeout

+

--image-opt-timeout

"image-opt-timeout": "5m"

+

"image-opt-timeout": "5m"

镜像操作超时时间,默认为5m

值为-1表示不限制超时。

--registry-mirrors

+

--registry-mirrors

"registry-mirrors": [ "docker.io" ]

+

"registry-mirrors": [ "docker.io" ]

镜像仓库地址

--insecure-registry

+

--insecure-registry

"insecure-registries": [ ]

+

"insecure-registries": [ ]

不使用TLS校验的镜像仓库

--native.umask

+

--native.umask

"native.umask": "secure"

+

"native.umask": "secure"

容器umask策略,默认"secure",normal为不安全配置

--pod-sandbox-image

+

--pod-sandbox-image

"pod-sandbox-image": "rnd-dockerhub.huawei.com/library/pause-aarch64:3.0"

+

"pod-sandbox-image": "rnd-dockerhub.huawei.com/library/pause-aarch64:3.0"

pod默认使用镜像,默认为"rnd-dockerhub.huawei.com/library/pause-${machine}:3.0"

--network-plugin

+

--network-plugin

"network-plugin": ""

+

"network-plugin": ""

指定网络插件,默认为空字符,表示无网络配置,创建的sandbox只有loop网卡。

支持cni和空字符,其他非法值会导致isulad启动失败。

--cni-bin-dir

+

--cni-bin-dir

"cni-bin-dir": ""

+

"cni-bin-dir": ""

指定cni插件依赖的二进制的存储位置

默认为/opt/cni/bin

--cni-conf-dir

+

--cni-conf-dir

"cni-conf-dir": ""

+

"cni-conf-dir": ""

指定cni网络配置文件的存储位置

默认为/etc/cni/net.d

--image-layer-check=false

+

--image-layer-check=false

"image-layer-check": false

+

"image-layer-check": false

开启镜像层完整性检查功能,设置为true;关闭该功能,设置为false。默认为关闭。

isulad启动时会检查镜像层的完整性,如果镜像层被破坏,则相关的镜像不可用。isulad进行镜像完整性校验时,无法校验内容为空的文件和目录,以及链接文件。因此若镜像因掉电导致上述类型文件丢失,isulad的镜像数据完整性校验可能无法识别。isulad版本变更时需要检查是否支持该参数,如果不支持,需要从配置文件中删除。

--insecure-skip-verify-enforce=false

+

--insecure-skip-verify-enforce=false

"insecure-skip-verify-enforce": false

+

"insecure-skip-verify-enforce": false

Bool类型,是否强制跳过证书的主机名/域名验证,默认为false。当设置为true时,为不安全配置,会跳过证书的主机名/域名验证

默认为false(不跳过),注意:因isulad使用的yajl json 解析库限制,若在/etc/isulad/daemon.json配置文件中配置非Bool类型的其他符合json格式的值时,isulad将使用默认值false。

--use-decrypted-key=true

+

--use-decrypted-key=true

"use-decrypted-key": true

+

"use-decrypted-key": true

Bool类型,指定是否使用不加密的私钥。指定为true,表示使用不加密的私钥;指定为false,表示使用的为加密后的私钥,即需要进行双向认证。

默认配置为true(使用不加密的私钥),注意:因isulad使用的yajl json 解析库限制,若在/etc/isulad/daemon.json配置文件中配置非Bool类型的其他符合json格式的值时,isulad将使用默认值true。

--tls

+

--tls

"tls":false

+

"tls":false

Bool类型,是否使用TLS

默认值为false, 仅用于-H tcp://IP:PORT方式

--tlsverify

+

--tlsverify

"tlsverify":false

+

"tlsverify":false

Bool类型,是否使用TLS,并验证远程访问

仅用于-H tcp://IP:PORT方式

--tlscacert

+

--tlscacert

--tlscert

--tlskey

"tls-config": {

+

"tls-config": {

"CAFile": "/root/.iSulad/ca.pem",

"CertFile": "/root/.iSulad/server-cert.pem",

"KeyFile":"/root/.iSulad/server-key.pem"

@@ -332,18 +358,18 @@

仅用于-H tcp://IP:PORT方式

--authorization-plugin

+

--authorization-plugin

"authorization-plugin": "authz-broker"

+

"authorization-plugin": "authz-broker"

用户权限认证插件

当前只支持authz-broker

--cgroup-parent

+

--cgroup-parent

"cgroup-parent": "lxc/mycgroup"

+

"cgroup-parent": "lxc/mycgroup"

字符串类型,容器默认cgroup父路径

--default-ulimits

+

--default-ulimits

"default-ulimits": {

+

"default-ulimits": {

"nofile": {

"Name": "nofile",

"Hard": 6400,

@@ -366,16 +392,16 @@

指定限制的资源类型,如“nofile”。两个字段名字必须相同,即都为nofile,否则会报错。Hard指定的值需要大于等于Soft'。如果Hard字段或者Soft字段未设置,则默认该字段默认为0。

--websocket-server-listening-port

-

"websocket-server-listening-port": 10350

-

设置CRI websocket流式服务监听端口,默认端口号10350

-

指定CRI websocket流式服务监听端,如果客户端指定了

-

--websocket-server-listening-port,以客户端参数为准。端口范围1024-49151

-

--websocket-server-listening-port

+

"websocket-server-listening-port": 10350

+

设置CRI websocket流式服务侦听端口,默认端口号10350

+

指定CRI websocket流式服务侦听端,如果客户端指定了

+

--websocket-server-listening-port,以客户端参数为准。端口范围1024-49151

+
@@ -385,6 +411,7 @@ $ cat /etc/isulad/daemon.json { "group": "isulad", + "default-runtime": "lcr", "graph": "/var/lib/isulad", "state": "/var/run/isulad", "engine": "lcr", diff --git "a/content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-22.md" "b/content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-25.md" similarity index 94% rename from "content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-22.md" rename to "content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-25.md" index 22a5a392d..a88861d01 100644 --- "a/content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-22.md" +++ "b/content/zh/docs/Container/\351\203\250\347\275\262\351\205\215\347\275\256-25.md" @@ -1,2 +1 @@ -# 部署配置 - +# 部署配置 diff --git "a/content/zh/docs/Container/\351\205\215\347\275\256TLS\350\256\244\350\257\201\344\270\216\345\274\200\345\220\257\350\277\234\347\250\213\350\256\277\351\227\256.md" "b/content/zh/docs/Container/\351\205\215\347\275\256TLS\350\256\244\350\257\201\344\270\216\345\274\200\345\220\257\350\277\234\347\250\213\350\256\277\351\227\256.md" index 624c4ec8d..85d788847 100644 --- "a/content/zh/docs/Container/\351\205\215\347\275\256TLS\350\256\244\350\257\201\344\270\216\345\274\200\345\220\257\350\277\234\347\250\213\350\256\277\351\227\256.md" +++ "b/content/zh/docs/Container/\351\205\215\347\275\256TLS\350\256\244\350\257\201\344\270\216\345\274\200\345\220\257\350\277\234\347\250\213\350\256\277\351\227\256.md" @@ -129,6 +129,7 @@ iSulad采用C/S模式进行设计,在默认情况,iSulad守护进程isulad >- 采用RPM安装方式时,服务端配置可通过/etc/isulad/daemon.json以及/etc/sysconfig/iSulad配置修改 >- 相比非认证或者单向认证方式,双向认证具备更高的安全性,推荐使用双向认证的方式进行通讯 >- GRPC开源组件日志不由iSulad进行接管,如果需要查看GRPC相关日志,请按需设置GRPC\_VERBOSITY和GRPC\_TRACE环境变量 +>   ## 示例 diff --git "a/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250-31.md" "b/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250-31.md" new file mode 100644 index 000000000..f4da608b8 --- /dev/null +++ "b/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250-31.md" @@ -0,0 +1,46 @@ +# 配置devicemapper存储驱动 + +用户如果需要使用devicemapper存储驱动,可以通过如下两种方式显示指定。 + +- 编辑/etc/docker/daemon.json,通过storage-driver字段显示指定。 + + ``` + cat /etc/docker/daemon.json + { + "storage-driver": "devicemapper" + } + ``` + + +- 编辑/etc/sysconfig/docker-storage,通过docker deamon启动参数显示指定。 + + ``` + cat /etc/sysconfig/docker-storage + DOCKER_STORAGE_OPTIONS="--storage-driver=devicemapper" + ``` + + +## 注意事项 + +- 使用devicemapper必须使用devicemapper+direct-lvm的方式,配置的方法可以参考 [https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/\#configure-direct-lvm-mode-for-production](https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production) 。 +- 配置devicemapper时,如果系统上没有足够的空间给thinpool做自动扩容,请禁止自动扩容功能。 +- 禁止把/etc/lvm/profile/docker-thinpool.profile中如下两个值都改成100。 + + ``` + activation { + thin_pool_autoextend_threshold=80 + thin_pool_autoextend_percent=20 + } + ``` + +- 使用devicemapper时推荐加上--storage-opt dm.use\_deferred\_deletion=true --storage-opt dm.use\_deferred\_removal=true。 +- 使用devicemapper时,容器文件系统推荐使用ext4,需要在docker daemon的配置参数中加 上--storage-opt dm.fs=ext4。 +- 当graphdriver为devicemapper时,如果metadata文件损坏且不可恢复,需要人工介入恢复。禁止直接操作或篡改daemon存储devicemapper的元数据。 +- 使用devicemapper lvm时,异常掉电导致的devicemapper thinpool损坏,无法保证thinpool损坏后可以修复,也不能保证数据的完整性,需重建thinpool。 + +**docker daemon开启了user namespace特性,切换devicemapper存储池时的注意事项** + +- 一般启动容器时,deviceset-metadata文件为:/var/lib/docker/devicemapper/metadata/deviceset-metadata。 +- 使用了user namespace场景下,deviceset-metadata文件使用的是:/var/lib/docker/\{userNSUID.GID\}/devicemapper/metadata/deviceset-metadata。 +- 使用devicemapper存储驱动,容器在user namespace场景和普通场景之间切换时,需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空;针对thinpool扩容或者重建的场景下,也同样的需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空,否则docker服务会重启失败。 + diff --git "a/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250.md" "b/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250.md" index d3c904a49..eff5f5b29 100644 --- "a/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250.md" +++ "b/content/zh/docs/Container/\351\205\215\347\275\256devicemapper\345\255\230\345\202\250\351\251\261\345\212\250.md" @@ -1,46 +1,173 @@ -# 配置devicemapper存储驱动 +# 配置devicemapper存储驱动 -用户如果需要使用devicemapper存储驱动,可以通过如下两种方式显示指定。 +使用devicemapper存储驱动需要先配置一个thinpool设备,而配置thinpool需要一个独立的块设备,且该设备需要有足够的空闲空间用于创建thinpool,请用户根据实际需求确定。这里假设独立块设备为/dev/xvdf,具体的配置方法如下: -- 编辑/etc/docker/daemon.json,通过storage-driver字段显示指定。 +**一、配置thinpool** + +1. 停止isulad服务。 ``` - cat /etc/docker/daemon.json - { - "storage-driver": "devicemapper" - } + # systemctl stop isulad + ``` + +2. 基于块设备创建一个lvm卷。 + + ``` + # pvcreate /dev/xvdf + ``` + +3. 使用刚才创建的物理卷创建一个卷组。 + + ``` + # vgcreate isula /dev/xvdf + Volume group "isula" successfully created: + ``` + +4. 创建名为thinpool和thinpoolmeta的两个逻辑卷。 + + ``` + # lvcreate --wipesignatures y -n thinpool isula -l 95%VG + Logical volume "thinpool" created. + ``` + + ``` + # lvcreate --wipesignatures y -n thinpoolmeta isula -l 1%VG + Logical volume "thinpoolmeta" created. + ``` + +5. 将新创建的两个逻辑卷转换成thinpool以及thinpool所使用的metadata,这样就完成了thinpool配置。 + + ``` + # lvconvert -y --zero n -c 512K --thinpool isula/thinpool --poolmetadata isula/thinpoolmeta + + WARNING: Converting logical volume isula/thinpool and isula/thinpoolmeta to + thin pool's data and metadata volumes with metadata wiping. + THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) + Converted isula/thinpool to thin pool. ``` -- 编辑/etc/sysconfig/docker-storage,通过docker deamon启动参数显示指定。 +   + +**二、修改isulad配置文件** + +1. 如果环境之前运行过isulad,请先备份之前的数据。 ``` - cat /etc/sysconfig/docker-storage - DOCKER_STORAGE_OPTIONS="--storage-driver=devicemapper" + # mkdir /var/lib/isulad.bk + # mv /var/lib/isulad/* /var/lib/isulad.bk ``` +2. 修改配置文件 + + 这里提供了两种配置方式,用户可根据实际情况的选择合适的方式。 -## 注意事项 + - 编辑/etc/isulad/daemon.json,配置storage-driver字段值为devicemapper,并配置storage-opts字段的相关参数,支持参数请参见[参数说明](#zh-cn_topic_0222861454_section1712923715282)。配置参考如下所示: + + ``` + { + "storage-driver": "devicemapper" + "storage-opts": [ + "dm.thinpooldev=/dev/mapper/isula-thinpool", + "dm.fs=ext4", + "dm.min_free_space=10%" + ] + } + ``` + + - 或者也可以通过编辑/etc/sysconfig/iSulad,在isulad启动参数里显式指定,支持参数请参见[参数说明](#zh-cn_topic_0222861454_section1712923715282)。配置参考如下所示: + + ``` + OPTIONS="--storage-driver=devicemapper --storage-opt dm.thinpooldev=/dev/mapper/isula-thinpool --storage-opt dm.fs=ext4 --storage-opt dm.min_free_space=10%" + ``` + +3. 启动isulad,使配置生效。 + + ``` + # systemctl start isulad + ``` + + +## 参数说明 + +storage-opts 支持的参数请参见[表1](#zh-cn_topic_0222861454_table3191161993812)。 + +**表 1** starage-opts字段参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

是否必选

+

含义

+

dm.fs

+

+

用于指定容器使用的文件系统类型。当前必须配置为ext4,即dm.fs=ext4

+

dm.basesize

+

+

用于指定单个容器的最大存储空间大小,单位为k/m/g/t/p,也可以使用大写字母,例如dm.basesize=50G。该参数只在首次初始化时有效。

+

dm.mkfsarg

+

+

用于在创建基础设备时指定额外的mkfs参数。例如“dm.mkfsarg=-O ^has_journal”

+

dm.mountopt

+

+

用于在挂载容器时指定额外的mount参数。例如dm.mountopt=nodiscard

+

dm.thinpooldev

+

+

用于指定容器/镜像存储时使用的thinpool设备。

+

dm.min_free_space

+

+

用于指定最小的预留空间,用百分比表示。例如dm.min_free_space=10%,表示当剩余存储空间只剩10%左右时,创建容器等和存储相关操作就会失败。

+
+ +## 注意事项 -- 使用devicemapper必须使用devicemapper+direct-lvm的方式,配置的方法可以参考 [https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/\#configure-direct-lvm-mode-for-production](https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production) 。 - 配置devicemapper时,如果系统上没有足够的空间给thinpool做自动扩容,请禁止自动扩容功能。 -- 禁止把/etc/lvm/profile/docker-thinpool.profile中如下两个值都改成100。 + + 禁止自动扩容的方法是把/etc/lvm/profile/isula-thinpool.profile中thin\_pool\_autoextend\_threshold和thin\_pool\_autoextend\_percent两个值都改成100,如下所示: ``` activation { - thin_pool_autoextend_threshold=80 - thin_pool_autoextend_percent=20 + thin_pool_autoextend_threshold=100 + thin_pool_autoextend_percent=100 } ``` -- 使用devicemapper时推荐加上--storage-opt dm.use\_deferred\_deletion=true --storage-opt dm.use\_deferred\_removal=true。 -- 使用devicemapper时,容器文件系统推荐使用ext4,需要在docker daemon的配置参数中加 上--storage-opt dm.fs=ext4。 +- 使用devicemapper时,容器文件系统必须配置为ext4,需要在isulad的配置参数中加上--storage-opt dm.fs=ext4。 - 当graphdriver为devicemapper时,如果metadata文件损坏且不可恢复,需要人工介入恢复。禁止直接操作或篡改daemon存储devicemapper的元数据。 - 使用devicemapper lvm时,异常掉电导致的devicemapper thinpool损坏,无法保证thinpool损坏后可以修复,也不能保证数据的完整性,需重建thinpool。 -**docker daemon开启了user namespace特性,切换devicemapper存储池时的注意事项** +**iSula开启了user namespace特性,切换devicemapper存储池时的注意事项** -- 一般启动容器时,deviceset-metadata文件为:/var/lib/docker/devicemapper/metadata/deviceset-metadata。 -- 使用了user namespace场景下,deviceset-metadata文件使用的是:/var/lib/docker/\{userNSUID.GID\}/devicemapper/metadata/deviceset-metadata。 -- 使用devicemapper存储驱动,容器在user namespace场景和普通场景之间切换时,需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空;针对thinpool扩容或者重建的场景下,也同样的需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空,否则docker服务会重启失败。 +- 一般启动容器时,deviceset-metadata文件为:/var/lib/isulad/devicemapper/metadata/deviceset-metadata。 +- 使用了user namespace场景下,deviceset-metadata文件使用的是:/var/lib/isulad/\{userNSUID.GID\}/devicemapper/metadata/deviceset-metadata。 +- 使用devicemapper存储驱动,容器在user namespace场景和普通场景之间切换时,需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空;针对thinpool扩容或者重建的场景下,也同样的需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空,否则isulad服务会重启失败。 diff --git "a/content/zh/docs/Container/\351\205\215\347\275\256overlay2\345\255\230\345\202\250\351\251\261\345\212\250.md" "b/content/zh/docs/Container/\351\205\215\347\275\256overlay2\345\255\230\345\202\250\351\251\261\345\212\250.md" index 24cb0cdca..81d8878ed 100644 --- "a/content/zh/docs/Container/\351\205\215\347\275\256overlay2\345\255\230\345\202\250\351\251\261\345\212\250.md" +++ "b/content/zh/docs/Container/\351\205\215\347\275\256overlay2\345\255\230\345\202\250\351\251\261\345\212\250.md" @@ -61,6 +61,8 @@ docker默认为使用overlay2存储驱动,也可以通过如下两种方式显 容器使用配置了overlay2存储驱动的过程中,可能出现挂载点被覆盖的异常情况。例如 +   + ## 异常场景-挂载点被覆盖 挂载关系:在问题容器的挂载点的下面,存在一个/var/lib/docker/overlay2的挂载点: @@ -87,6 +89,8 @@ docker rm: Error response from daemon: driver "overlay2" failed to remove root f docker info | grep "Storage Driver" ``` +    + 2. 查询当前的挂载点: ``` diff --git "a/content/zh/docs/Container/\351\205\215\347\275\256\346\226\271\346\263\225.md" "b/content/zh/docs/Container/\351\205\215\347\275\256\346\226\271\346\263\225.md" index 2f72ca3f5..7914d708f 100644 --- "a/content/zh/docs/Container/\351\205\215\347\275\256\346\226\271\346\263\225.md" +++ "b/content/zh/docs/Container/\351\205\215\347\275\256\346\226\271\346\263\225.md" @@ -3,14 +3,14 @@ 在容器启动时的配置: ``` -isula run -itd --health-cmd "echo iSulad >> /tmp/health_check_file || exit 1" --health-interval 5m --health-timeout 3s --health-exit-on-unhealthy centos bash +isula run -itd --health-cmd "echo iSulad >> /tmp/health_check_file || exit 1" --health-interval 5m --health-timeout 3s --health-exit-on-unhealthy busybox bash ``` 可配置的选项: - --health-cmd,必选,在容器内执行的命令。返回值为0表示成功,非0表示失败。 - --health-interval,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,相邻两次命令执行的间隔时间(注:入参0s时视为default)。 -- --health-timeout,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,单次检查命令执行的时间上限,超时则任务命令执行失败(注:入参0s时视为default) +- --health-timeout,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,单次检查命令执行的时间上限,超时则任务命令执行失败(注:入参0s时视为default),仅支持runtime类型为lcr的容器。 - --health-start-period,默认 0s,最大为int64上限(纳秒),自定义配置最小值1s,容器初始化时间。 - --health-retries,默认 3,最大为int32上限,健康检查失败最大的重试次数。 - --health-exit-on-unhealthy,默认false,检测到容器非健康时是否杀死容器。 diff --git "a/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-30.md" "b/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-34.md" similarity index 96% rename from "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-30.md" rename to "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-34.md" index fd2536e34..b59d41dc3 100644 --- "a/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-30.md" +++ "b/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-34.md" @@ -1,2 +1,2 @@ -# 镜像管理 - +# 镜像管理 + diff --git "a/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-33.md" "b/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-37.md" similarity index 94% rename from "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-33.md" rename to "content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-37.md" index 6e535107a..f015f51d5 100644 --- "a/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-33.md" +++ "b/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206-37.md" @@ -1,2 +1,5 @@ -# 镜像管理 - +# 镜像管理 + + + + diff --git "a/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206.md" "b/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206.md" index 1df655bac..79dca6812 100644 --- "a/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206.md" +++ "b/content/zh/docs/Container/\351\225\234\345\203\217\347\256\241\347\220\206.md" @@ -1 +1,3 @@ # 镜像管理 + + diff --git "a/content/zh/docs/Container/\351\231\204\345\275\225-19.md" "b/content/zh/docs/Container/\351\231\204\345\275\225-22.md" similarity index 93% rename from "content/zh/docs/Container/\351\231\204\345\275\225-19.md" rename to "content/zh/docs/Container/\351\231\204\345\275\225-22.md" index c8ba7c3c4..1cc9321be 100644 --- "a/content/zh/docs/Container/\351\231\204\345\275\225-19.md" +++ "b/content/zh/docs/Container/\351\231\204\345\275\225-22.md" @@ -1,2 +1 @@ -# 附录 - +# 附录 diff --git "a/content/zh/docs/Container/\351\231\204\345\275\225-25.md" "b/content/zh/docs/Container/\351\231\204\345\275\225-28.md" similarity index 93% rename from "content/zh/docs/Container/\351\231\204\345\275\225-25.md" rename to "content/zh/docs/Container/\351\231\204\345\275\225-28.md" index 0248916ca..02ace2a31 100644 --- "a/content/zh/docs/Container/\351\231\204\345\275\225-25.md" +++ "b/content/zh/docs/Container/\351\231\204\345\275\225-28.md" @@ -1,2 +1 @@ -# 附录 - +# 附录 diff --git "a/content/zh/docs/Container/\351\231\204\345\275\225.md" "b/content/zh/docs/Container/\351\231\204\345\275\225.md" index f31176ae4..cad6a4c02 100644 --- "a/content/zh/docs/Container/\351\231\204\345\275\225.md" +++ "b/content/zh/docs/Container/\351\231\204\345\275\225.md" @@ -1,5 +1 @@ # 附录 - - - - diff --git "a/content/zh/docs/Container/\351\231\220\345\210\266Blkio\350\265\204\346\272\220.md" "b/content/zh/docs/Container/\351\231\220\345\210\266Blkio\350\265\204\346\272\220.md" index 91226fb96..e9337eb50 100644 --- "a/content/zh/docs/Container/\351\231\220\345\210\266Blkio\350\265\204\346\272\220.md" +++ "b/content/zh/docs/Container/\351\231\220\345\210\266Blkio\350\265\204\346\272\220.md" @@ -57,7 +57,7 @@ 举例: ``` - docker run -tid --runtime kata-runtime --network none --annotation com.github.containers.virtcontainers.blkio_cgroup='{"blkiocgroup":[{"path":"/dev/sda","limits":[{"type":"throttle_read_bps","value":400},{"type":"throttle_write_bps","value":400},{"type":"throttle_read_iops","value":700},{"type":"throttle_write_iops","value":699}]},{"limits":[{"type":"blkio_weight","value":78}]}]}' rnd-dockerhub.huawei.com/official/pause + docker run -tid --runtime kata-runtime --network none --annotation com.github.containers.virtcontainers.blkio_cgroup='{"blkiocgroup":[{"path":"/dev/sda","limits":[{"type":"throttle_read_bps","value":400},{"type":"throttle_write_bps","value":400},{"type":"throttle_read_iops","value":700},{"type":"throttle_write_iops","value":699}]},{"limits":[{"type":"blkio_weight","value":78}]}]}' busybox sleep 999999 ``` 上面命令表示对启动的安全容器所使用的/dev/sda磁盘进行blkio限流,分别将throttle\_read\_bps限速为400bps,throttle\_write\_bps限速为400bps,throttle\_read\_iops限速为700次/秒,throttle\_write\_iops限速为699次/秒,以及所在blkio cgroup组的权重值设置为78。 diff --git "a/content/zh/docs/Container/\351\231\220\345\210\266CPU\350\265\204\346\272\220.md" "b/content/zh/docs/Container/\351\231\220\345\210\266CPU\350\265\204\346\272\220.md" index 7f7450b6f..14418ca70 100644 --- "a/content/zh/docs/Container/\351\231\220\345\210\266CPU\350\265\204\346\272\220.md" +++ "b/content/zh/docs/Container/\351\231\220\345\210\266CPU\350\265\204\346\272\220.md" @@ -12,7 +12,7 @@ ``` # 启动一个pause容器 - docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_cpu=4 ubuntu-arm64 bash + docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_cpu=4 busybox sleep 999999 be3255a3f66a35508efe419bc52eccd3b000032b9d8c9c62df611d5bdc115954 # 进入容器查看CPU信息,查看CPU个数是否与com.github.containers.virtcontainers.sandbox_cpu配置的CPU个数相等 @@ -90,7 +90,7 @@ ``` # 启动一个pause容器,轻量级虚机默认分配了1个vcpu - docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox ubuntu bash + docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox busybox sleep 999999 77b40fb72f63b11dd3fcab2f6dabfc7768295fced042af8c7ad9c0286b17d24f # 查看启动完pause容器后轻量级虚机中CPU个数 @@ -105,7 +105,7 @@ Socket(s): 1 # 在同一个Pod中启动新的容器并通过--cpus设置容器需要的CPU数量为4 - docker run -tid --runtime kata-runtime --network none --cpus 4 --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id=77b40fb72f63b11dd3fcab2f6dabfc7768295fced042af8c7ad9c0286b17d24f ubuntu bash + docker run -tid --runtime kata-runtime --network none --cpus 4 --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id=77b40fb72f63b11dd3fcab2f6dabfc7768295fced042af8c7ad9c0286b17d24f busybox sleep 999999 7234d666851d43cbdc41da356bf62488b89cd826361bb71d585a049b6cedafd3 # 查看当前轻量级虚机中CPU的个数 @@ -134,6 +134,10 @@ Socket(s): 1 ``` +    + +    + >![](public_sys-resources/icon-note.gif) **说明:** >由于pause容器只是一个占位容器没有工作负载,所以轻量级虚机启动时默认分配的1个CPU可以被其它容器共享,因此上面例子中启动的新容器只需要再热插3个CPU到轻量级虚机中即可。 diff --git "a/content/zh/docs/Container/\351\231\220\345\210\266\345\206\205\345\255\230\350\265\204\346\272\220.md" "b/content/zh/docs/Container/\351\231\220\345\210\266\345\206\205\345\255\230\350\265\204\346\272\220.md" index f7b93ba1a..7ba420485 100644 --- "a/content/zh/docs/Container/\351\231\220\345\210\266\345\206\205\345\255\230\350\265\204\346\272\220.md" +++ "b/content/zh/docs/Container/\351\231\220\345\210\266\345\206\205\345\255\230\350\265\204\346\272\220.md" @@ -12,7 +12,7 @@ ``` # 启动一个pause容器,通过--annotation com.github.containers.virtcontainers.sandbox_mem=4G为轻量级虚机分配4G内存 - docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_mem=4G ubuntu-arm64 bash + docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_mem=4G busybox sleep 999999 1532c3e59e7a45cd6b419aa1db07dd0069b0cdd93097f8944177a25e457e4297 # 查看轻量级虚机中内存信息,查看内存大小是否与com.github.containers.virtcontainers.sandbox_mem配置的内存大小相等 @@ -60,7 +60,7 @@ ``` # 启动一个pause容器,轻量级虚机默认分配了1GB内存 - docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox ubuntu bash + docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox busybox sleep 999999 99b78508ada3fa7dcbac457bb0f6e3784e64e7f7131809344c5496957931119f # 查看启动完pause容器后轻量级虚机中的内存大小 @@ -70,7 +70,7 @@ Swap: 0 0 0 # 在同一个Pod中启动新的容器并通过-m设置容器需要的内存大小为4G - docker run -tid --runtime kata-runtime --network none -m 4G --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id=99b78508ada3fa7dcbac457bb0f6e3784e64e7f7131809344c5496957931119f ubuntu bash + docker run -tid --runtime kata-runtime --network none -m 4G --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id=99b78508ada3fa7dcbac457bb0f6e3784e64e7f7131809344c5496957931119f busybox sleep 999999 c49461745a712b2ef3127fdf43b2cbb034b7614e6060b13db12b7a5ff3c830c8 # 查看当前轻量级虚机中内存的大小 diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index 092699111..46c0a1e49 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -349,13 +349,17 @@ headless: true - [概述]({{< relref "/docs/Container/概述.md" >}}) - [安装与部署]({{< relref "/docs/Container/安装与部署.md" >}}) - [安装方法]({{< relref "/docs/Container/安装方法.md" >}}) + - [升级方法]({{< relref "/docs/Container/升级方法.md" >}}) - [部署配置]({{< relref "/docs/Container/部署配置.md" >}}) - [部署方式]({{< relref "/docs/Container/部署方式.md" >}}) - [存储说明]({{< relref "/docs/Container/存储说明.md" >}}) - [约束限制]({{< relref "/docs/Container/约束限制.md" >}}) - [DAEMON多端口的绑定]({{< relref "/docs/Container/DAEMON多端口的绑定.md" >}}) - [配置TLS认证与开启远程访问]({{< relref "/docs/Container/配置TLS认证与开启远程访问.md" >}}) + - [配置devicemapper存储驱动]({{< relref "/docs/Container/配置devicemapper存储驱动.md" >}}) + - [卸载]({{< relref "/docs/Container/卸载.md" >}}) + - [使用方法]({{< relref "/docs/Container/使用方法.md" >}}) - [容器管理]({{< relref "/docs/Container/容器管理.md" >}}) - [创建容器]({{< relref "/docs/Container/创建容器.md" >}}) @@ -375,13 +379,19 @@ headless: true - [查看容器使用的资源]({{< relref "/docs/Container/查看容器使用的资源.md" >}}) - [获取容器日志]({{< relref "/docs/Container/获取容器日志.md" >}}) - [容器与主机之间数据拷贝]({{< relref "/docs/Container/容器与主机之间数据拷贝.md" >}}) + - [暂停容器]({{< relref "/docs/Container/暂停容器.md" >}}) + - [恢复容器]({{< relref "/docs/Container/恢复容器.md" >}}) + - [从服务端实时获取事件消息]({{< relref "/docs/Container/从服务端实时获取事件消息.md" >}}) + - [支持CNI网络]({{< relref "/docs/Container/支持CNI网络.md" >}}) - [描述]({{< relref "/docs/Container/描述.md" >}}) - [接口]({{< relref "/docs/Container/接口.md" >}}) - [CNI网络配置说明]({{< relref "/docs/Container/CNI网络配置说明.md" >}}) - [加入CNI网络列表]({{< relref "/docs/Container/加入CNI网络列表.md" >}}) - [退出CNI网络列表]({{< relref "/docs/Container/退出CNI网络列表.md" >}}) + - [使用限制]({{< relref "/docs/Container/使用限制.md" >}}) + - [容器资源管理]({{< relref "/docs/Container/容器资源管理.md" >}}) - [资源的共享]({{< relref "/docs/Container/资源的共享.md" >}}) - [限制运行时的CPU资源]({{< relref "/docs/Container/限制运行时的CPU资源.md" >}}) @@ -391,10 +401,12 @@ headless: true - [限制容器内文件句柄数]({{< relref "/docs/Container/限制容器内文件句柄数.md" >}}) - [限制容器内可以创建的进程/线程数]({{< relref "/docs/Container/限制容器内可以创建的进程-线程数.md" >}}) - [配置容器内的ulimit值]({{< relref "/docs/Container/配置容器内的ulimit值.md" >}}) + - [特权容器]({{< relref "/docs/Container/特权容器.md" >}}) - [场景说明]({{< relref "/docs/Container/场景说明.md" >}}) - [使用限制]({{< relref "/docs/Container/使用限制-0.md" >}}) - [使用指导]({{< relref "/docs/Container/使用指导.md" >}}) + - [CRI接口]({{< relref "/docs/Container/CRI接口.md" >}}) - [描述]({{< relref "/docs/Container/描述-1.md" >}}) - [接口]({{< relref "/docs/Container/接口-2.md" >}}) @@ -412,20 +424,23 @@ headless: true - [ContainerStatus]({{< relref "/docs/Container/ContainerStatus.md" >}}) - [UpdateContainerResources]({{< relref "/docs/Container/UpdateContainerResources.md" >}}) - [ExecSync]({{< relref "/docs/Container/ExecSync.md" >}}) - - [Exec]({{< relref "/docs/Container/Exec.md" >}}) - - [Attach]({{< relref "/docs/Container/Attach.md" >}}) - - [PortForward]({{< relref "/docs/Container/PortForward.md" >}}) + - [Exec]({{< relref "/docs/Container/Exec-1.md" >}}) + - [Attach]({{< relref "/docs/Container/Attach-1.md" >}}) - [ContainerStats]({{< relref "/docs/Container/ContainerStats.md" >}}) - [ListContainerStats]({{< relref "/docs/Container/ListContainerStats.md" >}}) - [UpdateRuntimeConfig]({{< relref "/docs/Container/UpdateRuntimeConfig.md" >}}) - [Status]({{< relref "/docs/Container/Status.md" >}}) + - [Image服务]({{< relref "/docs/Container/Image服务.md" >}}) - [ListImages]({{< relref "/docs/Container/ListImages.md" >}}) - [ImageStatus]({{< relref "/docs/Container/ImageStatus.md" >}}) - [PullImage]({{< relref "/docs/Container/PullImage.md" >}}) - [RemoveImage]({{< relref "/docs/Container/RemoveImage.md" >}}) - [ImageFsInfo]({{< relref "/docs/Container/ImageFsInfo.md" >}}) + + - [约束]({{< relref "/docs/Container/约束.md" >}}) + - [镜像管理]({{< relref "/docs/Container/镜像管理.md" >}}) - [docker镜像管理]({{< relref "/docs/Container/docker镜像管理.md" >}}) - [登录到镜像仓库]({{< relref "/docs/Container/登录到镜像仓库.md" >}}) @@ -436,37 +451,54 @@ headless: true - [列出镜像]({{< relref "/docs/Container/列出镜像.md" >}}) - [检视镜像]({{< relref "/docs/Container/检视镜像.md" >}}) - [双向认证]({{< relref "/docs/Container/双向认证.md" >}}) + - [embedded镜像管理]({{< relref "/docs/Container/embedded镜像管理.md" >}}) - [加载镜像]({{< relref "/docs/Container/加载镜像-3.md" >}}) - [列出镜像]({{< relref "/docs/Container/列出镜像-4.md" >}}) - [检视镜像]({{< relref "/docs/Container/检视镜像-5.md" >}}) - [删除镜像]({{< relref "/docs/Container/删除镜像-6.md" >}}) + + - [容器健康状态检查]({{< relref "/docs/Container/容器健康状态检查.md" >}}) - [场景说明]({{< relref "/docs/Container/场景说明-7.md" >}}) - [配置方法]({{< relref "/docs/Container/配置方法.md" >}}) - [检查规则]({{< relref "/docs/Container/检查规则.md" >}}) - [使用限制]({{< relref "/docs/Container/使用限制-8.md" >}}) + - [查询信息]({{< relref "/docs/Container/查询信息.md" >}}) - [查询服务版本信息]({{< relref "/docs/Container/查询服务版本信息.md" >}}) - [查询系统级信息]({{< relref "/docs/Container/查询系统级信息.md" >}}) + - [安全特性]({{< relref "/docs/Container/安全特性.md" >}}) - [seccomp安全配置场景]({{< relref "/docs/Container/seccomp安全配置场景.md" >}}) - [场景说明]({{< relref "/docs/Container/场景说明-9.md" >}}) - [使用限制]({{< relref "/docs/Container/使用限制-10.md" >}}) - [使用指导]({{< relref "/docs/Container/使用指导-11.md" >}}) + - [capabilities安全配置场景]({{< relref "/docs/Container/capabilities安全配置场景.md" >}}) - [场景说明]({{< relref "/docs/Container/场景说明-12.md" >}}) - [使用限制]({{< relref "/docs/Container/使用限制-13.md" >}}) - [使用指导]({{< relref "/docs/Container/使用指导-14.md" >}}) + + - [SELinux安全配置场景]({{< relref "/docs/Container/SELinux安全配置场景.md" >}}) + - [场景说明]({{< relref "/docs/Container/场景说明-15.md" >}}) + - [使用限制]({{< relref "/docs/Container/使用限制-16.md" >}}) + - [使用指导]({{< relref "/docs/Container/使用指导-17.md" >}}) + + - [支持OCI hooks]({{< relref "/docs/Container/支持OCI-hooks.md" >}}) - - [描述]({{< relref "/docs/Container/描述-15.md" >}}) - - [接口]({{< relref "/docs/Container/接口-16.md" >}}) - - [使用限制]({{< relref "/docs/Container/使用限制-17.md" >}}) + - [描述]({{< relref "/docs/Container/描述-18.md" >}}) + - [接口]({{< relref "/docs/Container/接口-19.md" >}}) + - [使用限制]({{< relref "/docs/Container/使用限制-20.md" >}}) + + - [附录]({{< relref "/docs/Container/附录.md" >}}) - [命令行参数说明]({{< relref "/docs/Container/命令行参数说明.md" >}}) - [CNI配置参数]({{< relref "/docs/Container/CNI配置参数.md" >}}) + + - [系统容器]({{< relref "/docs/Container/系统容器.md" >}}) - - [概述]({{< relref "/docs/Container/概述-18.md" >}}) + - [概述]({{< relref "/docs/Container/概述-21.md" >}}) - [安装指导]({{< relref "/docs/Container/安装指导.md" >}}) - [使用指南]({{< relref "/docs/Container/使用指南.md" >}}) - [简介]({{< relref "/docs/Container/简介.md" >}}) @@ -483,40 +515,53 @@ headless: true - [user namespace多对多]({{< relref "/docs/Container/user-namespace多对多.md" >}}) - [用户权限控制]({{< relref "/docs/Container/用户权限控制.md" >}}) - [proc文件系统隔离(lxcfs)]({{< relref "/docs/Container/proc文件系统隔离(lxcfs).md" >}}) - - [容器资源动态管理(isulad-tools)]({{< relref "/docs/Container/容器资源动态管理(isulad-tools).md" >}}) + + - [容器资源动态管理(syscontainer-tools)]({{< relref "/docs/Container/容器资源动态管理(syscontainer-tools).md" >}}) - [设备管理]({{< relref "/docs/Container/设备管理.md" >}}) - [网卡管理]({{< relref "/docs/Container/网卡管理.md" >}}) - [路由管理]({{< relref "/docs/Container/路由管理.md" >}}) - [挂卷管理]({{< relref "/docs/Container/挂卷管理.md" >}}) - - [附录]({{< relref "/docs/Container/附录-19.md" >}}) + + + - [附录]({{< relref "/docs/Container/附录-22.md" >}}) - [命令行接口列表]({{< relref "/docs/Container/命令行接口列表.md" >}}) + + - [安全容器]({{< relref "/docs/Container/安全容器.md" >}}) - - [概述]({{< relref "/docs/Container/概述-20.md" >}}) + - [概述]({{< relref "/docs/Container/概述-23.md" >}}) - [安装部署]({{< relref "/docs/Container/安装部署.md" >}}) - - [安装方法]({{< relref "/docs/Container/安装方法-21.md" >}}) - - [部署配置]({{< relref "/docs/Container/部署配置-22.md" >}}) + - [安装方法]({{< relref "/docs/Container/安装方法-24.md" >}}) + - [部署配置]({{< relref "/docs/Container/部署配置-25.md" >}}) - [docker-engine容器引擎的配置]({{< relref "/docs/Container/docker-engine容器引擎的配置.md" >}}) + - [iSula容器引擎的配置]({{< relref "/docs/Container/iSula容器引擎的配置.md" >}}) - [安全容器全局配置文件configuration.toml]({{< relref "/docs/Container/安全容器全局配置文件configuration-toml.md" >}}) - - [使用方法]({{< relref "/docs/Container/使用方法-23.md" >}}) + + + - [使用方法]({{< relref "/docs/Container/使用方法-26.md" >}}) - [管理安全容器的生命周期]({{< relref "/docs/Container/管理安全容器的生命周期.md" >}}) - [启动安全容器]({{< relref "/docs/Container/启动安全容器.md" >}}) - [停止安全容器]({{< relref "/docs/Container/停止安全容器.md" >}}) - [删除安全容器]({{< relref "/docs/Container/删除安全容器.md" >}}) - [在容器中执行一条新的命令]({{< relref "/docs/Container/在容器中执行一条新的命令.md" >}}) + - [为安全容器配置资源]({{< relref "/docs/Container/为安全容器配置资源.md" >}}) - - [资源的共享]({{< relref "/docs/Container/资源的共享-24.md" >}}) + - [资源的共享]({{< relref "/docs/Container/资源的共享-27.md" >}}) - [限制CPU资源]({{< relref "/docs/Container/限制CPU资源.md" >}}) - [限制内存资源]({{< relref "/docs/Container/限制内存资源.md" >}}) - [限制Blkio资源]({{< relref "/docs/Container/限制Blkio资源.md" >}}) - [限制文件描述符资源]({{< relref "/docs/Container/限制文件描述符资源.md" >}}) + - [为安全容器配置网络]({{< relref "/docs/Container/为安全容器配置网络.md" >}}) - [监控安全容器]({{< relref "/docs/Container/监控安全容器.md" >}}) - - [附录]({{< relref "/docs/Container/附录-25.md" >}}) + + - [附录]({{< relref "/docs/Container/附录-28.md" >}}) - [configuration.toml配置说明]({{< relref "/docs/Container/configuration-toml配置说明.md" >}}) - [接口列表]({{< relref "/docs/Container/接口列表.md" >}}) + + - [Docker容器]({{< relref "/docs/Container/Docker容器.md" >}}) - - [概述]({{< relref "/docs/Container/概述-26.md" >}}) - - [安装部署]({{< relref "/docs/Container/安装部署-27.md" >}}) + - [概述]({{< relref "/docs/Container/概述-29.md" >}}) + - [安装部署]({{< relref "/docs/Container/安装部署-30.md" >}}) - [安装配置介绍及注意事项]({{< relref "/docs/Container/安装配置介绍及注意事项.md" >}}) - [基本安装配置]({{< relref "/docs/Container/基本安装配置.md" >}}) - [配置daemon参数]({{< relref "/docs/Container/配置daemon参数.md" >}}) @@ -531,35 +576,42 @@ headless: true - [安全配置seccomp]({{< relref "/docs/Container/安全配置seccomp.md" >}}) - [禁止修改docker daemon的私有目录]({{< relref "/docs/Container/禁止修改docker-daemon的私有目录.md" >}}) - [普通用户大量部署容器场景下的配置注意事项]({{< relref "/docs/Container/普通用户大量部署容器场景下的配置注意事项.md" >}}) + - [存储驱动配置]({{< relref "/docs/Container/存储驱动配置.md" >}}) - [配置overlay2存储驱动]({{< relref "/docs/Container/配置overlay2存储驱动.md" >}}) - - [配置devicemapper存储驱动]({{< relref "/docs/Container/配置devicemapper存储驱动.md" >}}) + - [配置devicemapper存储驱动]({{< relref "/docs/Container/配置devicemapper存储驱动-31.md" >}}) + - [强杀docker相关后台进程的影响]({{< relref "/docs/Container/强杀docker相关后台进程的影响.md" >}}) - [信号量残留]({{< relref "/docs/Container/信号量残留.md" >}}) - [网卡残留]({{< relref "/docs/Container/网卡残留.md" >}}) - [重启容器失败]({{< relref "/docs/Container/重启容器失败.md" >}}) - [服务无法正常重启]({{< relref "/docs/Container/服务无法正常重启.md" >}}) + - [系统掉电影响]({{< relref "/docs/Container/系统掉电影响.md" >}}) - - [容器管理]({{< relref "/docs/Container/容器管理-28.md" >}}) - - [创建容器]({{< relref "/docs/Container/创建容器-29.md" >}}) + + + - [容器管理]({{< relref "/docs/Container/容器管理-32.md" >}}) + - [创建容器]({{< relref "/docs/Container/创建容器-33.md" >}}) - [创建容器使用hook-spec]({{< relref "/docs/Container/创建容器使用hook-spec.md" >}}) - [创建容器配置健康检查]({{< relref "/docs/Container/创建容器配置健康检查.md" >}}) - [停止与删除容器]({{< relref "/docs/Container/停止与删除容器.md" >}}) - [容器信息查询]({{< relref "/docs/Container/容器信息查询.md" >}}) - [修改操作]({{< relref "/docs/Container/修改操作.md" >}}) - - [镜像管理]({{< relref "/docs/Container/镜像管理-30.md" >}}) + + - [镜像管理]({{< relref "/docs/Container/镜像管理-34.md" >}}) - [创建镜像]({{< relref "/docs/Container/创建镜像.md" >}}) - [查看镜像]({{< relref "/docs/Container/查看镜像.md" >}}) - - [删除镜像]({{< relref "/docs/Container/删除镜像-31.md" >}}) + - [删除镜像]({{< relref "/docs/Container/删除镜像-35.md" >}}) + - [命令行参考]({{< relref "/docs/Container/命令行参考.md" >}}) - [容器引擎]({{< relref "/docs/Container/容器引擎.md" >}}) - - [容器管理]({{< relref "/docs/Container/容器管理-32.md" >}}) - - [attach]({{< relref "/docs/Container/attach-1.md" >}}) + - [容器管理]({{< relref "/docs/Container/容器管理-36.md" >}}) + - [attach]({{< relref "/docs/Container/attach.md" >}}) - [commit]({{< relref "/docs/Container/commit.md" >}}) - [cp]({{< relref "/docs/Container/cp.md" >}}) - [create]({{< relref "/docs/Container/create.md" >}}) - [diff]({{< relref "/docs/Container/diff.md" >}}) - - [exec]({{< relref "/docs/Container/exec-1.md" >}}) + - [exec]({{< relref "/docs/Container/exec.md" >}}) - [export]({{< relref "/docs/Container/export.md" >}}) - [inspect]({{< relref "/docs/Container/inspect.md" >}}) - [logs]({{< relref "/docs/Container/logs.md" >}}) @@ -576,7 +628,8 @@ headless: true - [top]({{< relref "/docs/Container/top.md" >}}) - [update]({{< relref "/docs/Container/update.md" >}}) - [wait]({{< relref "/docs/Container/wait.md" >}}) - - [镜像管理]({{< relref "/docs/Container/镜像管理-33.md" >}}) + + - [镜像管理]({{< relref "/docs/Container/镜像管理-37.md" >}}) - [build]({{< relref "/docs/Container/build.md" >}}) - [history]({{< relref "/docs/Container/history.md" >}}) - [images]({{< relref "/docs/Container/images.md" >}}) @@ -590,6 +643,7 @@ headless: true - [save]({{< relref "/docs/Container/save.md" >}}) - [search]({{< relref "/docs/Container/search.md" >}}) - [tag]({{< relref "/docs/Container/tag.md" >}}) + - [统计信息]({{< relref "/docs/Container/统计信息.md" >}}) - [events]({{< relref "/docs/Container/events.md" >}}) - [info]({{< relref "/docs/Container/info.md" >}}) -- Gitee

cDCnxbbDGP@ej$`~CECE2YDcwi>yymCQMHOAn!j<61OpKlrcu`>QW_MpM( z;S>+|8)Y4V@pt_P>JckTJgd&a!tLt!?5`TI^?e*GH6f;S9_)`Z-#!8o5Q1qHa$>E9p@EIuS@rh#2W9;+r5Cg%I2Pq4jeoW|% zL*EB_ZD>`%Z-el(D5LSXF!eY=R7VPY20?Yh1OPwh3cG!533yrH+>i@*Tc@j7EZ*yB zhuVDr))`oX;A@M(F54e=*~1!~a2)`@f!yc{yaN8U2-Lm@@0c{61s>Mf3zxO}gv8j| zZ^HWgPL$8CKap>NULg!h2WnYh!D${7as$oi(m+os`xd+tMPkvKlkXFTd5+42{tJRn zxLv+51(Kj;Tp7AP_o^RIw{reRsDi#p8+=o5o{rBYe3Exp@a%b-DRi#oDBQjV=Z*jj zDllXC&<%Y-1BT~iWU#ZpdUOqXk?c3h!?cl{Vg83 zeViQ2AA5T|No>2xr2$#cHuIc?nvX7NPHoLv?;` zX;2C$W&Cm0;mRMcG diff --git "a/content/zh/docs/Virtualization/figures/\350\231\232\346\213\237\345\214\226\346\236\266\346\236\204.png" "b/content/zh/docs/Virtualization/figures/\350\231\232\346\213\237\345\214\226\346\236\266\346\236\204.png" index f187c3d3de35a19cf836f11dc1cc98c9a85787a9..bd90a00d1fbe4d8356ec0dec3106c10dafd46950 100644 GIT binary patch literal 14455 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 diff --git "a/content/zh/docs/Virtualization/figures/\350\231\232\346\213\237\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" "b/content/zh/docs/Virtualization/figures/\350\231\232\346\213\237\347\275\221\347\273\234\347\273\223\346\236\204\345\233\276.png" index df08bb408415d539ce524478337b4c7a76d49e58..af5b2c44fe451371fb16115df15ae8ea8a723e28 100644 GIT binary patch literal 16684 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 M@lYq8NBt0-}=Z$CdYh8lU}N-wSTR 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 Y%t_hxhZFUpz`IW9>lojz)UuEIUlWuCJpcdz diff --git a/content/zh/docs/Virtualization/halt-polling.md b/content/zh/docs/Virtualization/halt-polling.md index 0e35339eb..b1052024f 100644 --- a/content/zh/docs/Virtualization/halt-polling.md +++ b/content/zh/docs/Virtualization/halt-polling.md @@ -2,14 +2,16 @@ ## 概述 -在计算资源充足的情况下,为使虚拟机获得接近物理机的性能,可以使用halt-polling特性。此时vCPU因halt触发vm-exit后,并不会立即调用scheduler,把计算资源让给其他主机侧进程;而是会根据配置先polling一段时间,若该vCPU在polling期间被唤醒,那么vCPU可以直接vm-entry执行Guest任务,而不用从主机侧的idle进程唤醒,减少了调度流程的开销,一定程度上提高了虚拟机系统的性能。 +在计算资源充足的情况下,为使虚拟机获得接近物理机的性能,可以使用halt-polling特性。没有使用halt-polling特性时,当vCPU空闲退出后,主机会把CPU资源分配给其他进程使用。当主机开启halt-polling特性时,虚拟机vCPU处于空闲时会polling一段时间,polling的时间由具体配置决定。若该vCPU在polling期间被唤醒,可以不从主机侧调度而继续运行,减少了调度流程的开销,从而在一定程度上提高了虚拟机系统的性能。 >![](public_sys-resources/icon-note.gif) **说明:** >halt-polling的机制保证虚拟机的vCPU线程的及时响应,但在虚拟机空载的时候,主机侧也会polling,导致主机看到vCPU所在CPU占用率比较高,而实际虚拟机内部CPU占用率并不高。 -## 操作步骤 +## 操作指导 -通过sysfs可以动态修改vCPU用于halt-polling的时间,默认配置为500000,单位为ns。 +系统默认开启了halt-polling特性,polling的时间默认为500000ns。用户可以通过文件halt\_poll\_ns内容动态修改vCPU用于halt-polling的时间,单位为ns。 + +例如设置polling时间为400000的命令如下: ``` # echo 400000 > /sys/module/kvm/parameters/halt_poll_ns diff --git "a/content/zh/docs/Virtualization/kworker\351\232\224\347\246\273\347\273\221\345\256\232.md" "b/content/zh/docs/Virtualization/kworker\351\232\224\347\246\273\347\273\221\345\256\232.md" new file mode 100644 index 000000000..2ae0aadd1 --- /dev/null +++ "b/content/zh/docs/Virtualization/kworker\351\232\224\347\246\273\347\273\221\345\256\232.md" @@ -0,0 +1,14 @@ +# kworker隔离绑定 + +## 概述 + +kworker是Linux内核实现的per-CPU线程,用来执行系统中的workqueue请求。kworker线程会和vCPU线程争抢物理核资源,导致虚拟化业务性能抖动。为了使虚拟机能够稳定的运行,减少kworker线程对虚拟机的干扰,可以将主机上的kworker线程绑定到特定的CPU上运行。 + +## 操作步骤 + +用户可以通过修改/sys/devices/virtual/workqueue/cpumask文件,将workqueue中的任务绑定到cpumask中指定的CPU上。cpumask中的掩码以十六进制表示,例如将kworker绑定到CPU0\~CPU7上,对应掩码为ff,修改的命令如下: + +``` +# echo ff > /sys/devices/virtual/workqueue/cpumask +``` + diff --git a/content/zh/docs/Virtualization/qemu-ga.md b/content/zh/docs/Virtualization/qemu-ga.md new file mode 100644 index 000000000..b4cd454a5 --- /dev/null +++ b/content/zh/docs/Virtualization/qemu-ga.md @@ -0,0 +1,63 @@ +# qemu-ga + +## 概述 + +qemu-ga(Qemu Guest Agent)它是运行在虚拟机内部的守护进程,它允许用户在host OS上通过QEMU提供带外通道实现对guest OS的多种管理操作:包括文件操作(open、read、write、close,seek、flush等)、内部关机、虚拟机休眠(suspend-disk、suspend-ram、suspend-hybrid),获取虚拟机内部的信息(包括内存,CPU,网卡,OS等相关信息 )等。 + +在一些对安全要求较高的使用场景,为了防止虚拟机内部信息泄露,qemu-ga提供了黑名单功能,用户可以通过黑名单选择性屏蔽qemu-ga提供的部分功能。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>qemu-ga对应的安装包是qemu-guest-agent-xx.rpm,openEuler默认不安装。xx为实际版本号。 + +## 操作方法 + +添加qemu-ga黑名单的操作步骤如下: + +1. 登录虚拟机,确定qemu-guest-agent服务存在且处于运行状态。 + + ``` + # systemctl status qemu-guest-agent |grep Active + Active: active (running) since Wed 2018-03-28 08:17:33 CST; 9h ago + ``` + +2. 查询qemu-ga哪些命令可以加入黑名单: + + ``` + # qemu-ga --blacklist ? + guest-sync-delimited + guest-sync + guest-ping + guest-get-time + guest-set-time + guest-info + ... + ``` + + +1. 设置黑名单。通过修改/usr/lib/systemd/system/qemu-guest-agent.service,将需要屏蔽的命令添加到该文件的--blacklist中,不同命令使用空格分隔。例如将guest-file-open和guest-file-close命令加入黑名单的配置参考如下: + + ``` + [Service] + ExecStart=-/usr/bin/qemu-ga \ + --blacklist=guest-file-open guest-file-close + ``` + + +1. 重启qemu-guest-agent服务: + + ``` + # systemctl daemon-reload + # systemctl restart qemu-guest-agent + ``` + +2. 确认虚拟机开启qemu-ga黑名单功能是否生效,即qemu-ga进程配置的参数--blacklist是否正确。 + + ``` + # ps -ef|grep qemu-ga|grep -E "blacklist=|b=" + root 727 1 0 08:17 ? 00:00:00 /usr/bin/qemu-ga --method=virtio-serial --path=/dev/virtio-ports/org.qemu.guest_agent.0 --blacklist=guest-file-open guest-file-close guest-file-read guest-file-write guest-file-seek guest-file-flush -F/etc/qemu-ga/fsfreeze-hook + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >更多关于qemu-ga的资料可以参见[https://wiki.qemu.org/Features/GuestAgent](https://wiki.qemu.org/Features/GuestAgent)。 + + diff --git "a/content/zh/docs/Virtualization/sVirt\344\277\235\346\212\244.md" "b/content/zh/docs/Virtualization/sVirt\344\277\235\346\212\244.md" new file mode 100644 index 000000000..feba81008 --- /dev/null +++ "b/content/zh/docs/Virtualization/sVirt\344\277\235\346\212\244.md" @@ -0,0 +1,62 @@ +# sVirt保护 + +## 概述 + +在只使用自由访问控制DAC(Discretionary Acces Control)策略的虚拟化环境中,主机上运行的恶意虚拟机可能存在攻击hypervisor或其他虚拟机的情况。为了提升虚拟化场景的安全性,openEuler使用了sVirt保护。sVirt是基于SELinux,适用于KVM虚拟化场景的安全防护技术。虚拟机本质是主机操作系统上的普通进程,sVirt机制在hypervisor将虚拟机对应的QEMU进程进行SELinux标记分类,除了使用type表示虚拟化专有进程和文件,还用不同的的category(在seclevel区间)表示不同虚拟机,每个虚拟机只能访问自身相同category的文件设备,防止虚拟机访问非授权的主机或其他虚拟机的文件和设备,从而防止虚拟机逃逸,提升主机和虚拟机的安全性。 + +## 开启sVirt保护 + +**一、开启主机的SELinux** + +1. 登录主机。 +2. 开启主机SELinux功能。 + 1. 修改/boot/grub2/grub.cfg,将selinux设置为1。 + + ``` + selinux=1 + ``` + + 2. 修改/etc/selinux/config,将SELINUX模式设置为enforcing。 + + ``` + SELINUX=enforcing + ``` + +3. 重启主机。 + + ``` + # reboot + ``` + + +**二、创建开启sVirt功能的虚拟机** + +1. 虚拟机配置文件中添加如下配置: + + ``` + + ``` + + 或确认没有下述配置: + + ``` + + ``` + +2. 创建虚拟机。 + + ``` + # virsh define openEulerVM.xml + ``` + + +**三、确认sVirt开启成功** + +执行下述命令检查运行中的虚拟机QEMU进程是否已经启用sVirt防护,若存在"svirt\_t:s0:c"表示已经启用sVirt防护。 + +``` +# ps -eZ|grep qemu |grep "svirt_t:s0:c" +system_u:system_r:svirt_t:s0:c200,c947 11359 ? 00:03:59 qemu-kvm +system_u:system_r:svirt_t:s0:c427,c670 13790 ? 19:02:07 qemu-kvm +``` + diff --git a/content/zh/docs/Virtualization/zh-cn_bookmap_0183145741.md b/content/zh/docs/Virtualization/zh-cn_bookmap_0183145741.md deleted file mode 100644 index 699caf794..000000000 --- a/content/zh/docs/Virtualization/zh-cn_bookmap_0183145741.md +++ /dev/null @@ -1,77 +0,0 @@ -# 虚拟化用户指南 - -- [法律声明](法律声明.md) -- [前言](前言.md) -- [认识虚拟化](认识虚拟化.md) -- [安装指南](安装指南.md) - - [最低硬件要求](最低硬件要求.md) - - [安装虚拟化核心组件](安装虚拟化核心组件.md) - - [安装方法](安装方法.md) - - [验证安装是否成功](验证安装是否成功.md) - - -- [用户和管理员指南](用户和管理员指南.md) - - [准备环境](准备环境.md) - - [准备虚拟机镜像](准备虚拟机镜像.md) - - [准备虚拟机网络](准备虚拟机网络.md) - - [准备UEFI引导工具集EDK II](准备UEFI引导工具集EDK-II.md) - - - [虚拟机配置](虚拟机配置.md) - - [总体介绍](总体介绍.md) - - [虚拟机描述](虚拟机描述.md) - - [虚拟CPU和虚拟内存](虚拟CPU和虚拟内存.md) - - [配置虚拟设备](配置虚拟设备.md) - - [存储设备](存储设备.md) - - [网络设备](网络设备.md) - - [总线配置](总线配置.md) - - [其它常用设备](其它常用设备.md) - - - [其他常见配置项](其他常见配置项.md) - - [XML配置文件示例](XML配置文件示例.md) - - - [管理虚拟机](管理虚拟机.md) - - [虚拟机生命周期](虚拟机生命周期.md) - - [总体介绍](总体介绍-0.md) - - [管理命令](管理命令.md) - - [示例](示例.md) - - - [在线修改虚拟机配置](在线修改虚拟机配置.md) - - [查询虚拟机信息](查询虚拟机信息.md) - - [登录虚拟机](登录虚拟机.md) - - [使用VNC密码登录](使用VNC密码登录.md) - - [配置VNC TLS登录](配置VNC-TLS登录.md) - - - - [热迁移虚拟机](热迁移虚拟机.md) - - [总体介绍](总体介绍-1.md) - - [应用场景](应用场景.md) - - [注意事项和约束限制](注意事项和约束限制.md) - - [热迁移操作](热迁移操作.md) - - - [管理系统资源](管理系统资源.md) - - [管理虚拟CPU](管理虚拟CPU.md) - - [CPU份额](CPU份额.md) - - [绑定qemu进程至物理CPU](绑定qemu进程至物理CPU.md) - - [调整虚拟CPU绑定关系](调整虚拟CPU绑定关系.md) - - - [管理虚拟内存](管理虚拟内存.md) - - [NUMA简介](NUMA简介.md) - - [配置Host NUMA](配置Host-NUMA.md) - - [配置Guest NUMA](配置Guest-NUMA.md) - - - - [管理设备](管理设备.md) - - [配置虚拟机PCIe控制器](配置虚拟机PCIe控制器.md) - - [管理虚拟磁盘](管理虚拟磁盘.md) - - [管理虚拟网卡](管理虚拟网卡.md) - - [配置虚拟串口](配置虚拟串口.md) - - - [最佳实践](最佳实践.md) - - [halt-polling](halt-polling.md) - - [内存大页](内存大页.md) - - -- [附录](附录.md) - - [术语和缩略语](术语和缩略语.md) - - diff --git "a/content/zh/docs/Virtualization/\344\275\223\347\263\273\346\236\266\346\236\204\347\233\270\345\205\263\351\205\215\347\275\256.md" "b/content/zh/docs/Virtualization/\344\275\223\347\263\273\346\236\266\346\236\204\347\233\270\345\205\263\351\205\215\347\275\256.md" new file mode 100644 index 000000000..f9c49c610 --- /dev/null +++ "b/content/zh/docs/Virtualization/\344\275\223\347\263\273\346\236\266\346\236\204\347\233\270\345\205\263\351\205\215\347\275\256.md" @@ -0,0 +1,59 @@ +# 体系架构相关配置 + +## 概述 + +XML中还有一部分体系架构相关的配置,这部分配置包括主板,CPU,一些与体系架构相关的feature,本章节主要介绍它们的配置和含义。 + +## 元素介绍 + +- os:定义虚拟机启动参数。 + + 子元素type:指定虚拟机类型,属性arch表示架构类型,如aarch64,属性machine表示虚拟机的芯片组类型,虚拟机支持的芯片组可以通过 **qemu-kvm -machine ?**命令查询,如AArch64结构使用“virt”类型。 + + 子元素loader:指定加载固件 ,如配置EDK提供的UEFI文件,属性readonly表示是否是只读文件,值为“yes”或“no”,属性type表示loader的类型,常用的值有“rom”、“pflash”。 + + 子元素nvram:指定nvram文件路径,用于存储UEFI启动配置。 + + +- features:hypervisor支持控制一些虚拟机CPU/machine的特性,如高级电源管理接口“acpi”,ARM处理器指定GICv3中断控制器等。 + +## AArch64架构配置示例 + +虚拟机的类型为AArch64结构,使用virt芯片组,利用UEFI启动的虚拟机配置如下: + +``` + + ... + + hvm + /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw + /var/lib/libvirt/qemu/nvram/openEulerVM.fd + + ... + +``` + +为虚拟机配置ACPI和GIC V3中断控制器特性。 + +``` + + + + +``` + +## x86\_64架构配置示例 + +x86\_64架构支持BIOS和UEFI两种启动方式,如果不配置loader,则使用默认启动方式BIOS。这里给出启动方式为UEFI、芯片组为q35的配置参考。 + +``` + + ... + + hvm + /usr/share/edk2/ovmf/OVMF.fd + + ... + +``` + diff --git "a/content/zh/docs/Virtualization/\345\205\266\344\273\226\345\270\270\350\247\201\351\205\215\347\275\256\351\241\271.md" "b/content/zh/docs/Virtualization/\345\205\266\344\273\226\345\270\270\350\247\201\351\205\215\347\275\256\351\241\271.md" index e5d0b0be0..f5b6775a1 100644 --- "a/content/zh/docs/Virtualization/\345\205\266\344\273\226\345\270\270\350\247\201\351\205\215\347\275\256\351\241\271.md" +++ "b/content/zh/docs/Virtualization/\345\205\266\344\273\226\345\270\270\350\247\201\351\205\215\347\275\256\351\241\271.md" @@ -1,4 +1,4 @@ -# 其他常见配置项 +# 其他常见配置项 ## 概述 @@ -6,17 +6,8 @@ ## 元素介绍 -- os:定义虚拟机启动参数。 - - 子元素type:指定虚拟机类型,属性arch表示架构类型,如aarch64,属性machine表示虚拟机的芯片组类型,如aarch64结构使用“virt-4.0”类型。 - - 子元素loader:指定加载固件 ,如配置EDK提供的EFI文件,属性readonly表示是否是只读文件,值为“yes”或“no”,属性type表示loader的类型,常用的值有“rom”、“pflash”。 - - 子元素nvram:指定nvram文件路径,用于存储EFI启动配置。 - - -- features:Hypervisor支持控制一些虚拟机CPU/machine的特性,如高级电源管理接口“acpi”,ARM处理器指定GICv3中断控制器等。 - iothreads:指定iothread数量,可以用于加速存储设备性能。 + - on\_poweroff:虚拟机关闭时采取的动作。 - on\_reboot:虚拟机重启时采取的动作。 - on\_crash:虚拟机崩溃时采取的动作。 @@ -27,29 +18,6 @@ ## 配置示例 -虚拟机的类型为aarch64结构,使用virt-4.0芯片组,利用UEFI启动的虚拟机配置如下: - -``` - - ... - - hvm - /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw - /var/lib/libvirt/qemu/nvram/openEulerVM.fd - - ... - -``` - -为虚拟机配置ACPI和GIC V3中断控制器特性。 - -``` - - - - -``` - 为虚拟机配置两个iothread,用于加速存储设备性能。 ``` diff --git "a/content/zh/docs/Virtualization/\345\205\266\345\256\203\345\270\270\347\224\250\350\256\276\345\244\207.md" "b/content/zh/docs/Virtualization/\345\205\266\345\256\203\345\270\270\347\224\250\350\256\276\345\244\207.md" index 0282dc1ef..8bab0521d 100644 --- "a/content/zh/docs/Virtualization/\345\205\266\345\256\203\345\270\270\347\224\250\350\256\276\345\244\207.md" +++ "b/content/zh/docs/Virtualization/\345\205\266\345\256\203\345\270\270\347\224\250\350\256\276\345\244\207.md" @@ -13,10 +13,20 @@ - video:媒体设备 - 属性type:媒体设备类型。常用属性值为virtio。 + 属性type:媒体设备类型。AArch架构常用属性值为virtio,x86\_64架构通常使用属性值为vga或cirrus。 子元素model:video的子元素,用于指定媒体设备类型。 + 在model元素中,type属性为vga表示配置VGA类型显卡,vram属性代表显存大小,单位默认为KB。 + + 例如:给x86\_64架构虚拟机配置16MB的VGA类型的显卡,XML示例如下,其中vram属性代表显存大小,单位默认为KB: + + ``` + + ``` + - input:输出设备 属性type:指定输出设备类型。常用属性值为tabe、keyboard,分别表示输出设备为写字板、键盘。 diff --git "a/content/zh/docs/Virtualization/\345\206\205\345\255\230\345\244\247\351\241\265.md" "b/content/zh/docs/Virtualization/\345\206\205\345\255\230\345\244\247\351\241\265.md" index 687e5cf41..d4f3b83a9 100644 --- "a/content/zh/docs/Virtualization/\345\206\205\345\255\230\345\244\247\351\241\265.md" +++ "b/content/zh/docs/Virtualization/\345\206\205\345\255\230\345\244\247\351\241\265.md" @@ -11,12 +11,12 @@ - 透明大页 - openEuler默认开启透明大页模式(THP),虚拟机分配内存时自动选择可用的2M连续页,同时自动完成大页的拆分合并,当没有可用的2M连续页时,它会选择可用的4K页面进行分配。透明大页的好处是不需要用户感知,同时能尽量使用2M大页以提升内存访问性能。 + 如果开启透明大页模式(THP)(openEuler默认关闭,需要手动打开),虚拟机分配内存时自动选择可用的2M连续页,同时自动完成大页的拆分合并,当没有可用的2M连续页时,它会选择可用的4K页面进行分配。透明大页的好处是不需要用户感知,同时能尽量使用2M大页以提升内存访问性能。 在虚拟机完全使用静态大页的场景下,可以通过关闭透明大页的方法,减少宿主机操作系统的开销,以便虚拟机获得更稳定的性能。 -## 操作步骤 +## 操作指导 - 使用静态大页 diff --git "a/content/zh/docs/Virtualization/\345\207\206\345\244\207UEFI\345\274\225\345\257\274\345\267\245\345\205\267\351\233\206EDK-II.md" "b/content/zh/docs/Virtualization/\345\207\206\345\244\207UEFI\345\274\225\345\257\274\345\267\245\345\205\267\351\233\206EDK-II.md" deleted file mode 100644 index 9f2ad02e2..000000000 --- "a/content/zh/docs/Virtualization/\345\207\206\345\244\207UEFI\345\274\225\345\257\274\345\267\245\345\205\267\351\233\206EDK-II.md" +++ /dev/null @@ -1,35 +0,0 @@ -# 准备UEFI引导工具集EDK II - -## 概述 - -统一的可扩展固件接口UEFI(Unified Extensible Firmware Interface)是一种全新类型的接口标准,用于开机自检、引导操作系统的启动,是传统BIOS的一种替代方案。EDK II是一套实现了UEFI标准的开源代码,在虚拟化场景中,通常利用EDK II工具集,通过UEFI的方式启动虚拟机。使用EDK II工具需要在虚拟机启动之前安装对应的软件包 ,本节介绍EDK II的安装方法。 - -## 安装方法 - -安装工具集EDK II的操作步骤如下: - -1. 安装edk软件包,命令如下: - - ``` - # yum install -y edk2-aarch64 - ``` - -2. 查询edk软件是否安装成功,命令如下: - - ``` - # rpm -qi edk2-aarch64 - ``` - - 若edk软件安装成功,命令和回显如下: - - ``` - # rpm -qi edk2-aarch64 - Name : edk2-aarch64 - Version : 20180815gitcb5f4f45ce - Release : 1.oe3 - Architecture: noarch - Install Date: Mon 22 Jul 2019 04:52:33 PM CST - Group : Applications/Emulators - ``` - - diff --git "a/content/zh/docs/Virtualization/\345\207\206\345\244\207\345\274\225\345\257\274\345\233\272\344\273\266.md" "b/content/zh/docs/Virtualization/\345\207\206\345\244\207\345\274\225\345\257\274\345\233\272\344\273\266.md" new file mode 100644 index 000000000..99777de0f --- /dev/null +++ "b/content/zh/docs/Virtualization/\345\207\206\345\244\207\345\274\225\345\257\274\345\233\272\344\273\266.md" @@ -0,0 +1,62 @@ +# 准备引导固件 + +## 概述 + +针对不同的架构,引导的方式有所差异。x86支持UFEI(Unified Extensible Firmware Interface)和BIOS方式启动,AArch64仅支持UFEI方式启动。openEuler默认已安装BIOS启动对应的引导文件,不需要用户额外操作。所以这里仅介绍UEFI启动方式的安装方法。 + +统一的可扩展固件接口UEFI是一种全新类型的接口标准,用于开机自检、引导操作系统的启动,是传统BIOS的一种替代方案。EDK II是一套实现了UEFI标准的开源代码,在虚拟化场景中,通常利用EDK II工具集,通过UEFI的方式启动虚拟机。使用EDK II工具需要在虚拟机启动之前安装对应的软件包 ,本节介绍EDK II的安装方法。 + +## 安装方法 + +如果使用UEFI方式引导,需要安装工具集EDK II,AArch64架构对应的安装包为edk2-aarch64,x86架构对应的安装包为edk2-ovmf。这里以AArch64架构为例,给出具体的安装方法,x86架构仅需将edk2-aarch64替换为edk2-ovmf。 + +1. 安装edk软件包,命令如下: + + 在AArch64架构下edk2的包名为edk2-aarch64 + + ``` + # yum install -y edk2-aarch64 + ``` + + 在x86\_64架构下edk2的包名为edk2-ovmf + + ``` + # yum install -y edk2-ovmf + ``` + +2. 查询edk软件是否安装成功,命令如下: + + 在AArch64架构下查询如下 + + ``` + # rpm -qi edk2-aarch64 + ``` + + 若edk软件安装成功,回显类似如下: + + ``` + Name : edk2-aarch64 + Version : 20180815gitcb5f4f45ce + Release : 1.oe3 + Architecture: noarch + Install Date: Mon 22 Jul 2019 04:52:33 PM CST + Group : Applications/Emulators + ``` + + 在x86\_64架构下查询如下 + + ``` + # rpm -qi edk2-ovmf + ``` + + 若edk软件安装成功,回显类似如下: + + ``` + Name : edk2-ovmf + Version : 201908 + Release : 6.oe1 + Architecture: noarch + Install Date: Thu 19 Mar 2020 09:09:06 AM CST + ``` + + diff --git "a/content/zh/docs/Virtualization/\345\207\206\345\244\207\347\216\257\345\242\203.md" "b/content/zh/docs/Virtualization/\345\207\206\345\244\207\347\216\257\345\242\203.md" index 8e06c1d03..043312ef9 100644 --- "a/content/zh/docs/Virtualization/\345\207\206\345\244\207\347\216\257\345\242\203.md" +++ "b/content/zh/docs/Virtualization/\345\207\206\345\244\207\347\216\257\345\242\203.md" @@ -1,2 +1 @@ # 准备环境 - diff --git "a/content/zh/docs/Virtualization/\345\255\230\345\202\250\345\277\253\347\205\247.md" "b/content/zh/docs/Virtualization/\345\255\230\345\202\250\345\277\253\347\205\247.md" new file mode 100644 index 000000000..062115bfa --- /dev/null +++ "b/content/zh/docs/Virtualization/\345\255\230\345\202\250\345\277\253\347\205\247.md" @@ -0,0 +1,41 @@ +# 存储快照 + +## 概述 + +虚拟机在使用过程中可能由于病毒对系统的破坏、系统文件被误删除或误格式化等原因造成虚拟机系统损坏导致系统无法启动。为了使损坏的系统快速恢复,openEuler提供了存储快照功能。openEuler可以在用户不感知的情况下制作虚拟机在某一时刻的快照(制作通常指需要几秒钟),该快照能帮助用户将磁盘快速恢复到某一时刻的状态,例如系统损坏后能快速恢复系统,从而提升系统可靠性。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>当前存储快照只支持raw、qcow2格式镜像,不支持block块设备。 + +## 操作步骤 + +制作虚拟机存储快照的操作步骤如下: + +1. 登录主机,通过virsh domblklist命令查询虚拟机使用的磁盘。 + + ``` + # virsh domblklist openEulerVM + Target Source + --------------------------------------------- + vda /mnt/openEuler-image.qcow2 + ``` + + +1. 创建虚拟机磁盘快照_openEuler-snapshot1.qcow2_,命令及回显如下: + + ``` + # virsh snapshot-create-as --domain openEulerVM --disk-only --diskspec vda,snapshot=external,file=/mnt/openEuler-snapshot1.qcow2 --atomic + Domain snapshot 1582605802 created + ``` + + +1. 磁盘快照查询操作。 + + ``` + # virsh snapshot-list openEulerVM + Name Creation Time State + --------------------------------------------------------- + 1582605802 2020-02-25 12:43:22 +0800 disk-snapshot + ``` + + diff --git "a/content/zh/docs/Virtualization/\345\255\230\345\202\250\350\256\276\345\244\207.md" "b/content/zh/docs/Virtualization/\345\255\230\345\202\250\350\256\276\345\244\207.md" index a7a3bddf1..dc2e7fd1f 100644 --- "a/content/zh/docs/Virtualization/\345\255\230\345\202\250\350\256\276\345\244\207.md" +++ "b/content/zh/docs/Virtualization/\345\255\230\345\202\250\350\256\276\345\244\207.md" @@ -101,7 +101,7 @@ XML配置文件使用disk元素配置存储设备,disk常见的属性如[表1] ## 配置示例 -按照“准备虚拟机镜像”章节的操作完成虚拟机镜像准备后,可以使用如下XML配置文件示例,为虚拟机配置虚拟磁盘。 +按照[准备虚拟机镜像](准备虚拟机镜像.md)操作完成虚拟机镜像准备后,可以使用如下XML配置文件示例,为虚拟机配置虚拟磁盘。 例如,该示例为虚拟机配置了两个IO线程,一个块磁盘设备和一个光盘设备,第一个IO线程分配给块磁盘设备使用。该块磁盘设备的后端介质为qcow2格式,且被作为优先启动盘。 @@ -118,7 +118,7 @@ XML配置文件使用disk元素配置存储设备,disk常见的属性如[表1] - + diff --git "a/content/zh/docs/Virtualization/\345\256\211\345\205\250\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/content/zh/docs/Virtualization/\345\256\211\345\205\250\346\234\200\344\275\263\345\256\236\350\267\265.md" new file mode 100644 index 000000000..48f6f3231 --- /dev/null +++ "b/content/zh/docs/Virtualization/\345\256\211\345\205\250\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -0,0 +1,2 @@ +# 安全最佳实践 + diff --git "a/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\214\207\345\215\227.md" "b/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\214\207\345\215\227.md" index 2dbbb7ea4..a07635298 100644 --- "a/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\214\207\345\215\227.md" +++ "b/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\214\207\345\215\227.md" @@ -1,3 +1,5 @@ # 安装指南 本章介绍在openEuler中安装虚拟化组件的方法。 + + diff --git "a/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\226\271\346\263\225.md" "b/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\226\271\346\263\225.md" index 12eae217f..c6829c234 100644 --- "a/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\226\271\346\263\225.md" +++ "b/content/zh/docs/Virtualization/\345\256\211\350\243\205\346\226\271\346\263\225.md" @@ -2,12 +2,12 @@ ## 前提条件 -- 已经配置yum源。配置方式请参见《openEuler 1.0 管理员指南》。 +- 已经配置yum源。配置方式请参见《openEuler 20.03 LTS 管理员指南》。 - 安装操作需要管理员权限。 ## 安装步骤 -1. 安装qemu组件。 +1. 安装QEMU组件。 ``` # yum install -y qemu diff --git "a/content/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\346\240\270\345\277\203\347\273\204\344\273\266.md" "b/content/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\346\240\270\345\277\203\347\273\204\344\273\266.md" index 9638c9198..7e40b21c2 100644 --- "a/content/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\346\240\270\345\277\203\347\273\204\344\273\266.md" +++ "b/content/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\346\240\270\345\277\203\347\273\204\344\273\266.md" @@ -1,3 +1,2 @@ # 安装虚拟化核心组件 - diff --git "a/content/zh/docs/Virtualization/\346\200\247\350\203\275\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/content/zh/docs/Virtualization/\346\200\247\350\203\275\346\234\200\344\275\263\345\256\236\350\267\265.md" new file mode 100644 index 000000000..956265d22 --- /dev/null +++ "b/content/zh/docs/Virtualization/\346\200\247\350\203\275\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -0,0 +1 @@ +# 性能最佳实践 diff --git "a/content/zh/docs/Virtualization/\346\200\273\344\275\223\344\273\213\347\273\215-0.md" "b/content/zh/docs/Virtualization/\346\200\273\344\275\223\344\273\213\347\273\215-0.md" index 06bbf14a8..87aaa11c7 100644 --- "a/content/zh/docs/Virtualization/\346\200\273\344\275\223\344\273\213\347\273\215-0.md" +++ "b/content/zh/docs/Virtualization/\346\200\273\344\275\223\344\273\213\347\273\215-0.md" @@ -24,7 +24,7 @@ ## 虚拟机标识 -在Libvirt中,完成创建的虚拟机实例称做一个“domain”,其描述了虚拟机的CPU、内存、网络设备、存储设备等各种资源的配置信息。在同一个主机上,每个domain具有唯一标识,通过虚拟机名称Name、UUID、Id表示,对应含义请参见[表1](#table84397266483)。在虚拟机生命周期期间,可以通过虚拟机标识对特定虚拟机进行操作。 +在libvirt中,完成创建的虚拟机实例称做一个“domain”,其描述了虚拟机的CPU、内存、网络设备、存储设备等各种资源的配置信息。在同一个主机上,每个domain具有唯一标识,通过虚拟机名称Name、UUID、Id表示,对应含义请参见[表1](#table84397266483)。在虚拟机生命周期期间,可以通过虚拟机标识对特定虚拟机进行操作。 **表 1** domain标识说明 @@ -56,5 +56,5 @@ >![](public_sys-resources/icon-note.gif) **说明:** ->可通过virsh命令查询虚拟机Id和UUID,操作方法请参见“查询虚拟机信息”章节内容。 +>可通过virsh命令查询虚拟机Id和UUID,操作方法请参见[查询虚拟机信息](查询虚拟机信息.md)章节内容。 diff --git "a/content/zh/docs/Virtualization/\346\200\273\347\272\277\351\205\215\347\275\256.md" "b/content/zh/docs/Virtualization/\346\200\273\347\272\277\351\205\215\347\275\256.md" index 921871667..77f9b2273 100644 --- "a/content/zh/docs/Virtualization/\346\200\273\347\272\277\351\205\215\347\275\256.md" +++ "b/content/zh/docs/Virtualization/\346\200\273\347\272\277\351\205\215\347\275\256.md" @@ -7,11 +7,11 @@ PCIe总线是一种典型的树结构,具有比较好的扩展性,总线之间通过控制器关联,这里以PCIe总线为例介绍如何为虚拟机配置总线拓扑。 >![](public_sys-resources/icon-note.gif) **说明:** ->总线的配置相对比较繁琐,若不需要精确控制设备拓扑结构,可以使用Libvirt自动生成的缺省总线配置。 +>总线的配置相对比较繁琐,若不需要精确控制设备拓扑结构,可以使用libvirt自动生成的缺省总线配置。 ## 元素介绍 -在Libvirt的XML配置中,每个控制器元素(使用controller元素表示)可以表示一个总线,根据虚拟机架构的不同,一个控制器上通常可以挂载一个或多个控制器或设备。这里介绍常用属性和子元素。 +在libvirt的XML配置中,每个控制器元素(使用controller元素表示)可以表示一个总线,根据虚拟机架构的不同,一个控制器上通常可以挂载一个或多个控制器或设备。这里介绍常用属性和子元素。 controller:控制器元素,表示一个总线。 diff --git "a/content/zh/docs/Virtualization/\346\234\200\344\275\216\347\241\254\344\273\266\350\246\201\346\261\202.md" "b/content/zh/docs/Virtualization/\346\234\200\344\275\216\347\241\254\344\273\266\350\246\201\346\261\202.md" index bf7246353..f8cdbd79d 100644 --- "a/content/zh/docs/Virtualization/\346\234\200\344\275\216\347\241\254\344\273\266\350\246\201\346\261\202.md" +++ "b/content/zh/docs/Virtualization/\346\234\200\344\275\216\347\241\254\344\273\266\350\246\201\346\261\202.md" @@ -2,7 +2,8 @@ 在openEuler系统中安装虚拟化组件,最低硬件要求: -- AArch64处理器架构(建议ARMv8处理器) +- AArch64处理器架构:ARMv8以上并且支持虚拟化扩展 +- X86\_64处理器架构:支持VT-x - 2核CPU - 4GB的内存 - 16GB可用磁盘空间 diff --git "a/content/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/content/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" index 25237daaf..1c482e52b 100644 --- "a/content/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" +++ "b/content/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -1 +1,2 @@ # 最佳实践 + diff --git "a/content/zh/docs/Virtualization/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" "b/content/zh/docs/Virtualization/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" index c6180ef28..09ca4ce21 100644 --- "a/content/zh/docs/Virtualization/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" +++ "b/content/zh/docs/Virtualization/\346\234\257\350\257\255\345\222\214\347\274\251\347\225\245\350\257\255.md" @@ -41,16 +41,6 @@