You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04预seed加密LVM安装时如何规避‘device in use’错误

Ubuntu 22.04预seed加密LVM安装时如何规避‘device in use’错误

我之前也被这个问题折腾得够呛——用Cubic制作Ubuntu自定义ISO,想通过preseed实现加密LVM的全自动分区,结果每次都卡在“设备被LVM模块占用”的错误上,手动GUI安装明明没问题。后来才发现,问题出在磁盘残留的旧加密卷/LVM配置没有彻底清理,哪怕用sgdisk清空分区表,内核里可能还挂着旧的卷组,导致partman无法操作。

下面是亲测有效的解决方案,分两部分:


第一步:添加预清理命令,确保磁盘完全干净

在preseed里加入early_command,在partman启动前彻底清理所有残留的加密卷、LVM配置和分区表:

d-i preseed/early_command string \
    cryptsetup luksClose --all; \
    vgchange -an; \
    pvremove -ffy /dev/sda*; \
    sgdisk -Z /dev/sda; \
    partprobe /dev/sda

这些命令的作用分别是:

  • 关闭所有已挂载的加密卷
  • 禁用所有卷组,释放设备占用
  • 强制删除所有物理卷
  • 彻底清空磁盘分区表(包括GPT和MBR)
  • 重新探测磁盘,让内核更新分区信息

第二步:调整preseed的partman配置

方案1:使用内置的atomic recipe(单分区)

如果不需要自定义分区结构,直接用官方内置的加密LVM配方,配置如下:

# 适配非UEFI系统(如果是UEFI环境可以去掉这行)
d-i partman-efi/non_efi_system boolean true

# 默认文件系统
d-i partman/default_filesystem string ext4

# 选择加密LVM分区方法
d-i partman-auto/method string crypto

# 设置加密密码(替换成你的密码)
d-i partman-crypto/passphrase password your_secure_pass
d-i partman-crypto/passphrase-again password your_secure_pass

# 清理旧的LVM/RAID配置
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# 卷组使用全部磁盘空间
d-i partman-auto-lvm/guided_size string max

# 选择内置的单分区配方(atomic)
d-i partman-auto/choose_recipe select atomic

# 自动确认所有分区操作
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

方案2:使用自定义分区配方

如果需要自定义分区(比如单独的/boot、swap、/分区),确保配方里的卷组名称和partman-auto-lvm/new_vg_name一致,同时加上第一步的预清理命令,配置示例:

# 预清理命令(同第一步)
d-i preseed/early_command string \
    cryptsetup luksClose --all; \
    vgchange -an; \
    pvremove -ffy /dev/sda*; \
    sgdisk -Z /dev/sda; \
    partprobe /dev/sda

d-i partman-auto/method string crypto
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-auto-lvm/guided_size string max
d-i partman-auto-lvm/new_vg_name string crypt

# 自定义加密LVM配方
d-i partman-auto/expert_recipe string \
root-encrypted :: \
500 500 500 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } \
. \
2000 2000 2000 linux-swap \
$lvmok{ } lv_name{ swap } \
in_vg { crypt } \
method{ swap } format{ } \
. \
500 10000 1000000000 ext4 \
$lvmok{ } lv_name{ rootpart } \
in_vg { crypt } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
.

d-i partman-md/device_remove_md boolean true
d-i partman-basicfilesystems/no_mount_point boolean false
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

关键注意事项

  • 确保preseed/early_command在所有partman配置之前,这样清理操作先执行
  • 如果是多磁盘环境,要把/dev/sda替换成你要操作的目标磁盘(比如/dev/nvme0n1)
  • 密码设置要符合Ubuntu的复杂度要求,否则可能安装失败

备注:内容来源于stack exchange,提问作者Mr. T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 16:19:31