Ubuntu 22.04 硬件RAID1安装指南:手动分区与GRUB配置实战
1. 项目缘起:为什么要在RAID1上安装Ubuntu?
最近给一台老旧的Dell PowerEdge服务器做系统迁移,原计划是直接装到一块新的NVMe SSD上。但在安装Ubuntu 22.04 LTS的引导过程中,我遇到了一个不大不小的麻烦:系统安装程序(Ubiquity)在识别和配置RAID1阵列时,表现得相当“固执”。它要么是找不到阵列,要么是找到了却无法正确创建引导加载器(GRUB),最终导致安装失败,卡在“安装系统引导器”这一步。这让我意识到,虽然Ubuntu的桌面安装程序对普通单盘安装已经非常友好,但面对服务器上常见的硬件RAID配置,尤其是像RAID1(镜像)这样的基础冗余阵列,它依然存在一些“盲区”和预设逻辑上的冲突。
这个经历促使我决定,彻底梳理一遍在Ubuntu 22.04时代,将系统干净利落地部署到硬件RAID1阵列上的完整流程。这不仅仅是点击“下一步”那么简单,它涉及到对Linux引导机制、RAID控制器驱动以及Ubuntu安装程序底层逻辑的理解。无论是用于家庭NAS、小型企业服务器,还是作为开发测试环境,在RAID1上安装系统都能提供最基本的数据冗余保障,避免因单块硬盘故障导致系统瘫痪和数据丢失。对于运维人员、开发者或者任何希望构建稳定基础系统的用户来说,掌握这项技能都很有必要。
接下来,我将以一台配置了PERC H730硬件RAID控制器的Dell服务器为例,但其中涉及的核心原理和排查思路,同样适用于其他品牌(如HPE、浪潮、华为)的硬件RAID卡,以及在某些场景下的软件RAID配置。我们会从最底层的RAID配置开始,一直讲到系统安装完成后的收尾工作,把每一个可能踩坑的环节都摊开来讲清楚。
2. 战前准备:理解硬件RAID与安装程序的“认知差”
在动手之前,我们必须先理清一个关键概念:对于操作系统而言,一个配置好的硬件RAID1阵列,看起来就像一块普通的硬盘。RAID卡(或主板集成的RAID功能)负责管理底层的多块物理磁盘,将它们组织、虚拟化成一块逻辑磁盘(Logical Drive),然后呈现给操作系统。这是所有后续操作的基础。
然而,Ubuntu 22.04的图形化安装程序(Ubiquity)在设计时,优先考虑的是通用性和易用性。它内置的磁盘分区工具parted和引导安装逻辑,在面对由硬件RAID卡虚拟出来的“单盘”时,有时会做出错误的判断。一个最常见的问题是:安装程序可能会试图将GRUB安装到某一块物理硬盘(例如/dev/sda)上,而不是安装到由RAID卡虚拟出来的、代表整个阵列的逻辑设备(例如/dev/sdb)上。这是因为在安装程序的设备探测阶段,它可能同时“看到”了物理磁盘和逻辑磁盘,从而产生了混淆。
因此,我们的核心策略可以概括为:引导安装程序正确地识别出RAID阵列这块“虚拟单盘”,并强制将GRUB安装到这个正确的设备上。为了实现这个目标,通常有两种主流路径:
- 使用“服务器版”镜像:Ubuntu Server 22.04的安装程序(Subiquity)对硬件RAID的支持通常更好,因为它更偏向于服务器环境。
- 在桌面版安装中使用“手动分区”:这是更通用、也更可控的方法。通过手动指定分区方案和引导设备,我们可以完全掌控安装过程,避免安装程序的自动决策出错。
考虑到很多用户更熟悉桌面环境,或者需要在桌面版上完成安装,本文将重点详述第二种方法——在Ubuntu 22.04 Desktop安装中,通过手动分区搞定RAID1。同时,我也会穿插说明如果选择服务器版,有哪些需要注意的差异点。
准备工作清单:
- 硬件:确保RAID1阵列已在RA卡配置界面(如开机按Ctrl+R进入Dell PERC配置)中创建完毕,并处于“Optimal”状态。准备好Ubuntu 22.04 LTS的安装U盘。
- 镜像:从Ubuntu官网下载
ubuntu-22.04.x-desktop-amd64.iso或ubuntu-22.04.x-live-server-amd64.iso,并使用Rufus、BalenaEtcher等工具以“DD模式”或“ISO模式”写入U盘,确保UEFI引导兼容性。 - 心态:准备好可能会经历一次失败的安装,并进入“试用Ubuntu”环境进行调试。这是解决问题的最佳入口。
3. 核心实战:从U盘引导到手动分区的完整流程
现在,我们开始正式的安装过程。请将制作好的安装U盘插入服务器,并从U盘引导。
3.1 引导进入安装环境与关键模式选择
服务器启动后,你会看到Ubuntu的GRUB菜单。这里有一个至关重要的步骤:不要直接按回车启动“Install Ubuntu”。
- 在GRUB菜单中,高亮选中“Install Ubuntu”。
- 按下键盘上的
E键,进入引导参数编辑模式。你会看到一串以linux开头的行。 - 在这行参数的末尾(在
---之前),先添加一个空格,然后输入以下参数:nomodesetnomodeset参数的作用是禁止内核在安装初期加载显卡驱动,这对于很多服务器集成的显卡或老旧独立显卡非常有用,可以避免因显卡驱动问题导致的安装界面黑屏、卡死。这是服务器安装的常见技巧。 - 按下
Ctrl+X或F10来使用这些参数引导。这样,我们就进入了图形化安装界面。
注意:对于某些非常新的硬件或特定RAID卡,如果发现安装程序无法识别到任何磁盘,你可能还需要尝试添加
raid=noautodetect参数,或者尝试使用“安全图形模式”启动。但大多数情况下,nomodeset已足够。
3.2 连接网络与抵达分区十字路口
安装程序启动后,按照提示选择语言、键盘布局。在“更新和其他软件”这一步,我强烈建议先不要连接网络,也不要选择“安装中下载更新”和“安装第三方软件”。
为什么?因为网络下载可能会引入不可预知的延迟或错误,在解决核心的磁盘识别问题之前,这些步骤都是次要的。我们首要目标是让系统先“站”起来。我们可以等系统安装完成后,再在稳定的环境下进行更新。所以,这两个选项都不要勾选,直接点击“继续”。
接下来,我们就来到了整个安装过程中最关键的环节——“安装类型”。安装程序通常会检测到你的RAID阵列,并可能显示为一块大容量的磁盘(比如“/dev/sdb - 1.8 TB”)。但它也可能显示多块磁盘。这里,我们必须选择“其他选项”(Something else),也就是手动分区。点击“继续”,进入手动分区编辑器。
3.3 手动分区:为RAID阵列规划Linux家园
现在,你看到了所有存储设备列表。你应该能看到你的RAID阵列设备(例如/dev/sdb),以及你的U盘(例如/dev/sda)。请务必仔细核对设备大小和型号,确保你操作的是目标RAID阵列,而不是安装U盘。
选中代表RAID阵列的那行(/dev/sdb),然后点击下方的“新建分区表”。在弹出的对话框中选择分区表类型为GPT(GUID Partition Table)。对于现代UEFI系统和大于2TB的磁盘,GPT是必须的。点击“确定”后,磁盘状态变为“空闲”。
接下来,我们将在这块“空闲”空间上创建必要的分区。一个典型的、适用于UEFI启动的Ubuntu服务器/桌面系统,至少需要以下三个分区:
EFI 系统分区:
- 大小:至少512MB,建议1GB。为未来可能的多系统引导或大型引导文件留足空间。
- 新分区的类型:主分区
- 新分区的位置:起始
- 用于:EFI系统分区
- 挂载点:
/boot/efi - 说明:这个分区用于存放UEFI引导加载器。至关重要:在页面最下方,“安装启动引导器的设备”下拉菜单中,必须选择这个分区对应的设备(例如
/dev/sdb1)。这是确保GRUB被安装到RAID阵列上的关键一步!
交换分区(可选,但建议):
- 大小:根据你的物理内存大小决定。对于服务器,如果内存足够大(如64GB以上),可以省略或设置一个较小的交换空间(如4-8GB)。对于内存较小的系统,可以设置为物理内存的1-2倍。
- 新分区的类型:逻辑分区(在扩展分区内创建)或主分区
- 用于:交换空间
- 挂载点:(无需指定)
- 说明:用于内存交换。虽然现代系统有时使用交换文件(swapfile),但在独立分区上设置交换空间仍然是服务器上的常见做法,性能和管理上更清晰。
根分区:
- 大小:占用所有剩余空间。
- 新分区的类型:逻辑分区(在扩展分区内创建)或主分区
- 用于:Ext4 日志文件系统(或其他你喜欢的,如XFS)
- 挂载点:
/ - 说明:这是系统的主分区,所有文件和目录(除了
/boot/efi)都将存放在这里。
分区方案示例表格:
| 设备 | 大小 | 类型 | 文件系统 | 挂载点 | 备注 |
|---|---|---|---|---|---|
/dev/sdb1 | 1GB | EFI系统分区 | FAT32 | /boot/efi | 引导器安装位置 |
/dev/sdb2 | 16GB | 交换空间 | swap | (无) | 根据内存调整 |
/dev/sdb3 | 剩余所有 | Linux文件系统 | Ext4 | / | 根目录 |
创建完所有分区后,请再次仔细检查页面最下方的“安装启动引导器的设备”是否已经正确设置为你的EFI分区(如/dev/sdb1)。确认无误后,点击“现在安装”。
3.4 完成安装与首次重启
之后的过程就是常规设置:选择时区、创建用户名和密码。设置完成后,安装程序开始复制文件。这个过程在RAID1上可能会比单盘稍慢一点,因为数据需要同步写入两块硬盘。
安装完成后,点击“现在重启”。系统会提示你拔掉安装介质(U盘),然后按回车重启。
4. 疑难排坑:当安装程序“找不到磁盘”或引导失败时
事情并不总是一帆风顺。如果你在“安装类型”页面根本看不到你的RAID阵列磁盘,或者安装完成后重启无法进入系统(黑屏、卡在GRUB或直接进入BIOS),那么我们需要进入“高级调试”模式。
4.1 进入“试用Ubuntu”环境进行侦查
在安装开始时,GRUB菜单中有一个“Try Ubuntu”选项。当安装失败后,我们可以通过这个选项引导进入一个完整的、运行在内存中的Ubuntu桌面环境。这是一个强大的故障排查工具。
进入试用桌面后,打开终端(Ctrl+Alt+T)。
第一步,确认系统是否识别到了RAID卡和阵列:
sudo lspci | grep -i raid这条命令会列出所有RAID控制器。你应该能看到你的RAID卡信息(例如“Broadcom / LSI MegaRAID SAS-3 3108 [Invader]”)。
第二步,查看磁盘设备:
sudo fdisk -l或者使用更清晰的lsblk命令:
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS,MODEL仔细查看输出。你的RAID阵列应该显示为一个容量正确的设备(如/dev/sdb),而两块成员硬盘可能显示为/dev/sda和/dev/sdc(假设/dev/sdb是U盘)。如果根本看不到/dev/sdb这样的大容量设备,问题可能出在RAID卡驱动上。
第三步,检查RAID阵列状态(如果使用megacli或storcli工具):对于Dell PERC(基于LSI)的卡,可以尝试安装storcli工具来查看。首先下载对应版本的storclideb包,然后用dpkg安装并查看:
# 假设你已经下载了storcli_xxx_all.deb sudo dpkg -i storcli_xxx_all.deb sudo storcli /c0 show这个命令会显示控制器0(/c0)上所有虚拟驱动器和物理磁盘的状态。确保你的RAID1状态是“Optimal”。
4.2 安装缺失的RAID卡驱动(罕见但关键)
绝大多数主流硬件RAID卡(如LSI/Broadcom/Avago系列、Intel VROC)的驱动都已集成在Ubuntu 22.04的内核中。但如果你的卡非常新或非常旧,有可能需要手动安装驱动。
如果在试用环境中使用lspci看到了RAID卡,但lsblk却看不到阵列磁盘,这很可能就是驱动问题。你需要去服务器或RAID卡制造商的官网,查找适用于Ubuntu 22.04 (内核5.15) 的驱动程序,通常是一个.deb包或源码包。在试用环境中,你可以联网下载并安装它。
例如,对于某些较新的PMC-Sierra(Adaptec)卡,可能需要安装aar驱动。安装驱动后,再次执行lsblk,应该就能看到阵列磁盘了。
4.3 使用chroot修复引导(最后的救命稻草)
如果你能确认磁盘和分区都存在(/dev/sdb1,/dev/sdb3等),但重启后就是无法引导,很可能是GRUB安装位置不正确或配置损坏。这时,我们可以在试用环境中“钻入”已安装的系统,重新安装和配置GRUB。
挂载已安装系统的根分区和EFI分区:
sudo mount /dev/sdb3 /mnt sudo mount /dev/sdb1 /mnt/boot/efi(请根据你的实际分区设备号调整
/dev/sdb3和/dev/sdb1)挂载必要的虚拟文件系统,并
chroot进入目标系统:for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done sudo chroot /mnt执行
chroot后,你的终端环境就“切换”到了已经安装在硬盘上的那个Ubuntu系统。在
chroot环境中重新安装和配置GRUB:# 更新initramfs,确保包含必要的RAID模块 update-initramfs -u -k all # 重新安装GRUB到EFI分区 grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Ubuntu --recheck # 更新GRUB配置,扫描所有可引导的系统 update-grub退出并重启:
exit sudo umount -R /mnt sudo reboot拔掉U盘,让服务器从硬盘启动。这次,GRUB菜单应该能正常出现了。
5. 安装后优化与验证:确保阵列健康运行
系统成功启动后,我们的工作还没完。我们需要验证RAID1阵列是否在操作系统中被正确识别,并处于健康状态。
5.1 安装RAID管理工具
对于Dell PERC (LSI) 卡,megacli或它的继任者storcli是必备的管理工具。它们通常不包含在默认仓库中。
# 添加Dell/EMC的仓库并安装storcli (以Dell为例,具体包名请查询官网) wget -qO - https://linux.dell.com/repo/hardware/dsu/bootstrap.cgi | sudo bash sudo apt-get update sudo apt-get install storcli安装后,可以使用sudo storcli /c0/e252/s0 show(具体路径请根据sudo storcli /c0 show的输出调整)来查看指定物理磁盘的详细信息,或者使用sudo storcli /c0/v0 show查看虚拟驱动器状态。
5.2 监控阵列状态与配置告警
一个健康的RAID1阵列,其状态应该始终显示为“Optimal”。你可以将storcli的命令加入crontab定期运行,或者配置smartd来监控硬盘的S.M.A.R.T.状态。
更重要的是一块硬盘故障时的处理。当RAID1中的一块硬盘失效时,阵列会进入“Degraded”状态,但系统仍可正常运行。此时,你需要:
- 通过
storcli或服务器管理界面(iDRAC、iLO)确认故障硬盘位置。 - 在关机状态下,热插拔更换故障硬盘(如果服务器支持)。
- 开机进入RA卡配置界面(Ctrl+R),将新硬盘加入到原有的RAID1阵列中,阵列会自动开始“重建(Rebuild)”。
- 在操作系统中,你可以通过
storcli /c0/v0 show rebuild来查看重建进度。
一个非常重要的经验:对于硬件RAID,在更换硬盘前,强烈建议在BIOS或管理界面中确认硬盘的“Foreign State”(外来状态)是否被清空。有时新硬盘会被识别为“外来配置”,需要先清除此状态才能用于重建。
5.3 性能与稳定性考量
RAID1提供了冗余,但写入性能理论上与单盘相同(因为数据要写两份)。对于Ubuntu系统盘来说,这通常不是瓶颈。为了最大化稳定性和兼容性,我有几点建议:
- 定期更新:保持系统内核和
storcli等管理工具更新,以获得最新的驱动和Bug修复。 - 备份EFI分区:虽然RAID1保护了数据,但EFI分区的内容相对独立。在重大系统变更前,可以手动备份
/boot/efi目录下的内容。 - 测试灾难恢复:在非生产环境,模拟一块硬盘故障,练习更换和重建流程。这比任何文档都管用。
整个流程走下来,在RAID1上安装Ubuntu 22.04更像是一次对Linux存储栈和引导过程的深入理解。它要求你跳出图形化安装程序的“舒适区”,直接与磁盘、分区和引导加载器对话。一旦掌握了这套方法,无论是面对更复杂的RAID5、RAID10,还是不同的硬件品牌,你都能做到心中有数,从容应对。毕竟,对于服务器而言,稳定性和可控性,远比点击几下鼠标完成安装要重要得多。
