Linux 安装系统失败:mkswap failed / 磁盘残留分区与 RAID 信息清理教程

云核筑梦家,今天记录一次 Linux 系统安装过程中遇到的磁盘分区异常问题。现场表现为系统安装器已经识别到硬盘,但是安装过程中在创建 swap 分区时失败,导致系统无法继续安装。
一、故障现象
在安装 Linux 系统时,安装器报错类似:
SwapError: mkswap failed for '/dev/sda3'安装界面里可能还会出现:
Installation Destination:No disks selected或者提示:
Not enough space in file systems for the current software selection.进入救援模式后查看磁盘,可以看到硬盘已经识别到了:
lsblk示例输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 756.9M 0 loop
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1000M 0 part
└─sda3 8:3 0 15.7G 0 part此时说明硬盘本身可以被系统识别,但是盘上存在安装失败后残留的分区信息,或者有旧的文件系统、swap、LVM、RAID 元数据残留,导致安装器在重新分区或创建 swap 时失败。
二、问题原因
这类问题常见原因有几个:
上一次系统安装失败,磁盘上残留了半截分区表。
磁盘之前做过 RAID、LVM、swap 或其他系统盘,残留了旧签名。
安装器读取到旧的 GPT、PMBR、mdadm、dmraid 等元数据后,自动分区异常。
kickstart 自动安装时写死了目标盘,比如
/dev/sda,但磁盘状态不干净,导致分区流程失败。
本次问题中,/dev/sda 是一块 931.5G 的硬盘,空间本身足够,最终判断不是硬盘容量不足,而是磁盘残留信息导致安装器创建 swap 分区失败。
三、进入救援模式
如果系统还没装好,可以从安装 ISO 进入 Rescue Mode,也就是救援模式。
进入救援模式后,先查看磁盘:
lsblk
fdisk -l
cat /proc/partitions确认目标安装盘是哪一块。
本次目标盘是:
/dev/sda注意:后面的清理命令会清空整块磁盘数据,一定要确认目标盘正确,不要清错数据盘。
四、清理磁盘残留分区和签名
确认目标盘是 /dev/sda 后,执行下面命令:
swapoff -a 2>/dev/null
for p in /dev/sda?*; do
umount "$p" 2>/dev/null
wipefs -af "$p" 2>/dev/null
done
wipefs -af /dev/sda
dd if=/dev/zero of=/dev/sda bs=1M count=300 conv=fsync status=progress
partprobe /dev/sda 2>/dev/null
lsblk执行完成后,如果正常,应该只看到整块硬盘本身,不应该再看到 sda1、sda2、sda3 这些分区。
正常示例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 756.9M 0 loop
sda 8:0 0 931.5G 0 disk这一步会清理磁盘开头的分区表、GPT、PMBR、文件系统签名等信息。
五、进一步清理 RAID / LVM / dmraid 残留
如果怀疑这块盘以前做过 RAID、LVM,或者安装器依旧识别异常,可以继续清理磁盘末尾的元数据。
很多 RAID、LVM 或磁盘阵列残留信息可能会写在磁盘末尾,所以建议把磁盘开头和末尾都清掉。
执行:
swapoff -a 2>/dev/null
for p in /dev/sda?*; do
umount "$p" 2>/dev/null
done
for md in /dev/md* /dev/md/*; do
[ -e "$md" ] && mdadm --stop "$md" 2>/dev/null
done
mdadm --zero-superblock --force /dev/sda 2>/dev/null
dmraid -r -E /dev/sda 2>/dev/null
wipefs -af /dev/sda
dd if=/dev/zero of=/dev/sda bs=1M count=300 conv=fsync status=progress
sectors=$(blockdev --getsz /dev/sda)
dd if=/dev/zero of=/dev/sda bs=512 seek=$((sectors-614400)) count=614400 conv=fsync status=progress
partprobe /dev/sda 2>/dev/null
sync说明:
wipefs -af /dev/sda用于清除系统能识别到的文件系统、swap、RAID、LVM 等签名。
dd if=/dev/zero of=/dev/sda bs=1M count=300用于清理磁盘开头 300M。
dd if=/dev/zero of=/dev/sda bs=512 seek=$((sectors-614400)) count=614400用于清理磁盘末尾 300M,避免 RAID 或 LVM 元数据残留。
六、检查是否清理干净
清理完成后,执行:
lsblk
wipefs -n /dev/sda
blkid /dev/sda
cat /proc/mdstat正常情况下,lsblk 应该只看到一整块裸盘:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 756.9M 0 loop
sda 8:0 0 931.5G 0 diskwipefs -n /dev/sda 没有任何输出,说明没有检测到文件系统或 RAID 签名。
blkid /dev/sda 没有任何输出,说明没有 UUID、文件系统、swap 等残留。
cat /proc/mdstat 显示:
Personalities :
unused devices: <none>说明当前没有软件 RAID 阵列在运行。
到这里,系统层面的分区表、swap、LVM、mdadm RAID、dmraid 残留基本已经清理干净。
七、重新安装系统
确认磁盘干净后,执行:
reboot重启后重新进入正常系统安装流程即可。
如果使用 kickstart 自动安装,建议分区配置里加上清盘参数,例如:
ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel --drives=sda
bootloader --location=mbr --boot-drive=sda
part biosboot --fstype=biosboot --size=1 --ondisk=sda
part /boot --fstype=xfs --size=1024 --ondisk=sda
part swap --fstype=swap --size=4096 --ondisk=sda
part / --fstype=xfs --grow --size=20480 --ondisk=sda如果是 UEFI 启动,可以使用 EFI 分区,例如:
ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel --drives=sda
bootloader --boot-drive=sda
part /boot/efi --fstype=efi --size=600 --ondisk=sda
part /boot --fstype=xfs --size=1024 --ondisk=sda
part swap --fstype=swap --size=4096 --ondisk=sda
part / --fstype=xfs --grow --size=20480 --ondisk=sda实际用 BIOS 还是 UEFI,需要根据服务器启动模式决定。
八、如果还是无法安装
如果清理完成后,系统安装器仍然提示 RAID、Foreign、磁盘异常,或者依旧无法创建分区,那就不是 Linux 系统层面能完全处理的问题了。
这时需要检查 RAID 卡或服务器管理后台:
进入 RAID 卡 BIOS,查看是否有 Foreign Config。
清除 RAID 卡里的 Foreign 配置。
如果是阵列卡管理的磁盘,需要重新创建 VD。
在 iDRAC、iMana、iLO 或 BMC 里检查硬盘状态是否 Online。
检查硬盘、盘架、背板、阵列卡是否有故障告警。
九、总结
这次问题的核心不是硬盘容量不够,而是磁盘上残留了安装失败后的分区、swap 或 RAID/LVM 相关元数据,导致安装器在创建 /dev/sda3 swap 分区时失败。
最终处理思路就是:
确认目标盘
停止占用
清理分区签名
清理磁盘开头
清理磁盘末尾
确认 wipefs / blkid 无输出
重新安装系统只要 lsblk 里目标盘下面没有残留分区,wipefs -n 和 blkid 都没有输出,基本就可以作为一块干净盘重新安装系统。
评论