OrbStack 實用教學:如何使用 CLI 快速打造 Linux 虛擬機器工作空間

對於開發者與 DevOps 工程師來說,快速建立乾淨且獨立的 Linux 測試環境是日常剛需。
OrbStack 以極輕量與高效能成為取代 Docker Desktop 成為容器化的新秀。
但很多人不知道,其實 OrbStack 可以開一些簡單的 Linux 虛擬機 (Virtual Machine, VM)。

在一些特定的情況下,你可能會需要一層薄薄的沙箱 (Sandbox),
一個「有 root 的工作空間」

如果你剛好用 macOS,也剛好有裝 OrbStack,
OrbStack CLI(orb 指令)的指令可以幫你輕鬆建立與管理 Linux 虛擬機。

這邊就整理一下這些細節,用 orb 指令來管理 OrbStack 內建的虛擬機。


orb 指令說明

這邊列出 orb 指令的說明,後面會跟大家說要怎麼使用

Usage:
  orb create [flags] DISTRO[:VERSION] [MACHINE_NAME]

Aliases:
  create, add, new

Examples:
  orb create -a arm64 ubuntu:24.04
  orb create --memory 4G --cpus 2 --disk 64G ubuntu dev
  orb create -a amd64 fedora foo

Flags:
  -a, --arch string         Override the default architecture
      --cpus string         CPU core limit for the machine
      --disk string         Disk usage limit for the machine (GiB, or units like 64G)
      --forward-ssh-agent   Enable SSH agent forwarding for an isolated machine
  -h, --help                help for create
      --isolate-network     Block an isolated machine from other machines and host IPs
      --isolated            Create an isolated machine (disables file sharing and integration)
      --memory string       Memory limit for the machine (MiB, or units like 4G)
      --mount stringArray   Add a selective host mount for an isolated machine as SOURCE[:DEST] (repeatable)
  -p, --set-password        Set a password for the default user
  -u, --user string         Username for the default user
  -c, --user-data string    Path to Cloud-init user data file (for automatic setup)

核心指令語法

使用 orb create 即可快速建立新的 Linux 虛擬機器:

orb create [旗標] 發行版[:版本] [機器名稱]
  • 別名(Aliases): createaddnew 皆可通用。

常用旗標(Flags)說明

旗標 / 參數 完整名稱 說明
-a --arch 變更預設架構(例如:arm64amd64
--cpus 設定 CPU 核心數上限
--memory 設定記憶體上限(例如:4G2048M
--disk 設定磁碟容量上限(例如:64G
-u --user 指定預設使用者名稱
-p --set-password 為預設使用者設定密碼
-c --user-data 指定 Cloud-init 寫入檔路徑(用於自動化初始化設定)
--isolated 建立隔離機器(關閉檔案共享與系統整合)
--isolate-network 封鎖隔離機器存取其他機器與宿主機 IP
--forward-ssh-agent 為隔離機器啟用 SSH Agent 轉發
--mount 為隔離機器新增指定的宿主機掛載點(格式:來源[:目標],可重複使用)

一些快速上手的範例

1. 建立具有 Root 權限的獨立工作空間

若需要一個能隨意使用 sudo 測試安裝套件或準備素材的獨立環境,可以直接指定架構建立:

  • 建立 x86 (amd64) 架構的 Ubuntu 虛擬機器
orb create --a amd64 ubuntu
  • 進入該虛擬機器(以預設 ubuntu 為例)
orb -m ubuntu

進入之後你會發現提示詞有變化,會不一樣
就像你登入 SSH 一樣

然後就可以在這個環境自由的操作了

2. 其他各種常見的情境

這裏列出其他常見的指令範例,供參考

  • 建立最新版 Ubuntu(自動命名)
orb create ubuntu

註:你可以用 tab 鍵去看有哪些發行版可以用,目前只支援 Linux 常見的發行版
官方也明確表示不支援 Windows 虛擬機

這邊我列出目前截稿它有的選項

alma
alma:10
alma:8
alma:9
alpine
alpine:3.21
alpine:3.22
alpine:3.23          
alpine:edge
arch
arch:current
centos               
centos:10-Stream     
centos:9-Stream      
debian               
debian:10
debian:11
debian:12            
debian:13            
debian:14
debian:bookworm
debian:bookworm      
debian:bullseye      
debian:bullseye      
debian:buster
debian:forky
debian:forky         
debian:trixie
debian:trixie        
devuan
devuan:4
devuan:5
devuan:chimaera      
devuan:chimaera      
devuan:daedalus      
devuan:daedalus      
devuan:excalibur     
fedora
fedora:42
fedora:43
fedora:44
gentoo
gentoo:current       
kali
kali:current
nixos
nixos:25.11          
nixos:unstable       
openeuler            
openeuler:22.03
openeuler:24.03      
openeuler:25.09      
opensuse
opensuse:15.5        
opensuse:16.0        
opensuse:tumbleweed  
oracle               
oracle:8
oracle:9             
rocky
rocky:10             
rocky:8
rocky:9
ubuntu
ubuntu:20.04
ubuntu:22.04         
ubuntu:24.04
ubuntu:24.10
ubuntu:25.04         
ubuntu:25.10         
ubuntu:26.04         
ubuntu:focal
ubuntu:jammy
ubuntu:jammy         
ubuntu:noble
ubuntu:noble         
ubuntu:oracular      
ubuntu:plucky        
ubuntu:questing      
ubuntu:questing      
ubuntu:resolute
ubuntu:resolute      
void
void:current
  • 指定特定版本與自訂名稱:
orb create ubuntu:noble devbox

自訂的名稱叫做 devbox
版本是: Ubuntu 24.04.4 (Noble Numbat)

  • 配置硬體資源上限:
orb create --memory 4G --cpus 2 --disk 64G ubuntu dev
  • 透過 Rosetta 在 Apple Silicon 上模擬 x86 架構:
    orb create --arch amd64 debian x86vm

檔案共享機制

OrbStack 提供非常便利的系統整合功能:預設會自動將 Mac 的 /Users 目錄共享並掛載至 Linux 虛擬機器的相同路徑下。這代表你在 Mac 上的檔案可以直接在虛擬機器內存取,無需額外設定複雜的共享資料夾。


希望這篇文章對你有幫助

[Linux] 把玩 Android 16 beta 的原生終端機 Terminal 功能

Android 16 beta 推出了很多全新的功能,
讓我眼睛一亮的是原生終端機 (Terminal) 功能,
相對於手機有一個小小 Debian Linux 可以使用,
如果熟悉 Ubuntu 的朋友,幾乎無痛上手。

就來看看要怎麼把玩這個新功能吧!

Android 16 新功能頁面:

https://developer.android.com/about/versions/16?hl=zh-tw

支援的清單

支援的清單列表在這裡:

https://developer.android.com/about/versions/16/download-ota?hl=zh-tw

  • Pixel 6 與 6 Pro
  • Pixel 6a
  • Pixel 7 與 7 Pro
  • Pixel 7a
  • Pixel Fold
  • Pixel Tablet
  • Pixel 8 和 8 Pro
  • Pixel 8a
  • Pixel 9、Pixel 9 Pro、Pixel 9 Pro XL 和 Pixel 9 Pro Fold

有支援的清單可以直接線上 OTA 升級,不用清除資料
不用清除資料,這點真的香

這次使用的機器:Pixel 7 pro

以下是操作步驟

加入 Android Beta 版體驗方案

到這個連結:

https://www.google.com/android/beta#devices

登入你有綁定 Pixel 手機的 Google 帳號,選取你手機,
將你的手機加入 Beta 體驗方案,屆時 Android 就會幫你推送 Beta 的更新

在手機系統,點選系統更新,就會看到新版 Android 16 beta 啦!

開心的的按下更新
(註:Beta 版可能會有不穩定的情況,建議不要用主要使用的手機做這個更新)

打開 Linux 開發環境

更新完畢之後,除了 UI 介面有小改之外,感覺什麼事情都沒有發生,
這很正常,要打開秘密選項才有

到系統設定

系統 > 開發人員選項 > Linux 開發環境

[勾選] 實驗功能 在 Android 上執行 Linux 終端機

系統 > 開發人員選項 > Linux 開發環境

[勾選] 停止限制子程序

應用程式就會出現 [終端機] 程式
就可以開始玩了

等於一台 arm64 的 debian 機器

設定硬碟大小

設定 > 調整磁碟大小

預設 5GB 可以直接開到最大 16GB

不然你可能會遇到磁碟空間不足的問題

各種安裝與把玩

接下來就是各種安裝與把玩啦!
想怎麼玩都可以,不一定要照我的做

有個地方要注意,手機是 arm64 架構,
一般 x86_64 程式是不能直接運行的,
它也不是 Apple silicon (M1) 有 Rosetta 可以跑相容模式,
下載程式編譯架構要注意一下

以下是一些指令筆記:

安裝相關套件與權限調整

安裝相關套件

sudo apt update -y
sudo apt install -y tmux neofetch

建立使用者,調整權限

useradd myuser
passwd myuser
sudo usermod -a -G sudo myuser
sudo usermod -a -G docker myuser

調整磁碟大小

sudo apt install -y parted

在 parted 介面裡,找到 rootfs ext4 磁區,將它擴大

print
resizepart 1 100%
quit

SSH Server

安裝 SSH Server

sudo apt install -y openssh-server

設定開啟的 port

sudo vi /etc/ssh/sshd_config

修改

port 22

重啟服務

sudo systemctl restart sshd

會有通知提示是否允許 port 開啟,因爲安全原因,只會開放對應到本機上

ngrok

安裝 ngrok,下列指令二選一

wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-arm64.tgz
sudo tar xvzf ./ngrok-v3-stable-linux-arm64.tgz -C /usr/local/bin

參考:

https://ngrok.com/docs/guides/device-gateway/linux/

或者

curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
  | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
  && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
  | sudo tee /etc/apt/sources.list.d/ngrok.list \
  && sudo apt update \
  && sudo apt install ngrok

參考:

https://ngrok.com/downloads/linux

Docker

一鍵指令安裝 Docker

sudo apt-get update -y && \
sudo apt-get install ca-certificates curl && \
sudo install -m 0755 -d /etc/apt/keyrings && \
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
sudo chmod a+r /etc/apt/keyrings/docker.asc && \
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt-get update -y && \
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

參考:

https://docs.docker.com/engine/install/debian/

kind & K8s

安裝 kind

export BIN_PATH=/usr/local/bin

export KIND_VER=0.26.0
export CLOUD_PROVIDER_KIND_VER=0.5.0

curl -Lo ${BIN_PATH}/kind https://kind.sigs.k8s.io/dl/v${KIND_VER}/kind-linux-arm64 && chmod +x ${BIN_PATH}/kind
curl -Lo /tmp/cloud-provider-kind.tgz https://github.com/kubernetes-sigs/cloud-provider-kind/releases/download/v${CLOUD_PROVIDER_KIND_VER}/cloud-provider-kind_${CLOUD_PROVIDER_KIND_VER}_linux_arm64.tar.gz && tar zxvf /tmp/cloud-provider-kind.tgz -C ${BIN_PATH} cloud-provider-kind
curl -Lo ${BIN_PATH}/kubectl "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl" && chmod +x ${BIN_PATH}/kubectl

參考:

https://github.com/kalug/k8s-demo/blob/main/kind-starting/1-create-cluster.md

ollama 與 LLM

安裝 ollama

curl -fsSL https://ollama.com/install.sh | sh

參考:

https://ollama.com/download/linux

下載模型

ollama pull deepseek-r1:1.5b

註:gemma:2b 手機記憶體不足,跑不動,
故改用 deepseek-r1:1.5b

會有通知提示是否允許 port 11434 開啟,因爲安全原因,只會開放對應到本機上
按允許即可

你可以用相關聊天 WebUI,我這邊直接用 App 解決

下載 Maid:

https://play.google.com/store/apps/details?id=com.danemadsen.maid

進入 App 的設定,
設定來源為 ollama
網址: localhost:11434

按下確定,就可以開始聊天了

參考資料

https://ivonblog.com/posts/ollama-android-termux/
https://www.youtube.com/watch?v=UT8Q_V82boM

[Linux] Linux LVM 磁區擴增 disk extending (以 Redhat 為例)

在 Linux 系統中,監控磁碟空間是系統管理員的日常任務之一。
當面臨需要增加磁碟空間的情況時,Linux 的 LVM(Logical Volume Manager)磁碟機制可能會讓初學者感到困惑。
但實際上,LVM 是一個強大的工具,它允許我們在不影響現有資料的情況下靈活地調整磁碟分區。
透過 LVM,我們可以動態地擴展或縮小邏輯卷的大小,輕鬆應對磁碟空間需求的變化。
本教學將詳細介紹如何使用 LVM 擴增 Linux 系統中的磁區,幫助您更有效地管理系統資源。

磁區擴增指令快速指南

以下提供相關磁區擴增指令,
磁碟有磁區,
LVM 磁區裡面有 PV 跟 LV,最後才是磁區,四者皆要配合才會擴增容量

查看磁碟用量

# df -h | less

查看 VG LV 的容量

# vgdisplay -v

雖然還有 vgdisplaylvdisplay 指令可以用,只是記一個指令比較方便

重新調整磁碟磁區,調整 LVM 那個 (注意磁區的數字)

# parted
(parted) print
(parted) resizepart 2 100%
(parted) quit

擴增 PV

# pvresize /dev/sda2

擴增 LV

# lvextend -l +100%FREE /dev/rhel/root

擴增磁區

# xfs_growfs /dev/rhel/root

實際情境題

假設我們有一台 RHEL Linux 或者 Rocky Linux 系統,硬碟當初容量寫 20GB
如今想要擴增成為 60GB,我們該如何操作?
請看以下步驟

Step1. 查看硬碟容量

首先先用 df -h 查看容量

# df -h

你會看到類似這樣的結果

# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               3.8G     0  3.8G   0% /dev
tmpfs                  3.9G     0  3.9G   0% /dev/shm
tmpfs                  3.9G  362M  3.5G  10% /run
tmpfs                  3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G   14G  3.7G  79% /                ### 真的只有 17G
/dev/sda1             1014M  150M  865M  15% /boot

你可以看到 /dev/mapper/rhel-root 只有 17GB,而且可用容量只有 3.7GB,硬碟快滿了

vgdisplay -v 查看 LVM 的 Volume group (VG) 與 Logical volume (LV) 的狀態

# vgdisplay -v
  --- Volume group ---
  VG Name               rhel
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB                         ### VG 容量只有 19GB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               edb3Hx-xxxx-xxxx-xxxx-xxxx-xxxx-iiOyAf

  --- Logical volume ---
  LV Path                /dev/rhel/swap
  LV Name                swap
  VG Name                rhel
  LV UUID                ocf2IU-xxxx-xxxx-xxxx-xxxx-xxxx-BoYp70
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/rhel/root
  LV Name                root
  VG Name                rhel
  LV UUID                5mZgRT-xxxx-xxxx-xxxx-xxxx-xxxx-0KHlI7
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 1
  LV Size                <17.00 GiB                        ### LV 容量只有 17GB,前面有 2GB 是 Swap
  Current LE             4351
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Physical volumes ---
  PV Name               /dev/sda2
  PV UUID               86HkpN-xxxx-xxxx-xxxx-xxxx-xxxx-Z6DNv4
  PV Status             allocatable
  Total PE / Free PE    4863 / 0

這邊列出一個示意圖:


Step2. 調整虛擬機(VM)硬碟大小

在 VMWare ESXi 或者 Promox VE 設定虛擬機(VM)硬碟大小(20GB -> 60GB)
虛擬機(VM) 重開機後我們觀察一下

這裡很重要,再次提醒

VM一定要重開機
VM一定要重開機
VM一定要重開機

很重要講三次,
因為硬碟大小是在開機時讀取的,不重開機是看不到變化的

fdisk -l 查看硬碟大小

# fdisk -l

Disk /dev/sda: 64.4 GB, 64424509440 bytes, 125829120 sectors                ### 可以看到硬碟大小變成 64.4GB 了
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ca3fa

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   8e  Linux LVM

Disk /dev/mapper/rhel-root: 18.2 GB, 18249416704 bytes, 35643392 sectors    ### 但掛載 root 的硬碟還是 18.2GB
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/rhel-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

你會看到硬碟總容量大小變成 64.4GB 了
但是掛載的 /dev/mapper/rhel-root 還是 18.2GB,容量沒變

LVM 資訊也看一下

# vgdisplay -v
  --- Volume group ---
  VG Name               rhel
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB                         ### VG 容量還是沒變,只有 19GB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               edb3Hx-xxxx-xxxx-xxxx-xxxx-xxxx-iiOyAf

  --- Logical volume ---
  LV Path                /dev/rhel/swap
  LV Name                swap
  VG Name                rhel
  LV UUID                ocf2IU-xxxx-xxxx-xxxx-xxxx-xxxx-BoYp70
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/rhel/root
  LV Name                root
  VG Name                rhel
  LV UUID                5mZgRT-xxxx-xxxx-xxxx-xxxx-xxxx-0KHlI7
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 1
  LV Size                <17.00 GiB                         ### LV 容量也沒變,只有 17GB
  Current LE             4351
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Physical volumes ---
  PV Name               /dev/sda2
  PV UUID               86HkpN-xxxx-xxxx-xxxx-xxxx-xxxx-Z6DNv4
  PV Status             allocatable
  Total PE / Free PE    4863 / 0

你也會發現 df -h 還是沒變

# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               3.8G     0  3.8G   0% /dev
tmpfs                  3.9G     0  3.9G   0% /dev/shm
tmpfs                  3.9G   12M  3.8G   1% /run
tmpfs                  3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G   15G  2.5G  86% /                              ### 掛載 root 的磁區還是 17GB
/dev/sda1             1014M  150M  865M  15% /boot

你會發現

  1. 磁碟容量變大了
  2. LVM 的 VG 沒變大
  3. LVM 的 LV 也沒變大
  4. 檔案系統也沒變大

示意圖:

所以接下來我們要來做一些步驟來擴增硬碟容量

Step3. 擴增分割區

使用 parted 指令進入 gparted 互動式介面,將其調整變大

# parted
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) 

你可以在 parted 裡面輸入需要的指令,打 quit 離開互動式介面

先打 print 印出磁區列表,

(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 64.4GB                                        ### 可以看到硬碟大小變成 64.4GB 了
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  21.5GB  20.4GB  primary               lvm    ### 但 LVM 磁區只有 20.4GB

使用 resizepart 指令調整分割區大小

(parted) resizepart 2 100%

記得這個 2 要換成對應的數字

再印一次看看

(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  64.4GB  63.3GB  primary               lvm    ### LVM 磁區擴增變成新的大小 63.3GB

quit 離開互動式介面

(parted) quit
Information: You may need to update /etc/fstab.

LVM 資訊看一下

# vgdisplay -v
  --- Volume group ---
  VG Name               rhel
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB                         ### VG 容量還是沒變,只有 19GB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               edb3Hx-xxxx-xxxx-xxxx-xxxx-xxxx-iiOyAf

  --- Logical volume ---
  LV Path                /dev/rhel/swap
  LV Name                swap
  VG Name                rhel
  LV UUID                ocf2IU-xxxx-xxxx-xxxx-xxxx-xxxx-BoYp70
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/rhel/root
  LV Name                root
  VG Name                rhel
  LV UUID                5mZgRT-xxxx-xxxx-xxxx-xxxx-xxxx-0KHlI7
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 1
  LV Size                <17.00 GiB                         ### LV 容量也沒變,只有 17GB
  Current LE             4351
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Physical volumes ---
  PV Name               /dev/sda2
  PV UUID               86HkpN-xxxx-xxxx-xxxx-xxxx-xxxx-Z6DNv4
  PV Status             allocatable
  Total PE / Free PE    4863 / 0

Step4. 擴增 PV

我們用 pvresize 調整 PV 的大小

# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

再次印一次 LVM 資訊看看

# vgdisplay -v
  --- Volume group ---
  VG Name               rhel
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <59.00 GiB                         ### VG 容量變大了 59GB
  PE Size               4.00 MiB
  Total PE              15103
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       10240 / 40.00 GiB                  ### 跑出了一些 PE 大小
  VG UUID               edb3Hx-xxxx-xxxx-xxxx-xxxx-xxxx-iiOyAf

  --- Logical volume ---
  LV Path                /dev/rhel/swap
  LV Name                swap
  VG Name                rhel
  LV UUID                ocf2IU-xxxx-xxxx-xxxx-xxxx-xxxx-BoYp70
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/rhel/root
  LV Name                root
  VG Name                rhel
  LV UUID                5mZgRT-xxxx-xxxx-xxxx-xxxx-xxxx-0KHlI7
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 1
  LV Size                <17.00 GiB                       ### LV 容量沒變,還是 17GB
  Current LE             4351
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Physical volumes ---
  PV Name               /dev/sda2
  PV UUID               86HkpN-xxxx-xxxx-xxxx-xxxx-xxxx-Z6DNv4
  PV Status             allocatable
  Total PE / Free PE    15103 / 10240                  ### 跑出了一些 Free PE 出來(因為我們還沒調整)

Step5. 擴增 LV

我們使用 lvextend 擴大 LV 大小

# lvextend -l +100%FREE /dev/rhel/root
  Size of logical volume rhel/root changed from <17.00 GiB (4351 extents) to <57.00 GiB (14591 extents).
  Logical volume rhel/root successfully resized.

再次印一次 LVM 資訊看看

# vgdisplay -v
  --- Volume group ---
  VG Name               rhel
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <59.00 GiB                         ### VG 容量沒問題 59GB
  PE Size               4.00 MiB
  Total PE              15103
  Alloc PE / Size       15103 / <59.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               edb3Hx-xxxx-xxxx-xxxx-xxxx-xxxx-iiOyAf

  --- Logical volume ---
  LV Path                /dev/rhel/swap
  LV Name                swap
  VG Name                rhel
  LV UUID                ocf2IU-xxxx-xxxx-xxxx-xxxx-xxxx-BoYp70
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/rhel/root
  LV Name                root
  VG Name                rhel
  LV UUID                5mZgRT-xxxx-xxxx-xxxx-xxxx-xxxx-0KHlI7
  LV Write Access        read/write
  LV Creation host, time uatgit, 2023-08-21 18:06:42 +0800
  LV Status              available
  # open                 1
  LV Size                <57.00 GiB                         ### LV 容量變大了 57GB
  Current LE             14591
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Physical volumes ---
  PV Name               /dev/sda2
  PV UUID               86HkpN-xxxx-xxxx-xxxx-xxxx-xxxx-Z6DNv4
  PV Status             allocatable
  Total PE / Free PE    15103 / 0                           ### 沒有 Free PE 了 

檔案系統看一下

# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               3.8G     0  3.8G   0% /dev
tmpfs                  3.9G     0  3.9G   0% /dev/shm
tmpfs                  3.9G   12M  3.8G   1% /run
tmpfs                  3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G   15G  2.5G  86% /               ### 仍然沒變,還是 17G
/dev/sda1             1014M  150M  865M  15% /boot

Step6. 擴增檔案系統

使用 xfs_growfs 來做線上容量擴增
(註:不要用 resizefs 指令)

# xfs_growfs /dev/rhel/root
meta-data=/dev/mapper/rhel-root  isize=512    agcount=4, agsize=1113856 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4455424, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 4455424 to 14941184

再次查看情況

# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               3.8G     0  3.8G   0% /dev
tmpfs                  3.9G     0  3.9G   0% /dev/shm
tmpfs                  3.9G   12M  3.8G   1% /run
tmpfs                  3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/rhel-root   57G   15G   43G  26% /
/dev/sda1             1014M  150M  865M  15% /boot

應該就能完整看到系統了

列出示意圖,讓大家容易瞭解
希望這個流程對 LVM 的操作與學習有幫助

參考資料

5 分鐘快速上手 Linux tmux 終端機分割畫面指令

用 Terminal 在多視窗切換,不免俗的提到 screen 指令,
因為 screen 指令在 Red Hat RHEL 中把它 deprecated 掉了
所以改學一下 tmux 指令,如果學過 screen 指令的話,可以 5 分鐘快速上手
但可能要背一下指令,因為指令 操作 & 快捷鍵 略為不同

tmux 它比 screen 更強,值得一學

安裝

這邊分成五個系統講

Red hat 系列的 Linux (RHEL / Rocky Linux) 使用 yum 指令

$ yum install -y tmux

Debian / Ubuntu 系列的 Linux 使用 apt 指令

$ apt install -y tmux

Alpine Linux 用對應的 apk 指令

$ apk add -y tmux

最後 macOS 使用 homebrew 來裝

$ brew install -y tmux

如果你要極致一點,連在 Android 裡面的 Termux app 也要用的話

$ pkg install -y tmux

基本操作

打入 tmux 之後
底下會出現一個綠色的 bar 就成功進入指令了

tmux 的起頭快捷鍵都是 ctrl + b,等等會慢慢介紹

分割視窗

水平分割視窗

ctrl + b + %

(百分比符號 % 有 shift 記得要按)

垂直分割視窗

ctrl + b + "

(雙引號 " 有 shift 記得要按)

然後分割視窗了之後用

ctrl + b + 方向鍵

可以自由切換各個正在使用的視窗

detach (暫時卸離) / attach (重新接回)

detach / attach 這個我不知道中文叫什麼
暫且翻譯成 detach (暫時卸離) 跟 attach (重新接回) 好了

ctrl + b + d

就會把整組視窗 detach
暫時卸離,暫丟在背景,綠色 bar 消失

再次打 tmux 指令之後,你會發現又起了一個新的 session
你可以打點東西區分其不同

再次按 ctrl + b + d

detach 暫丟在背景

(如果是使用 screen 指令的朋友,它的作用跟 ctrl + a + d 是一樣的)

這時背景有二個 session

tmux ls 指令查看所有 session

$ tmux ls

(如果是使用 screen 指令的朋友,它的作用跟 screen -r 是一樣的)

用以下指令接回第一個 session

$ tmux attach-session -t 0

指令太長不好打,通常會縮寫變成

tmux a -t 0  

數字請自行變通,
接回第二個 session 就是 tmux a -t 1 以此類推

(如果是使用 screen 指令的朋友,它的作用跟 screen -r 數字 是一樣的)

關閉當前視窗 (window) 或 面板 (pane)

最後關閉當前的視窗 (window) / 面板 (pane)
可以用萬用的快捷鍵

ctrl + d

或者 exit 指令

$ exit

離開或者登出

基礎就這樣子,如果想要更華麗更完整的點的話可以繼續看

其他補充

tmux 它其實有 session / window / pane 的概念

tmux 剛執行的時候會建立一個 session,建立一個 window
執行分割畫面之後,變成一個 window 二個 pane

你可以用

ctrl + b + w

打開視窗預覽頁,切來切去

其他可以參考 tmux 的 cheat sheet 有更完整的用法

參考資料

Red hat Linux 使用 yum 離線安裝套件 (RHEL / CentOS / Rocky Linux)

情境是這樣的,因為一些特殊需求與限制,你需要在一台沒有網際網路連線的 Linux 主機上面安裝軟體,離線安裝 (offline install),
本來單純的以為只要把 rpm 檔案複製好就好,但發現事情並不想像中的那麼簡單,
所以筆記一下操作方式,以及需要注意的地方。

材料準備

講一下我們需要準備的材料:

  • 一台離線要安裝的目標主機(它沒有對外網路)
  • 一台能連網的主機,安裝對應版本的 VM (虛擬機)
  • 與目標主機對應版本的安裝 ISO 映象檔

操作步驟

你需要利用 yum 這個強大的套件管理工具,解析套件間的依賴 (dependency),
做自己所需要的套件庫,然後整個複製到目標機器,最後安裝它。

首先,調查清楚目標離線主機要安裝的 Linux 版本
整理出以下對照表:

  • RHEL 7.9 對應 CentOS 7-2009
  • RHEL 8.8 對應 Rocky Linux 8.8
  • RHEL 9.2 對應 Rocky Linux 9.2

然後下載對應的 ISO 映象檔:

Step 1. 準備一台可連網的虛擬機

在能連網的電腦上,
準備好虛擬機環境(例如:VMware、Hyper-V、VirtualBox)
找到對應版本的 minimal iso 來安裝系統(越小越好)

新增一個,規格小小的 VM,例如:

  • CPU: 2 core
  • RAM: 2GB
  • Disk: 20GB

掛載指定版本 ISO 來安裝 VM
Linux 的安裝過程就暫時跳過

重點是要「最小安裝」
到時候在循環檢查套件依賴的時候,
才可以抓得比較完整

確認網路

RHEL 預設網路不會開,你可能會遇到沒有網路可用的情況
需要自行設定網路與開啟網路

先用 ip a 找到所有的網卡裝置

# ip a

檢查網路卡名稱,然後編輯對應的網路卡設定檔

編輯 ifcfg-XXX 檔案

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

(假設你的網卡叫做 eth0

設定靜態 IP 位址

DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.1.2     # 修改 IP 位址
NETMASK=255.255.255.0  # 子網路遮罩
GATEWAY=192.168.2.254  # 網路閘道
DNS1=192.168.1.1
DNS2=8.8.8.8
DNS3=8.8.4.4
DEFROUTE=yes

ONBOOT=yes

或者 DHCP

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

最重要的就是修改 ONBOOT 區段,要設定成 yes

ONBOOT=yes

然後 :wq 存檔

最後重啟網路服務

$ sudo systemctl restart NetworkManager

因版本不同,也有可能是這樣,看發行版本

$ sudo systemctl restart network

或者可以用新版 nmcli 指令

$ sudo nmcli con mod "eth0" \
  ipv4.method "manual" \
  ipv4.addresses "192.168.1.2/24" \
  ipv4.gateway "10.200.1.1" \
  ipv4.dns "8.8.8.8,1.1.1.1"

或者修改 XXX.nmconnection 檔案

$ sudo vi /etc/NetworkManager/system-connections/eth0.nmconnection

修改 [ipv4] 段落

[ipv4]
method=manual
dns=8.8.8.8,1.1.1.1;
address1=192.168.1.2/24,192.168.1.1

最後存檔

Step 2. 安裝套件

首先在 root 身份下,
執行 yum update 指令,將套件清單更新一下

# yum update -y  

在這台能連網的電腦裝一下套件

# yum install -y tar yum-utils createrepo

然後建立一個資料夾,
前者存放所有套件,後者存放其暫存檔

# mkdir -p /tmp/yumrepo
# mkdir -p /tmp/yumrepo-installroot

Step 3. 加入你需要的來源庫 (Optional)

這裡看你的需要加入你所需要的來源庫,
例如我需要加入 docker 與 kubernetes (k8s) 的來源庫

這裡要參考 docker 安裝說明kubernetes 安裝說明 文件

加入 docker 參考
(指令僅供參考,來源庫可能隨時會更新)

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

加入 kubeernetes 參考
(指令僅供參考,來源庫可能隨時會更新)

# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

Step 4. 下載你所需的套件

萬事俱備!用 yum install --downloadonly 來下載所有你所需要的套件
注意 releasever 要根據你的版本做修改,
RHEL 7.9 就用 7,RHEL 8.8 就用 8,RHEL 9.2 就用 9,以此類推

# yum install --downloadonly --releasever=7 
--installroot=/var/tmp/yumrepo-installroot 
--downloaddir=/var/tmp/yumrepo -y
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo openssh-clients openssh-server tmux python3 vim net-tools tar yum-utils createrepo

它會很神奇的全自動去解析相依性的套件,並全部下載下來

Step 5. 建立離線 yum 來源庫

最後這邊是關鍵ㄧ步,
我們使用 createrepo 指令,將剛剛下載的一堆 rpm 建立成 yum 來源庫

# createrepo --database /var/tmp/yumrepo

不然只是散的一堆 rpm 而已

Step 6. 打包並複製到目標機

你可以用 tar 指令整個資料夾打包成 tar.gz 檔案

# tar zcvf yumrepo.tar.gz /var/tmp/yumrepo

唯有要注意的是,
RHEL 8.8/9.2 的最小安裝可能並不包含 tar 指令,
記得去資料夾找到 tar 的 rpm 多複製一份出來
(我的版本與檔案叫 tar-1.34-6.el9_1.x86_64.rpm 供參考)

至於怎麼複製到目標機?方式很多種,就不多做介紹了


Step 7. 目標機解壓縮並安裝

這裡來到離線無網路的目標機
假設你準備的檔案,一樣複製到了 /var/tmp 底下

剛剛提到 RHEL 8.8/9.2 的最小安裝可能並不包含 tar 指令,
rpm 指令安裝一下(檔名請換成你當下的)

# rpm -ivh tar-1.34-6.el9_1.x86_64.rpm

然後解壓縮

# tar zxvf yumrepo.tar.gz

Step 8. 製作來源庫描述檔

我們在離線目標機上面,直接用 cat 指令,製作一個來源庫描述檔

# cat <<EOF | sudo tee /etc/yum.repos.d/offline-yumrepo.repo
[offline-yumrepo]
name=CentOS-$releasever - yumrepo
baseurl=file:///var/tmp/yumrepo
enabled=1
gpgcheck=0
EOF

注意 baseurl 為到時候放入離線目標機的檔案路徑,可能要依據情境來修改

(其實也可以在前面的連網的虛擬機先做好一起打包,再複製到指定位置也可以)

這下你已經設定好離線的 yum 來源了

Step 9. 離線安裝

接下來的步驟就跟一般 yum 一樣了,安裝你需要的套件即可

# yum --disablerepo=\* --enablerepo=offline-yumrepo -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-compose vim net-tools yum-utils python3 sudo kubelet kubeadm kubectl --disableexcludes=kubernetes

這邊多了二個參數 --disablerepo=\*--enablerepo=offline-yumrepo
意思就是,關掉全部的來源,只開我們指定的 offline-yumrepo 來源

這樣子就完成了。
咦?我剛剛不小心幫你裝了 docker 跟 kubeadm 嗎?

參考資料