增加加密交换空间的大小

Ubuntu 18.04默认在每次启动时使用dm-crypt/Swap加密创建一个随机的加密交换空间。对我来说,这创建了一个1GB的交换空间,但我找不到在每次启动时增加交换空间大小的地方。我们如何增加每次启动时分配的交换空间大小?我不想切换到静态交换文件。没有/swapfile或分区。
这似乎是一个新功能,系统每次启动时会动态创建交换空间。我该如何增加它?
从/etc/crypttab中:
nvme0n1p3_crypt UUID=1e092df8-5c37-4409-8ac8-361402244f69 none luks,discard
cryptswap1 UUID=aba1b825-a77b-4384-a40f-fdc6fdaaced0 /dev/urandom swap,offset=1024,cipher=aes-xts-plain64

/etc/fstab 文件中:
/dev/mapper/cryptswap1 none swap sw 0 0

# swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-3                               partition   1003004 601088  -2

htop

gparted没有显示任何交换分区。这是唯一的驱动器。

gparted

在这里的一个回答中,建议做以下操作:
sudo swapoff -a  
sudo cryptsetup resize cryptswap1 --size (in sectors)  
sudo mkswap /dev/cryptswap1  
sudo swapon -a  

所以我运行:cryptsetup resize cryptswap1 --size 7812500。这导致错误:Device /dev/mapper/mint--vg-swap_1 is too small. 所以我尝试:cryptsetup resize /dev/mapper/mint--vg-swap_1 --size 7812500 这没有产生错误,但是parted --list; fdisk -l显示没有变化。
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cryptswap1: 979.5 MiB, 1027080192 bytes, 2006016 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

尝试再次运行cryptsetup resize cryptswap1 --size 7812500会出现设备/dev/mapper/mint--vg-swap_1太小。 我还尝试了resize2fs /dev/mapper/mint--vg-swap_1 -s 4G,结果如下:
resize2fs 1.44.1 (24-Mar-2018)
resize2fs: Device or resource busy while trying to open /dev/mapper/mint--vg-swap_1
Couldn't find valid filesystem superblock.

# lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop0                   7:0    0  54.6M  1 loop  /snap/core18/1279
loop1                   7:1    0  89.1M  1 loop  /snap/core/8213
loop2                   7:2    0  89.1M  1 loop  /snap/core/8268
loop3                   7:3    0 497.4M  1 loop  /snap/wickrme/246
loop4                   7:4    0 497.2M  1 loop  /snap/wickrme/247
loop5                   7:5    0  54.6M  1 loop  /snap/core18/1288
nvme0n1               259:0    0 465.8G  0 disk  
├─nvme0n1p1           259:1    0   512M  0 part  /boot/efi
├─nvme0n1p2           259:2    0   732M  0 part  /boot
└─nvme0n1p3           259:3    0 464.6G  0 part  
  └─nvme0n1p3_crypt   253:0    0 464.6G  0 crypt 
    ├─mint--vg-root   253:1    0 463.6G  0 lvm   /
    └─mint--vg-swap_1 253:2    0   980M  0 lvm   
      └─cryptswap1    253:3    0 979.5M  0 crypt [SWAP]

设备类型是什么?(普通、luks等) - JasonF4
该驱动器已经使用LUKS加密。 - xendi
我们能看到lsblk的输出吗? - Kaz Wolfe
添加了。看起来我有一个误解。我没有意识到gparted不能处理LVM。我想我需要缩小我的根LVM,为我的cryptswap腾出更多空间,但是我手头没有闪存驱动器可以启动。我不认为根卷可以“实时”缩小。 - xendi
我根据你收到的错误更新了答案。而且,在你尝试调整 mint--vg-swap_1(2MiB)的大小时,你没有考虑头部的大小。mint--vg-swap_1 需要比 cryptswap 大 2MiB(这样 cryptswap 才不能放进去)。我不认为你可以在容器上使用那个调整大小的命令。请查看我的更新答案。 - JasonF4
2个回答

此答案基于Ubuntu 22.04 LTS

lslbk
   # └─sda6                  8:6    0 464,6G  0 part  
   #   └─sda6_crypt        253:0    0 464,5G  0 crypt 
   #     ├─vgubuntu-root   253:1    0 463,6G  0 lvm   /
   #     └─vgubuntu-swap_1 253:2    0   980M  0 lvm   [SWAP]

在之前没有解决的一个问题是,为了增加LVM交换空间大小,首先必须减小LVM根目录的大小!
(至少当lsblk(如上所示)显示根目录和交换空间占据整个加密设备时。)

太长不看(但备份重要数据!)

在这里,我们减少根目录空间40G,并增加交换空间40G:

# Boot Ubuntu Live/Flash/"Try Ubuntu" AND open terminal
# Run subsequent commands as superuser
sudo su
    # `sudo`    => Execute a command as another user.
    # `sudo su [user]` => Run a command with substitute user, default is root.

# Encrypted device should NOT be unlocked
lsblk # => list block devices
    # └─sda6 => no `crypt`/`lvm``

# Unlock encrypted device
cryptsetup open /dev/sda6 crypt # Enter passphrase
    # `cryptsetup` => Manage dm-crypt + LUKS encrypted volumes.
    # `cryptsetup open <device> <name>` => Opens encrypted lv as <name>

# Get logical volume identifiers
lsblk
    # └─sda6                  8:6    0 464,6G  0 part
    #   └─sda6_crypt        253:0    0 464,5G  0 crypt
    #     ├─vgubuntu-root   253:1    0 463,6G  0 lvm   /
    #     └─vgubuntu-swap_1 253:2    0   980M  0 lvm   [SWAP]

# Shrink logical root volume AND filesystem
lvresize --verbose --resizefs -L -40G /dev/mapper/vgubuntu-root
    # `lvresize` <volume> => resize a logical volume
    #   --verbose  => Give more info.
    #   --resizefs => Resize filesystem AND LV with fsadm(8).
    #   -L         => Specifies the new size of the LV, 
    #                 +/- add/subtracts to/from current size, g|G is GiB.

# Check filesystem of logical root volume for errors
e2fsck -f /dev/mapper/vgubuntu-root
    # `e2fsck`<fs-path> => Check a Linux ext2/ext3/ext4 file system
    #   -f => Force checking even if the file system seems clean.

# Increase swapsize
lvresize --verbose -L +40G /dev/mapper/vgubuntu-swap_1

重启后,Ubuntu应该正常启动,交换空间的大小应该被调整。
lslbk
    # └─sda6                  8:6    0 464,6G  0 part  
    #   └─sda6_crypt        253:0    0 464,5G  0 crypt 
    #     ├─vgubuntu-root   253:1    0 423,6G  0 lvm   /
    #     └─vgubuntu-swap_1 253:2    0    41G  0 lvm   [SWAP]

如果系统监视器仍然只有最初的1G,则需要重新编写逻辑交换设备:

swapon --show
    # NAME      TYPE      SIZE USED PRIO
    # /dev/dm-2 partition 976M   0B   -2

swapoff -v /dev/dm-2
    # swapoff /dev/dm-2

mkswap /dev/dm-2
    # mkswap: /dev/dm-2: warning: wiping old swap signature.
    # Setting up swapspace version 1, size = 41 GiB (43973079040 bytes)
    # no label, UUID=...

我试图使用这个方法增加我的交换空间大小,但是我遇到了以下错误信息: 无法使用已在使用中(已映射或已挂载)的设备/dev/sda6。 我猜想这是因为我只有一个设备并且已经在使用中。有哪些可能的解决方案? - Stromwerk
1@Stromwerk 1. 如果你询问一个失败的命令的建议,显然我们需要确切地知道你在谈论哪个命令。2. 如果是lvresize/dev/sda6似乎是错误的,因为这个答案是针对加密交换分区应该位于/dev/mapper/下面的情况。3. 通常情况下,调整大小应该从Linux Live光盘中进行,而不是从要更改的系统中进行,然后才能挂载非/dev/sdaX设备。4. 问问自己为什么要挂载sda6。5. 可以搜索如何卸载sdaX设备。 - goulashsoup
命令是lvresize --verbose --resizefs -L -15G /dev/mapper/vgubuntu-root(我将其设置为-15G,因为我只想改变交换空间的大小)。我现在明白解决办法很可能是使用Linux实时磁盘,但我目前无法轻松获得。谢谢您。 - Stromwerk

sudo swapoff -a  
sudo cryptsetup resize cryptswap1 --size (in sectors)  
sudo mkswap /dev/mapper/cryptswap1  
sudo swapon -a  

如果省略了--size参数,它将使用整个设备。
根据反馈进行更新。重新启动并确保mint--vg-swap_1仍然是980M。
如果是这样的话,请按照以下步骤操作。首先尝试手动增加容器的大小(我认为这不应该是必要的)。根据您的评论,您正在尝试将交换空间设置为4G(+3G),所以:
sudo swapoff -a  
sudo lvresize -L+3G /dev/mapper/mint--vg-swap_1
sudo cryptsetup resize cryptswap1 --size 7812500
sudo mkswap /dev/mapper/cryptswap1  
sudo swapon -a  

另一方面,如果 mint--vg-swap_1 现在是 4G,则运行以下命令(考虑到标题的大小):
sudo swapoff -a  
sudo cryptsetup resize cryptswap1 --size 7808404   
sudo mkswap /dev/mapper/cryptswap1  
sudo swapon -a  

参考资料


这个在重启之间会保持吗?我如何计算扇区?我猜我需要打印当前扇区大小并除以总的所需大小? - xendi
手册上说 --size, -b <512字节扇区数>,所以我尝试了 cryptsetup resize cryptswap1 --size 7812500,结果显示 设备 /dev/mapper/mint--vg-swap_1 太小了。 - xendi
在问题中添加了尝试的信息。 - xendi
使用cryptsetup resize命令,在增加交换空间大小而不是减小时,将在引导时持久存在。(是的,这很奇怪。) - JasonF4
根据您对问题的反馈,我更新了答案。 - JasonF4
在缩小根分区之前,请勿使用lvresize命令而不加上--resizefs选项。这样做会导致文件系统损坏! - goulashsoup
尝试使用这种方法来增加我的交换空间大小时,运行sudo cryptsetup resize cryptswap1 --size 31457280时出现了“设备cryptswap1未激活”的错误提示(我想将我的交换空间增加15G,如果我理解正确的话,那就意味着我需要将大小设置为31457280 * 512字节扇区)。我还尝试运行了sudo mkswap /dev/mapper/cryptswap1,但是它给出了sudo cryptsetup resize cryptswap1 --size 31457280的错误提示。 - Stromwerk