如何从命令行挂载加密卷?

如果我有一个加密的外部磁盘(或者一个不在fstab中的内部磁盘),我会在Nautilus中看到一个条目,类似于“X GB加密卷”。我可以点击这个卷,然后会提示我输入密码来解密和挂载设备。
但是我如何通过命令行来做到这一点呢?
我能找到的这个维基页面和其他文档只提到了使用图形界面的方法来解密设备;但是在无头服务器或SSH登录的情况下,这样做是不可行的。是否有一种简单的方法让设备自动挂载到/media中的指定位置,就像在图形界面中那样?
(我不是在问关于加密的家目录的问题——我知道ecryptfs-mount-private。这个问题是关于额外的加密卷。)

+1 对于区分整个文件系统的加密和加密的个人目录表示赞同。 - XavierStuvw
1继续。现在,随着Ubuntu 18.04将对单个目录加密的支持降级为全盘加密,这一区别已经成为一个热门话题,详见https://askubuntu.com/q/1030572/446253 对于一些人,包括我在内,这是在无缝迁移到18.04时遇到困难的原因之一。 - XavierStuvw
相关链接:https://unix.stackexchange.com/questions/182387/how-to-mount-a-disk-encrypted-with-cryptsetupcrypto-luks-in-ubuntu-14-04 | https://superuser.com/questions/1134255/luks-on-ubuntu-16-04-unknown-filesystem-type-crypto-luks - Ciro Santilli OurBigBook.com
14个回答

你的卷可能是使用LUKS加密的,以下是如何挂载它的方法:
你需要:
sudo apt-get install cryptsetup

解密卷:
sudo cryptsetup luksOpen /dev/sda1 my_encrypted_volume

现在你可以像往常一样安装它:
sudo mkdir /media/my_device
sudo mount /dev/mapper/my_encrypted_volume /media/my_device

要再次锁定容器,首先需要卸载它:
sudo umount /media/my_device
sudo cryptsetup luksClose my_encrypted_volume

要自动将其放置在/media位置上,请使用udisks工具。
sudo udisks --mount /dev/mapper/my_encrypted_volume

2所以,作为一个非特权用户,我也无法做到这一点,即使我可以通过图形界面实现吗? - cha
这实际上取决于您的系统设置。我相信只要您的系统允许用户访问设备,大多数命令都应该可以正常工作。 - Georg Schölly
1Ubuntu 15.04在udisks的位置上使用了udisks2软件包,而后者将工具重命名为udisksctl - skierpage
4很遗憾,在我的Ubuntu 16.04上无法工作。挂载:未知的文件系统类型'LVM2_member'。 - Selah
@Selah:听起来你在尝试解密一个不是LUKS卷的东西。也许你需要使用除了/dev/sda1之外的其他方法。 - Georg Schölly
1谢谢你的关心。我试图挂载/dev/sda3,根据GParted显示,它是加密类型的crypt-luks。 - Selah
1这对我有用!! https://askubuntu.com/questions/895478/opening-luks-encrypted-drive-in-nautilus-results-in-operation-cancelled/895508#895508 - Selah
这对我起了魔法般的作用。在上下翻阅了整个互联网之后,这是我在网络上找到的最佳答案。谢谢你提供如此精彩的答案。我不明白的是,我以前从未在Ubuntu 16.04上遇到过这个问题。它总是自动挂载驱动器,但这次发生了一些改变,无法自动挂载...再次感谢你的出色答案。 - ThN
在我的情况下,我需要从这个答案中获取一些提示。 - polynomial_donut
这个配方在Ubuntu 22.04上失败,并显示错误信息:"未知的文件系统类型 'crypto_LUKS'." 在第一个挂载命令处。 - Luís de Sousa
修复LVM2_member错误:当你执行luksOpen命令时,请列出/dev/mapper目录的内容。里面可能会有一个xx--vg-root的项目。将其挂载,而不是my_encrypted_volume。 - undefined

@Georg Schölly的回答中的步骤对我来说并没有起作用,尽管现在可能会起作用,在几个Ubuntu版本之后。当时,在执行sudo mount /dev/mapper/my_encrypted_volume /media/my_device这一步之后,我遇到了以下错误:

mount: unknown filesystem type 'LVM2_member'

使用udiskctl解锁和挂载磁盘

相反,我使用了udisksctl,这是一个与udisksd服务进行交互的命令行界面。

以下是成功的方法(/dev/sdb5是我硬盘上标记为crypt-luks的分区):

udisksctl unlock -b /dev/sdb5
udisksctl mount -b /dev/mapper/ubuntu--vg-root

在输入第一个命令后,系统会要求您输入加密密码。一旦解锁了加密分区,执行第二个命令将会挂载它。如果成功的话,您将会收到类似于以下信息的提示:类似于这样:
Mounted /dev/dm-1 at /media/dpm/e8cf82c0-f0a3-41b3-ab28-1f9d23fcfa72

从那里我可以访问数据 :)

使用udiskctl锁定磁盘

卸载设备:

udisksctl unmount -b /dev/mapper/ubuntu--vg-root

首先,您需要停用ubuntu-vg卷组中的所有逻辑卷。否则,如果您尝试锁定它,您将收到类似于“设备忙”的错误消息(更多信息):

sudo lvchange -an ubuntu-vg

然后,你就可以重新锁定加密分区了。
udisksctl lock -b /dev/sdb5

笔记

  • 执行udisksctl命令时不需要使用sudo
  • 设备映射器名称:在不同的Ubuntu版本中,ubuntu--vg-root的命名可能会有所变化(例如,我也看到过它被称为system-rootubuntu-root)。找到名称的简单方法是在解锁LUKS分区后运行以下命令:

    ls -la /dev/mapper

    然后查看ls命令的输出,你通常需要的名称将是符号链接到/dev/dm-1的那个。

  • 设备映射器名称,替代方法:另一种替代上述命令的方法是运行:

    lsblk -e7

    在那里可以以树状视图查看设备名称映射。选项-e 7用于从输出中排除由已安装的snap创建的循环设备(ID 7),以减少混乱。

  • 逻辑卷名称:你可以运行sudo lvs命令来查找卷组和逻辑卷的名称。
  • Disks应用程序:GNOME Disks应用程序在锁定分区之前不会自动停用逻辑卷。即使你成功通过GUI解锁了分区,你仍然需要进入命令行并执行sudo lvchange -an ubuntu-vg命令才能从GUI中锁定它。

1我认为这是最好的答案,因为我怀疑这就是nautilus使用libudisks2所做的事情。而且,我已经测试过这在非特权用户下运行良好。 - Jaap Versteegh
15很不幸,我遇到了错误信息“Object /org/freedesktop/UDisks2/block_devices/dm_2d3 is not a mountable filesystem.” 你有什么建议吗? - wawa
2@wawa 我遇到了同样的问题,并在这个答案中解决了它 http://askubuntu.com/a/895508/334823 - raphael
我不清楚在/dev/mapper/ubuntu-root的位置应该输入什么。如果我简单地输入它,会出现错误。"查找设备/dev/mapper/ubuntu-root时出错"。 - Selah
对于两个 udisksctl 命令,我需要使用 sudo,否则会出现错误,类似于 Error unlocking /dev/sdb1: GDBus.Error:org.freedesktop.UDisks2.Error.NotAuthorized: Not authorized to perform operation - mwfearnley
4快进5年,我发现自己再次需要解密一个分区。我使用了Ubuntu 18.04的live USB工具,并按照我之前描述的步骤进行操作。同样的方法依然有效,我不需要使用sudo来执行它们。 - David Planella
2@Selah,我扩展了答案以更好地解释挂载时要使用的设备路径。对于mwfearnley:您登录的用户的权限可能值得一看。 - David Planella
1这个帮我避免了重新安装!谢谢你!<3 - tplive
这将以只读模式挂载卷。有没有办法以读写模式进行挂载? - Luís de Sousa

如果你遇到这个错误:
mount: unknown filesystem type 'LVM2_member'

运行:

sudo apt-get install lvm2
sudo lvscan

然后激活你看到的所有LVM。
sudo vgchange -ay

然后重新运行挂载命令:
sudo mount /dev/mapper/my_encrypted_volume /media/my_device

15最后一行不一定正确,因为你可能仍然会遇到相同的错误。相反,挂载lvscan列出的其中一个驱动器,而不是/dev/mapper/my_encrypted_volume - Weasemunk
1这对我没有用。同样的错误,挂载:未知的文件系统类型'LVM2_member'。也许是因为我正在从闪存驱动器启动? - Selah
@SeanScott 非常感谢你...我使用了安装程序来加密我的驱动器,现在我正在尝试恢复数据并且不得不重新学习这些东西...唉 - CameronNemo
@Weasemunk 谢谢!这就是问题所在! - taharqa
在重新安装NIXOS的情况下,这对我起作用。已经从nixos-minimal iso中可用lvscanvgchange - Paul Parker

一个问题我遇到的是“重复的卷组”:我的恢复系统和待恢复的驱动器都是Ubuntu系统,并且使用了LVM。这就是为什么我有两个“ubuntu-vg”卷组(每个卷组都有自己的UUID,但我无法访问它们的逻辑卷)。
我的解决方案基于Georg的答案。
  • 从一个活动的Linux系统启动(这样你就不会遇到重复的卷组名称)
  • sudo cryptsetup luksOpen /dev/sdaX my_encrypted_volume
  • 在提示时输入你的密码
  • sudo vgscan 现在应该能够找到包含的卷/组。

  • 前方高能:我们现在要更改卷组名称。 之后你将无法从该驱动器启动!

    使用 sudo vgrename ubuntu-vg ubuntu-vg2 来重命名卷组。

    如果你需要从该驱动器启动,你可以再次执行这些步骤,但将卷组重新命名为 ubuntu-vg。另一种可能性是修改引导配置为新的卷组名称。

现在重复的卷组名称问题已解决,我可以重新启动回到我的常规系统,重新执行 cryptsetup...vgscan 然后将 /dev/mapper/ubuntu--vg2-root 挂载到任何你喜欢的位置。


2看起来你也可以使用 sudo vgdisplay 命令来查找 UUID,并使用它来替代重复的名称,以便只对一个卷进行重命名。也就是说,获取 UUID 然后执行 sudo vgrename <uuid> old 对我来说有效。 - mpontillo
我现在无法测试Mike的建议,但如果它有效的话,那比重新命名卷组要好! - amenthes

以上所有的答案都假设用户已经知道哪个分区是加密的。作为一个不太喜欢命令行的人,我期望得到一些用户友好的答案...所以这是我的建议。
1. 打开Ubuntu的"磁盘"应用程序。 2. 在左侧面板中找到您挂载的硬盘。 3. 点击具有"LUKS"名称的分区:这样您就可以在下方的"设备"文本中看到它的挂载点(在我的情况下是:/dev/sdb4)。
然后我尝试按照上面的建议进行挂载。
$ sudo cryptsetup luksOpen /dev/sdb4 someNameForMyVolume
Enter passphrase for /dev/sdb4: 

但是遇到了这个错误:
Cannot use device /dev/sdb4 which is in use (already mapped or mounted).

好的,我猜nautilus已经尝试挂载它了(因为当我连接USB时,它实际上提示我输入密码,即使最终没有显示解密后的树)。然而,错误信息并不是很有帮助,因为它没有告诉我它已经映射/挂载到哪里。但是这个命令在这种情况下很有帮助:
$ udisksctl unlock -b /dev/sdb4
Passphrase: 
Error unlocking /dev/sdb4: GDBus.Error:org.freedesktop.UDisks2.Error.Failed: Device /dev/sdb4 is already unlocked as /dev/dm-3

啊哈!原来是 /dev/dm-3
然而,当尝试挂载它时,却无法正常工作。
$ udisksctl mount -b /dev/dm-3
Object /org/freedesktop/UDisks2/block_devices/dm_2d3 is not a mountable filesystem.

经过一番摸索,我发现自己遇到了“重复卷组”问题(由@amenthes在上面描述),因为命令sudo vgscan -v和sudo vgdisplay显示了两个具有相同卷组名称的条目。然而,我找到了比他的方法更好的解决办法(无需启动LiveCD来重命名卷组!),在这个链接中link,我将在上面引用(以防该链接失效...):
如果你运行ls -la /dev/mapper/,你应该会看到一个luks-xxxxxx-xxxxx-xxxx或类似的文件。那是当Ubuntu提示输入加密密码时创建的映射(对话框只是调用luksOpen并将其映射到/dev/mapper/luks-xxx文件)。现在:
确保你的物理卷可用,运行sudo pvdisplay命令来确认。它应该是/dev/mapper/luks-xxx-whatever。
通过运行sudo pvs -o +vg_uuid命令获取卷的UUID。UUID将显示在最右边,包含7个由破折号分隔的值。将其复制到某个地方,因为我们将在下一步中使用它们。不要混淆UUID并复制错误的UUID。只复制当前/dev/mapper/luks-xxx-whatever设备的UUID。
通过运行以下命令更改旧磁盘的卷组:sudo vgrename UUIDOFYOURDISKHERE oldhd。你可以将"oldhd"更改为任何你想要的名称,只要它与当前磁盘的卷组名称不同即可。执行此步骤会删除卷组名称冲突,从而使卷现在可用。
运行命令vgchange -a y以激活卷。
在某个位置创建一个挂载点文件夹,例如:sudo mkdir /media/<yourUserName>/someDir 挂载它:sudo mount /dev/oldhd/root /mnt/oldhd
在处理完文件后,如果你希望该卷仍然可引导,请将卷组重命名为ubuntu-vg

sdb1 这里是一个例子,你应该输入你的设备名称,这些命令都不需要 root 权限。

解锁加密磁盘

udisksctl unlock -b /dev/sdb1

插入正确的密码短语后,它将输出类似于这样的内容:已解锁 /dev/sdb1 作为 /dev/dm-3 然后将其挂载到 /media/。
udisksctl mount -b /dev/dm-3

应该输出类似这样的内容:已挂载 /dev/dm-3 到 /media/yourUserName/sdb 要卸载它。
udisksctl unmount -b /dev/dm-3

再次锁定它
udisksctl lock -b /dev/sdb1

2disksctl mount -b /dev/dm-4 对象/org/freedesktop/UDisks2/block_devices/dm_2d4不是可挂载的文件系统。 - DevilCode
抱歉,你解决了这个问题吗?(因为我也遇到了无法挂载的文件系统) - Oleg Tarasenko
1同样的问题,看看这个答案对我有用 http://askubuntu.com/a/895508/334823 - raphael
就像@David Panella的回答所说,这将卷挂载为只读模式。如何将其挂载为读写模式? - Luís de Sousa

对于那些不想使用图形界面工具来确定哪个分区被加密的人来说。
找到任何加密分区 lsblk -lf | grep LUKS -l 请求“列表”格式 - 我们不需要树 -f 同时显示文件系统的名称 我们会得到类似以下内容: sdc2 crypto_LUKS b09d6209-......
解锁我们想要的分区(在我的情况下是/dev/sdc2) udisksctl unlock -b /dev/sdc2 -b 表示我们提供了块设备的路径 输入密码后,我们会得到一个肯定的回应,并附带下一步所需的信息: 已解锁 /dev/sdc2 作为 /dev/dm-6
挂载新创建的设备(dm 代表设备管理器) udisksctl mount -b /dev/dm-6 再次得到一个肯定的回应和有用的信息: 已将 /dev/dm-6 挂载到 /media/g/Data。 (g 是我在此系统上的用户名,Data 是我为该分区使用的标签) 也可能是您的桌面系统/文件管理器已自动挂载了该设备,或者您之前自己挂载了它。然后您会得到类似以下内容: 挂载 /dev/dm-6 时出错:GDBus.Error:org.freedesktop.UDisks2.Error.AlreadyMounted: 设备 /dev/dm-6 已在 '/media/g/Data' 处挂载。 这没有问题,您仍然可以访问加密分区中的数据。
访问数据:ls /media/g/Data
再次卸载设备(使用您用于挂载的相同名称,命令是 unmount,而不是 umount :-) ) udisksctl unmount -b /dev/dm-6 如果设备未被占用,您将得到以下回应: 已卸载 /dev/dm-6。
现在再次锁定分区(您必须记住分区的名称) udisksctl lock -b /dev/sdc2 您会得到以下回应: 已锁定 /dev/sdc2。
可选择地关闭整个外部磁盘 udisksctl power-off -b /dev/sdc 在图形桌面上,您可能会遇到错误: 关闭驱动器时出错:正在使用该驱动器:设备 /dev/sdc3 已挂载(udisks-error-quark, 14) 在这种情况下,您可以使用 udisksctl 逐个卸载分区,直到成功为止。udisksctl power-off 不会返回任何消息。

我从之前的答案中尝试了几种方法,只有之前答案的组合对我有效。这是我做的事情,以及成功的部分和失败的部分以及我的解决办法。
我有一个需要从Ubuntu 15.10的live boot USB上挂载的LUKS加密硬盘。为了实现这个目标,我使用了以下命令开始操作:
udisksctl unlock -b /dev/sda3

其中sda3是加密分区。这个命令对我没有起作用,我不确定为什么,所以我使用了以下命令:

sudo cryptsetup luksOpen /dev/sda1 my_encrypted_volume

这对我来说很有效,而且我不需要安装它,因为它已经在实时启动中存在。

现在,我需要挂载硬盘,这并不是一件直截了当的事情:我尝试过:

sudo mkdir /media/my_device
sudo mount /dev/mapper/my_encrypted_volume /media/my_device

但是第二个命令对我不起作用,因此我不得不找到一个解决办法,如下所示:
sudo udisksctl mount -b /dev/mapper/ubuntu--vg-root

那是我的路径..但你可以使用路径 dev/mapper/ubuntu,然后按两次 Tab 键查看其他选项。这会将硬盘驱动器挂载为:

Mounted /dev/dm-1 at /media/root/03cf6b80-fa7c-411f-90b9-42a3398529ce

然后我使用以下命令将其挂载为/media/my_device,如下所示:

sudo mount /dev/dm-1 /media/my_device/

这很好地发挥了作用。

总结

sudo cryptsetup luksOpen /dev/sda1 my_encrypted_volume
sudo mkdir /media/my_device
sudo udisksctl mount -b /dev/mapper/ubuntu--vg-root
sudo mount /dev/dm-1 /media/my_device/

您可以通过两个步骤进行挂载,我有一个脚本示例。

注意:服务udiskctl会将物品挂载在/media下面,它更适用于桌面用户挂载USB设备。如果您想在其他地方挂载设备,这不是您寻找的解决方案。

以下是我找到的方法。 在这个示例中,我的加密设备是使用lvm创建的分区,但这并不重要。它是一个ext4格式的分区。在加密形式下,它位于

/dev/myvg/opt1 

一个加密的分区是这样“打开”的(解密)
  STEP 1:  sudo cryptsetup luksOpen /dev/myvg/opt1 opt1_opened

(这是您输入密码的地方)
最后一个参数是对解密块设备的临时引用。 当您重新启动时,'mapping' 将消失,因此您可以每次选择不同的名称,如果您愿意。
现在它作为一个设备可见:
ls /dev/mapper
control  myvg-opt1  myvg-root  opt1_opened

你可以挂载这个设备:我们现在有一个ext4设备。 为了方便起见,在/etc/fstab中添加一行。
/dev/mapper/opt1_opened /opt1   ext4    noauto,users    0       0

并创建挂载点(在我的情况下:sudo mkdir /opt1),然后根据您的要求设置权限。如果您在第一步中使用了名称opt1_opened,那么这是第二步来挂载它:

STEP 2: mount /opt1   #the fstab line lets users mount, so no need for sudo

并且它已经安装。

因此,一个bash脚本:

#!/bin/bash
#needs to be run sudo
read -s -p "Enter LUKS password: " luks_password
printf $luks_password | cryptsetup luksOpen /dev/myvg/opt1 opt1_opened --key-file -
sudo -u tim mount /opt1