Linux 管理筆記

最後更新: 2023-10-07 01:45:35 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

本文整理了幾項彼此獨立的管理工作:可移除式儲存裝置、能力、檔案系統位置、影像合成,以及 ELF 符號版本。每個章節都說明自動化時需要注意的操作邊界。

安全操作可移除式裝置 #

在關閉可移除式媒體的電源之前,先卸載所有已掛載的檔案系統。udisksctl 使用 UDisks 服務,因此會套用桌面工作階段授權並協調操作,而不是直接發出未經中介的裝置命令。

bash
lsblk -o NAME,PATH,TYPE,FSTYPE,MOUNTPOINTS
udisksctl unmount -b /dev/sdb1
udisksctl power-off -b /dev/sdb

將 /dev/sdb1 這類分割區傳給 unmount,但將 /dev/sdb 這類完整磁碟傳給 power-off。後者會清除緩衝區、讓裝置停止供核心使用,並在硬體支援時關閉磁碟電源。裝置名稱可能在每次連接事件後改變,因此請在執行命令前立即確認名稱。卸載成功本身並不保證 USB 外接盒已關閉電源。

使用能力委派權限 #

Linux 能力會將傳統上擁有全部權限的 root 權限,分割為彼此獨立且分別檢查的單位。程序具有 permitted、effective、inheritable、bounding 和 ambient 能力集合;檔案也可以攜帶 permitted 與 inheritable 能力遮罩,以及 effective 位元。每項能力涵蓋特定的核心檢查,因此請參閱 capabilities(7)。

例如,需要設定系統時鐘的專用二進位檔可以獲得 CAP_SYS_TIME:

bash
sudo setcap cap_sys_time=ep /opt/example/bin/clock-setter
getcap /opt/example/bin/clock-setter

=ep 會將該能力加入檔案的 permitted 集合,並要求它進入執行後程序的 effective 集合。對於範圍狹窄且不可寫入的可執行檔,只授予最小能力集合。複製、封裝或不支援必要擴充屬性的檔案系統可能會移除檔案能力,因此部署檢查應執行 getcap。

能力不是完整的沙盒。尤其是 CAP_SYS_ADMIN 授權許多互不相關的操作,而特權二進位檔仍可能因記憶體安全問題或命令注入錯誤而導致系統遭到入侵。如果委派內容可以表示為一個經過稽核的命令,受限制的 sudoers 規則可能更容易檢查。

選擇檔案系統位置 #

Filesystem Hierarchy Standard 和 hier(7) 依據資料的持久性與用途將其分開:

  • /run 包含自開機以來的揮發性執行階段狀態。此階層會在開機期間清除。服務應為 PID 檔案、UNIX 網域通訊端、鎖定檔及其他執行階段中繼資料建立 /run/example/ 這類私有子目錄;服務管理員可以使用 systemd 的 RuntimeDirectory= 等功能建立它。
  • /var 包含跨重新開機持續存在的可變資料,包括記錄、佇列、快取、資料庫和應用程式狀態。持久狀態應選擇 /var/lib/example 這類已定義的子樹;可重新產生的資料則應選擇 /var/cache/example。
  • /tmp 包含暫存檔案,可能依據原則或在開機時清除。絕不要假設其中的資料具有持久性。請使用不可預測的名稱和嚴格的權限以原子方式建立檔案;Shell 指令碼應使用 mktemp,程式則應使用等效的安全 API。

如果使用具命名空間的子目錄即可避免衝突,並讓所有權能以單一單位管理,就不要將應用程式檔案直接放在 /run 或 /var 中。/run 適合放置用於連線至精靈的通訊端;持久的精靈資料應放在 /var 下,而不是該通訊端旁邊。

調整大小與拼接影像 #

ImageMagick 7 使用 magick 命令。不含 ! 的幾何參數會保留長寬比:

bash
# Fit within a width of 25 pixels, with unconstrained height.
magick src.png -resize 25x out.png

# Fit within a height of 25 pixels, with unconstrained width.
magick src.png -resize x25 out.png

# Scale both dimensions to 70 percent.
magick input.jpg -resize 70% output.jpg

25x25 表示「放入此方框內」,而不是「強制調整為正好 25 x 25」。只有在有意產生變形時才加入 !;若需求是填滿並裁切為精確矩形,請使用 ^ 加上 -extent。

append 運算子會保留輸入順序:

bash
magick 1.jpg 2.jpg -append vertical.jpg
magick 1.jpg 2.jpg +append horizontal.jpg

-append 會將影像由上到下堆疊;+append 會將影像由左到右排列。輸出會使用交叉軸上最大的輸入寬度或高度。-gravity 控制對齊方式,-background 控制暴露空間:

bash
magick -background '#202020' -gravity center 1.jpg 2.jpg +append row.jpg

檢查 ELF 符號版本 #

ELF 符號版本控制可讓共用物件發布同一符號的多個 ABI 世代。連結器版本腳本可以將匯出的名稱指派給版本節點,而 .symver 指示詞或函式庫建置機制可以將實作繫結至這些節點。某個定義會以 @@ 標記為預設定義;較舊的相容定義則使用 @。例如,memcpy@@GLIBC_2.14 是為新的未版本化參照選取的預設定義,而較舊的二進位檔可能需要 memcpy@GLIBC_2.2.5。

版本控制支援在單一 SONAME 內提供向後相容的實作,但不會讓針對較新版本建置的二進位檔能在缺少必要節點的系統上執行。請檢查兩端:

bash
readelf --dyn-syms --wide ./program
readelf --version-info ./program
objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep ' GLIBC_'

readelf --version-info 會顯示版本定義、需求和符號版本表。objdump -T 會將動態符號及其版本合併顯示。執行階段載入器必須從選定的相依性中解析每個必要的版本節點;診斷期間可以使用 LD_DEBUG=versions ./program 追蹤該檢查。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)