ubuntu26.04从ext4改成raid1+lvm启动

复制代码
#!/bin/bash

# ==============================================================================
# Ubuntu 26.04 RAID1 + LVM 启动配置脚本
# 警告:此脚本将清除目标磁盘所有数据!请务必确认磁盘标识无误。
# 适用场景:Ubuntu Server Live USB 环境
# ==============================================================================

set -e

# --------------------------
# 1. 用户配置区域 (请根据实际情况修改)
# --------------------------
DISK1="/dev/sdb"       # 第一块物理硬盘
DISK2="/dev/sdc"       # 第二块物理硬盘
HOSTNAME="ubuntu-raid" # 主机名
USERNAME="ubuntu"      # 默认用户名
PASSWORD="ubuntu"      # 默认密码 (安装后请立即修改)
TIMEZONE="Asia/Shanghai"

# EFI 分区大小 (MB)
EFI_SIZE=512
# Boot 分区大小 (MB, BIOS模式需要, UEFI模式下/boot通常合并到根或单独ext4)
# 本脚本采用 UEFI + GPT 标准方案:
# /dev/md0: EFI System Partition (镜像同步, 虽非必须但便于管理) -> 实际上EFI通常不做RAID, 这里我们做两个独立EFI
# /dev/md1: /boot (ext4, RAID1)
# /dev/md2: LVM PV (RAID1), 包含 root (/) 和 swap

# --------------------------
# 2. 环境检查与准备
# --------------------------
echo "[*] 检查是否以 root 运行..."
if [ "$EUID" -ne 0 ]; then
    echo "请使用 sudo 运行此脚本"
    exit 1
fi

echo "[*] 安装必要工具..."
apt-get update
apt-get install -y mdadm lvm2 grub-efi-amd64 shim-signed dosfstools

# --------------------------
# 3. 磁盘分区 (GPT)
# --------------------------
wipe_disks() {
    echo "[!] 正在清除磁盘 $DISK1 和 $DISK2 上的所有数据..."
    sgdisk --zap-all $DISK1
    sgdisk --zap-all $DISK2
    partprobe $DISK1
    partprobe $DISK2
}

create_partitions() {
    echo "[*] 创建分区表..."
    
    # 定义分区方案 (单位: MiB)
    # 1. EFI 分区 (512M) - 类型 EF00
    # 2. Boot 分区 (1G)   - 类型 FD00 (Linux RAID)
    # 3. Root/LVM 分区 (剩余空间) - 类型 FD00 (Linux RAID)

    for DISK in $DISK1 $DISK2; do
        echo "[*] 分区 $DISK ..."
        sgdisk $DISK \
            --new=1:1M:+${EFI_SIZE}M --typecode=1:EF00 --change-name=1:"EFI" \
            --new=2:0:+1G --typecode=2:FD00 --change-name=2:"Boot" \
            --new=3:0:0 --typecode=3:FD00 --change-name=3:"RootLVM" \
            --print
    done
    partprobe $DISK1
    partprobe $DISK2
}

# --------------------------
# 4. 组建 RAID1 阵列
# --------------------------
setup_raid() {
    echo "[*] 组建 RAID1 阵列..."
    
    # 停止可能存在的旧阵列
    mdadm --stop /dev/md0 || true
    mdadm --stop /dev/md1 || true
    mdadm --stop /dev/md2 || true

    # 创建 /boot 的 RAID1 (md1)
    mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=1.2 \
        ${DISK1}2 ${DISK2}2
    
    # 创建 LVM 物理卷基础的 RAID1 (md2)
    mdadm --create /dev/md2 --level=1 --raid-devices=2 --metadata=1.2 \
        ${DISK1}3 ${DISK2}3

    echo "[*] 等待 RAID 同步初始化..."
    sleep 5
    cat /proc/mdstat
}

# --------------------------
# 5. 配置 LVM
# --------------------------
setup_lvm() {
    echo "[*] 配置 LVM..."
    
    # 创建物理卷
    pvcreate /dev/md2
    
    # 创建卷组
    vgcreate vg_root /dev/md2
    
    # 创建逻辑卷
    # Swap: 8G (根据内存调整)
    lvcreate -L 1G -n lv_swap vg_root
    # Root: 剩余所有空间
    lvcreate -l 100%FREE -n lv_root vg_root
    
    # 格式化
    mkfs.ext4 /dev/md1          # /boot
    mkfs.ext4 /dev/vg_root/lv_root # /
    mkswap /dev/vg_root/lv_swap
}

# --------------------------
# 6. 挂载文件系统并安装基础系统
# --------------------------
install_system() {
    echo "[*] 挂载文件系统..."
    mount /dev/vg_root/lv_root /mnt
    mkdir -p /mnt/boot
    mount /dev/md1 /mnt/boot
    
    # 处理 EFI 分区 (UEFI 模式下,EFI 分区通常不做 RAID,而是分别挂载)
    mkdir -p /mnt/boot/efi
    # 注意:GRUB 在 UEFI 下通常只需要一个 EFI 分区有效,但为了冗余,我们可以格式化其中一个并挂载
    # 这里我们格式化 DISK1 的 EFI 分区作为主 EFI
    mkfs.vfat -F32 ${DISK1}1
    mount ${DISK1}1 /mnt/boot/efi

    echo "[*] 开始安装基础系统 (debootstrap)..."
    # 使用 debootstrap 安装最小化系统
    # 如果是在 Live USB 中,通常使用 ubuntu-server-installer 或 subiquity
    # 此处演示手动 chroot 安装核心包,实际生产建议使用官方 Installer 的 "Manual Partitioning" 模式
    # 由于手动 debootstrap 极其复杂且易错,以下代码仅为结构示意,
    # **强烈建议**在 Live 环境中使用 `ubuntu-desktop-installer` 或 `subiquity` 的手动分区功能
    
    echo "[!] 警告:全自动脚本安装完整 Ubuntu 系统极其复杂且依赖网络源稳定性。"
    echo "[!] 建议操作:重启进入图形化安装程序,选择 'Manual Storage Configuration',"
    echo "[!] 按照上述分区和 RAID/LVM 结构手动挂载。"
    
    # 若坚持命令行安装,需执行 debootstrap,此处省略具体包列表以防错误
    # debootstrap jammy /mnt http://archive.ubuntu.com/ubuntu/
	
}

# --------------------------
# 7. 配置 Chroot 环境 (系统安装后执行)
# --------------------------
configure_chroot() {
    echo "[*] 配置 Chroot 环境..."
    
    # 挂载必要虚拟文件系统
    mount --bind /dev /mnt/dev
    mount --bind /proc /mnt/proc
    mount --bind /sys /mnt/sys
    mount --bind /run /mnt/run

    # 复制 resolv.conf
    cp /etc/resolv.conf /mnt/etc/resolv.conf

    chroot /mnt /bin/bash <<EOF
set -e
echo "[*] 在 Chroot 环境中配置..."

# 1. 安装内核和必要工具
apt-get update
apt-get install -y linux-image-generic linux-headers-generic mdadm lvm2 grub-efi-amd64 shim-signed os-prober

# 2. 生成 fstab
echo "生成 /etc/fstab..."
# 获取 UUID
BOOT_UUID=\$(blkid -s UUID -o value /dev/md1)
ROOT_UUID=\$(blkid -s UUID -o value /dev/mapper/vg_root-lv_root)
EFI_UUID=\$(blkid -s UUID -o value ${DISK1}1)
SWAP_UUID=\$(blkid -s UUID -o value /dev/mapper/vg_root-lv_swap)

cat > /etc/fstab <<FSTAB
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=\$EFI_UUID /boot/efi vfat umask=0077 0 1
UUID=\$BOOT_UUID /boot ext4 defaults 0 1
UUID=\$ROOT_UUID / ext4 errors=remount-ro 0 1
UUID=\$SWAP_UUID none swap sw 0 0
FSTAB

# 3. 配置 Hostname 和 Hosts
echo "$HOSTNAME" > /etc/hostname
cat > /etc/hosts <<HOSTS
127.0.0.1 localhost
127.0.1.1 $HOSTNAME
HOSTS

# 4. 配置网络 (Netplan)
cat > /etc/netplan/00-installer-config.yaml <<NETPLAN
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
NETPLAN

# 5. 安装 GRUB
echo "安装 GRUB..."
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck
update-grub

# 6. 更新 Initramfs (确保包含 raid 和 lvm 模块)
update-initramfs -u -k all

# 7. 设置用户
useradd -m -s /bin/bash $USERNAME
echo "$USERNAME:$PASSWORD" | chpasswd
usermod -aG sudo $USERNAME

echo "[*] Chroot 配置完成。"
EOF

    # 卸载虚拟文件系统
    umount /mnt/dev
    umount /mnt/proc
    umount /mnt/sys
    umount /mnt/run
}

# --------------------------
# 主执行流程
# --------------------------
main() {
    echo "=================================================="
    echo " Ubuntu 26.04 RAID1 + LVM 部署脚本"
    echo "=================================================="
    read -p "警告:这将擦除 $DISK1 和 $DISK2 的所有数据!继续吗?(yes/no): " confirm
    if [ "$confirm" != "yes" ]; then
        echo "已取消。"
        exit 0
    fi

    wipe_disks
    create_partitions
    setup_raid
    setup_lvm
    
    echo "[*] 分区和 RAID/LVM 结构已创建完毕。"
    echo "[*] 接下来请挂载文件系统并安装操作系统。"
    echo "[*] 您可以选择:"
    echo "    1. 重启并使用图形化安装器的'手动分区'功能,识别已创建的 /dev/md* 和 /dev/mapper/*。"
    echo "    2. 继续运行本脚本的 install_system (需完善 debootstrap 逻辑)。"
    
    # 自动执行 chroot 配置部分通常需要系统文件已存在,因此这里暂停
    # configure_chroot 
}

# 取消注释以下行以执行(谨慎!)
# main
相关推荐
这个DBA有点耶17 小时前
从OLTP到OLAP到HTAP:数据库负载分类的技术演进与选型指南
数据库·mysql·架构
YangYang9YangYan19 小时前
商业数据分析校招项目怎么选,附项目设计与简历包装思路
大数据·数据库·数据分析
李白客19 小时前
数据库培训怎么选?零基础到DBA的学习路线与机构认证对比(2026)
数据库·学习
shark-chili19 小时前
关于AI辅助编程的认知
数据库·人工智能·redis·macos·缓存
SendTomo19 小时前
.ico透明图标在线生成下载平台深度解析
大数据·数据结构·数据库·数据仓库·个人开发
蓝速科技19 小时前
国产化信创终端等保合规核心防护与落地方案丨蓝速科技
大数据·运维·数据库·人工智能·科技
IvorySQL20 小时前
PostgreSQL 日报|在线校验和特性被回退(9 月 17 日)
数据库·人工智能·postgresql
实验室管理云平台20 小时前
北京盛元广通检测管理方案:信息集成、质量控制与移动应用
大数据·数据库·科技
IT大白鼠20 小时前
MySQL 高可用系列 · Orchestrator + ProxySQL 第三篇——核心原理精讲
数据库·mysql·架构
geovindu20 小时前
sql:Data Modeling Patterns using PostgreSQL 18
postgresql·数据库开发·数据库架构