systemd 依賴項能否僅應用於單元的“ExecStart”操作?
我有一個場景,其中使用可移動加密 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-generator
systemd 在系統啟動時執行。生成的單元包括對密鑰文件路徑的依賴:
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