从命令行安装LUKS


11

nautiluscaja我单击加密磁盘的图标并输入密码时,基础块设备将映射到/dev/mapper/luks-$UUID该设备,并将其挂载在/media/$USER/$DISK,而无需root密码。有没有一种方法可以在没有GUI的情况下从命令行调用此过程,包括避免sudo并使挂载点能够从GUI再次卸载。


不确定(因此要发表评论而不是回答),我相信GUI会通过udisks(或udisks2)完成此操作。研究其CLI实用程序中的选项可能会提供进一步的答案。
2015年

另外,您可能是第一次输入密码,然后选择将其保存到登录密钥环。因此,从技术上讲,它确实使用密码,但是它是自动完成的,因此您看不到它。
2015年

Answers:


12

我不知道执行此操作的单命令方式。GUI程序正在对磁盘进行相当多的询问,以采取“正确”的方法,您需要自己完成一些工作。不过,您不需要sudo,而且我认为所产生的事件序列相对而言不会感到痛苦。

简短答案

udisksctludisks2包装中使用:

udisksctl unlock -b /path/to/disk/partition
udisksctl mount -b /path/to/unlocked/device

您的用户帐户将需要得到适当的授权,才能使上述操作正常进行。在Debian和Ubuntu上,这意味着将您的帐户添加到plugdev组中。

处理完磁盘后:

udisksctl unmount -b /path/to/unlocked/device
udisksctl lock -b /path/to/disk/partition
udisksctl power-off -b /path/to/disk/or/partition

如何设置东西

您可以通过以下方法(通过命令行)进行设置,以使使用磁盘的过程尽可能轻松。我假设您要将整个USB驱动器用作单个文件系统。其他配置将需要修改说明。关于变化的警告:我尚未找到在加密容器中使用LVM的方法,该方法将允许无特权的帐户断开所有连接。(我看不到通过禁用卷组的方法udisksctl。)

为了便于说明,我们将磁盘称为/dev/sda。您将需要文件系统的名称,以便以后参考。我将使用“ example”。

分区磁盘

运行sudo parted /dev/sda并运行以下命令:

mklabel gpt
mkpart example-part 1MiB -1s
quit

mkpart命令可能会提示您稍微调整参数。您应该可以接受它的建议号码。

现在可以通过访问该分区/dev/disk/by-partlabel/example-part

创建并挂载LUKS分区

sudo cryptsetup luksFormat /dev/disk/by-partlabel/example-part

浏览提示。

sudo cryptsetup luksOpen /dev/disk/by-partlabel/example-part example-unlocked

加密的设备现在可以在上找到/dev/mapper/example-unlocked。这将不是永久的事情;仅用于设置过程。

创建您的文件系统

假设您使用的文件系统是XFS。几乎所有其他传统文件系统都将以相同的方式工作。重要的是添加一个标签,以便以后使用:

sudo mkfs -t xfs -L example /dev/mapper/example-unlocked

现在可以通过访问文件系统的块设备/dev/disk/by-label/example

设置文件系统权限

默认情况下,文件系统只能由root用户访问。在大多数情况下,您可能希望用户帐户可以访问这些文件。假设您的帐户名称为“ user”:

udisksctl mount -b /dev/disk/by-label/example
sudo chown user:user /media/user/example

关闭所有内容

udisksctl unmount -b /dev/disks/by-label/example
sudo cryptsetup luksClose example-unlocked

使用您的文件系统

这是您定期执行的操作。插入USB驱动器后,

udisksctl unlock -b /dev/disks/by-partlabel/example-part
udisksctl mount -b /dev/disks/by-label/example

如果您的用户帐户是“ user”,则文件系统现在将安装在/media/user/example

卸载文件系统:

udisksctl unmount -b /dev/disks/by-label/example
udisksctl lock -b /dev/disks/by-partlabel/example-part
udisksctl power-off -b /dev/disks/by-partlabel/example-part

现在您可以断开USB驱动器的连接了。


我创建了一个开源的bash脚本,该脚本可以自动化并简化您的“使用文件系统”部分:github.com/JerichoJyant/usbkey。它是为USB闪存驱动器设计的。我还计划将您在此处描述的设置也合并到脚本中。
Josh Patton

3

在我看来,asciiphil答案是正确的,应该如此标出。

首先,“我不知道单命令执行此操作的方式。” 我也没有,并且已经打开了相应的功能请求。作为一种解决方法,可以创建包装器脚本,以提供一种单命令方式来解锁和安装分区。

假设您使用Bash,请将下面的脚本另存为,例如unlock-and-mount,使其可执行,然后将其放置在的目录中PATH。然后,您可以使用一步来解锁和安装设备unlock-and-mount /dev/disk/by-id/my-device-part-X

警告:这依赖于解析udisksctl发送到stdout 的消息以及udisksctl命令行界面的稳定性。根据udisksctl 手册页,这很脆弱,它说:

[此]程序不适合脚本或其他程序使用-将来,即使在维护版本中,选项/命令也可能以不兼容的方式更改。

同时,这是目前可以使用的脚本:

#!/usr/bin/env bash
# A convenience wrapper around `udisksctl`.

# Trace execution 
set -x

# Abort on errors. (I find this helpful, despite the cautions given in
# http://mywiki.wooledge.org/BashFAQ/105 and
# http://mywiki.wooledge.org/BashFAQ/112 .)
set -e
set -u

# Define functions
die () {
    echo >&2 "$@"
    exit 1
}

# Validate input argument(s) 
[[ "$#" -eq 1 ]] || die "Exactly 1 argument required: path to partition ID. $# given"
[[ -b "$1" ]]    || die "$1 is not a block device"
[[ "$1" == /dev/disk/by-id/* ]] || die "$1 does not begin '/dev/disk/by-id/'"

# Unlock partition
unlockedpart="$(udisksctl unlock -b "$1" |\
 tail -n1 |\
 sed -e 's/^Unlocked \/dev\/[[:print:]]\+ as \([[:print:]]\+\).$/\1/' \
)"

# Mount unlocked partition
udisksctl mount -b "$unlockedpart"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.