和物理機同樣,虛擬機包括幾個重要的部分:CPU、內存、磁盤設備、網絡設備等。本文將簡要總結虛機磁盤設備有關知識。html
nova boot CLI 的完整參數以下:linux
usage: nova boot [--flavor <flavor>] [--image <image>] //boot from image with id [--image-with <key=value>] //image metadata properties [--boot-volume <volume_id>] [--snapshot <snapshot_id>] [--block-device-mapping <dev-name=mapping>] [--block-device key1=value1[,key2=value2...]] [--swap <swap_size>] [--ephemeral size=<size>[,format=<format>]] [--min-count <number>] [--max-count <number>] [--meta <key=value>] [--key-name <key-name>] [--file <dst-path=src-path>] //文件注入 [--user-data <user-data>] [--availability-zone <availability-zone>] [--security-groups <security-groups>] [--hint <key=value>] [--nic <net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,port-id=port-uuid>] [--config-drive <value>] [--poll] <name>
這裏面,--boot-volume,--snapshot,--block-device-mapping,--block-device, --swap,--ephemeral 這幾個參數都類似的功能。數據庫
該參數可使用下面這些值:api
這裏面只有 source 和 id 是必須的,別的都有默認值。好比:網絡
dest 會指定source 的 destination,包括本地的(local)和 Cinder 卷 (volume)。數據結構
dest | source | 說明 | shortcut |
volume | volume | 直接掛載到 compute 節點 | 當 boot_index = 0 時至關於 --boot-volume <volume_id> |
snapshot | 調用 cinder 依據快照建立新卷,掛載到compute節點 | 當 boot_index = 0 時至關於 --snapshot <snapshot_id> | |
image | 調用cinder依據鏡像建立新卷,掛載到compute節點 | 當 boot_index = 0 時至關於 --image <image> (Boot from image (creates a new volume)) | |
blank | 通知cinder依大小建立空卷並掛載到compute節點 | ||
local | image | 在 Hypervisor 上建立 ephemeral 分區,將 image 拷貝到裏面並啓動虛機app |
至關於普通的 Boot from imageide |
local | blank | format=swap 時,建立 swap 分區ui 默認建立 ephemeral 分區spa |
當 boot_index=-1, shutdown=remove, format=swap 時至關於 --swap <swap size in MB> 當 boot_index=-1, shutdown=remove 時至關於 --ephemeral |
2.1 --boot-volume <volume_id>
從 volume Boot 虛機。至關於 --block-device source=volume, dest=volume, boot_index=0, shutdown=preserve。一次只能使用一個 volume。不能和 --image and --snapshot 一塊兒使用。
還能夠預先建立好 bootable volume,而後使用 boot-volume 參數來指定該volume id。好比:
nova boot --flavor 2 --boot-volume f3f00ca1-5683-4e6b-8430-4dba1bbe3e5c boot_from_volume
2.2 --snapshot <snapshot_id>
從 snapshot boot 虛機。至關於 --block-device source=snapshot, dest=volume, boot_index=0, shutdown=preserve。一次只能使用一個 snapshot。不能和 --volumeand --snapshot 一塊兒使用。
2.3 --swap <swap size in MB>
在 boot 虛機的時候增長 swap 塊設備。至關於 --block-device source=blank, dest=local, boot_index=-1, shutdown=remove, format=swap。一次只能使用一次。
2.4 --ephemeral size=<size in GB>,format=<ext3, ext4, ...>
在 boot 虛機的時候增長 ephemeral 塊設備。至關於 --block-device source=blank, dest=local, boot_index=-1, shutdown=remove。一次可使用屢次該參數。
好比 --ephemeral size=<size in GB>,format=<ext3, ext4, ...>
2.5 --block-device-mapping <dev-name=mapping> 用於增長多個額外的塊設備
mapping 的格式是 <dev-name>=<id>:<type>:<size(GB)>:<delete-on-terminate>:
好比從 image boot VM 的同時掛載一個block volume
nova boot --image 4042220e-4f5e-4398-9054-39fbd75a5dd7 --flavor 2 --key-name mykey --block-device-mapping vdc=13:::0 boot-with-vol-test
2.6 --image
指定虛機系統盤的鏡像,ID 或者 name。nova compute 會根據 images_type 來決定使用何種類型的系統盤,包括 qcow2(本地鏡像文件)、lvm(volume group 中的vol,經過 iSCSI 掛接給虛機)、rbd(ceph rbd volume)等。
在 OpenStack 中, 一個虛機涉及到的存儲空間, 主要是 根分區 (/ ,root分區), swap分區, ephemeral disk, 還有就是 Block storage (塊存儲,OpenStack 中的 Cinder 項目就是用於管理塊存儲的)。前面三種都是 ephemeral 的 (Nova 中專門定義的 ephemeral disk 指的是除了 root disk 和 swap disk以外的 ephemeral 空間), ephemeral 空間會隨着 instance 的生命週期建立和消亡。
Nova flavor 能夠定義一個虛機的各分區的大小。如下面的 tiny2 flavor 爲例,其 root disk 爲 1G 大小,Ephemeral disk 爲 1G 大小,Swap disk 爲 30M 大小。
s1@controller:~$ nova flavor-list +--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | 1 | m1.tiny | 512 | 1 | 0 | | 1 | 1.0 | True | | 129f237e-8825-49fa-b489-0e41fb06b70e | tiny2 | 50 | 1 | 1 | 30 | 1 | 1.0 | True |
除了能夠在 flavor 中設置各磁盤大小之外, 還使用 nova boot 命令時也能夠設置 swap 和 ephemeral 分區的大小和文件系統,只是這裏設置的空間大小須要比使用的 flavor 中相應值要小,也能夠不設置這兩項,不設置的時候會按照flavor的默認值建立, 否則 novaclient 會提示錯誤。
使用 tiny2 flavor 啓動虛機後,登陸到虛機,使用 「fdisk -l」 命令能夠看到其磁盤的狀況:
root disk:
ephemeral 和 swap disk:
此種類型下,nova compute 會在計算節點本地建立文件夾,並生成虛機系統鏡像文件。
對於 libvirt 虛機來講,當虛機是基於鏡像啓動的時候,虛機的每一個磁盤在 nova compute 節點上都有一個磁盤鏡像文件,默認是在 /var/lib/nova/instances/<instance_id> 目錄中:
root@compute1:/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b# ls -l total 2476 -rw-r--r-- 1 libvirt-qemu kvm 2031616 Jun 10 18:19 disk -rw-r--r-- 1 libvirt-qemu kvm 393216 Jun 10 18:12 disk.local -rw-r--r-- 1 libvirt-qemu kvm 197120 Jun 10 07:42 disk.swap
每一個文件默認都是 qcow2 格式,都使用 backing 文件。
disk 文件對應的是虛機的 root 分區:
root@compute1:/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b# qemu-img info disk image: disk file format: qcow2 virtual size: 1.0G (1073741824 bytes) #受 flavor 指定的大小 disk size: 1.9M cluster_size: 65536 backing file: /var/lib/nova/instances/_base/fbad3d96a1727069346073e51d5bbb1824e76e34 Format specific information: compat: 1.1 lazy refcounts: false
而其 backing file 是個 raw 類型的鏡像文件:
root@compute1:/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b# qemu-img info /var/lib/nova/instances/_base/fbad3d96a1727069346073e51d5bbb1824e76e34 image: /var/lib/nova/instances/_base/fbad3d96a1727069346073e51d5bbb1824e76e34 file format: raw virtual size: 39M (41126400 bytes) disk size: 17M
disk.local 是虛機的 ephemeral 分區的鏡像文件,默認的時候它一樣是 qcow2 類型:
root@compute1:/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b# qemu-img info disk.local image: disk.local file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 324K cluster_size: 65536 backing file: /var/lib/nova/instances/_base/ephemeral_1_default Format specific information: compat: 1.1 lazy refcounts: false
disk.swap 是虛機的 swap 分區的鏡像文件:
root@compute1:/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b# qemu-img info disk.swap image: disk.swap file format: qcow2 virtual size: 30M (31457280 bytes) disk size: 196K cluster_size: 65536 backing file: /var/lib/nova/instances/_base/swap_30 Format specific information: compat: 1.1 lazy refcounts: false
這些磁盤鏡像文件是由 Nova 在啓動虛機的過程當中建立的。鏡像文件的目錄由 nova.config 的配置項 instances_path 指定,其默認值爲 「/var/lib/nova/instances」;鏡像文件的 backing 文件的目錄由 image_cache_subdirectory_name 配置項指定,其默認值爲 「 _base」 ,其主要過程能夠參考 這篇文章。
libvirt.xml 文件定義了磁盤的鏡像文件和磁盤的對應關係:
<disk type="file" device="disk"> <driver name="qemu" type="qcow2" cache="none"/> <source file="/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b/disk"/> <target bus="virtio" dev="vda"/> </disk> <disk type="file" device="disk"> <driver name="qemu" type="qcow2" cache="none"/> <source file="/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b/disk.local"/> <target bus="virtio" dev="vdb"/> </disk> <disk type="file" device="disk"> <driver name="qemu" type="qcow2" cache="none"/> <source file="/var/lib/nova/instances/eddc46a8-e026-4b2c-af51-dfaa436fcc7b/disk.swap"/> <target bus="virtio" dev="vdc"/> </disk>
該數據結構是 Nova 中一個重要的數據結構,它的內容包括虛機的全部磁盤和被附加的全部卷。一個示例以下:
block_device_info = {
'root_device_name': "/dev/sda", //root分區 'swap': { // swap 分區 'device_name': "/dev/sdb", 'swap_size': 5, } 'ephemerals': [ //ephemerals 分區,能夠有多個 {'num': 0, 'virtual_name': 'eph0', 'device_name': "/dev/sdc", 'size': 5 }, {'num': 1, 'virtual_name': 'eph1', 'device_name': "/dev/sdd", 'size': 5 }, {'num': 2, 'virtual_name': 'eph2', 'device_name': "/dev/sde", 'size': 5 }, ... ], 'block_device_mapping': [ //block devices mapping,能夠有多個 {'cinfo': {....some cinder volume data....}, 'mount_device': "/dev/sdf", 'delete_on_termination': True }, {'cinfo': {....some cinder volume data....}, 'mount_device': "/dev/sdg", 'delete_on_termination': True }, {'cinfo': {....some cinder volume data....}, 'mount_device': "/dev/sdh", 'delete_on_termination': True }, ... ], }
block_device_mapping 的信息是由 Nova 在數據庫中維護的,數據表是 block_device_mapping,它維護着一個虛機曾經有過可是如今被刪除的和現有的卷信息:
MariaDB [nova]> select * from block_device_mapping where instance_uuid='02699155-940f-4401-bc01-36220db80639';
| created_at | updated_at | deleted_at | id | device_name | delete_on_termination | snapshot_id | volume_id | volume_size | no_device | connection_info | instance_uuid | deleted | source_type | destination_type | guest_format | device_type | disk_bus | boot_index | image_id |
+---------------------+---------------------+---------------------+----+-------------+-----------------------+-------------+---------------------------
| 2015-06-10 02:01:56 | 2015-06-10 02:44:31 | NULL | 46 | /dev/vda | 0 | NULL | 26446902-5a56-4c79-b839-a8e13a66dc7a | NULL | NULL | {"driver_volume_type": "iscsi", "serial": "26446902-5a56-4c79-b839-a8e13a66dc7a", "data": {"device_path": "/dev/disk/by-path/ip-10.0.2.41:3260-iscsi-iqn.2010-10.org.openstack:volume-26446902-5a56-4c79-b839-a8e13a66dc7a-lun-1", "host_device": "/dev/disk/by-path/ip-10.0.2.41:3260-iscsi-iqn.2010-10.org.openstack:volume-26446902-5a56-4c79-b839-a8e13a66dc7a-lun-1", "target_discovered": false, "encrypted": false, "qos_specs": null, "target_iqn": "iqn.2010-10.org.openstack:volume-26446902-5a56-4c79-b839-a8e13a66dc7a", "target_portal": "10.0.2.41:3260", "volume_id": "26446902-5a56-4c79-b839-a8e13a66dc7a", "auth_password": "Yeb2Sjit2ESPvkKV7YSs", "target_lun": 1, "access_mode": "rw", "auth_username": "HhADUkXT858xD3AEBhzv", "auth_method": "CHAP"}} | 02699155-940f-4401-bc01-36220db80639 | 0 | volume | volume | NULL | disk | virtio | 0 | NULL |
| 2015-06-10 02:27:06 | NULL | 2015-06-10 02:27:14 | 47 | /dev/vdd | 0 | NULL | 31367039-0da5-4dac-bf9a-40303b869126 | NULL | NULL | NULL | 02699155-940f-4401-bc01-36220db80639 | 47 | volume | volume | NULL | NULL | NULL | NULL | NULL |
| 2015-06-10 02:28:59 | NULL | 2015-06-10 02:29:08 | 48 | /dev/vdd | 0 | NULL | 31367039-0da5-4dac-bf9a-40303b869126 | NULL | NULL | NULL | 02699155-940f-4401-bc01-36220db80639 | 48 | volume | volume | NULL | NULL | NULL | NULL | NULL |
| 2015-06-10 02:30:07 | 2015-06-10 02:44:32 | 2015-06-10 03:58:26 | 49 | /dev/vdd | 0 | NULL | 31367039-0da5-4dac-bf9a-40303b869126 | NULL | NULL | {"driver_volume_type": "iscsi", "serial": "31367039-0da5-4dac-bf9a-40303b869126", "data": {"device_path": "/dev/disk/by-path/ip-10.0.2.41:3260-iscsi-iqn.2010-10.org.openstack:volume-31367039-0da5-4dac-bf9a-40303b869126-lun-1", "host_device": "/dev/disk/by-path/ip-10.0.2.41:3260-iscsi-iqn.2010-10.org.openstack:volume-31367039-0da5-4dac-bf9a-40303b869126-lun-1", "target_discovered": false, "encrypted": false, "qos_specs": null, "target_iqn": "iqn.2010-10.org.openstack:volume-31367039-0da5-4dac-bf9a-40303b869126", "target_portal": "10.0.2.41:3260", "volume_id": "31367039-0da5-4dac-bf9a-40303b869126", "auth_password": "2bUgBWHDTr8HyPBSX7wr", "target_lun": 1, "access_mode": "rw", "auth_username": "FaoWrhsw6CFThDtcUvSf", "auth_method": "CHAP"}} | 02699155-940f-4401-bc01-36220db80639 | 49 | volume | volume | NULL | NULL | NULL | NULL | NULL |
| 2015-06-10 05:51:50 | 2015-06-10 05:51:55 | NULL | 52 | /dev/vdd | 0 | NULL | de127d46-ed92-471d-b18b-e89953c305fd | NULL | NULL | {"driver_volume_type": "iscsi", "serial": "de127d46-ed92-471d-b18b-e89953c305fd", "data": {"access_mode": "rw", "host_device": "/dev/disk/by-path/ip-10.0.2.41:3260-iscsi-iqn.2010-10.org.openstack:volume-de127d46-ed92-471d-b18b-e89953c305fd-lun-1", "target_discovered": false, "encrypted": false, "qos_specs": null, "target_iqn": "iqn.2010-10.org.openstack:volume-de127d46-ed92-471d-b18b-e89953c305fd", "target_portal": "10.0.2.41:3260", "volume_id": "de127d46-ed92-471d-b18b-e89953c305fd", "target_lun": 1, "device_path": "/dev/disk/by-path/ip-10.0.2.41:3260-iscsi-iqn.2010-10.org.openstack:volume-de127d46-ed92-471d-b18b-e89953c305fd-lun-1", "auth_password": "eb6BYxF4oJYLFxDt3woc", "auth_username": "nJPF9yMdy2b9ioobRFMw", "auth_method": "CHAP"}} | 02699155-940f-4401-bc01-36220db80639 | 0 | volume | volume | NULL | NULL | NULL | NULL | NULL |
+---------------------+---------------------+---------------------+----+-------------+-----------------------+-------------+----------------------------+
試着使用下面的命令,建立一個 empermeal disk,設置它的 size 爲1G:
nova boot --flavor 5a03775d-11e1-4d20-b4d6-4c54d7036421 --image b07b7e9c-7cb9-4be4-b623-625ef79a142d --block-device source=blank,dest=local,bus=virtio,device=/dev/vdc,size=1 --nic net-id=e088cd37-032c-4ed5-9079-7f4096d2e0eb testdevice2
可是,建立出來的虛機的臨時磁盤依然是 /dev/vdb。日誌代表libivrt driver 拒絕了用戶設置的 device name:
Compute_service record updated for server-72:server-72.2 2018-10-25 12:53:23.830 41759 WARNING nova.virt.libvirt.driver [req-bd][instance: c124e394-cf6f-44ba-be36-53b145067f3c] Ignoring supplied device name: /dev/vdc. Libvirt can't honour user-supplied dev names
分析:
另外,要建立臨時磁盤的話,須要設置 flavor 的 ephemeral 屬性。其值默認爲 0,此時沒法建立 ephemeral 磁盤。
參考連接:
https://wiki.openstack.org/wiki/BlockDeviceConfig
http://adaishu.blog.163.com/blog/static/175831286201262811249332/