在前邊的博客中,我們創建KVM虛擬機用到了virt-manager,這個工具是一個圖形化工具,創建虛擬機很方便;除此我們還是用virsh define/create +虛擬機配置文件來創建虛擬機,這種方式是通過配置文件的方式,我們把定義虛擬機的信息寫成一個.xml格式的描述文件,然后使用virsh這個工具來讀取配置文件,從而根據我們定義的配置文件創建虛擬機;今天我們來了解下直接在命令行使用virt-install命令的方式來創建虛擬機;
1、virt-install的幫助信息
[root@node1 ~]# virt-install -h usage: virt-install --name NAME --memory MB STORAGE INSTALL [options] 從指定安裝源創建新虛擬機。 optional arguments: -h, --help show this help message and exit --version show program's version number and exit --connect URI 通過 libvirt URI 連接到虛擬機管理程序 通用選項: -n NAME, --name NAME 客戶機實例名稱 --memory MEMORY Configure guest memory allocation. Ex: --memory 1024 (in MiB) --memory 512,maxmemory=1024 --memory 512,maxmemory=1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --vcpus VCPUS Number of vcpus to configure for your guest. Ex: --vcpus 5 --vcpus 5,maxvcpus=10,cpuset=1-4,6,8 --vcpus sockets=2,cores=4,threads=2 --cpu CPU CPU model and features. Ex: --cpu coreduo,+x2apic --cpu host-passthrough --cpu host --metadata METADATA 配置客戶機元數據。例如: --metadata name=foo,title="My pretty title",uuid=... --metadata description="My nice long description" 安裝方法選項: --cdrom CDROM 光驅安裝介質 -l LOCATION, --location LOCATION 安裝源 (例如:nfs:host:/path, http://host/path, ftp://host/path) --pxe 使用 PXE 協議從網絡引導 --import 在已有的磁盤鏡像中構建客戶機 --livecd 將光驅介質視為 Live CD -x EXTRA_ARGS, --extra-args EXTRA_ARGS 將附加參數添加到由 --location 引導的內核中 --initrd-inject INITRD_INJECT 添加指定文件到由 --location 指定的 initrd 根中 --os-variant DISTRO_VARIANT 在客戶機上安裝的操作系統,例如:'fedor a18'、'rhel6'、'winxp' 等。 --boot BOOT 配置客戶機引導設置。例如: --boot hd,cdrom,menu=on --boot init=/sbin/init (針對容器) --idmap IDMAP 為 LXC 容器啟用用戶名稱空間。例如: --idmap uid_start=0,uid_target=1000,uid_count=10 設備選項: --disk DISK 指定存儲的各種選項。例如: --disk size=10 (在默認位置創建 10GiB 鏡像) --disk /my/existing/disk,cache=none --disk device=cdrom,bus=scsi --disk=? -w NETWORK, --network NETWORK 配置客戶機網絡接口。例如: --network bridge=mybr0 --network network=my_libvirt_virtual_net --network network=mynet,model=virtio,mac=00:11... --network none --network help --graphics GRAPHICS 配置客戶機顯示設置。例如: --graphics vnc --graphics spice,port=5901,tlsport=5902 --graphics none --graphics vnc,password=foobar,port=5910,keymap=ja --controller CONTROLLER 配置客戶機控制器設備。例如: --controller type=usb,model=ich9-ehci1 --input INPUT 配置客戶機輸入設備。例如: --input tablet --input keyboard,bus=usb --serial SERIAL 配置客戶機串口設備 --parallel PARALLEL 配置客戶機並口設備 --channel CHANNEL 配置客戶機通信通道 --console CONSOLE 配置文本控制台連接主機與客戶機 --hostdev HOSTDEV 配置物理 USB/PCI 等主機設備與客戶機共享 --filesystem FILESYSTEM 傳遞主機目錄到客戶機。例如: --filesystem /my/source/dir,/dir/in/guest --filesystem template_name,/,type=template --sound [SOUND] 配置客戶機聲音設備仿真 --watchdog WATCHDOG 配置客戶機 watchdog 設備 --video VIDEO 配置客戶機視頻硬件。 --smartcard SMARTCARD 配置客戶機智能卡設備。例如: --smartcard mode=passthrough --redirdev REDIRDEV 配置客戶機重定向設備。例如: --redirdev usb,type=tcp,server=192.168.1.1:4000 --memballoon MEMBALLOON 配置客戶機 memballoon 設備。例如: --memballoon model=virtio --tpm TPM 配置客戶機 TPM 設備。例如: --tpm /dev/tpm --rng RNG Configure a guest RNG device. Ex: --rng /dev/urandom --panic PANIC 配置客戶機 panic 設備。例如: --panic default --memdev MEMDEV Configure a guest memory device. Ex: --memdev dimm,target_size=1024 客戶機配置選項: --security SECURITY 設置域安全驅動配置。 --cputune CPUTUNE Tune CPU parameters for the domain process. --numatune NUMATUNE 為域進程調整 NUMA 策略。 --memtune MEMTUNE 為域進程調整內存策略。 --blkiotune BLKIOTUNE 為域進程調整 blkio 策略。 --memorybacking MEMORYBACKING 為域進程設置內存后備策略。例如: --memorybacking hugepages=on --features FEATURES 設置域 <features> XML。例如: --features acpi=off --features apic=on,eoi=on --clock CLOCK 設置域 <clock> XML。例如: --clock offset=localtime,rtc_tickpolicy=catchup --pm PM 配置 VM 電源管理功能 --events EVENTS 配置 VM 生命周期管理策略 --resource RESOURCE 配置 VM 資源分區(cgroups) --sysinfo SYSINFO Configure SMBIOS System Information. Ex: --sysinfo emulate --sysinfo host --sysinfo bios_vendor=Vendor_Inc.,bios_version=1.2.3-abc,... --sysinfo system_manufacturer=System_Corp.,system_product=Computer,... --sysinfo baseBoard_manufacturer=Baseboard_Corp.,baseBoard_product=Motherboard,... --qemu-commandline QEMU_COMMANDLINE Pass arguments directly to the qemu emulator. Ex: --qemu-commandline='-display gtk,gl=on' --qemu-commandline env=DISPLAY=:0.1 虛擬化平台選項: -v, --hvm 這個客戶機應該是一個全虛擬化客戶機 -p, --paravirt 這個客戶機應該是一個半虛擬化客戶機 --container 這個客戶機應該是一個容器客戶機 --virt-type HV_TYPE 要使用的管理程序名稱 (kvm, qemu, xen, ...) --arch ARCH 模擬 CPU 架構 --machine MACHINE 機器類型為仿真類型 其它選項: --autostart 主機啟動時自動啟動域。 --transient Create a transient domain. --wait WAIT 請等待數分鍾以便完成安裝。 --noautoconsole 不要自動嘗試連接到客戶端控制台 --noreboot 安裝完成后不啟動客戶機。 --print-xml [XMLONLY] 打印生成的 XML 域,而不是創建客戶機。 --dry-run 運行安裝程序,但不創建設備或定義客戶 機。 --check CHECK 啟用或禁用驗證檢查。例如: --check path_in_use=off --check all=off -q, --quiet 抑制非錯誤輸出 -d, --debug 輸入故障排除信息 使用 '--option=?' 或 '--option help' 來查看可用的子選項 請參考 man 手冊,以便了解示例和完整的選項語法。 [root@node1 ~]#
提示:如果要查看某一個選項的子選項,可以使用選項加?或者選項加--help來查看,如下所示
[root@node1 ~]# virt-install --memorybacking ? --memorybacking options: clearxml hugepages locked nodeset nosharepages size unit [root@node1 ~]# virt-install --memorybacking help --memorybacking options: clearxml hugepages locked nodeset nosharepages size unit [root@node1 ~]#
2、創建一個虛擬機
2.1、上傳一個鏡像到宿主機
[root@node1 ~]# cd /kvm/iso/ [root@node1 iso]# ls [root@node1 iso]# rz rz waiting to receive. zmodem trl+C ȡ 100% 811008 KB 26161 KB/s 00:00:31 0 Errors-1708.iso... [root@node1 iso]# ls CentOS-7-x86_64-Minimal-1708.iso [root@node1 iso]#
提示:建議把鏡像單獨放在一個目錄下;
2.2、創建磁盤
[root@node1 iso]# cd [root@node1 ~]# cd /kvm/images/ [root@node1 images]# ls c1.qcow2 c2.qcow2 c3.qcow2 cirros-0.5.0-x86_64-disk.img [root@node1 images]# qemu-img create -f qcow2 ./centos7.qcow2 10G Formatting './centos7.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off [root@node1 images]# ll 總用量 41989476 -rw-r--r-- 1 root root 197120 8月 15 13:23 c1.qcow2 -rw------- 1 qemu qemu 21478375424 8月 18 13:07 c2.qcow2 -rw------- 1 root root 21478375424 8月 17 00:23 c3.qcow2 -rw-r--r-- 1 root root 197120 8月 18 13:08 centos7.qcow2 -rw-r--r-- 1 qemu qemu 40108032 8月 18 13:01 cirros-0.5.0-x86_64-disk.img [root@node1 images]#
提示:創建磁盤可以使用-o preallocation來指定磁盤分配策略,它支持 off, metadata, falloc, full,其中off表示不預分配(默認不指定就是這個),metadate,表示分配元素據信息,falloc表示隨文件的增大而增大,full表示全部分配;
2.3、創建虛擬機,並指定使用我們剛才上傳的鏡像
[root@node1 images]# virt-install --virt-type kvm --name c7 --ram 1024 --vcpus 2 --cdrom=/kvm/iso/CentOS-7-x86_64-Minimal-1708.iso --disk path=/kvm/images/centos7.qcow2 --network=default --graphics vnc,listen=0.0.0.0 --noautoconsole 開始安裝...... 域安裝仍在進行。您可以重新連接 到控制台以便完成安裝進程。 [root@node1 images]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- 1 generic running 2 c2 running 3 centos7.0 running 4 c7 running [root@node1 images]#
提示:--virt-type用來指定虛擬機類型,--name用來指定創建的虛擬機名稱,--ram 用於指定內存大小 --vcpus用於指定虛擬cpu核心數量 --cdrom用於指定關盤鏡像文件位置 --disk path用於指定磁盤路徑,--network用於指定網絡名稱 --graphics用於指定虛擬圖形顯卡,--noaustart用於指定不隨宿主機啟動而啟動;到此虛擬機就創建好了,接下來我們需要用圖像軟件VNC或者virt-manager連接到虛擬機的控制台界面進行安裝系統操作;
3、使用vnc連接虛擬機安裝操作系統
3.1、查看宿主機上的監聽端口情況
[root@node1 images]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 1 *:5903 *:* LISTEN 0 128 *:111 *:* LISTEN 0 5 192.168.122.1:53 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:5900 *:* LISTEN 0 128 127.0.0.1:5901 *:* LISTEN 0 128 127.0.0.1:5902 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* [root@node1 images]#
提示:默認情況vnc的第一個虛擬顯示器(窗口)監聽在5900這個端口,第二個窗口監聽5901,依次類推;從上面的信息可以看到,我們宿主機上有4個vnc窗口,我們最后創建的虛擬機應該是第四個窗口,監聽在5903這個端口;
3.2、使用VNC連接宿主機的5903端口
提示:使用tightvnc viewer連接宿主機上的非第一個窗口需要在后面用雙冒號+端口的方式來連接指定窗口;如果是第一個窗口直接寫宿主機的ip地址即可;這里需要注意一點,用virsh或virt-manager創建的虛擬機,默認它是把vnc監聽在127.0.0.1上,所以用外部的vnc軟件是無法正常連接進去的;
提示:至此我們就可以安裝虛擬機操作了,安裝完成后重啟即可;安裝系統的過程就不過多演示了;
3.3、創建windows系統虛擬機
virtio 是一種 I/O 半虛擬化解決方案,是一套通用 I/O 設備虛擬化的程序,是對半虛擬化 Hypervisor 中的一組通用I/O 設備的抽象。提供了一套上層應用與各 Hypervisor 虛擬化設備(KVM,Xen,VMware等)之間的通信框架和編程接口,減少跨平台所帶來的兼容性問題,大大提高驅動程序開發效率,windows 系統需要單獨安裝virtio驅動,linux系統自帶virtio驅動。
3.3.1、創建目錄,並下載virtio驅動(根據安裝的windos版本架構下載驅動)下載地址https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.96/;
[root@node1 kvm]# ls images iso [root@node1 kvm]# mkdir virtio [root@node1 kvm]# cd virtio [root@node1 virtio]# wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.96/virtio-win_amd64.vfd --2020-08-18 13:58:51-- https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.96/virtio-win_amd64.vfd 正在解析主機 fedorapeople.org (fedorapeople.org)... 152.19.134.199, 2610:28:3090:3001:5054:ff:fea7:9474 正在連接 fedorapeople.org (fedorapeople.org)|152.19.134.199|:443... 已連接。 已發出 HTTP 請求,正在等待回應... 301 Moved Permanently 位置:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.96/virtio-win-0.1.96_amd64.vfd [跟隨至新的 URL] --2020-08-18 13:58:54-- https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.96/virtio-win-0.1.96_amd64.vfd 再次使用存在的到 fedorapeople.org:443 的連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度:2949120 (2.8M) [application/x-troff-man] 正在保存至: “virtio-win_amd64.vfd” 100%[====================================================================>] 2,949,120 8.04KB/s 用時 6m 8s 2020-08-18 14:05:03 (7.83 KB/s) - 已保存 “virtio-win_amd64.vfd” [2949120/2949120]) [root@node1 virtio]# ls virtio-win_amd64.vfd [root@node1 virtio]# pwd /kvm/virtio [root@node1 virtio]#
3.3.2、上傳鏡像
[root@node1 images]# cd ../iso/ [root@node1 iso]# ls CentOS-7-x86_64-Minimal-1708.iso [root@node1 iso]# rz rz waiting to receive. zmodem trl+C ȡ 100% 3189038 KB 27025 KB/s 00:01:58 0 Errors_with_sp1_x64_dvd_u_677685.iso... [root@node1 iso]# ll 總用量 4000048 -rw-r--r-- 1 qemu qemu 830472192 2月 22 2018 CentOS-7-x86_64-Minimal-1708.iso -rw-r--r-- 1 root root 3265574912 3月 6 2018 cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso [root@node1 iso]#
3.3.3、創建磁盤
[root@node1 iso]# cd ../virtio/ [root@node1 virtio]# qemu-img create -f qcow2 /kvm/images/win7.qcow2 50G Formatting '/kvm/images/win7.qcow2', fmt=qcow2 size=53687091200 encryption=off cluster_size=65536 lazy_refcounts=off [root@node1 virtio]# ls /kvm/images/win7.qcow2 /kvm/images/win7.qcow2 [root@node1 virtio]#
3.3.4、創建虛擬機
[root@node1 virtio]# virt-install --virt-type kvm --name win7 --ram 1024 --vcpus=2 --os-type=windows --cdrom=/kvm/iso/cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso --disk path=/kvm/images/win7.qcow2,format=qcow2,bus=virtio --disk path=/kvm/virtio/virtio-win_amd64.vfd,device=floppy --network=default --graphics vnc,listen=0.0.0.0 --noautoconsole 開始安裝...... 域安裝仍在進行。您可以重新連接 到控制台以便完成安裝進程。 [root@node1 virtio]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- 1 win7 running - c2 關閉 - c7 關閉 - centos7.0 關閉 - generic 關閉 [root@node1 virtio]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 1 *:5900 *:* LISTEN 0 128 *:111 *:* LISTEN 0 5 192.168.122.1:53 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* [root@node1 virtio]#
提示:可以看到虛擬機已經創建好了,並跑起來了,對應vnc5900端口也處於監聽狀態;
3.3.5、用vnc連接虛擬機控制台,安裝系統
提示:這個根據自己安裝的系統來選就可以了;
提示:如果能夠把我們創建的磁盤識別到,說明我們的驅動選擇是正確的,否則你需要更改驅動;
提示:等這個安裝完成后重啟,windows系統就裝到我們創建的虛擬機上了;需要注意一點這個界面重啟,虛擬機不會自動啟動,需要我們手動的去啟動虛擬機,才能下面的安裝,安裝完成后如下圖所示;
到此基於virt-install工具在命令行創建windows虛擬機,結合vnc連接到虛擬機上安裝操作系統的過程就結束了;其實在生產中,我們更本不會這樣用,因為生產上用的虛擬機數量往往很大,用人為手動的方式去安裝顯然是不行的;我們可以借助自動化工具pxe+kickstart 或者使用cobbler配合這些自動化安裝系統的工具來安裝系統,我們只需要使用腳本把創建虛擬機的命令寫好,創建好網絡配置好網絡,磁盤創建命令寫好,一個腳本我們可以批量創建很多台虛擬機;有關pxe服務器和cobbler服務器的搭建,有興趣的可以參考本人博客《Linux系統自動化安裝之pxe實現》和《Linux系統自動化安裝之cobbler實現》;