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
相关产品推荐
相关产品推荐

