Arch-Linux

systemd 依賴項能否僅應用於單元的“ExecStart”操作?

  • February 5, 2015

我有一個場景,其中使用可移動加密 USB“密鑰環”快閃記憶體驅動器上包含的密鑰對許多儲存捲進行加密。我正在執行 Arch Linux,這個問題是關於 systemd 依賴配置的。

系統配置為,只要存在密鑰環,系統就會啟動並安裝卷。密鑰環密碼是在引導過程中手動輸入的。

一旦系統啟動,我希望能夠移除 USB 密鑰環,但是,我遇到了問題,因為 systemd 解除安裝了所有內容。

這是我所做的一個例子。第一的,/etc/crypttab

# <name>  <device>           <password>             <options>
keyring   PARTLABEL=keyring  none                   noauto
abc       /dev/lvm/abc       /root/keyring/abc.key  header=/root/keyring/abc.hdr
xyz       /dev/lvm/xyz       /root/keyring/xyz.key  header=/root/keyring/xyz.hdr
  • 我正在使用systemd支持該header選項的最新 Git 結帳;它於 1 月 8 日被添加到程式碼庫中。
  • 我正在使用密鑰環的分區標籤,因為出於備份/方便的原因,有多個物理密鑰環。它們可能具有不同的 UUID,但使用相同的 PARTUUID 設置。
  • 我正在使用noauto,所以密鑰環只是任何需要解密的設備的依賴項。

接下來是/etc/fstab

# <file system>     <dir>         <type>    <options>
/dev/mapper/keyring /root/keyring ext4      ro,noauto
/dev/mapper/abc     /srv/abc      ext4
/dev/mapper/xyz     /srv/xyz      ext4

同樣,密鑰環之所以noauto如此安裝,是因為它是一個依賴項。此外,它以只讀方式安裝,因此只需將其拉出即可安全。

現在,為了創建捲和密鑰環之間的依賴關係,我使用了一個drop-in override,例如:

# /etc/systemd/system/systemd-cryptsetup\@abc.service.d/override.conf
[Unit]
Requires=root-keyring.mount

這一切都適用於啟動。問題是移除密鑰環會停止依賴它的單元。我不希望這種情況發生 - 僅需要在加密卷解鎖時使密鑰和標頭可訪問。解鎖後,不再需要密鑰和標題。

所以,我的問題是問我如何安排對僅在 systemd-cryptsetup@.service 單元中的“ExecStart”命令期間存在的密鑰環的依賴

或者,如果這是錯誤的方法,任何改進的解決方案都將受到歡迎。

在目前的 systemd 中(在撰寫本文時為 218),一個條目會/etc/crypttab導致該systemd-cryptsetup@.service單元的實例由systemd-cryptsetup-generatorsystemd 在系統啟動時執行。

生成的單元包括對密鑰文件路徑的依賴:

RequiresMountsFor=/path/to/key_file

這種依賴關係記錄在man systemd.unit其中,它解釋了它導致訪問指定路徑所需的所有安裝的依賴關係Requires=After=

如果掛載單元被停用,Requires=依賴關係會導致 systemd 停止 cryptsetup 單元。

這意味著解除安裝包含密鑰的設備會導致 cryptsetup 單元停用,並在這樣做時鎖定卷。

目前唯一的解決方法是不/etc/crypttab用於可能存在問題的任何卷,而是提供不包含RequiresMountsFor=依賴項的自定義單元。. 這是一個合適的自定義單元,它基於生成器生成的單元:

# /etc/systemd/system/systemd-cryptsetup\@.service 
[Unit]
Description=Cryptography Setup for %I
Documentation=man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8)
DefaultDependencies=no
Conflicts=umount.target
BindsTo=dev-mapper-%i.device
IgnoreOnIsolate=true
After=cryptsetup-pre.target
Before=cryptsetup.target
BindsTo=dev-lvmvg-%i.device
After=dev-lvmvg-%i.device
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutSec=0
ExecStart=/usr/lib/systemd/systemd-cryptsetup attach '%i' '/dev/lvmvg/%i' '/root/keyring/%i.key' 'header=/root/keyring/%i.hdr'
ExecStop=/usr/lib/systemd/systemd-cryptsetup detach '%i'

[Install]
WantedBy=dev-mapper-%i.device

將使用此範例代替/etc/crypttab此條目:

# <name>  <device>       <password>              <options>
mail      /dev/lvmvg/mail /root/keyring/mail.key  header=/root/keyring/mail.hdr   

此問題已向 systemd 開發人員提出,並已添加到TODO 列表中

也許您可以使用automount代替顯式依賴。

我記得 Systemd 在Poettering 最初的博文中宣傳了這一點,作為一種隱式依賴。這就像(使用 systemd)您可以如何向套接字寫入請求並且將為您啟動相應的服務,即“套接字啟動”。在這種情況下,訪問文件系統將導致它被掛載。

使用這種方法,您可以期望在服務或文件系統準備好之前阻塞。 注意:這意味著如果您嘗試查看它,您的系統將有一個阻止您的目錄(一旦您刪除了“keyring”驅動器)……也許如果您曾經將 /root 用於其他任何東西,它會是最好將它安裝在其他地方,例如/automount/keyring,以避免絆倒它。就我個人而言,我認為這類問題使自動掛載有點令人困惑——但它似乎確實為您的問題提供了一個非常快速的解決方案。

如果文件系統在 中列出/etc/fstab,只需添加x-systemd.automount到選項列表中。

如果它是由本機.mount文件描述的,那麼您似乎需要創建一個.automount同名的文件。例如root-keyring.automount,包含:

[Automount]
Where=/root/keyring

引用自:https://unix.stackexchange.com/questions/182050