Luks

如果 LUKS 不儲存分區大小,“cryptsetup resize”會做什麼?

  • January 16, 2018

LUKS//dm-crypt常見cryptsetup 問題頁面說:

2.15 我可以調整 dm-crypt 或 LUKS 分區的大小嗎?

是的,您可以,因為 dm-crypt 和 LUKS 都不儲存分區大小。

我很困惑:

  1. 如果沒有儲存大小資訊,什麼是“調整大小”?
  2. 如何在打開/關閉加密卷時記住“調整大小”?

這是關於線上調整大小。

例如,如果你使用 LVM,創建一個 1G 大小的 LV,然後將 LUKS 放在上面,它是這樣的:

# lvcreate -L1G -n test VG
# cryptsetup luksFormat /dev/mapper/VG-test
# cryptsetup luksOpen /dev/mapper/VG-test lukstest
# blockdev --getsize64 /dev/mapper/VG-test
1073741824
# blockdev --getsize64 /dev/mapper/lukstest
1071644672

所以 LUKS 設備的大小與 VG-test 設備的大小差不多(1G 減去 LUKS 標頭使用的 2MiB)。

現在當你讓 LV 變大時會發生什麼?

# lvresize -L+1G /dev/mapper/VG-test
 Size of logical volume VG/test changed from 1.00 GiB (16 extents) to 2.00 GiB (32 extents).
 Logical volume test successfully resized.
# blockdev --getsize64 /dev/mapper/VG-test
2147483648
# blockdev --getsize64 /dev/mapper/lukstest
1071644672

LV現在2G大了,但是LUKS設備還是卡在1G,原來是1G。

一旦你luksCloseluksOpen,它也將是 2G ——因為 LUKS 不儲存大小,它預設為你打開它時的設備大小。所以關閉和打開(或簡單地重新啟動)會將加密映射更新為新的設備大小。但是,由於您只能在解除安裝/停止其中的所有內容後關閉容器,因此這基本上是離線調整大小

但也許你在 LUKS 上有一個掛載的文件系統,它正在使用中,你不想解除安裝它來調整大小,這就是cryptsetup resize線上調整大小操作的地方。

# cryptsetup resize /dev/mapper/lukstest
# blockdev --getsize64 /dev/mapper/lukstest
2145386496

cryptsetup resize將活動 crypt 映射更新為新的設備大小,不需要 umount,然後您可以跟進它resize2fs或其他任何東西來線上增長已安裝的文件系統本身。

如果您不介意重新啟動或重新安裝,您將永遠不需要cryptsetup resize,因為它會自動離線。但是,如果您想線上進行,那是唯一的方法。


縮小 ( cryptsetup resize --size x) 時,調整大小是暫時的。LUKS 不儲存設備大小,所以下次你 luksOpen 時,它會再次使用設備大小。因此,只有當支撐裝置也相應地收縮時,收縮才會生效。

要成功收縮,您必須向後工作…增長首先是增長分區,然後是 LUKS,然後是文件系統…收縮是首先收縮文件系統,最後是分區。


如果調整大小不起作用,很可能是由於未調整支持設備的大小,例如,核心可能會在驅動器正在使用時拒絕更改分區表。與 blockdev 一起檢查所有設備層的大小是否符合您的預期。

引用自:https://unix.stackexchange.com/questions/322905