Linux

一些跟 Linux 有關的內容

Systemd

Systemd

建立一個服務

範例模板

[Unit]
Description=<Description>

[Service]
Type=oneshot
User=<user>
Group=<groups>
ExecStart=<command>

[Install]
WantedBy=multi-user.target

解說

[Unit] 區塊

[Service] 區塊

 [Install] 區塊

Systemd

Systemd-boot

運作起來很簡單的開機載入器(UEFI 限定)

系統需求

安裝、修復

一般安裝

無論在哪一種環境(正常環境或 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));
for key in "${array[@]}"; do cwebp $key -o $key.webp; done
&& mv *.webp ./webp

備註

Arch Linux 獨有

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

Proton

由 Steam (Valve) 領頭維護的 Wine fork。

Proton vs. Proton-GE-Custom

安裝 Proton

安裝一般版本

Steam -> 設定 -> 相容性, 開啟 為所有其他產品啟用 Steam Play 選項,然後在 執行其他產品時使用 清單中選擇 Proton 9.0-1 (或是其他任何不帶 ExpermentalGE 字樣的選項)

安裝 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)

常用參數

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 指令參數的說明:

設定好之後就可以輸入 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 的網路知識,可以看這個部落格文章 或是 這個