手动解密/home分区后如何自动启动服务

Zyt*_*hyr 5 encryption mount services systemd dmcrypt

问题: 我有一个服务,seafile.service启动后会自动启动 Seafile 服务器。但是,此服务无法在具有加密/home分区的Ubuntu 服务器上启动。该服务需要访问本指南中/home/sfadmin/seafile/seafile-server-latest/seafile.sh所示的。

即使手动解密/home分区后,该服务也无法自动启动 Seafile 服务器。当我通过执行手动启动服务时sudo systemctl start seafile.service,它可以工作,但是,/home即使分区已经解密并安装,我也被要求提供分区的解密密码。即使我输入了错误的密码,服务也能正常启动。

背景:

  1. 我正在运行带有加密/home分区的Ubuntu 16.04.4 LTS 服务器。的/home分区使用DMCrypt(cryptsetup)加密。我使用本指南来加密我的/home分区。
  2. 我的/etc/fstab配置有nofail指导对我的/home分区如下:/dev/mapper/data-home /home ext4 defaults,nofail 0 2
  3. /etc/crypttab的配置如下:data UUID=myuuidhere none luks,discard,noearly,nofail
  4. 我的/home分区解密是手动完成的。每次启动后,我/home使用 SSH 命令远程解密分区sudo cryptsetup luksOpen /dev/sda3 data
  5. 解密后,Ubuntu 会自动挂载/home分区。

尝试的解决方案

由于Seafile服务(/etc/systemd/system/seafile.service)需要访问/home的分区,我用后续指令对我的服务配置:ConditionPathExistsRequires,和After。以下是我的确切服务定义。

[Unit]
Description=Seafile
ConditionPathExists=/home/sfadmin
Requires=home.mount
# add mysql.service or postgresql.service depending on your database to the line below
After=network.target mysql.service home.mount

[Service]
Type=forking
ExecStart=/home/sfadmin/seafile/seafile-server-latest/seafile.sh start
ExecStop=/home/sfadmin/seafile/seafile-server-latest/seafile.sh stop
User=sfadmin
Group=sfadmin

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

问题:

Ubuntu服务器重启后,我使用SSH远程登录,手动解密/home分区。我确认该/home分区是自动挂载的,但是seafile.service由于依赖关系仍然无法启动。

当我手动尝试使用命令启动 seafile.service 时sudo systemctl start seafile.service,会提示我输入密码来解密/home分区,即使分区已经解密。当要求输入密码时,我将其留空并按 Enter 键,但我没有收到其他提示。当我检查 的状态时seafile.service,它现在已启动并处于活动状态。

我认为无法seafile.service启动的可能罪魁祸首可能与系统要求密码短语来解密/home分区有关,即使分区已经解密。

为什么seafile.service/home分区已经解密的情况下手动启动时系统会要求输入密码?

请参阅以下步骤:

$ sudo cryptsetup luksOpen /dev/sda3 data
Enter passphrase for /dev/sda3:
$ sudo systemctl status seafile.service
? seafile.service - Seafile
   Loaded: loaded (/etc/systemd/system/seafile.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

Mar 10 04:14:02 VM-SERVER systemd[1]: Dependency failed for Seafile.
Mar 10 04:14:02 VM-SERVER systemd[1]: seafile.service: Job seafile.service/start failed with result 'dependency'.
$ sudo systemctl start seafile.service
Please enter passphrase for disk data!
$ sudo systemctl status seafile.service
? seafile.service - Seafile
   Loaded: loaded (/etc/systemd/system/seafile.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-03-10 04:36:46 EST; 11s ago
  Process: 1589 ExecStart=/home/sfadmin/seafile/seafile-server-latest/seafile.sh start (code=exited, status=0/SUCCESS)
    Tasks: 15
   Memory: 21.2M
      CPU: 528ms
   CGroup: /system.slice/seafile.service
           ??1614 /home/sfadmin/seafile/seafile-server-6.2.5/seafile/bin/seafile-controller -c /home/sfadmin/seafile/ccnet -d /home/sfadmin/seafile/seafile-data -F /home/sfadmin/seafile/conf
           ??1616 ccnet-server -F /home/sfadmin/seafile/conf -c /home/sfadmin/seafile/ccnet -f /home/sfadmin/seafile/logs/ccnet.log -d -P /home/sfadmin/seafile/pids/ccnet.pid
           ??1618 seaf-server -F /home/sfadmin/seafile/conf -c /home/sfadmin/seafile/ccnet -d /home/sfadmin/seafile/seafile-data -l /home/sfadmin/seafile/logs/seafile.log -P /home/sfadmin/seafile/pids/seaf-server.pid

Mar 10 04:36:42 VM-SERVER systemd[1]: Starting Seafile...
Mar 10 04:36:43 VM-SERVER seafile.sh[1589]: [03/10/18 04:36:43] ../common/session.c(132): using config file /home/sfadmin/seafile/conf/ccnet.conf
Mar 10 04:36:43 VM-SERVER seafile.sh[1589]: Starting seafile server, please wait ...
Mar 10 04:36:46 VM-SERVER systemd[1]: Started Seafile.
Run Code Online (Sandbox Code Playgroud)