1. 程式人生 > >libvirt 詳解(2)

libvirt 詳解(2)

1.1.3 libvirt、libvirtd的配置和使用

1. libvirt的配置檔案

以RHEL 6.3為例,libvirt相關的配置的配置檔案都在 /etc/libvirt/ 目錄之中,如下所示:

[[email protected] libvirt]# cd /etc/libvirt/

[[email protected] libvirt]# ls

cim  libvirt.conf  libvirtd.conf  lxc.conf  nwfilter  qemu  qemu.conf  qemu-sanlock.conf  storage

[[email protected]

libvirt]# cd qemu

[[email protected] qemu]# ls

networks  rhel6u3-1.xml  rhel6u3-2.xml

下面簡單介紹其中幾個重要的配置檔案和目錄:

(1)/etc/libvirt/libvirt.conf

libvirt.conf 檔案是用於配置一些常用 libvirt 連線(通常是遠端連線)的別名,和Linux中的普通配置檔案一樣,該配置檔案中以井號(#)開頭的行是註釋,本次示例中的該配置檔案如下:

[[email protected] kvm_demo]# cat /etc/libvirt/libvirt.conf

#

# This can be used to setup URI aliases for frequently

# used connection URIs. Aliases may contain only the

# characters  a-Z, 0-9, _, -.

#

# Following the ‘=’ may be any valid libvirt connection

# URI, including arbitrary parameters

uri_aliases = [

"remote1=qemu+ssh://[email protected]/system",

]

其中,配置了 remote1 這個別名用於指代 qemu+ssh://[email protected]/system 這個遠端的libvirt連線,有這個別名後,就可以在 virsh 等工具或者自己寫程式碼呼叫libvirt API 時使用這個別名而不需要寫完整的、冗長的URI連線標識了。用 virsh 使用這個別名,連線到遠端的 libvirt 上查詢當前已經啟動的客戶機狀態,然後退出連線,命令列操作如下:

[[email protected] kvm_demo]# service libvirtd reload

Reloading libvirtd configuration:                          [  OK  ]

[[email protected] kvm_demo]# virsh -c remote1

[email protected]′s password:

Welcome to virsh, the virtualization interactive terminal.

Type:  ‘help’ for help with commands

‘quit’ to quit

virsh # list

Id    Name                           State

—————————————————-

1     rhel6u3-remote                 running

virsh # quit

[[email protected] kvm_demo]#

在程式碼中呼叫 libvirt API 也可以使用這個別名用於建立連線,如下的 python 程式碼行就是使用這個別名來建立連線:

conn = libvirt.openReadOnly(‘remote1′)

(2)/etc/libvirt/libvirtd.conf

libvirtd.conf 是 libvirt 的守護程序 libvirtd 的配置檔案,修改後需要讓libvirtd重新載入配置檔案(或重啟libvirtd)才會生效。 libvirtd.conf 檔案中,用井號(#)開頭的行是註釋內容,真正有用的配置在檔案的每一行中使用“配置項 = 值”(如tcp_port = “16509″)這樣配對的格式來設定。 libvirtd.conf 配置值了 libvirtd 啟動時的許多設定,包括是否建立 TCP、UNIX domain socket 等連線方式及其最大連線數,以及這些連線的認證機制,等等。

例如,下面的幾個配置項,表示關閉TLS安全認證的連線(預設值是開啟的)、開啟 TCP 連線(預設是關閉TCP連線的),設定TCP監聽的埠,TCP連線不使用認證授權方式,設定UNIX domain socket 的儲存目錄等。

listen_tls = 0

listen_tcp = 1

tcp_port = “16666″

unix_sock_dir = “/var/run/libvirt”

auth_tcp = “none”

注意:要讓TCP、TLS等連線的生效,需要在啟動 libvirtd 時加上 –listen 引數(簡寫為 -l )。而預設的 service libvirtd start 命令啟動 libvirtd 服務時,並沒帶 –listen 引數,所以如果要使用TCP等連線方式,可以使用 libvirtd –listen -d 命令來啟動libvirtd。

上面配置選項讓 UNIX socket 放到 /var/run/libvirt 目錄下,啟動 libvirtd 並檢驗配置是否生效,命令列操作如下:

[[email protected] ~]# libvirtd –listen -d

2012-12-01 07:54:02.715+0000: 6788: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)

[[email protected] ~]# virsh -c qemu+tcp://localhost:16666/system

Welcome to virsh, the virtualization interactive terminal.

Type:  ‘help’ for help with commands

‘quit’ to quit

virsh # quit

[[email protected] ~]# ls /var/run/libvirt/libvirt-sock*

/var/run/libvirt/libvirt-sock  /var/run/libvirt/libvirt-sock-ro

(3)/etc/libvirt/qemu.conf

qemu.conf 是 libvirt 對QEMU的驅動的配置檔案,包括 VNC、SPICE等和連線它們時採用的許可權認證方式的配置,也包括記憶體大頁、SELinux、Cgroups等相關配置。

(4)/etc/libvirt/qemu/ 目錄

qemu 目錄下是存放使用QEMU驅動的域的配置檔案,檢視qemu目錄如下:

[[email protected] ~]# ls /etc/libvirt/qemu/

networks  rhel6u3-1.xml  rhel6u3-2.xml

其中包括了兩個域的XML配置檔案(rhel6u3-1.xml 和 rhel6u3-2.xml),這就是筆者用virt-manager 工具建立的兩個域,預設會將其配置檔案儲存到 /etc/libvirt/qemu/ 目錄下。而其中的 networks 目錄是儲存了建立一個域時預設使用的網路配置。

2. libvirtd的使用

libvirtd 是一個作為 libvirt 虛擬化管理系統中的伺服器端的守護程式,如果要讓某個節點能夠用 libvirt 進行管理(無論是本地還是遠端管理),都需要在這個節點上執行著 libvirtd 這個守護程序,以便讓其他上層管理工具可以連線到該節點,libvirtd 負責執行其他管理工具傳送它的虛擬化管理操作指令。而 libvirt 的客戶端工具(包括virsh、virt-manager等)可以連線到本地或遠端的 libvirtd 程序,以便管理節點上的客戶機(啟動、關閉、重啟、遷移等)、收集節點上的宿主機和客戶機的配置和資源使用狀態。

在RHEL 6.3 中 libvirtd 是作為一個服務(service)配置在系統中的,所以可以通過 service 命令來對其進行操作(實際是通過 /etc/init.d/libvirtd 服務指令碼來實現的)。常用的操作方式有:“service libvirtd start”命令表示啟動libvirtd,“service libvirtd restart”表示重啟 libvirtd,“service libvirtd reload”表示不重啟服務但是重新載入配置檔案(即 /etc/libvirt/libvirtd.conf 配置檔案)。對 libvirtd 服務進行操作示例的命令列如下:

[[email protected] ~]# service libvirtd

Usage: /etc/init.d/libvirtd {start|stop|status|restart|condrestart|reload|force-reload|try-restart}

[[email protected] ~]# service libvirtd start

Starting libvirtd daemon: 2012-12-01 08:14:33.048+0000: 31202: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)

[  OK  ]

[[email protected] ~]# service libvirtd status

libvirtd (pid  31327) is running…

[[email protected] ~]# service libvirtd restart

Stopping libvirtd daemon:                                  [  OK  ]

Starting libvirtd daemon: 2012-12-01 08:14:43.522+0000: 31325: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)

[  OK  ]

預設情況下,libvirtd監聽在一個本地的Unix domain socket上,而沒有監聽基於網路的TCP/IP socket,需要使用“-l 或 –listen”的命令列引數來開啟對 libvirtd.conf 配置檔案中對TCP/IP socket的配置。另外,libvirtd 守護程序的啟動或停止,並不會直接影響到正在執行中的客戶機。 libvirtd 在啟動或重啟完成時,只要客戶機的XML配置檔案是存在的,libvirtd 會自動載入這些客戶的配置,獲取它們的資訊;當然,如果客戶機沒有基於 libvirt 格式的XML檔案來執行,libvirtd 則不能發現它。

libvirtd 是一個可執行程式,不僅可以使用“service”命令呼叫它作為服務來執行,而且可以單獨地執行 libvirtd 命令來使用它。libvirtd 命令列主要有如下幾個引數:

-d,或 –daemon

表示讓 libvirtd 作為守護程序(daemon)在後臺執行。

-f,或 –config  FILE

指定libvirtd的配置檔案為FILE,而不是使用預設值(通常是 /etc/libvirt/libvirtd.conf )。

-l,或 –listen

開啟配置檔案中配置的 TCP/IP 連線。

-p,或 –pid-file FILE

將 libvirtd 程序的PID寫入到FILE檔案中,而不是使用預設值(通常是 /var/run/libvirtd.pid )。

-t,或 –timeout SECONDS

設定對 libvirtd 連線的超時時間為SECONDS秒。

-v,或 –verbose

讓命令輸出詳細的輸出資訊。特別是執行出錯時,詳細的輸出資訊便於使用者查詢原因。

–version

顯示 libvirtd 程式的版本資訊。

對libvirtd 命令的使用,幾個簡單的命令列操作示例如下:

#使用libvirtd 命令前,先停止已有的服務

[[email protected] ~]# service libvirtd stop

Stopping libvirtd daemon:                                  [  OK  ]

[[email protected] ~]# libvirtd –version

libvirtd (libvirt) 0.9.10

[[email protected] ~]# libvirtd

2012-12-01 08:57:38.475+0000: 2196: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)

^C    #沒有以daemon的形式啟動,標準輸出被libvirtd 佔用;這裡用 Ctrl-C 結束掉libvirtd 程序,以便繼續進行後續操作。

[[email protected] ~]# libvirtd -l -d  -p /root/libvirtd.pid

2012-12-01 08:56:14.665+0000: 7683: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)

[[email protected] ~]# cat /root/libvirtd.pid

7685

1.1.5 libvirt API 簡介

libvirt 的核心價值和主要目標就是提供了一套管理虛擬機器的、穩定的、高效的應用程式介面(API)。libvirt API 本身是用C語言實現的,本節以其提供了最核心的 C語言介面的 API 為例做簡單的介紹。

libvirt API 大致可劃分為如下8個大的部分:

(1)連線 Hypervisor 相關的API:以virConnect 開頭的一系列函式。

只有與 Hypervisor 建立了連線之後,才能進行虛擬機器管理操作,所以連線 Hypervisor 的API是其他所有API使用的前提條件。與 Hypervisor 建立的連線是為其他API的執行提供了路徑,是其他虛擬化管理功能的基礎。通過呼叫 virConnectOpen 函式可以建立一個連線,其返回值是一個virConnectPtr 物件,該物件就代表到 Hypervisor 的一個連線;如果連接出錯,則返回空值(NULL)。而 virConnectOpenReadOnly 函式會建立一個只讀的連線,在該連線上可以使用一些查詢的功能,而不使用建立、修改等功能。 virConnectOpenAuth 函式提供了更具認證建立的連線。 virConnectGetCapabilities 函式是返回對 Hypervisor 和驅動的功能的描述的 XML 格式的字串。virConnectListDomains函式返回一列域識別符號,它們代表該 Hypervisor 上的活動域。

(2)域管理的 API:以virDomain 開頭的一系列函式。

虛擬機器的管理,最基本的職能就是對各個節點上的域的管理,故 libvirt API 中實現了很多針對域管理的函式。要管理域,首先就要獲取virDomainPtr 這個域物件,然後才能對域進行操作。有很多種方式來獲取域物件,如 virDomainPtr virDomainLookupByID (virConnectPtr conn, int id) 函式是根據域的 id 值到 conn 這個連線上去查詢相應的域。類似地,virDomainLookupByName、virDomainLookupByUUID 等函式分別是根據域的名稱和 UUID 去查詢相應的域。在得到了某個域的物件後,就可以進行很多的操作,可以是查詢域的資訊(如:virDomainGetHostname、virDomainGetInfo、virDomainGetVcpus、virDomainGetVcpusFlags、virDomainGetCPUStats,等等),也可以是控制域的生命週期(如:virDomainCreate 、virDomainSuspend 、virDomainResume 、virDomainDestroy 、virDomainMigrate,等等)。

(3)節點管理的 API:以virNode 開頭的一系列函式。

域是執行在物理節點之上,libvirt也提供了對節點的資訊查詢和控制的功能。節點管理的多數函式都需要使用一個連線 Hypervisor 的物件作為其中的一個傳入引數,以便可以查詢或修改到該連線上的節點的資訊。virNodeGetInfo函式是獲取節點的物理硬體資訊,virNodeGetCPUStats 函式可以獲取節點上各個 CPU 的使用統計資訊,virNodeGetMemoryStats 函式可以獲取節點上的記憶體的使用統計資訊,virNodeGetFreeMemory 函式可以獲取節點上可用的空閒記憶體大小。也有一些設定或者控制節點的函式,如virNodeSetMemoryParameters 函式可以設定節點上的記憶體排程的引數,virNodeSuspendForDuration 函式可以讓節點(宿主機)暫停執行一段時間。

(4)網路管理的 API:以 virNetwork 開頭的一系列函式和部分以 virInterface 開頭的函式。

libvirt 對虛擬化環境中的網路管理也提供了豐富的API。libvirt 首先需要建立virNetworkPtr 物件,然後才能查詢或控制虛擬網路。一些查詢網路相關資訊的函式,如:virNetworkGetName 函式可以獲取網路的名稱,virNetworkGetBridgeName 函式可以獲取該網路中網橋的名稱,virNetworkGetUUID 函式可以獲取網路的 UUID 標識,virNetworkGetXMLDesc 函式可以獲取網路的以 XML 格式的描述資訊,virNetworkIsActive 函式可以查詢網路是否正在使用中。一些控制或更改網路設定的函式,有:virNetworkCreateXML 函式可以根據提供的 XML 格式的字串建立一個網路(返回 virNetworkPtr 物件),virNetworkDestroy 函式可以銷燬一個網路(同時也會關閉使用該網路的域),virNetworkFree 函式可以回收一個網路(但不會關閉正在執行的域),virNetworkUpdate 函式可根據提供的 XML 格式的網路配置來更新一個已存在的網路。另外,virInterfaceCreate、virInterfaceFree、virInterfaceDestroy、virInterfaceGetName、virInterfaceIsActive 等函式可以用於建立、釋放和銷燬網路介面,以及查詢網路介面的名稱和啟用狀態。

(5)儲存卷管理的 API:以 virStorageVol 開頭的一系列函式。

libvirt 對儲存卷(volume)的管理,主要是對域的映象檔案的管理,這些映象檔案可能是 raw、qcow2、vmdk、qed等各種格式。libvirt 對儲存卷的管理,首先需要建立virStorageVolPtr 這個儲存卷的物件,然後才能對其進行查詢或控制操作。libvirt 提供了3個函式來分別通過不同的方式來獲取儲存卷物件,如:virStorageVolLookupByKey 函式可以根據全域性唯一的鍵值來獲得一個儲存卷物件,virStorageVolLookupByName 函式可以根據名稱在一個儲存資源池(storage pool)中獲取一個儲存卷物件,virStorageVolLookupByPath 函式可以根據它在節點上路徑來獲取一個儲存卷物件。有一些函式用於查詢儲存卷的資訊,如:virStorageVolGetInfo 函式可以查詢某個儲存卷的使用情況,virStorageVolGetName 函式可以獲取儲存卷的名稱,virStorageVolGetPath 函式可以獲取儲存卷的路徑,virStorageVolGetConnect 函式可以查詢儲存卷的連線。一些函式用於建立和修改儲存卷,如:virStorageVolCreateXML 函式可以根據提供的 XML 描述來建立一個儲存卷,virStorageVolFree 函式可以釋放儲存卷的控制代碼(但是儲存卷依然存在),virStorageVolDelete 函式可以刪除一個儲存卷,virStorageVolResize 函式可以調整儲存卷的大小。

(6)儲存池管理的 API:以virStoragePool 開頭的一系列函式。

libvirt 對儲存池(pool)的管理,包括對本地的基本檔案系統、普通網路共享檔案系統、iSCSI共享檔案系統、LVM分割槽等的管理。libvirt 需要基於 virStoragePoolPtr 這個儲存池物件才能進行查詢和控制操作。一些函式可以通過查詢獲取一個儲存池物件,如:virStoragePoolLookupByName 函式可以根據儲存池的名稱來獲取一個儲存池物件,virStoragePoolLookupByVolume 可以根據一個儲存卷返回其對應的儲存池物件。virStoragePoolCreateXML 函式可以根據 XML 描述來建立一個儲存池(預設已啟用),virStoragePoolDefineXML 函式可以根據 XML 描述資訊靜態地定義個儲存池(尚未啟用),virStoragePoolCreate 函式可以啟用一個儲存池。virStoragePoolGetInfo、virStoragePoolGetName、virStoragePoolGetUUID等函式可以分別獲取儲存池的資訊、名稱和 UUID 標識。virStoragePoolIsActive函式可以查詢儲存池是否處於使用中狀態。virStoragePoolFree 函式可以釋放儲存池相關的記憶體(但是不改變其在宿主機中的狀態),virStoragePoolDestroy 函式可以用於銷燬一個儲存池(但並沒有釋放virStoragePoolPtr 物件,之後還可以用virStoragePoolCreate 函式重新啟用它),virStoragePoolDelete 函式可以物理刪除一個儲存池資源(該操作不可恢復)。

(7)事件管理的API:以virEvent 開頭的一系列函式。

libvirt 支援事件機制,使用該機制註冊之後,可以在發生特定的事件(如:域的啟動、暫停、恢復、停止等)之時,得到自己定義的一些通知。

(8)資料流管理的API:以virStream 開頭的一系列函式。

libvirt 還提供了一系列函式用於資料流的傳輸。

對於 libvirt API 一些細節的使用方法和實現原理,可以參考其原始碼或者本章末尾的參考閱讀中介紹資料。

相關推薦

libvirt 2

1.1.3 libvirt、libvirtd的配置和使用 1. libvirt的配置檔案 以RHEL 6.3為例,libvirt相關的配置的配置檔案都在 /etc/libvirt/ 目錄之中,如下所示: [[email protected] libvirt]# cd /etc/libvirt/

canvas特效代碼2

text pre javascrip css png tco border src null canvas是一個就基於像素的畫圖h5元素。 利用canvas做一個如下描述所示的動態圖形:當鼠標點下去時開始繪圖,在鼠標結束時完成一個矩形,當再一次點擊時重復第一次的繪圖步驟

經典算法2尋找數組中的次大數

etc n) esp arr else second include 尋找 char 題目:10個互不相等的整數,求其中的第2大的數字,要求數組不能用排序,設計的算法效率越高越好。 1 #include<iostream> 2 3 using name

屬性配置文件2

環境配置 gap 通過 數據庫 訪問 基本 需要 .profile 實驗 通過命令行設置屬性值 相信使用過一段時間Spring Boot的用戶,一定知道這條命令:java -jar xxx.jar --server.port=8888,通過使用–server.port屬性來

Spring MVC @RequestMapping註解2

並不是 value get ecif 使用 .com java代碼 處理方法 分開 @RequestMapping 參數說明   value:定義處理方法的請求的 URL 地址。(重點)   method:定義處理方法的 http method 類型,如 GET、POST

Java2--JDK安裝與環境變數配置

JDK安裝與環境變數配置 ---------------------  作者:文動天下 來源:CSDN  連結:https://blog.csdn.net/li_yi_kun?t=1 版權宣告:本文為博主原創文章,轉載請附上博文連結! 1、JDK&nb

JAVA:Excel匯入匯出2--匯入

1. 瀏覽資料夾,選擇需要上傳的檔案 程式碼 jsp <li class="col-sm-1"> <span>上&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&a

Extreme Drift賽車遊戲C#源碼2

時間 blank 出現 進行 rest clam .text static cost Extreme Drift賽車遊戲C#源碼詳解(1) 接著上次的源碼分析: MainMenu場景的UGUI部分: Canvas中的EnoughMoney: 作用:當買車後金幣不足彈出的

C語言面向物件程式設計:繼承2

在 C 語言面向物件程式設計(一)裡說到繼承,這裡再詳細說一下。     C++ 中的繼承,從派生類與基類的關係來看(出於對比 C 與 C++,只說公有繼承): 派生類內部可以直接使用基類的 public 、protected 成員(包括變數

iptables2:四表五鏈

關於iptables中“四表五鏈”,我們今天來好好嘮嘮: 1、表的概念:   我們把具有相同功能的規則的集合叫做"表",所以說,不同功能的規則,我們可以放置在不同的表中進行管理,而iptables已經為我們定義了4種表,每種表對應了不同的功能,而我們定義的規則也都逃脫不了這4種功能的範圍,所以,學習ipt

nignx服務之配置檔案2

nginx是一個功能非常強大的web伺服器加反向代理伺服器,同時又是郵件伺服器等等,在專案使用中,使用最多的三個核心功能是反向代理、負載均衡和靜態伺服器。這三個不同的功能的使用,都跟nginx的配置密切相關,nginx伺服器的配置資訊主要集中在nginx.conf這個配置檔案中,並且所有的可

redis啟動報錯2Unrecoverable error: corrupted cluster config file.

➜ 7000 ../redis-server redis.conf & [1] 11045 11045:C 24 Oct 2018 19:26:52.320 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1104

虛擬記憶體2

一、定義以及基本思想 定義:系統對主存的抽象。 基本思想:允許每個資料物件有多個獨立的地址,其中每個地址選自不同的地址空間。 二、作用 將主存看成是一個儲存在磁碟上的地址空間的快取記憶體,在主存中只儲存活動區域,並根據需要在主存和磁碟中來回傳遞資料,通

Android 4.4 Graphic系統2 VSYNC的生成

VSYNC 的概念 VSYNC(Vertical Synchronization)是一個相當古老的概念,對於遊戲玩家,它有一個更加大名鼎鼎的中文名字—-垂直同步。 “垂直同步(vsync)”指的是顯示卡的輸出幀數和螢幕的垂直重新整理率相同,這完全是一個CRT顯

JMeter對伺服器效能監控--結果檢視和plugins外掛2

首先申明,此篇文章借鑑出處:https://www.jianshu.com/p/ea36fef0a96b 引言 我們對被測應用進行效能測試時,除了關注吞吐量、響應時間等應用自身的表現外,對應用執行所涉及的伺服器資源的使用情況,也是非常重要的方面,通過實時監控,可以準確

基於TensorFlow的Cats vs. Dogs貓狗大戰實現和2

2. 卷積神經網路模型的構造——model.py   關於神經網路模型不想說太多,視訊中使用的模型是仿照TensorFlow的官方例程cifar-10的網路結構來寫的。就是兩個卷積層(每個卷積層後加一個池化層),兩個全連線層,最後一個softmax

屬性配置檔案2十七

過命令列設定屬性值 相信使用過一段時間Spring Boot的使用者,一定知道這條命令:java -jar xxx.jar --server.port=8888,通過使用–server.port屬性來設定xxx.jar應用的埠為8888。 在命令列執行時,連續的兩個減號--就是對application.p

XILINX_zynq_2

  2010年4月矽谷舉行的嵌入式系統大會上,賽靈思釋出了可擴充套件處理平臺的架構詳情,這款基於無處不在的ARM處理器的SoC可滿足複雜嵌入式系統的高效能、低功耗和多核處理能力要求。賽靈思可擴充套件處理平臺晶片硬體的核心本質就是將通用基礎雙ARMCortex-A9MPCore處理器系統作為“主系統”,結合低功

第四章 Controller介面控制器2

4.5、ServletForwardingController 將接收到的請求轉發到一個命名的servlet,具體示例如下:   java程式碼: Java程式碼  

Linux 開機引導和啟動過程2

理解作業系統開機引導和啟動過程對於配置作業系統和解決相關啟動問題是至關重要的。該文章陳述了 GRUB2 引導裝載程式開機引導裝載核心的過程和 systemd 初始化系統執行開機啟動作業系統的過程。   事實上,作業系統的啟動分為兩個階段:引導boot和啟動startup。引導