天天看點

第二章 Linux系統總覽-2.6 Linux系統啟動流程

作者:邊緣智能技術

通過前面幾個章節,我們對Linux已經有了一些基本的概念,這個章節,會講解一下Linux的整個啟動過程,不過不會進行非常深入的分析,隻是希望你在總體上對Linux啟動過程有一個基本的了解,如果你看完本小節内容,卻不是很明白,也沒關系,繼續往後看,随着逐漸深入了解,在不時的回過頭來看看本小結,或者就明白了。書有時候就要來回看,反複看,俗話說,讀書百遍,其義自現,說的就是這個道理,對于這個道理,我自己也深有體會,我大學學的是建築工程,也是一個很不錯的專業,但就是沒有興趣,是以後來決定考計算機的研究所學生,然後就是自學,很多專業課,完全沒有基礎,看一遍根本就看不懂,然後就反反複複的看,每一遍都有新的收獲,後來發現慢慢的,居然全部都看懂了,沒有報任何輔導班,全都是自己學習的。

Linux的啟動,主要包括固件初始化,引導加載程式的執行,Linux核心映像的加載和啟動,以及檔案系統中各種腳本和守護程式的執行,最後就是圖形桌面系統的啟動(當然,也有很多Linux可能是不帶圖形系統的,這種情況通常啟動到一個可以互動的指令行下面),總體步驟基本上就是這幾個步驟,但實際是實作方式和技術,在Linux發展過程中,是在不斷的變化和演進的。不同CPU硬體和架構,細節上也不台一樣,在引導程式這邊,比如X86的引導程式,目前使用的最多的是grub(早期還有LILO等),而ARM架構,目前基本上都是用Uboot引導(早期還有ecos等)。另外比如當核心加載完畢後,開始啟動Linux根檔案系統時,不同的Linux發展階段,也有不同的方式,總的來說,主要有以下三種:

  • Sysvinit
  • Upstart
  • Systemd

舉例以Ubuntu的發展來看:

Ubuntu 6.10及以前版本使用Sysvinit。

Ubuntu 14.10及以前版本使用Upstart但是還留着Sysvinit并存。

Ubuntu 15.04開始預設使用Systemd,但是可以在開機選項選擇使用Systemd或Upstart,但是不可同時使用Sysvinit或Upstart并存。

如今,最新的Linux發行版,都已經預設采用的systemd的系統啟動方式。Upstart應該已經不見蹤迹,Sysvinit曆史悠久,直到今天,還有很多嵌入式Linux在采用這種方式來啟動,因為它比較簡單。是以,這幾種方式,也沒有絕對的好與壞,隻有合适不合适,根據需要采用合适的啟動方式。

是以接下來後續介紹中,upstart,就不介紹了,因為基本已經沒有Linux在用了,Sysvinit啟動方式,用的也比較少,我會簡單介紹,而重點會介紹systemd機制,目前這種方式,使用最為廣泛。

剛才也提到,不同系統,不同架構,啟動方式也有差異,是以,這裡以X86平台,Ubuntu 20.04為例來講解整個啟動過程,但不做深入分析,隻是簡單了解過程。其實X86 Linux的啟動過程,都差不多。

  1. 第一步:開機自檢,加載BIOS(針對X86,ARM等沒有該步驟)
  2. 第二步:Grub2(引導程式)引導(ARM平台通常使用uboot作為引導)
  3. 第三步:加載和運作Linux 核心
  4. 第四步:systemd機制啟動檔案系統(systemd是使用者态第一個程序,有核心調用啟動)
  5. 第五步:通過systemd服務機器加載啟動圖形系統和系統登入
第二章 Linux系統總覽-2.6 Linux系統啟動流程

第一步:開機自檢,加載BIOS

當我們打開計算機電源的時候,以前很多台式計算機随後會滴的一聲響(現在筆記本好像不響),自檢開始,這個過程中主要是檢測我們的計算機硬體裝置比如:CPU,記憶體,主機闆,顯示卡,CMOS等裝置是否有故障存在,并完成硬體的初始化工作。

當你按下你機器上的電源鍵時,存儲在主機闆 EEPROM 晶片中的固件初始化 (通電自檢) 檢查系統硬體資源的狀态, 結束後,固件會搜尋并加載位于第一塊可用磁盤上的 MBR 或 EFI 分區的第一階段引導程式,并把控制權交給引導程式。

MBR是一種老的方式,目前新的計算機基本上都采用EFI進行引導。這一塊也是比較複雜的,但我覺得對于初學者,先不用去管,你隻要知道,上電後,BIOS來完成硬體的檢測,如果檢測OK,就會調到grub引導程式,由grub來接替BIOS,開始下一步的啟動工作。

第二步:Grub2(引導程式)引導

對于使用 EFI/UEFI 方式的系統, UEFI 固件讀取它的設定來決定從哪裡啟動哪個 UEFI 應用。(例如, EFI 分區位于哪塊磁盤或分區)

接下來,加載并運作第二階段引導程式(又名引導管理器)。GRUB[GRand Unified Boot] 是 Linux 中最常使用的引導管理器。今天大部分使用的系統中都能找到它兩個中的其中一個版本。

grub也在經曆不斷的發展,目前基本使用的都是grub2這個版本。我這裡也就不講grub這個版本了,隻講grub2這個版本。

grub2引導程式有個配置檔案,通常在/boot/grub/grub.cfg

第二章 Linux系統總覽-2.6 Linux系統啟動流程

grub引導程式就是考讀取這個配置檔案的資訊,并依照此配置資訊來啟動Linux作業系統的。這個配置檔案,最主要的就是告訴grub引導程式,使用哪個版本的核心啟動,這個核心在哪裡,檔案名是什麼。理論上,硬碟上是可以存在多個核心檔案的,根據你的需要,在grub引導程式中指定你需要的核心進行引導即可。另外,在這個檔案中,也可以指定需要傳遞給核心的參數,核心也是一個程式,在啟動中,針對同一個核心,可以給他傳遞不同的參數,傳遞不同的參數,核心就可能有不同的行為。還有一個重要的作用,就是配置ramdisk,通常我們也叫initrd或者initramfs鏡像,這個鏡像其實是一個小型的Linux系統的根檔案系統,因為他足夠小,是以整個檔案系統可以全部加載在記憶體中運作。這裡,可能有人為問,我的Linux系統不是已經安裝在硬碟上了嗎?為什麼這裡還需要一個小型的,可以再記憶體中運作的Linux系統?

很好的問題。

我來說說我的了解,前面好像提到過驅動是運作在核心中的,不過Linux有個特點,雖然驅動運作的時候,是作為核心級别來運作的,但是,驅動本身既可以直接編譯在核心中,也是可以編譯成獨立的子產品檔案的,在需要的時候加載到核心中去執行就可以,Linux核心有非常非常多的驅動,廣泛的支援各種各樣的硬體,編譯在核心中的好處,就是grub加載核心後,跳轉到核心執行時,驅動就可以執行起來了,但如果把所有驅動都編譯到核心中,核心就會變得非常非常大,而且很多驅動可能是你不需要的,這樣就浪費了很多資源。initrd 或者 initramfs 其實就是為了避免這個問題,把需要的一些基本驅動,初始化腳本等,做成一個小型的Linux系統,讓核心先把這個小型的Linux啟動起來,幫助完成硬體檢測、必要的核心子產品加載、以及發現挂載真正硬碟上的根目錄檔案系統需要的裝置。比如,硬碟的驅動,跟檔案系統的驅動,也是在initrd中作為子產品插入和驅動的,隻有驅動了硬碟,核心才能挂載硬碟上真正的Linux跟檔案系統。

到那可能大家又有一個問題,既然一開始硬碟都沒有驅動,那核心和initrd又是怎麼運作起來的,其實,大家都知道,程式運作之前,是要加載到記憶體中的,當加載到記憶體中以後,運作的時候,其實就不需要硬碟了,除非你運作的程式需要讀寫硬碟上的資料。grub2引導程式有自帶硬碟驅動,可以從硬碟上讀取配置檔案,然後找到核心和initrd,把他們加載到核心中,然後跳到核心在記憶體中的位置開始執行,并且告訴核心,初始化的initrd在哪裡,這時候,grub的使命就完成了,核心就啟動了,但核心要挂載真正的跟檔案系統,還需要重新在核心中驅動硬碟,是以他會先執行initrd,讓initrd來進行包括硬碟初始化在内的很多初始化工作,然後再正式切換到硬碟上的真正的根檔案系統。

一旦真正的根目錄檔案系統啟動,為了顯示使用者界面,核心就會執行系統和服務管理器(init 或 systemd,程序号 PID 一般為 1)開始普通使用者态的引導程式。

下圖就是grub.cfg配置檔案的部分摘錄内容

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-d047dd69-4d9e-454f-ae15-4f895f353014' {
        recordfail
        load_video
        gfxmode $linux_gfx_mode
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos5'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5  d047dd69-4d9e-454f-ae15-4f895f353014
        else
          search --no-floppy --fs-uuid --set=root d047dd69-4d9e-454f-ae15-4f895f353014
        fi
        linux   /boot/vmlinuz-5.15.0-53-generic root=UUID=d047dd69-4d9e-454f-ae15-4f895f353014 ro  quiet splash $vt_handoff
        initrd  /boot/initrd.img-5.15.0-53-generic
}
           

其中,這兩行,就是指定了核心和initrd,其中核心就是/boot/vmlinuz-5.15.0-53-generic, 而initrd就是/boot/initrd.img-5.15.0-53-generic。

linux /boot/vmlinuz-5.15.0-53-generic root=UUID=d047dd69-4d9e-454f-ae15-4f895f353014 ro quiet splash $vt_handoff
initrd /boot/initrd.img-5.15.0-53-generic           

一般來說,Linux核心和initrd都放在/boot/目錄下,如下圖,這裡就有兩個核心版本,沒有核心版本都有對應的initrd檔案,你想使用那個核心,就可以再grub.cfg檔案中進行指定即可。

第二章 Linux系統總覽-2.6 Linux系統啟動流程

存放核心和initrd的/boot/目錄

第三步:加載和運作kernel核心

上面已有部分調,grub根據grub設定的核心映像所在路徑,系統讀取記憶體映像,并進行解壓縮操作。此時,螢幕一般會輸出“Uncompressing Linux”的提示。當解壓縮核心完成後,螢幕輸出“OK, booting the kernel”。

系統将解壓後的核心放置在記憶體之中,并調用start_kernel()函數來啟動一系列的初始化函數并初始化各種裝置,完成Linux核心環境的建立。至此,Linux核心已經建立起來了,基于Linux的程式應該可以正常運作了。

從全局啟動曆程start_kernel開始,

核心完成的任務主要有:

  • 硬體的特測
  • 硬體驅動的初始化,
  • 挂載根檔案系統(根切換,如前面有講,一般是先挂載initrd小型記憶體根檔案系統,完成初步初始化後,在挂載硬碟上真正的根檔案系統)
  • 啟動init程序。
  • 核心在系統啟動後的功能先提前介紹一下:
  • 程序的排程,記憶體管理,檔案系統的管理,硬體驅動,網絡等
  • 核心自身初始化完成後開始下一步

第四步:system機制啟動檔案系統

前面提到,真正的根檔案系統就是你安裝在硬碟上的這個Linux根檔案系統,雖然核心會通常用先挂載initrd進行必要的初始化,但大部分初始化工作,是由你硬碟上的真正的Linux根檔案系統來完成的。其實核心和initrd,也是包含安裝在硬碟上的,也就是說,也是在根檔案系統裡面,隻是這幾個檔案比較特殊,是靠grub去加載記憶體中的,其實系統起來後,這兩個檔案已經沒有什麼用了,隻要你不關機,隻是這兩個檔案就算删除了,系統還是照常在正常運作的。當然,如果你删除了,那重新開機系統,肯定就起不來了,因為grub找不到核心檔案了。

說的有點遠了,回過頭了看檔案系統,前面提到,Linux的檔案系統啟動方式有好幾種,目前最重要的是systemd啟動機制,另外一種就是sysvinit,是以在重點介紹說明 systemd引導之前,先簡單說明一下Sysvinit的引導方式,這裡不講的話,後續可能也沒有适合的時候來講了。最新的Ubuntu不會使用Sysvinit啟動,但有些嵌入式系統還有在用,是以有必要簡單介紹一下。

Systeminit(sysvinit)啟動機制:

核心被加載執行到最後,就會挂載磁盤,執行磁盤上的應用程式,進行應用層的啟動,第一個運作的程式便是/sbin/init,init程序執行rc.sysinit,在Systeminit啟動模式下,rc.sysinit會讀取/etc/inittab檔案,并依據此檔案來進行初始化工作。

其實/etc/inittab檔案最主要的作用就是設定Linux的運作等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運作在等級5上。

Linux的運作等級設定如下:

  • 0:-halt 關機
  • 1:-single user mode 單使用者模式
  • 2:-Multi-user,without NFS無網絡支援的多使用者模式  類似于下面的run level3
  • 3:-Full multi-user mode 有網絡支援的多使用者模式
  • 4:-unused 保留,未使用
  • 5:-X11 有網絡支援有X-Window支援的多使用者模式
  • 6:- reboot 重新開機系統,即重新開機

通常,圖形系統的Linux是運作在等級5,是怎麼個運作法呢:

在Linux下/etc目錄下,通常有rc0.d到rc6.d這樣7個目錄,如果你想深入了解這種啟動方式,可以去安裝一個舊一點的Ubuntu系統,比如Ubuntu 6.10之前的版本,但我不确定網絡上是否還可以找到這樣舊的版本,估計是很難了,是以我覺得不用去找了,聽我這裡講講就好了,這幾個目錄,如果你打開去看一下,都是一推腳本,根據運作級别的不同,系統會運作rc0.d到rc6.d中的相應的腳本程式,來完成相應的初始化工作和啟動相應的服務,比如運作在級别5,系統就會去執行rc5.d中的腳本,裡面的腳本一般都是S開頭或者K開頭的,比如S01.sh,S02.sh,假設這樣兩個腳本,就是先執行S01,再執行S02, 是以是有一定的執行順序的,S就表示start,就是開機的時候執行的腳本,而K表示Kill,殺死的意思,一般是關機的時候執行的,也會有類似K01.sh, K02.sh這樣的腳本,也會有一定的執行順序,在開機執行的基本中,肯定就是啟動各種服務,包括圖形系統等,那關機的腳本,肯定就是殺死各種程序和服務,大概的邏輯就是這樣的。如果你再在開機的時候執行一個腳本,也可以在這個目錄下添加一個S99.sh的腳本,然後在這個腳本中執行你想要在開機是執行的任務,那系統開機的時候,就會自動執行到這個腳本,進而執行你腳本中的相關任務。

另外,還有一個腳本,/etc/rc.d/rc.local,你如果打開了此檔案,裡面有一句話,讀過之後,你就會對此指令的作用一目了然:

# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.           

rc.local就是在一切初始化工作後,Linux留給使用者進行個性化的地方。你可以把你想設定和啟動的東西放到這裡。執行/bin/login程式,啟動mingetty,進入登入狀态,啟動圖形系統。剛才前面提到,你可以添加一個S99.sh來讓系統開機時啟動你的腳本,其實,你也可以修改rc.local這個腳本,把你想要開機執行的代碼寫到這個腳本,也是可以的。

Systemd啟動

接下裡來,我們來講systemd,關于 systemd,在Linux中,是一個非常非常重要的機制,Systemd是一個系統管理守護程序、工具和庫的集合,用于取代System V初始程序。Systemd的功能是用于集中管理和配置類UNIX系統。不過這裡也隻是結合啟動過程簡單介紹,讓大家知道上systemd啟動機制是如何啟動系統的,即可。後續等你詳細了解後,你甚至可以添加自己的啟動項到systemd裡面去。之前也反複提到過,學習Linux,最重要是要動手,是以看完本章,你可以嘗試自己添加一個systemd服務,讓你的某個程式可以開機啟動。

上面介紹的sysvinit看起來也不錯,也比較簡單,為何還需要systemd,systemd它的主要目标之一是允許系統啟動時多個任務盡可能并行,進而縮短系統的啟動時間,(而 sysvinit 并非如此,sysvinit是串行的,一個任務執行完,才能執行下一個任務,CPU很多時候再空閑中,效率比較低,導緻系統啟動時間 一般比較慢,因為它每次隻啟動一個程序,而且會檢查彼此之間是否有依賴,在啟動其它服務之前還要等待守護程序啟動),充當運作中系統動态資源管理的角色。

另外,systemd可以讓服務隻在需要的時候啟動,而不是系統啟動時毫無緣由地啟動全部服務,可以防止系統資源不必要的消耗。

首先,systemd 挂載在 /etc/fstab 中配置的檔案系統,包括記憶體交換檔案或分區。據此,systemd 必須能夠通路位于 /etc 目錄下的配置檔案,包括它自己的。systemd 借助其配置檔案 /etc/systemd/system/default.target 決定 Linux 系統應該啟動達到哪個狀态(或目标态target)。default.target 是一個真實的 target 檔案的符号連結。對于桌面系統,其連結到 graphical.target,該檔案相當于舊式 systemV init 方式的 runlevel 5。對于一個伺服器作業系統來說,default.target 更多是預設連結到 multi-user.target, 相當于 systemV 系統的 runlevel 3。 emergency.target 相當于單使用者模式。

Systemctl是一個systemd工具,主要負責控制systemd系統和服務管理器。

下面将簡單介紹啟動中的4個關鍵步驟:

1) 執行預設的target:

systemd 執行預設target 配置,配置檔案/etc/systemd/system/default.target,它一般是一個軟連結,指向multi-user.target或者graphical.target。可以通過如下指令查詢和修改default.target:

systemctl get-default #查詢

systemctl set-default multi-user.target #設定

2) 執行依賴的target

systemd 執行啟動所依賴的目标basic.target和sysinit.target初始化系統

通過檢視cat /etc/systemd/system/default.target檢視依賴:

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes           

After指定的target需要在default.target之前運作。如果想上面這樣,systemd就會先去執行basic.target rescue.service rescue.target。

3) 執行使用者相關的target

systemd 啟動multi-user.target 下的本機與伺服器服務,由于default.target指向multi-user.target,那麼這一步就啟動對應的multi-user.target相關的服務。它的服務存在于 /etc/systemd/system/multi-user.target.wants 目錄中,這個目錄下很很多的服務,systemd就會一個一個去啟動相關的服務:

lrwxrwxrwx. 1 root root 37 Aug 8 2018 acpid.service -> /usr/lib/systemd/system/acpid.service
lrwxrwxrwx. 1 root root 35 Aug 8 2018 atd.service -> /usr/lib/systemd/system/atd.service
lrwxrwxrwx. 1 root root 38 Aug 8 2018 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 37 Aug 8 2018 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 37 Aug 8 2018 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx. 1 root root 46 Aug 8 2018 libstoragemgmt.service -> /usr/lib/systemd/system/libstoragemgmt.service
lrwxrwxrwx 1 root root 36 Aug 13 2018 ntpd.service -> /usr/lib/systemd/system/ntpd.service
lrwxrwxrwx. 1 root root 39 Aug 8 2018 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 40 Aug 8 2018 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 46 Aug 8 2018 rhel-configure.service -> /usr/lib/systemd/system/rhel-configure.service
lrwxrwxrwx. 1 root root 39 Aug 8 2018 rpcbind.service -> /usr/lib/systemd/system/rpcbind.service
lrwxrwxrwx. 1 root root 39 Aug 8 2018 rsyslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root 36 Aug 8 2018 sshd.service -> /usr/lib/systemd/system/sshd.service
lrwxrwxrwx. 1 root root 37 Aug 8 2018 tuned.service -> /usr/lib/systemd/system/tuned.service
lrwxrwxrwx. 1 root root 35 Aug 8 2018 vdo.service -> /usr/lib/systemd/system/vdo.service           

4) 執行rc.local服務

systemd 也會執行/etc/rc.d/rc.local。systemd是可以相容systemv init中的rc.local配置的,通過rc-local.service來實作相容的,systemd在啟動的很早就會判斷/etc/rc.local是否存在并且是可執行的,如果滿足條件,那麼systemd會調用/usr/lib/systemd/system-generators/下面的小程式來把rc-local.service服務加入到default.target中來。這樣在後面的執行時就會觸發rc.local的運作:

[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target
[Service]
Type=simple
ExecStart=/etc/rc.d/rc.local start
TimeoutStartSec=0
TimeoutStopSec=1
RemainAfterExit=yes           

是以,如果再systemd機制下,如果你想開機時讓系統執行一個程式,你可以自己寫一個systemd的service,或者也可以直接修改/etc/rc.d/rc.local.

第五步:圖形系統啟動和系統登入

1) 啟動指令

systemctl isolate graphical.target

2) 啟動過程:

檔案:/etc/systemd/system/graphical.target

來自:systemd包

内容:

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes           

檔案:/etc/systemd/system/display-manager.service

來自:安裝lightdm包時自己主動生成

内容:連結到/lib/systemd/system/lightdm.service

檔案:/lib/systemd/system/lightdm.service

來自:lightdm包

内容:

[Unit]
Description=Light Display Manager
Documentation=man:lightdm(1)
[email protected]
After=systemd-user-sessions.service [email protected] plymouth-quit.service livesys-late.service
[Service]
ExecStart=/usr/sbin/lightdm
Restart=always
IgnoreSIGPIPE=no
BusName=org.freedesktop.DisplayManager
[Install]
Alias=display-manager.service           

檔案: /user/sbin/lightdm

來自:lightdm包

内容:二進制可運作檔案。啟動圖形界面。

是以一層一層執行下來,最後就執行到了/usr/bin/lightdm這個程式,這個程式就是Ubuntu的圖形登入界面,這樣,整個圖形系統就啟動了。

另外,systemd機制也提供了其他一些指令,比如可以來分析和統計啟動各個服務消耗的時間,如有需要,可以根據分析的結果來優化系統,比如有些服務啟動時間過長,但你又不需要這個服務,那麼就可以禁止這個服務,讓這個服務下次啟動時不再啟動。

分析服務啟動時間的方法如下:

  • systemd-analyze blame #列舉出每個服務的啟動耗時,前面第一列就是這個服務啟動使用的時間。
第二章 Linux系統總覽-2.6 Linux系統啟動流程
  • systemd-analyze plot > boot.svg #圖形化展示啟動耗時(生成的圖很大,貼上去也看不清楚,我這裡就不貼了,你們可以動手試一下)

如何禁止一個服務,啟動一個服務,都有相關的指令,我這裡就不詳細講了,這個小結我也不想講的太複雜,不行牽扯太多的細節,隻是想把Linux的啟動過程做一個簡單梳理,讓初學者大概了解這個過程即可,其實上面說的,我覺細節可以還不夠完整,很多細節沒有講,我計劃後面可以錄個視訊來講解一下,這樣可能會比較清楚。關于systemd, 是Linux根檔案系統啟動的關鍵,初學者也可以再網絡上進行搜尋,繼續深入學習,我這裡計算抛磚引玉了。

以上寫的有點亂,我也不确定初始學時候可以看明白,即使不是很明白,應該也大概有個印象把,我們後面還有規劃,會講如何自己自作一個Linux系統,等你自己會制作Linux系統了,可能就完全明白整個過程了,慢慢學,歡迎持續關注我的文章。

繼續閱讀