Linux
一些跟 Linux 有關的內容
Systemd
建立一個服務
範例模板
[Unit]
Description=<Description>
[Service]
Type=oneshot
User=<user>
Group=<groups>
ExecStart=<command>
[Install]
WantedBy=multi-user.target
解說
[Unit]
區塊
Description
: 描述服務,會顯示在systemctl status
當中
[Service]
區塊
Type
: 服務類型,常用有兩種simple
: 簡單服務,會根據程式結束的回傳值來判定服務是否正常運行oneshot
: 類似simple
,但是執行之後就不管回傳值的狀況,比較適用於執行之後馬上就離開主程式並背景執行的程式(e.g.tmux -d
)
User
: 執行身份,不填寫的話預設是root
Group
: 執行群組,不填寫的話預設是root
ExecStart
: 服務開始時執行的指令,可以是一行指令,或是 shell script
[Install]
區塊
WantedBy
: 要在什麼樣的 Target 下才能用systemctl enable
啟用服務
Systemd-boot
運作起來很簡單的開機載入器(UEFI 限定)
系統需求
- ESP大小至少 512MB,建議 1GB 以上
- 預設 Systemd-boot 會把 Kernel 一起安裝到 ESP 內
- 系統必須是以 UEFI 環境下開機,而非 BIOS 或 CSM 環境的 BIOS 模式下開機
- Linux 必須安裝 Systemd 作為 init daemon
安裝、修復
一般安裝
無論在哪一種環境(正常環境或 chroot 環境),都要先掛載 ESP,ESP 掛在哪個掛載點,根據當初安裝 Linux 發行版的狀況而定(通常是 /boot
或 /efi
)
然後輸入以下指令:
sudo bootctl install # 沒 sudo 或在 root 身份下不用輸入 sudo
Systemd 就會複製自己的檔案到 ESP 分區,並且建立 UEFI 開機項目
如果要深入瞭解究竟複製了哪些項目,可以看看 ArchWiki
ESP 與 /boot 分區分開安裝
當你不想動到 Windows 那小到不行的 100MB ESP 才用這招。以下步驟我自己沒有測試過:
首先,再切一個獨立的 /boot
分區,並且將它的分區類型設定為 "Linux extended boot"
具體來說怎麼設定,可以參考 ArchWiki 的說明:
In other cases, it is recommended to set the partition type to Extended Boot Loader (XBOOTLDR) Partition which is GPT partition type GUID BC13C2FF-59E6-4262-A352-B275FD6F7172 (ea00 type for gdisk) or MBR partition type ID ea.
切完之後,掛載 /boot 和 /efi 分區,然後輸入以下指令:
sudo bootctl --esp-path=/efi --boot-path=/boot install
這樣就安裝好了。
修改 Cmdline(Kernel Parameter)
用文字編輯器編輯 /etc/kernel/cmdline
,編輯完畢之後,輸入以下指令:
sudo kernel-install add-all
此舉會把所有 Kernel 重新安裝到 Systemd-boot 當中,並且套用新的 Cmdline (順便)
實用工具
一行指令將 PNG 轉換成 WebP
指令
array=($(ls *.png)); for key in "${array[@]}"; do cwebp $key -o $key.webp; done && mv *.webp ./webp
解釋
array=($(ls *.png));
- 將 ls 的結果丟到 array 去
- 這個是比較不太好的做法,為什麼不太好這裡有解釋,主要是可能會遇到 ambiguous 的狀況
for key in "${array[@]}"; do cwebp $key -o $key.webp; done
${array[@]}
是把 array 的東西全部枚舉出來- 剩下就是 for-loop 和變數的寫法,全部丟給 cwebp 處理
&& mv *.webp ./webp
- 只是把轉換後的 WebP 檔案丟到另外一個資料夾
備註
- 需要安裝 libwebp,請洽各大 Linux 發行版確定有沒有這套 library
- Array 的寫法為 bash,確定最原始的 sh 是不支援的,zsh 應該支援但沒測試過,其他 shell 也沒測試過
Arch Linux 獨有
Arch User Repository
紀錄一下我用 Arch User Repository (AUR) 時用的東西。
安裝 yay
不知道從什麼時候開始要先關掉 makepkg 會自己製作 debug 套件,不然安裝的時候會多跑一個套件,如果真的不慎安裝了還是有辦法刪除啦。
#########################################################################
# GLOBAL PACKAGE OPTIONS
# These are default values for the options=() settings
#########################################################################
#
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
#-- docs: Save doc directories specified by DOC_DIRS
#-- libtool: Leave libtool (.la) files in packages
#-- staticlibs: Leave static library (.a) files in packages
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- debug: Add debugging flags as specified in DEBUG_* variables
#-- lto: Add compile flags for building with link time optimization
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto)
把 debug
前面加上驚嘆號就好了。接著就可以安裝 yay:
sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
makepkg.conf
內的多執行緒策略
先改 MAKEFLAGS
那行,用 nproc
偵測執行緒的數量
MAKEFLAGS="-j$(nproc)"
然後安裝幾款支援多執行緒壓縮 / 解壓縮的軟體:
yay -S pigz pbzip2 lbzip2 plzip
然後就是大改特改環節了:
COMPRESSGZ=(pigz -c -f -n)
COMPRESSBZ2=(pbzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSZST=(zstd -c -T0 --ultra -20 -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
COMPRESSLZ4=(lz4 -q)
COMPRESSLZ=(plzip -c -f)
Bash
常見的 Unix Shell
建立 alias
alias alias_name="command_to_run"
執行完之後,你的alias_name
就會等於是後面所指定的指令內容,這是一種替代文字的概念。
GPG
數位簽章
完全信任 Key
- 先看要編輯哪個 Key:
gpg --list-keys --keyid-format SHORT
- 建議用 SHORT 不然等等要打很長
- 然後進入編輯模式:
gpg --edit-key <keyid>
- 接著在
gpg>
輸入環境底下,輸入trust
,之後會跳出需要哪種信任等級,選擇 5 (ultimate) - 確定變成 ultimate 之後,輸入
quit
離開 - 然後就可以回去看 key 是否有編輯成功
Proton
由 Steam (Valve) 領頭維護的 Wine fork。
Proton vs. Proton-GE-Custom
- Proton 是 Steam 官方 (Valve) 維護的版本
- Proton-GE-Custom 是社群專案,包含 Valve 沒有合併進去的 Patch 1
安裝 Proton
安裝一般版本
至 Steam -> 設定 -> 相容性, 開啟 為所有其他產品啟用 Steam Play 選項,然後在 執行其他產品時使用 清單中選擇 Proton 9.0-1 (或是其他任何不帶 Expermental
或 GE
字樣的選項)
安裝 Proton-GE-Custom
In Arch Linux (使用 yay 當作 AUR Helper):
yay -S proton-ge-custom-bin
有安裝 asdf 的話 2:
asdf plugin add protonge
# Or install a version from a tag (Eg.: GE-Proton8-25)
asdf install protonge latest
asdf 安裝方式的原理
Plugin 會把下載下來的 Proton-GE-Custom 解壓縮到 ASDF_PROTONGE_STEAM_COMPAT_DIR
指定的路徑裡(預設為 ~/.steam/root/compatibilitytools.d
)讓 Steam 可以識別,並且在 ~/.asdf/installs/protonge
底下建立 symlink 讓 Plugin 可以管理 3。
如果要讓 Plugin 可以吃到其他在 ASDF_PROTONGE_STEAM_COMPAT_DIR
`底下的任何版本,可以用以下指令:
ls ~/.steam/root/compatibilitytools.d | asdf protonge manage
Wine
讓 Linux 可以執行 Windows 程式。
[TOC]
安裝
官方版本
In Arch Linux:
sudo pacman -S wine
Proton
參見 Proton
Prefix 管理
預設 Wine 執行時會建立一個在 ~/.wine
底下的 Prefix 1 2。
使用 WINEPREFIX
來指定其他 Prefix:
WINEPREFIX=~/.wine-other wine winecfg
使用 WINEARCH
建立不同系統架構的 Wine,指定 win32
為建立 32 位元系統架構的 Wine, win64
則是 64 位元(預設)。
WINEARCH=win32 WINEPREFIX=~/.wine-32 wine winecfg
sudo
以不同身份執行程式(沒有指定的話預設是 UID=0,也就是 root)
常用參數
-E
: 保留當前使用者的環境變數到 sudo 執行環境內,這在某些需要環境變數傳遞的程式上很好用- 等同
--preserve-env
- 等同
-e
: 編輯檔案,而不是執行- 等同
--edit
,和sudoedit
指令
- 等同
-u
: 以特定使用者身份執行,在編輯只有特定使用者才能存取的檔案時(如 www-data)很好用- 與
su <username>
不同,su 需要使用者可以進入 shell 才可以使用
- 與
Distrobox
利用容器原理,讓你可以跑不同 Distro 的軟體。
安裝
大部分 Distro 都有收,以下指令以 Debian 12 為範例:
sudo apt install distrobox
建立容器環境
建議將家目錄跟宿主主機的家目錄隔離,不然部份設定檔(如 .bashrc)會出現錯亂。
mkdir -p ~/distrobox-home/arch
distrobox create -n arch -i docker.io/library/archlinux:latest --home $HOME/distrobox-home/arch
distrobox enter arch
關於 distrobox create
指令參數的說明:
-n
: 容器名稱-i
: 使用的映像- 因為 Debian 用 Podman 作為後端,所以要用 Docker Registry 的映像,地址要完整打出來 (
docker.io/library
)
- 因為 Debian 用 Podman 作為後端,所以要用 Docker Registry 的映像,地址要完整打出來 (
--home
: 指定容器的家目錄位置
設定好之後就可以輸入 distrobox enter <name>
進入容器內,第一次進入容器會先安裝基本套件,要等一下。
libimobiledevice
不用 iTunes,在 Linux 上就可以管理 Apple 裝置的工具。
安裝
Ubuntu 安裝的方式比較簡單:
sudo apt-get install usbmuxd libimobiledevice6 libimobiledevice-utils
沒有的話可能要搞個虛擬機,然後 Debian 要安裝的話目前(12,撰文當下)只能手動編譯,而且還要開 Experimental。
AUR 的話就分好幾包,可能要稍微找一下。自己最後裝的結果是這樣:
yay -S idevicerestore-git usbmuxd-git
遇到無法識別到 Apple 裝置的狀況,那會有很大的機率需要從 GitHub 上抓原始碼下來手動編譯
如果真的需要手動編譯,建議直接開個 VM 上 Arch Linux 、Gentoo 、openSUSE Tumbleweed 等任何可以隨時收到最新 libimobiledevice 的發行版,而不是在 Ubuntu、Debian 上手動編譯,那會造成依賴地獄
備份與還原
不要打成 idevicebackup
,那只有 iOS 3(含)以前的設備才可以用
備份
idevicebackup2 backup --full ./idevice-backup
將完整備份(包含系統)備份到 ./idevice-backup
資料夾當中。如果不加 --full
似乎只有使用者資料(未測試)。
還原
還原之前要先關閉尋找裝置(Find My iPhone、Find My iPad)功能,否則不會讓你還原
idevicebackup2 -s "device-uid" restore --system --settings ./idevice-backup
將 ./idevice-backup
資料夾內的備份,包含系統與設定,還原到指定的設備(-s
)。
如果備份有開加密,記得加 -i
讓程式提示輸入密碼。
一旦備份還原成功後,重開機會先跟你說裝置需要升級、提示要重新登入 Apple ID,並要求重新輸入裝置密碼,照著一步一步設定就好,進入系統後 App 會重新下載安裝,不過相關設定都沒有跑掉
安裝 IPSW
idevicerestore -e <IPSW_file_location>
-e
表示要格式化裝置,降級的話一定要清除,升級的話不用打這個。
如果要懶人地直接請 idevicerestore
取得最新版,直接打 -l
它會自己抓取。
如果要在 DFU 環境下安裝,則需要加入 -R
參數 (--recovery-mode
)。
建議使用實機進行安裝 IPSW 會比較省事,如果用虛擬機則需要隨時注意 USB 重新定向的相關設定是否有跑掉
如果遇到抓不到設備的狀況,可以先嘗試使用 root 身份運行 idevicerestore
疑難排解
卡在 DFU 模式出不來
你需要 irecovery。
將設備連結到電腦後,輸入:
irecovery -n
沒有任何錯誤的話,裝置應該就會自動重啟到一般模式了。
Podman / Docker
容器化技術
遇到的問題
讓容器可以吃到 Host 的網路
Command:
docker run --network=host -it ...
docker-compose.yml
(v3 以後): 加入 network_mode: "host"
選項。
這會導致 Port 全部只導向至 host 內,如果要開 Port 至對外,必須仰賴電腦的防火牆(如 iptables 或 firewalld) 的設定
更多有關 Podman/Docker 的網路知識,可以看這個部落格文章 或是 這個