From b0d11273bd11af52d74310ca924680331b097746 Mon Sep 17 00:00:00 2001 From: Ming Yang Date: Tue, 22 Sep 2020 19:45:11 +0800 Subject: [PATCH] docs: add docs for StratoVirt which is a new virtualization platform. 1. reorganize the architecture of docs. 2. add docs for StratoVirt. Signed-off-by: Ming Yang --- ...37\345\214\226\347\256\200\344\273\213.md" | 18 ++ ...37\346\234\272\351\205\215\347\275\256.md" | 194 ++++++++++++++++++ ...6\346\236\204\350\247\206\345\233\276.png" | Bin 0 -> 43877 bytes .../figures/\346\263\250\346\204\217.png" | Bin 0 -> 2142 bytes .../figures/\351\241\273\347\237\245.png" | Bin 0 -> 1486 bytes ...43\350\231\232\346\213\237\345\214\226.md" | 3 + ...37\350\231\232\346\213\237\345\214\226.md" | 3 + ...57\345\242\203\345\207\206\345\244\207.md" | 58 ++++++ ...50\346\234\237\347\256\241\347\220\206.md" | 167 +++++++++++++++ ...04\346\272\220\347\256\241\347\220\206.md" | 79 +++++++ ...34\345\203\217\345\210\266\344\275\234.md" | 106 ++++++++++ content/zh/menu/index.md | 26 ++- 12 files changed, 645 insertions(+), 9 deletions(-) create mode 100644 "content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\345\214\226\347\256\200\344\273\213.md" create mode 100644 "content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" create mode 100644 "content/zh/docs/Virtualization/figures/StratoVirt\346\236\266\346\236\204\350\247\206\345\233\276.png" create mode 100644 "content/zh/docs/Virtualization/figures/\346\263\250\346\204\217.png" create mode 100644 "content/zh/docs/Virtualization/figures/\351\241\273\347\237\245.png" create mode 100644 "content/zh/docs/Virtualization/\344\270\213\344\270\200\344\273\243\350\231\232\346\213\237\345\214\226.md" create mode 100644 "content/zh/docs/Virtualization/\344\274\240\347\273\237\350\231\232\346\213\237\345\214\226.md" create mode 100644 "content/zh/docs/Virtualization/\347\216\257\345\242\203\345\207\206\345\244\207.md" create mode 100644 "content/zh/docs/Virtualization/\347\224\237\345\221\275\345\221\250\346\234\237\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\350\265\204\346\272\220\347\256\241\347\220\206.md" create mode 100644 "content/zh/docs/Virtualization/\351\225\234\345\203\217\345\210\266\344\275\234.md" diff --git "a/content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\345\214\226\347\256\200\344\273\213.md" "b/content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\345\214\226\347\256\200\344\273\213.md" new file mode 100644 index 0000000..a55f9ec --- /dev/null +++ "b/content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\345\214\226\347\256\200\344\273\213.md" @@ -0,0 +1,18 @@ +# 概述 + +StratoVirt是一款轻量虚拟化方案,通过精简设备模型,优化运行性能,为容器提供安全隔离、性能优异的安全沙箱运行环境。支持CPU、内存、串口、磁盘和网卡等设备的虚拟化,整体架构视图如图1所示。 + +**图1** StratoVirt整体架构图 + +![](figures\StratoVirt架构视图.png) + + + +# 约束限制和规格 + +1. 仅支持运行于x86_64和aarch64体系架构下。 +2. 仅支持在openEuler 20.03及以上版本编译、调测和部署。 +3. 仅支持用于对接openEuler的isula安全沙箱容器运行时场景。 +4. 仅支持运行x86_64和aarch64体系架构的linux虚拟机。 +5. 本软件支持以非root权限运行。 +6. 虚拟机规格限制详见使用指南。 \ No newline at end of file diff --git "a/content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" "b/content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" new file mode 100644 index 0000000..2ea06ee --- /dev/null +++ "b/content/zh/docs/Virtualization/StratoVirt\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" @@ -0,0 +1,194 @@ +# 虚拟机配置 + +## 概述 + +得到StratoVirt可执行文件以后就要对其运行方式进行配置。我们提供了通过cmdline和json两种方式进行运行配置,用来配置包括CPU、内存、磁盘等信息。这里给出两种方式的具体操作方法。 + + + +### 1、cmdline配置 + +StratoVirt能够运行的最小配置为: + +- 有一个PE格式的linux内核文件 +- 将rootfs镜像设置成virtio-blk设备,并添加到内核参数中 +- 使用api-channel来控制StratoVirt +- 如果要使用ttyS0登录,添加一个串口到启动命令行,并将ttyS0添加到内核的参数中 + +首先,确保api-channel可以被创建,需清理环境: + +``` +$ rm [参数] [socket文件路径] +``` + +接着,使用cmdline命令运行: + +``` +$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] ... +``` + +使用cmdline命令部署的参数参考下表: + +表1 :使用cmdline命令部署的参数 + +| 参数 | 参数选项 | 说明 | +| ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| -name | abc | 配置虚拟机名称 | +| -kernel | /path/to/vmlinux.bin | 配置内核镜像 | +| -append | console=ttyS0 root=/dev/vda reboot=k panic=1 | 配置内核命令行参数 | +| -initrd | /path/to/initrd.img | 配置initrd文件 | +| -smp | [cpus=]个数 | 配置cpu个数,范围[1, 254] | +| -m | 内存大小(字节单位)、内存大小M(M单位)、内存大小G(G单位) | 配置内存大小,范围[128M, 512G] | +| -drive | id=rootfs,file=/path/to/rootfs[,readonly=false,direct=true,serial=serial_num] | 配置virtio-blk设备 | +| -netdev | id=iface_id,netdev=tap0[,mac=mac_address] | 配置virtio-net设备 | +| -chardev | id=console_id,path=/path/to/socket | 配置virtio-console,运行前须保证socket文件不存在 | +| -device | vsock,id=vsock_id,guest-cid=3 | 配置vhost-vsock | +| -api-channel | unix:/path/to/socket | 配置api-channel,运行前须保证socket文件不存在 | +| -serial | stdio | 配置串口设备 | +| -D | /path/to/logfile | 配置日志文件 | +| -pidfile | /path/to/pidfile | 配置pid文件,必须和-daemonize一起使用。运行前须保证pid文件不存在 | +| -disable-seccomp | NA | 关闭Seccomp,默认打开 | +| -omit_vm_memory | NA | 当进程panic时,不dump虚拟机内存 | +| -daemonize | NA | 开启进程daemon化 | + +运行配置示例: + +``` +# 确保api-channel可以被创建 +$ rm -f /path/to/socket + +# 运行StratoVirt +$ /path/to/stratovirt \ + -kernel /path/to/vmlinux.bin \ + -append console=ttyS0 root=/dev/vda reboot=k panic=1 \ + -drive file=/path/to/rootfs,id=rootfs,readonly=false \ + -api-channel unix:/path/to/socket \ + -serial stdio +``` + +此时虚拟机启动,输出启动信息。 + + + +![](figures\注意.png) + +``` +1、虚拟机启动后,虚拟机内部会有2个网卡:eth0和eth1,这2张网卡是预留给热插拔用的。热插的第一张网卡是eth0,热插的第二张网卡是eth1,目前只支持热插2张virtio-net网卡。 +2、当启动命令行不正确时,会导致进程coredump。 +``` + + + +### 2、json配置 + +StratoVirt也可以使用json配置文件。 + +首先编写配置文件,各配置字段说明如下: + +**表2**:配置文件的字段 + +| 配置参数 | 配置参数选项 | 说明 | +| -------------- | ------------------------------------------------------------ | ---------------------------------------------------- | +| boot-source | "kernel_image_path": "/path/to/vmlinux.bin","boot_args": "console=ttyS0 reboot=k panic=1 pci=off tsc=reliable ipv6.disable=1 root=/dev/vda quiet","initrd_fs_path": "/path/to/initrd.img"(可选) | 配置内核镜像和内核参数 | +| machine-config | "name": "abc","vcpu_count": 4,"mem_size": 805306368,"omit_vm_memory": true(可选) | 配置虚拟cpu和内存大小 | +| drive | "drive_id": "rootfs","path_on_host": "/path/to/rootfs.ext4","read_only": false,"direct": true,"serial_num": "xxxxx" (可选) | 配置virtio-blk磁盘 | +| net | "iface_id": "net0","host_dev_name": "tap0","mac": "xx:xx:xx:xx:xx:xx" (可选) | 配置virtio-net网卡 | +| console | "console_id": "charconsole0","socket_path": "/path/to/socket" | 配置virtio-console串口,运行前须保证socket文件不存在 | +| vsock | "vsock_id": "vsock0","guest_cid": 3 | 配置virtio-vsock设备 | +| serial | "stdio": true | 配置串口设备 | + +接着,使用json运行。 + +用法: + +``` +$ /path/to/stratovirt -config /path/to/json -[参数] [参数选项] +``` + +参数: + +使用json运行的参数参考下表 + +表3:使用json运行的参数 + +| 参数 | 参数选项 | 说明 | +| ---------------- | -------------------- | ------------------------------------------------------------ | +| -config | /path/to/json | 配置文件的路径 | +| -api-channel | unix:/path/to/socket | 配置api-channel,运行前须保证socket文件不存在 | +| -D | /path/to/logfile | 配置日志文件 | +| -pidfile | /path/to/pidfile | 配置pid文件,必须配合daemonize使用。运行前须保证pid文件不存在 | +| -disable-seccomp | NA | 关闭Seccomp,默认打开 | +| -daemonize | NA | 开启进程daemon化 | + + + +json配置示例: + +``` +# json配置文件的内容 +{ + "boot-source": { + "kernel_image_path": "/path/to/vmlinux.bin", + "boot_args": "console=ttyS0 reboot=k panic=1 pci=off tsc=reliable ipv6.disable=1 root=/dev/vda quiet" + }, + "machine-config": { + "name": "abc", + "vcpu_count": 2, + "mem_size": 268435456, + "omit_vm_memory": false + }, + "drive": [ + { + "drive_id": "rootfs", + "path_on_host": "/path/to/rootfs.ext4", + "direct": true, + "read_only": false, + "serial_num": "abcd" + } + ], + "net": [ + { + "iface_id": "net0", + "host_dev_name": "tap0", + "mac": "0e:90:df:9f:a8:88" + } + ], + "console": { + "console_id": "charconsole0", + "socket_path": "/path/to/console.socket" + }, + "serial": { + "stdio": true + }, + "vsock": { + "vsock_id": "vsock-123321132", + "guest_cid": 4 + } +} + +# 运行StratoVirt +$ /path/to/stratovirt \ + -config /path/to/simple_machin.json \ + -api-channel unix:/path/to/socket +``` + +现在,StratoVirt可以引导Linux系统的客户虚拟机了。 + +您也可以使用initrdfs来运行StratoVirt,参考项目源码中的文件。路径为:`docs/mk_initrd_rootfs.md` + +如果您想了解更多关于StratoVirt的信息,参考项目源码中的文件。路径为:`docs/StratoVirt-Guidebook.md` + + + +![](figures\须知.png) + +``` +约束限制: +•虚拟机cpu个数范围:[1, 254] +•虚拟机内存大小范围:[128M, 512G] +•虚拟机磁盘个数范围(包括热插的):[0, 6] +•虚拟机网卡个数范围(包括热插的):[0, 2] +•虚拟机的console设备仅支持单路连接 +•x86_64平台,除了磁盘和网卡,最多配置2个设备; aarch64平台,除了磁盘和网卡,最多配置12个设备。 +``` + diff --git "a/content/zh/docs/Virtualization/figures/StratoVirt\346\236\266\346\236\204\350\247\206\345\233\276.png" "b/content/zh/docs/Virtualization/figures/StratoVirt\346\236\266\346\236\204\350\247\206\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..baf5526d077a452c9d8a18af38638c8db9150d27 GIT binary patch literal 43877 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 dn2Ddeh4bY)!^&fNe22lGipK~!jg?OAP5 zQ&$>(V;~8T@R0x^esB|zfMuyILb0qOP@$qzqyuP~VJKqVOpzT$aV$G@q+Pm-I*Lw} zA{Y^H5wte7Vi5`=QYsaKh0O*?0E0AWAb}7PAVIS~!bFU*<_2b}vw0>za^Lsd=e&95 zd_3m_GcDe$c~}k>n2be#b^)&+ERvyyMKaW|NQN2~$xy>08ERN96w#!Ha_YOcmQbx@ zg74Z`OBagv6~ux`mU+svsH7AC#&eQc8*Ao6b^1Ip_2Y@>r?AP6xVN2akxblwQe77TBZvU36qF(o4$=7 z6Th4uu2N2Ms(9j2dB`e{cLM18Z1qoF|LGO4S+!zy01W_WX3f+2N;avXq-8bG5#&9; z*_jw0GLmx?atp_c517e$Dr<=5;xja?_Vc#+V0*nmmM0YRguuQc&^>x1&Oe@+O%+`7 za3sz+0swgt;_f6Km6M&RMC%C>2?qefvd3DiEdbcyruAZ7yuSFOjbc>gVdi-(FTb^6 zM>_jbL2@9yy@?HXoBIgKak8YCfuxwH*@8u;v+rvWQn9PGwTFHeVgNp_-w3IJ&dP5_VCWgJ~Fzqo#Du;Y<`gvGOp zIn5~v>#9vBw6V1vA02CIQXG@h#(>dQ?Gf+bEk|Jc03 znz@2+&R&uJE+ATs8T||hd%ih)<@bkE=JA_9%5n?G0U#wxu6v{-$bFFr0O*JtKtBMa zB{+S16;4!8zf3{l(UwvrWruK?d430XD*#|mF3sN2L6?%r9|OR|q&B<2N8f(2!|2~W zdh|SxBT4(B4N+u+F&Z}!W=ht;i@5y#tg+BV!q>jd7Ks30u^UkrVUW9aeY*A7*A)pH zP#cbY$rCys+xtM%S>G`?)p&>7!ME2xrf&5x%7C?J3M9tKv34YYPE_^Gg*lQ2z?w59J=% zw*QNBF%c*X$AARe*m5sr%ew%Ixi+;V9Fwm9FVO)n*>|8>B`?$83YWKt#btGv4K zwW~wDTj$2#aGyO$Q;5%;s5b`*^AY5DVRz6GQw>M|10?`>EzzK@4FGO5xreNjL+aZI2qb5Q16)Ms+Qdsi9Sz7 z4B`xOS8Q}-Rz{*5v2SjifE~}?yS}dR4yQTL6#g?8sXw=M`FeY9_$%rgB&iH{`l9M; z<6xhdpwN)ZuXo#!$RC7i7!0>IzPPd$7Zs)`zcGEYol;({scU(_6_TVf9NJ#cjWWJC zIQvj(N@9$GvCv`1CIyvjWXTQnZVg|%`m4OU$N=U`Z#aZv8?{>PO?MEAlox6lb5lll zOqjE2p19yt*WCVI@S9nw!-<&)0CWk*Sn;Z~86pnLq*K-D2g$s?9vaQL_+L+Ace%4G zf5B@1ay%2=Ktm^4LFEhp?Al_)(Tt8`;?lXU6ymqXmO0sL4YHr7B4G)4&Q*nEY-%8Y}?V60`u&|A?5FNdf@C zg5V+Wgc7w{O<#hikktv%OYsE4m;xh};ZWV9p^&VB7g1DlKKH;j2R!%rY&%a2021lM zs2rT^4YLe#S4v_`_My^EYyQY^2>S3;idBH`@`%9UAb-^lUg4$`rrR_rWcA6;4V3@@E57e7PusbdOC|!vv3&Dx_g>LZb-p_RYy4cs zcnhmpIsxX?gg0L8OiPm00w@`SG5#OI^4BkFSR_LYi)5%_kqk8~lA(r0GSslblKlSc8eTK}50M!M UNWVLxQUCw|07*qoM6N<$g296hOaK4? literal 0 HcmV?d00001 diff --git "a/content/zh/docs/Virtualization/figures/\351\241\273\347\237\245.png" "b/content/zh/docs/Virtualization/figures/\351\241\273\347\237\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..7ac453de1bd1b322b8e8ea7454e0007b7fe92bc5 GIT binary patch literal 1486 zcmV;<1u^=GP)eh4bY)!^&fNe21!GA>K~!jg?U{c} z6K5F5zy9j6(iTc}&?+F^_|Y;b(FN*|f&wBLCe99`1~=SX$J`*%xFs%2j1#j=otrb; zDABo$E|BQNO{X|2AZ)GzQNUrTu%-n|!C{M~BCV+V<4k2jkTYD>+DP-aY-~ zecyZE+%zb^0K=r&mNS3)lg{DUgHc8qMj2%oWt3r*QHD`Q8E+{gScT~eAERGRf;1;V z3W7D|89g>Lz4I9Ln&fOncucS$fa_zq?wp|IWs9x2ruqH_!8-8%QZAcSzopD-vU(xU z$>0rTMXM6C72$lIkDbOYiCjg0F%{mZD440V;-9o6&f)1 z&G1`u7l65QIP~R76?)gQcfS7}Kv0PAaDHldu)o|QJl$*taQwWnP*V+pB@_w(SWVWk zqiSEUvCrSkxm93UX7w4z=aR{T;q4@ID(7@ohoA~EgHUW5pMd*qJm?%k*13_$0^bh$Sks?!>};Bu$MzPLgzz6Y>Jjj0F`AHeN9 zcPGA0Vw4a-beNz-nXp<@f3xp8jX6&OdXMGW)=s$GK_S9#*DL%u#0j0TqT!$Wbv$mC zJPg2F8PV#zbN~(dUOtC-=nlEByp$X}4}j%gXVxO|j-@fafdX1{ek5LfW3D@N2EcLi zwK#vSew&iZX0@AbqB$H@R*bIAs?z+~Vla>H>l-L|BRPuC^Qmew=arqiQuO*Juxoi-`Q~L&p#kk?+v<{b!LDxMW}7KtXwKQu@LW$B=tVMN^O2y8R~|fF-hEAJz;2Caa@C-%I`mytwV4 zag^mRiTmu$M1Kz9@m2Flc1m0@S$ph{&i9Ts_I6nT#D4T+X?|vInnaZqbJKNub6G8b z>JKu=W8;@cFSHuW0Crb40w}$F^<#wup8YTY@18MdK$=0*t(&a2>;*6A^u3w;PLMmY z*tyRyk_xMu%zG*>d{}$HsG_OU+Bd`{X06rKlZ{Q+Zz&VR-~7_D^+>&^*}2Xh z=M87HXttrtZgURTws(_pX^^1lN}tZ$Z|t+t^mj;7qW!1Q`{|d*g=27ZKo%ML(1JA) zJ_LrJ {"event":"STOP","data":{},"timestamp":{"seconds":1583908726,"microseconds":162739}} +-> {"return":{}} +``` + +## 恢复 + +使用cont命令恢复所有VCPU。 + +- 用法: + +``` +{"execute":"cont"} +``` + +- 具体示例: + +``` +<- {"execute":"cont"} +-> {"event":"RESUME","data":{},"timestamp":{"seconds":1583908853,"microseconds":411394}} +-> {"return":{}} +``` + +## 退出 + +使用quit命令使StratoVirt进程正常退出。 + +- 用法: + +``` +{"execute":"quit"} +``` + +- 具体示例: + +``` +<- {"execute":"quit"} +-> {"event":"SHUTDOWN","data":{"guest":false,"reason":"host-qmp-quit"},"timestamp":{"ds":1590563776,"microseconds":519808}} +-> {"return":{}} +``` + +## 查询状态 + +使用query-status命令查询虚拟机的运行状态。 + +- 用法: + +``` +{ "execute": "query-status" } +``` + +- 具体示例: + +``` +<- { "execute": "query-status" } +-> { "return": { "running": true,"singlestep": false,"status": "running" } +``` + + + +使用query-cpus命令查询所有VCPU的拓扑结构。 + +- 用法: + +``` +{ "execute": "query-cpus" } +``` + +- 具体示例: + +``` +<- { "execute": "query-cpus" } +-> {"return":[{"CPU":0,"arch":"x86","current":true,"halted":false,"props":{"core-id":0,"socket-id":0,"thread-id":0},"qom_path":"/machine/unattached/device[0]","thread_id":8439},{"CPU":1,"arch":"x86","current":true,"halted":false,"props":{"core-id":0,"socket-id":1,"thread-id":0},"qom_path":"/machine/unattached/device[1]","thread_id":8440}]} +``` + + + +使用query-hotpluggable-cpus命令查询所有VCPU的online/offline情况。 + +- 用法: + +``` +{ "execute": "query-hotpluggable-cpus" } +``` + +- 具体示例: + +``` +<- { "execute": "query-hotpluggable-cpus" } +-> {"return":[{"props":{"core-id":0,"socket-id":0,"thread-id":0},"qom-path":"/machine/unattached/device[0]","type":"host-x86-cpu","vcpus-count":1},{"props":{"core-id":0,"socket-id":1,"thread-id":0},"qom-path":"/machine/unattached/device[1]","type":"host-x86-cpu","vcpus-count":1}]} +``` + diff --git "a/content/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\350\265\204\346\272\220\347\256\241\347\220\206.md" "b/content/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\350\265\204\346\272\220\347\256\241\347\220\206.md" new file mode 100644 index 0000000..0127887 --- /dev/null +++ "b/content/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\350\265\204\346\272\220\347\256\241\347\220\206.md" @@ -0,0 +1,79 @@ +# 管理虚拟机资源 + +## 概述 + +除了可以使用QMP命令来管理虚拟机的生命周期,我们还可以使用QMP来管理虚拟机上的资源。本节将介绍如何使用QMP命令管理磁盘和网卡。 + + + +**说明:** + +您可以参考上节的QMP连接命令,进行QMP的连接。然后才能使用QMP对虚拟机的资源进行管理。 + + + +## 磁盘热插拔 + +- 用法: + +``` +{"execute": "blockdev-add", "arguments": {"node-name": "drive-0", "file": {"driver": "file", "filename": "/path/to/block"}, "cache": {"direct": true}, "read-only": false}} +{"execute": "device_add", "arguments": {"id": "drive-0", "driver": "virtio-blk-mmio", "addr": "0x1"}} +``` + +- 参数: + +blockdev-add中的node-name要和device_add中的id一致,如上都是drive-0。 + +/path/to/block是你要热插磁盘的镜像路径,不能是启动rootfs的磁盘镜像。 + +对于addr来说,它从0x0开始与虚拟机的vda映射,0x1与vdb映射,以此类推。为了兼容qmp协议,"addr"也可以用"lun"代替,但是lun=0与客户机的vdb映射。只支持热插6张virtio-blk磁盘。 + +- 具体示例: + +``` +<- {"execute": "blockdev-add", "arguments": {"node-name": "drive-0", "file": {"driver": "file", "filename": "/path/to/block"}, "cache": {"direct": true}, "read-only": false}} +-> {"return": {}} +<- {"execute": "device_add", "arguments": {"id": "drive-0", "driver": "virtio-blk-mmio", "addr": "0x1"}} +-> {"return": {}} +``` + +- 您当然也可以通过以下方式删除替换的块设备: + +``` +<- {"execute": "device_del", "arguments": {"id": "drive-0"}} +-> {"event":"DEVICE_DELETED","data":{"device":"drive-0","path":"drive-0"},"timestamp":{"seconds":1598513162,"microseconds":367129}} +-> {"return": {}} +``` + + + +## 网卡热插拔 + +- 用法: + +``` +{"execute":"netdev_add", "arguments":{"id":"net-0", "ifname":"tap0"}} +{"execute":"device_add", "arguments":{"id":"net-0", "driver":"virtio-net-mmio", "addr":"0x0"}} +``` + +- 参数: + +netdev_add中的id应该和device_add中的id一致,ifname是后端的tap设备名称。 + +对于addr来说,它从0x0开始与虚拟机的eth0映射,0x1和虚拟机的eth1映射,只支持热插2张virtio-net网卡。 + +- 具体示例: + +``` +<- {"execute":"netdev_add", "arguments":{"id":"net-0", "ifname":"tap0"}} +-> {"execute":"device_add", "arguments":{"id":"net-0", "driver":"virtio-net-mmio", "addr":"0x0"}} +``` + +- 您当然也可以通过以下方式删除替换的网络设备: + +``` +<- {"execute": "device_del", "arguments": {"id": "net-0"}} +-> {"event":"DEVICE_DELETED","data":{"device":"net-0","path":"net-0"},"timestamp":{"seconds":1598513339,"microseconds":97310}} +-> {"return": {}} +``` \ No newline at end of file diff --git "a/content/zh/docs/Virtualization/\351\225\234\345\203\217\345\210\266\344\275\234.md" "b/content/zh/docs/Virtualization/\351\225\234\345\203\217\345\210\266\344\275\234.md" new file mode 100644 index 0000000..7c528b7 --- /dev/null +++ "b/content/zh/docs/Virtualization/\351\225\234\345\203\217\345\210\266\344\275\234.md" @@ -0,0 +1,106 @@ +# 镜像制作 + +## 概述 + +由于StratoVirt是轻量级虚拟化方案,所以在开始使用之前要编译好运行所必需的kernel和root_fs。 + + + +## kernel镜像制作 + +当前版本的StratoVirt仅支持x86_64和aarch64平台的PE格式内核镜像。此格式内核映像可以使用以下工具生成: + +1. 使用下面的命令获取openEuler的kernel源代码: + + ``` + $ git clone https://gitee.com/openeuler/kernel + $ cd kernel + ``` + +2. 使用下面的命令查看并切换kernel的版本到4.19: + + ``` + $ git checkout kernel-4.19 + ``` + +3. 配置linux的kernel版本。您可以使用我们推荐的配置,将其复制到kernel路径下作为.config。您也可以通过以下命令进行交互: + + ``` + $ make menuconfig + ``` + +4. 使用下面的命令制作并转换kernel镜像为PE格式: + + ``` + $ make -j vmlinux && objcopy -O binary vmlinux vmlinux.bin + ``` + + + +## root_fs制作 + +Rootfs镜像是一种文件系统镜像,在StratoVirt启动的时候可以装载带有init的EXT4格式的镜像。下面是制作EXT4 Rootfs镜像的简单方法: + +1. 准备一个大小合适的文件(例如在/home中创建10G空间大小的文件): + + ``` + $ cd /home + $ dd if=/dev/zero of=./rootfs.ext4 bs=1G count=10 + ``` + +2. 在此文件上创建空的EXT4文件系统: + + ``` + $ mkfs.ext4 ./rootfs.ext4 + ``` + +3. 挂载文件镜像: + + ``` + # 创建目录 + $ mkdir /mnt/rootfs + + # 返回刚刚创建文件系统的目录(如/home),若不是root用户,mount的时候要用sudo + $ cd /home + $ mount ./rootfs.ext4 /mnt/rootfs && cd /mnt/rootfs + ``` + +4. 获取您对应的平台的 + + 最新的alpine-mini rootfs: + + ``` + # 如果您使用的是aarch64平台,请使用下面的命令 + $ wget http://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/aarch64/alpine-minirootfs-3.12.0-aarch64.tar.gz + $ tar -zxvf alpine-minirootfs-3.12.0-aarch64.tar.gz + $ rm alpine-minirootfs-3.12.0-aarch64.tar.gz + + # 如果您使用的是x86_64平台,请使用下面的命令 + $ wget http://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/x86_64/alpine-minirootfs-3.12.0-x86_64.tar.gz + $ tar -zxvf alpine-minirootfs-3.12.0-x86_64.tar.gz + $ rm alpine-minirootfs-3.12.0-x86_64.tar.gz + ``` + +5. 使用下面的命令为了EXT4文件镜像制作一个简单的/sbin/init: + + ``` + $ cat > sbin/init <}}) - [认识虚拟化]({{< 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" >}}) - - [管理设备]({{< 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" >}}) + - [管理虚拟机]({{< 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" >}}) + - [StratoVirt虚拟化简介]({{< relref "./docs/Virtualization/StratoVirt虚拟化简介.md" >}}) + - [镜像制作]({{< relref "./docs/Virtualization/镜像制作.md" >}}) + - [环境准备]({{< relref "./docs/Virtualization/环境准备.md" >}}) + - [虚拟机配置]({{< relref "./docs/Virtualization/StratoVirt虚拟机配置.md" >}}) + - [生命周期管理]({{< relref "./docs/Virtualization/生命周期管理.md" >}}) + - [虚拟机资源管理]({{< relref "./docs/Virtualization/虚拟机资源管理.md" >}}) - [容器用户指南]({{< relref "./docs/Container/container.md" >}}) -- 2.27.0