使用libvirt 在伺服器上安裝openSuse虛擬機器

禹鼎侯發表於2023-02-09

先講一下我的需求。
我需要在無介面的伺服器上安裝openSUSE虛擬機器,所以市面上常見的一些虛擬機器安裝工具,如vmwarevirtual-box之類的都不考慮,後來瞭解到有一個叫libvirt的工具,可以透過命令列方式安裝虛擬機器,自然成為了首選。
但是在實際安裝的過程中,也出現了一些問題,碰到了一些坑,解決花了一番功夫,特此記錄一下。
需要說明的是,本文偏向於實踐,因此,理論性的知識不多做贅述,如果要講kvmlibvirtqemu,估計幾萬字都說不完。所以,一切從實操出發,Let's go

準備工作

首先要確定你的伺服器是可以使用虛擬機器技術的,先確認cpu支援vmx指令。

cat /proc/cpuinfo |grep vmx

如果查出來有內容,就說明這一條是滿足條件的。
第二步要確認的是核心已經載入了kvm模組,使用如下命令:

lsmod | grep kvm

如果正常,應該能得到如下的結果:

kvm_intel             282624  0 
kvm                   667648  1 kvm_intel
irqbypass              16384  1 kvm

我的機器是CentOS7.9x86_64架構。以上條件都滿足。

安裝軟體

主要是要安裝libvirt相關的一些軟體和依賴,可以使用下面一條命令梭哈:

yum install qemu qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils libguestfs-tools virt-install.noarch -y

安裝完成之後,啟動libvirt服務即可:

systemctl start libvirtd

正常情況下,可以看到服務正常啟動了:

[root@ck16 ~]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since 四 2023-02-09 13:36:07 CST; 14min ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 34326 (libvirtd)
    Tasks: 19 (limit: 32768)
   Memory: 54.1M
   CGroup: /system.slice/libvirtd.service
           ├─ 2694 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/l...
           ├─ 2695 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/l...
           └─34326 /usr/sbin/libvirtd

2月 09 13:36:07 ck16 systemd[1]: Starting Virtualization daemon...
2月 09 13:36:07 ck16 systemd[1]: Started Virtualization daemon.
2月 09 13:36:07 ck16 dnsmasq[2694]: read /etc/hosts - 8 addresses
2月 09 13:36:07 ck16 dnsmasq[2694]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
2月 09 13:36:07 ck16 dnsmasq-dhcp[2694]: read /var/lib/libvirt/dnsmasq/default.hostsfile

這時候,如果你在終端輸入virsh list應該能正常顯示:

[root@ck16 ~]# virsh list
 Id    名稱                         狀態
----------------------------------------------------

該命令是列出當前已經安裝過的虛擬機器,由於我們還沒有安裝過,所以虛擬機器列表為空。

建立虛擬機器

建立虛擬機器使用 virt-install命令。該命令引數眾多,可以使用-h進行檢視。
在建立虛擬機器之前需要有一個系統映象,我這裡使用的是openSUSE15.4, 安裝使用如下命令即可:

virt-install --name=vm1 --vcpus=2 --memory=2048 --location=/mnt/nfs/1-ISO/1-linux/openSUSE-Leap-15.4-CR-DVD-x86_64-Build31.98-Media.iso --disk size=100 --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics --os-variant=opensuse15.1

以上命令簡要說明:

  • --name=vm1

    • 指定虛擬機器的名字,只要不與已有的虛擬機器重複就行
  • --vcpus=2

    • 指定要建立的虛擬機器vcpu個數
  • --memory=2048

    • 指定要建立的虛擬機器記憶體大小
  • --location=/mnt/nfs/1-ISO/1-linux/openSUSE-Leap-15.4-CR-DVD-x86_64-Build31.98-Media.iso

    • 指定映象位置,也可以使用--cdrom指定,不過我安裝的時候有坑,就用--location指定的
  • --disk size=100

    • 設定虛擬機器硬碟大小, 預設單位為GB
    • 注意:磁碟一定不能設定太小,我第一次指定5G,安裝時需要自己進行分割槽,結果分割槽太小,導致安裝時空間不足,如果空間比較大,它會自己分割槽,不用人工參與
    • 安裝centos所需硬碟應該可以小一點,5G也能安裝上
  • --extra-args='console=tty0 console=ttyS0,115200n8 serial'

    • 額外引數,主要是指定console,如果沒有console,那麼後面安裝會卡住,進不了終端
    • 注意指定了該引數,前面指定系統映象時就必須使用--location,而不能使用--cdrom
  • --nographics

    • 這一步也很重要,我之前在這一步卡了很久,如果不指定這一項,它應該是會彈出來安裝介面的,因為我是在伺服器上安裝的,沒有介面彈出,所以一直卡在那裡很久都沒有反應
    • 禁用這項後,它就會在控制檯進行安裝,很快就能看到安裝進度
  • --os-variant=opensuse15.1

    • 指定安裝系統的型別,注意不能亂指,os-variant支援的型別,可以透過命令osinfo-query os命令進行檢視

以上命令執行後,等待安裝就行了,安裝過程中,會引導提示你輸入使用者名稱,密碼,以及時區什麼的,都是安裝系統的常規操作,這裡就不贅述了。

安裝完成後系統會自動重啟,然後輸入之前設定的使用者名稱和密碼,就能登入上去了。

eoi@localhost:~> cat /etc/os-release 
NAME="openSUSE Leap"
VERSION="15.4"
ID="opensuse-leap"
ID_LIKE="suse opensuse"
VERSION_ID="15.4"
PRETTY_NAME="openSUSE Leap 15.4"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:15.4"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"
DOCUMENTATION_URL="https://en.opensuse.org/Portal:Leap"
LOGO="distributor-logo-Leap"

執行ifconfig報錯,提示需要安裝,安裝一下:

eoi@localhost:~> ifconfig
If 'ifconfig' is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf ifconfig
eoi@localhost:~> cnf ifconfig
ifconfig: searching ... 
Warning: incomplete repos found but could not refresh - try to refresh manually, e.g. with 'zypper refresh'.
                          
The program 'ifconfig' can be found in following packages:
  * net-tools-deprecated [ path: /bin/ifconfig, repository: zypp (repo-oss) ]
  * net-tools-deprecated [ path: /usr/bin/ifconfig, repository: zypp (repo-oss) ]

Try installing with:
    sudo zypper install net-tools-deprecated

eoi@localhost:~> sudo zypper install net-tools-deprecated

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for root: 
Retrieving repository 'Update repository of openSUSE Backports' metadata .[done]
Building repository 'Update repository of openSUSE Backports' cache ......[done]
Retrieving repository 'Update repository with updates from SUSE Linux Ente[done]
Building repository 'Update repository with updates from SUSE Linux Enterp[done]
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  net-tools-deprecated

1 new package to install.
Overall download size: 170.2 KiB. Already cached: 0 B. After the operation,
additional 460.1 KiB will be used.
Continue? [y/n/v/...? shows all options] (y): y
Retrieving package net-tools-deprecated-2.0+git20170221.479bb4a-3.11.x86_64
                                           (1/1), 170.2 KiB (460.1 KiB unpacked)
Retrieving: net-tools-deprecated-2.0+git20170221.479bb4a-3.11.[done (2.4 KiB/s)]

Checking for file conflicts: .............................................[done]
(1/1) Installing: net-tools-deprecated-2.0+git20170221.479bb4a-3.11.x86_64[done]
eoi@localhost:~> ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.230  netmask 255.255.255.0  broadcast 192.168.122.255
        inet6 fe80::5054:ff:fefa:87e3  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:fa:87:e3  txqueuelen 1000  (Ethernet)
        RX packets 25541  bytes 58671738 (55.9 MiB)
        RX errors 0  dropped 56  overruns 0  frame 0
        TX packets 18778  bytes 1425343 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)

vitsh常用命令

克隆機器

克隆機器前需要停止機器:

virsh shutdown vm1

克隆命令如下:

virt-clone -o vm1 -n vm2 --auto-clone

其中:

  • -o

    • 指定源虛擬機器
  • -n

    • 指定目標虛擬機器
  • --auto-clone

    • 自動克隆,就不需要指定虛擬機器映象位置了
[root@ck16 ~]# virt-clone -o vm1 -n vm2 --auto-clone
正在分配 'vm2.qcow2'                                                                                  | 100 GB  00:00:03     

成功克隆 'vm2'。

檢視虛擬機器

virsh list --all

virsh list只能看到正在執行的虛擬機器,加上--all就能看到所有的虛擬機器,包括關閉的虛擬機器了。

[root@ck16 ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 4     vm2                            running
 -     vm1                            關閉

關閉虛擬機器

virsh shutdown vm1

virsh destroy vm1

刪除虛擬機器

virsh undefine vm1

注意刪除虛擬機器,僅在虛擬機器被停止後才會生效,如果虛擬機器在執行狀態下執行刪除,它不會報錯,但也不會實際被刪除,只有停止後才會真正被刪除。

重啟虛擬機器

virsh reboot vm1

進入虛擬機器

virsh console vm1

當然還有更多的命令,就不一一介紹了,可以使用--help命令檢視。

參考文件: https://linuxconfig.org/how-t...

相關文章