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
相关推荐
鲨鱼辣钊37 分钟前
FastAPI筑基_Day15_Alembic数据库迁移实战
数据库·elasticsearch·fastapi
叫我:松哥42 分钟前
基于Flask的教师评教管理系统,支持学生和教师两种角色登录
数据库·后端·python·数据挖掘·flask
Tisfy1 小时前
LeetCode 3720.大于目标字符串的最小字典序排列:状态机 —— :从左往右枚举,失败则退回(最多退回一次)
linux·数据库·leetcode·字符串·状态机·构造
csdn_aspnet1 小时前
mysql 函数、存储过程写法及示例
数据库·mysql·存储过程·函数·function·procedure
IvorySQL1 小时前
倒计时 6 天!PGConf.Asia 2026 演讲征集即将截止
数据库·人工智能·postgresql
qyyyyy5701 小时前
PDF 转 JSON 怎么做?从表格和元数据提取到 LLM 结构化处理
数据库·pdf·json·erlang·llama
今天AI了吗1 小时前
从“金鱼脑”到“大象记忆”:AI Agent 短期记忆与长期记忆的存储与检索全解
数据库·人工智能·python·sql·rust
Java小白笔记2 小时前
Codex CLI 使用与斜杠指令实战教程
服务器·数据库·oracle
养生技术人2 小时前
Oracle OCP认证考试题目详解082系列第16题
数据库·sql·oracle·ocp