Learning Objectives
- 說明虛擬化與 Hypervisor 如何把一台實體主機切成多台互相隔離的虛擬機
- 建立虛擬機時,看懂要選的項目:區域、作業系統映像檔、規格(vCPU、記憶體、磁碟)、公用 IP
- 用 ssh-keygen 產生 SSH 金鑰對,說明公鑰與私鑰各放在哪裡,以及為什麼私鑰絕對不能外流
- 設定防火牆規則時只開放需要的連接埠,並用 ssh 登入虛擬機做第一次檢查
一台實體主機,切成很多台虛擬機
機房裡的一台實體伺服器,可能有幾十個 CPU 核心、幾百 GB 的記憶體。整台只租給一個人用,大部分時間都閒著,太浪費。
虛擬化(virtualization)把一台實體主機在邏輯上切成很多台虛擬機(virtual machine,VM)。 每台虛擬機都以為自己是一台完整的電腦:有自己的 CPU、記憶體、磁碟,也有自己的作業系統。
┌────────────┬────────────┬────────────┐
│ VM 1 │ VM 2 │ VM 3 │
│ 你的網站 │ 別人的服務 │ 另一位客戶 │
│ Ubuntu │ Windows │ Debian │
├────────────┴────────────┴────────────┤
│ Hypervisor(虛擬化層) │
├──────────────────────────────────────┤
│ 實體主機(CPU、記憶體、磁碟) │
└──────────────────────────────────────┘
負責切割與分配的軟體叫 Hypervisor(虛擬機監控程式)。它把實體的 CPU 時間、記憶體、磁碟分給各台虛擬機, 並且讓它們互相隔離:一台當機或被入侵,不會直接影響另一台。
| 類型 | 裝在哪裡 | 例子 |
|---|---|---|
| 第一型(bare-metal) | 直接裝在實體硬體上,效率高 | 雲端服務商機房裡的主機 |
| 第二型(hosted) | 裝在一般作業系統上,當成一個應用程式執行 | 在筆電上用 VirtualBox 開一台 Ubuntu |
你在雲端「租一台主機」,拿到的幾乎都是一台虛擬機;這就是第 01 課的 IaaS。
建立虛擬機時要決定的事
不論哪一家雲端服務商,建立虛擬機的頁面都會問你差不多的問題:
| 項目 | 意思 | 選擇的原則 |
|---|---|---|
| 區域(region) | 機器放在哪個地區的機房 | 離使用者近(第 02 課) |
| 作業系統映像檔(image) | 虛擬機開機時用的系統範本 | 本課用 Ubuntu 24.04 LTS;LTS 是長期支援版,有較長的安全更新期 |
| vCPU | 分給這台虛擬機的虛擬 CPU 數 | 靜態網站或小型專題,從最小的規格開始 |
| 記憶體(memory) | RAM 大小 | 跑資料庫或機器學習模型才需要比較大 |
| 磁碟(disk) | 系統碟與資料碟的容量 | 夠放系統與網站即可,之後可以再加大 |
| SSH 金鑰 | 登入用的公鑰 | 見下一節 |
| 防火牆規則 | 哪些連接埠可以從外面連進來 | 只開需要的 |
| 公用 IP(public IP) | 讓外面連得到的位址 | 網站要對外就需要;有些服務商可以另外保留固定 IP |
規格越大,每小時的費用越高(第 05 課會算)。規格不夠時,通常可以先關機、換成大一號的規格再開機。
映像檔的概念和 Docker 映像檔類似:一份唯讀的範本,用它建立出一台台的機器。
SSH 金鑰:一把鎖、一把鑰匙
雲端主機沒有螢幕和鍵盤,你要透過網路用 SSH(Secure Shell)遠端登入,在終端機裡下指令。 比起密碼,雲端主機多半要求用 SSH 金鑰對登入:
| 公鑰(public key) | 私鑰(private key) | |
|---|---|---|
| 比喻 | 一把鎖 | 打開這把鎖的鑰匙 |
| 檔名 | id_ed25519.pub(有 .pub) |
id_ed25519(沒有副檔名) |
| 放在哪裡 | 交給雲端主機(建立虛擬機時貼上) | 只留在你自己的電腦 |
| 可以給別人嗎 | 可以,公開也沒關係 | 絕對不行 |
登入時,主機用你給它的公鑰出一道題目,只有持有私鑰的人答得出來;私鑰本身從頭到尾不會在網路上傳送。
私鑰的守則:
- 不要寄給組員、不要貼到聊天室、不要上傳到 GitHub、不要放進雲端硬碟的共用資料夾
- 產生時可以設定一組密語(passphrase),私鑰檔被偷走時多一道保護
- 每個人用自己的金鑰對;組員要登入,請他把公鑰給你,加到主機上
- 懷疑私鑰外流,就到主機上移除對應的公鑰,再產生一組新的
防火牆規則:只開需要的門
雲端主機一拿到公用 IP,全世界都能嘗試連線,其中不少是自動掃描、猜密碼的程式。 雲端服務商在虛擬機外面提供一層防火牆規則(各家的名稱不同,常見的叫安全性群組 security group 或防火牆規則), 決定哪些連接埠(port)可以從外面連進來:
| 連接埠 | 服務 | 要不要開 |
|---|---|---|
| 22 | SSH 遠端登入 | 要(否則你自己也進不去);可以的話限定只有你的 IP 能連 |
| 80 | HTTP 網頁 | 架網站時要 |
| 443 | HTTPS 網頁 | 網站加上 HTTPS 之後要 |
| 3306、5432 | MySQL、PostgreSQL 資料庫 | 不要對外開;讓網站程式在主機內部或私有網路連線就好 |
原則是預設全部關閉、只開需要的。開得越多,被攻擊的入口就越多。
第 04 課還會在 Ubuntu 裡再開一層 ufw 防火牆,形成兩道門。
容器:比虛擬機更輕的選擇
剛才的比較可以看到:
| 虛擬機 | 容器 | |
|---|---|---|
| 每個應用程式帶什麼 | 一整套作業系統+函式庫+程式 | 只帶函式庫+程式,共用主機的作業系統核心 |
| 啟動 | 像開一台電腦,要等開機 | 像啟動一個程式,很快 |
| 隔離程度 | 強,各自有獨立的作業系統 | 較輕,共用同一個核心 |
| 適合 | 需要完整控制作業系統、或要跑不同作業系統 | 把同一個應用程式快速、大量地部署 |
兩者不是二選一:雲端上很常見的做法是先租虛擬機,再在虛擬機裡跑容器。 容器怎麼建立、怎麼打包成映像檔,請看 Docker 容器軌道;第 06 課也會再談容器如何讓部署更容易。
接下來的導覽,用通用的步驟建立一台虛擬機並登入。各家服務商的畫面不同,但要填的項目大同小異。
導覽:建立虛擬機並用 SSH 登入
以下步驟不綁定特定服務商。範例的公用 IP 是文件專用的保留位址 203.0.113.10,實際操作時換成你的主機拿到的 IP。本機終端機在 macOS、Linux 與 Windows(PowerShell)都內建 ssh 與 ssh-keygen。
-
1
在自己的電腦產生 SSH 金鑰對
ssh-keygen -t ed25519產生一組 Ed25519 金鑰對,-C加上一段註解(通常寫信箱,方便辨認是誰的金鑰)。詢問存放位置時直接按 Enter 用預設路徑;詢問密語(passphrase)時可以設定一組,輸入時畫面不會顯示。完成後在~/.ssh/會有兩個檔案:id_ed25519是私鑰,id_ed25519.pub是公鑰。下面的輸出是 macOS/Linux 的路徑;Windows 會存在C:\Users\你的帳號\.ssh\,用法相同。 -
2
複製公鑰(只複製 .pub)
用
cat顯示公鑰內容,整行複製起來,等一下要貼到建立虛擬機的頁面。注意檔名結尾是.pub;不要打開或複製沒有.pub的私鑰。 -
3
在雲端主控台建立虛擬機
登入雲端服務商的網頁主控台,找到建立虛擬機(各家的名稱不同,常見的叫執行個體或 Instance)的頁面,依序設定:
- 名稱:例如
web-01 - 區域:選離使用者近的區域
- 映像檔:Ubuntu 24.04 LTS
- 規格:先選最小的一級(示意:1~2 vCPU、1~2 GB 記憶體就夠放一個靜態網站)
- SSH 金鑰:貼上剛才複製的公鑰;預設的登入帳號在 Ubuntu 映像檔通常是
ubuntu - 防火牆規則:允許 TCP 22(SSH)與 80(HTTP)連入,其他先不要開
- 公用 IP:啟用
按下建立,等狀態變成「執行中」,記下主控台顯示的公用 IP(本例是
203.0.113.10)。從這一刻開始計費,練習結束記得關機或刪除。 - 名稱:例如
-
4
用 SSH 登入
ssh 帳號@IP登入。第一次連線時,ssh 會顯示主機的指紋並問你是否信任,輸入yes,之後這台主機會被記在~/.ssh/known_hosts。若產生金鑰時設了密語,這裡會要你輸入。提示字元變成ubuntu@web-01:~$,代表你已經在雲端主機裡面了。 -
5
第一次檢查:這是一台什麼樣的機器?
登入後先看看這台主機:
uname -a顯示核心版本與架構,nproc顯示 CPU 數,df -h顯示磁碟用量(-h是用 G、M 這種好讀的單位),free -h顯示記憶體。數字應該和你建立時選的規格差不多。注意上一步歡迎訊息裡的10.0.0.4是雲端內部網路的私有 IP,外面的人要用公用 IP203.0.113.10才連得到。看完輸入exit離開,回到自己的電腦。
想一想:虛擬化與規格
在雲端機房裡,負責把一台實體主機的 CPU、記憶體分給多台虛擬機,並讓它們彼此隔離的是?
建立虛擬機時選擇「Ubuntu 24.04 LTS」,這是在選什麼?
同樣在一台主機上跑 8 個應用程式,為什麼虛擬機通常比容器用掉更多記憶體?
想一想:金鑰與防火牆
組員也需要登入你們的雲端主機。正確的做法是?
一台只放靜態網站的虛擬機,防火牆規則最合適的設定是?
重點精華回顧
- 虛擬化用 Hypervisor 把一台實體主機切成多台互相隔離的虛擬機,每台有自己的作業系統;雲端租到的主機多半是虛擬機。
- 建立虛擬機要選:區域、作業系統映像檔(本課用 Ubuntu 24.04 LTS)、規格(vCPU、記憶體、磁碟)、SSH 公鑰、防火牆規則、公用 IP。
ssh-keygen -t ed25519產生金鑰對:公鑰(.pub)交給主機,私鑰只留在自己的電腦,絕對不能分享或上傳。- 防火牆規則預設全關、只開需要的連接埠:SSH 22、HTTP 80、HTTPS 443;資料庫連接埠不對外開放。
ssh ubuntu@IP登入;用uname -a、nproc、df -h、free -h檢查機器;exit離開。- 容器共用主機的核心,比虛擬機輕、啟動快;常見做法是在虛擬機裡跑容器,詳見 Docker 容器軌道。
- 虛擬機建立後就開始計費,練習完記得關機或刪除。